diff --git a/CHANGELOG.md b/CHANGELOG.md index b70ba56d4a3fc5..7b9bcd9e768a73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ Select a Node.js version below to view the changelog history: -* [Node.js 11](doc/changelogs/CHANGELOG_V11.md) - **Current** +* [Node.js 12](doc/changelogs/CHANGELOG_V12.md) - **Current** +* [Node.js 11](doc/changelogs/CHANGELOG_V11.md) - Current * [Node.js 10](doc/changelogs/CHANGELOG_V10.md) — **Long Term Support** * [Node.js 9](doc/changelogs/CHANGELOG_V9.md) — End-of-Life * [Node.js 8](doc/changelogs/CHANGELOG_V8.md) — Long Term Support @@ -29,7 +30,8 @@ release. -12.0.0
+12.1.0
+12.0.0
11.14.0
diff --git a/GOVERNANCE.md b/GOVERNANCE.md index af61aed758f956..9e678855932e1d 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -139,30 +139,28 @@ the nomination. The nomination passes if no Collaborators oppose it after one week. Otherwise, the nomination fails. -Prior to the public nomination, the Collaborator initiating it can seek -feedback from other Collaborators in private using -[the GitHub discussion page][collaborators-discussions] of the -Collaborators team, and work with the nominee to improve the nominee's -contribution profile, in order to make the nomination as frictionless -as possible. +There are steps a nominator can take in advance to make a nomination as +frictionless as possible. Use the [Collaborators discussion page][] to request +feedback from other Collaborators in private. A nominator may also work with the +nominee to improve their contribution profile. -If individuals making valuable contributions do not believe they have been -considered for a nomination, they may log an issue or contact a Collaborator -directly. +It is possible that Collaborators will overlook someone with valuable +contributions. In that case, the contributor may open an issue or contact a +Collaborator to request a nomination. ### Onboarding -When the nomination is accepted, the new Collaborator will be onboarded -by a TSC member. See [the onboarding guide](./doc/onboarding.md) on -details of the onboarding process. In general, the onboarding should be -completed within a month after the nomination is accepted. +After the nomination passes, a TSC member onboards the new Collaborator. See +[the onboarding guide](./doc/onboarding.md) on details of the onboarding +process. In general, the onboarding should occur within a month after the +nomination passes. ## Consensus Seeking Process -The TSC follows a [Consensus Seeking][] decision-making model as described by -the [TSC Charter][]. +The TSC follows a [Consensus Seeking][] decision-making model per the +[TSC Charter][]. -[collaborators-discussions]: https://github.com/orgs/nodejs/teams/collaborators/discussions +[Collaborators discussion page]: https://github.com/orgs/nodejs/teams/collaborators/discussions [Consensus Seeking]: https://en.wikipedia.org/wiki/Consensus-seeking_decision-making [TSC Charter]: https://github.com/nodejs/TSC/blob/master/TSC-Charter.md [nodejs/node]: https://github.com/nodejs/node diff --git a/LICENSE b/LICENSE index 59f5c0e6ecd462..6125b8268a41ca 100644 --- a/LICENSE +++ b/LICENSE @@ -118,8 +118,8 @@ The externally maintained libraries used by Node.js are: """ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) - Copyright © 1991-2018 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + Copyright © 1991-2019 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in https://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation @@ -1103,7 +1103,7 @@ The externally maintained libraries used by Node.js are: // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- jinja2, located at tools/jinja2, is licensed as follows: +- jinja2, located at tools/inspector_protocol/jinja2, is licensed as follows: """ Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. @@ -1138,7 +1138,7 @@ The externally maintained libraries used by Node.js are: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -- markupsafe, located at tools/markupsafe, is licensed as follows: +- markupsafe, located at tools/inspector_protocol/markupsafe, is licensed as follows: """ Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS for more details. @@ -1255,7 +1255,7 @@ The externally maintained libraries used by Node.js are: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -- gtest, located at deps/gtest, is licensed as follows: +- gtest, located at test/cctest/gtest, is licensed as follows: """ Copyright 2008, Google Inc. All rights reserved. diff --git a/Makefile b/Makefile index d04aac3515a181..d41bf1601fb599 100644 --- a/Makefile +++ b/Makefile @@ -1226,6 +1226,8 @@ LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ tools/icu/*.h \ tools/code_cache/*.cc \ tools/code_cache/*.h \ + tools/snapshot/*.cc \ + tools/snapshot/*.h \ )) # Code blocks don't have newline at the end, diff --git a/benchmark/http/bench-parser.js b/benchmark/http/bench-parser.js index a54f0efa75e3c1..271ac55d007028 100644 --- a/benchmark/http/bench-parser.js +++ b/benchmark/http/bench-parser.js @@ -24,7 +24,7 @@ function main({ len, n }) { bench.start(); for (var i = 0; i < n; i++) { parser.execute(header, 0, header.length); - parser.reinitialize(REQUEST, i > 0); + parser.initialize(REQUEST, header); } bench.end(n); } diff --git a/configure.py b/configure.py index 1a0819e74113bc..1dd6da6d2b997a 100755 --- a/configure.py +++ b/configure.py @@ -421,6 +421,11 @@ dest='with_ltcg', help='Use Link Time Code Generation. This feature is only available on Windows.') +parser.add_option('--with-node-snapshot', + action='store_true', + dest='with_node_snapshot', + help='Turn on V8 snapshot integration. Currently experimental.') + intl_optgroup.add_option('--download', action='store', dest='download_list', @@ -928,6 +933,13 @@ def configure_node(o): o['variables']['want_separate_host_toolset'] = int( cross_compiling and want_snapshots) + if options.with_node_snapshot: + o['variables']['node_use_node_snapshot'] = 'true' + else: + # Default to false for now. + # TODO(joyeecheung): enable it once we fix the hashseed uniqueness + o['variables']['node_use_node_snapshot'] = 'false' + if target_arch == 'arm': configure_arm(o) @@ -1249,7 +1261,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): def icu_download(path): - with open('tools/icu/current_ver.dep') as f: + depFile = 'tools/icu/current_ver.dep'; + with open(depFile) as f: icus = json.load(f) # download ICU, if needed if not os.access(options.download_path, os.W_OK): @@ -1258,7 +1271,12 @@ def icu_download(path): attemptdownload = nodedownload.candownload(auto_downloads, "icu") for icu in icus: url = icu['url'] - md5 = icu['md5'] + (expectHash, hashAlgo, allAlgos) = nodedownload.findHash(icu) + if not expectHash: + error('''Could not find a hash to verify ICU download. + %s may be incorrect. + For the entry %s, + Expected one of these keys: %s''' % (depFile, url, ' '.join(allAlgos))) local = url.split('/')[-1] targetfile = os.path.join(options.download_path, local) if not os.path.isfile(targetfile): @@ -1267,13 +1285,13 @@ def icu_download(path): else: print('Re-using existing %s' % targetfile) if os.path.isfile(targetfile): - print('Checking file integrity with MD5:\r') - gotmd5 = nodedownload.md5sum(targetfile) - print('MD5: %s %s' % (gotmd5, targetfile)) - if (md5 == gotmd5): + print('Checking file integrity with %s:\r' % hashAlgo) + gotHash = nodedownload.checkHash(targetfile, hashAlgo) + print('%s: %s %s' % (hashAlgo, gotHash, targetfile)) + if (expectHash == gotHash): return targetfile else: - warn('Expected: %s *MISMATCH*' % md5) + warn('Expected: %s *MISMATCH*' % expectHash) warn('\n ** Corrupted ZIP? Delete %s to retry download.\n' % targetfile) return None icu_config = { diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 25b6eb9d3415e6..2e01e368768a4b 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -1,7 +1,7 @@ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) -Copyright © 1991-2018 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in http://www.unicode.org/copyright.html. +Copyright © 1991-2019 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index 2ff8a36061cfad..efc3ebe925cbba 100644 --- a/deps/icu-small/README-SMALL-ICU.txt +++ b/deps/icu-small/README-SMALL-ICU.txt @@ -1,8 +1,8 @@ Small ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=small-icu (the default) -It is a strict subset of ICU 63 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt63l.dat : Reduced-size data file +It is a strict subset of ICU 64 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt64l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index a513bafb160c85..42771b3617747d 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -124,13 +124,12 @@ static void U_CALLCONV _deleteEngine(void *obj) { U_CDECL_END U_NAMESPACE_BEGIN -static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER; - const LanguageBreakEngine * ICULanguageBreakFactory::getEngineFor(UChar32 c) { const LanguageBreakEngine *lbe = NULL; UErrorCode status = U_ZERO_ERROR; + static UMutex gBreakEngineMutex = U_MUTEX_INITIALIZER; Mutex m(&gBreakEngineMutex); if (fEngines == NULL) { diff --git a/deps/icu-small/source/common/capi_helper.h b/deps/icu-small/source/common/capi_helper.h new file mode 100644 index 00000000000000..54b1db9e331805 --- /dev/null +++ b/deps/icu-small/source/common/capi_helper.h @@ -0,0 +1,97 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __CAPI_HELPER_H__ +#define __CAPI_HELPER_H__ + +#include "unicode/utypes.h" + +U_NAMESPACE_BEGIN + +/** + * An internal helper class to help convert between C and C++ APIs. + */ +template +class IcuCApiHelper { + public: + /** + * Convert from the C type to the C++ type (const version). + */ + static const CPPType* validate(const CType* input, UErrorCode& status); + + /** + * Convert from the C type to the C++ type (non-const version). + */ + static CPPType* validate(CType* input, UErrorCode& status); + + /** + * Convert from the C++ type to the C type (const version). + */ + const CType* exportConstForC() const; + + /** + * Convert from the C++ type to the C type (non-const version). + */ + CType* exportForC(); + + /** + * Invalidates the object. + */ + ~IcuCApiHelper(); + + private: + /** + * While the object is valid, fMagic equals kMagic. + */ + int32_t fMagic = kMagic; +}; + + +template +const CPPType* +IcuCApiHelper::validate(const CType* input, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + if (input == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + auto* impl = reinterpret_cast(input); + if (static_cast*>(impl)->fMagic != kMagic) { + status = U_INVALID_FORMAT_ERROR; + return nullptr; + } + return impl; +} + +template +CPPType* +IcuCApiHelper::validate(CType* input, UErrorCode& status) { + auto* constInput = static_cast(input); + auto* validated = validate(constInput, status); + return const_cast(validated); +} + +template +const CType* +IcuCApiHelper::exportConstForC() const { + return reinterpret_cast(static_cast(this)); +} + +template +CType* +IcuCApiHelper::exportForC() { + return reinterpret_cast(static_cast(this)); +} + +template +IcuCApiHelper::~IcuCApiHelper() { + // head off application errors by preventing use of of deleted objects. + fMagic = 0; +} + + +U_NAMESPACE_END + +#endif // __CAPI_HELPER_H__ diff --git a/deps/icu-small/source/common/characterproperties.cpp b/deps/icu-small/source/common/characterproperties.cpp index 3aff85b3f1193e..5a57364375b372 100644 --- a/deps/icu-small/source/common/characterproperties.cpp +++ b/deps/icu-small/source/common/characterproperties.cpp @@ -23,6 +23,11 @@ #include "umutex.h" #include "uprops.h" +using icu::LocalPointer; +#if !UCONFIG_NO_NORMALIZATION +using icu::Normalizer2Factory; +using icu::Normalizer2Impl; +#endif using icu::UInitOnce; using icu::UnicodeSet; @@ -30,17 +35,22 @@ namespace { UBool U_CALLCONV characterproperties_cleanup(); +constexpr int32_t NUM_INCLUSIONS = UPROPS_SRC_COUNT + UCHAR_INT_LIMIT - UCHAR_INT_START; + struct Inclusion { UnicodeSet *fSet; UInitOnce fInitOnce; }; -Inclusion gInclusions[UPROPS_SRC_COUNT]; // cached getInclusions() +Inclusion gInclusions[NUM_INCLUSIONS]; // cached getInclusions() UnicodeSet *sets[UCHAR_BINARY_LIMIT] = {}; UCPMap *maps[UCHAR_INT_LIMIT - UCHAR_INT_START] = {}; -UMutex cpMutex = U_MUTEX_INITIALIZER; +icu::UMutex *cpMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} //---------------------------------------------------------------- // Inclusions list @@ -80,35 +90,22 @@ UBool U_CALLCONV characterproperties_cleanup() { return TRUE; } -} // namespace - -U_NAMESPACE_BEGIN - -/* -Reduce excessive reallocation, and make it easier to detect initialization problems. -Usually you don't see smaller sets than this for Unicode 5.0. -*/ -constexpr int32_t DEFAULT_INCLUSION_CAPACITY = 3072; - -void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCode &errorCode) { +void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode) { // This function is invoked only via umtx_initOnce(). - // This function is a friend of class UnicodeSet. - U_ASSERT(0 <= src && src < UPROPS_SRC_COUNT); if (src == UPROPS_SRC_NONE) { errorCode = U_INTERNAL_PROGRAM_ERROR; return; } - UnicodeSet * &incl = gInclusions[src].fSet; - U_ASSERT(incl == nullptr); + U_ASSERT(gInclusions[src].fSet == nullptr); - incl = new UnicodeSet(); - if (incl == nullptr) { + LocalPointer incl(new UnicodeSet()); + if (incl.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } USetAdder sa = { - (USet *)incl, + (USet *)incl.getAlias(), _set_add, _set_addRange, _set_addString, @@ -116,7 +113,6 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo nullptr // don't need removeRange() }; - incl->ensureCapacity(DEFAULT_INCLUSION_CAPACITY, errorCode); switch(src) { case UPROPS_SRC_CHAR: uchar_addPropertyStarts(&sa, &errorCode); @@ -183,12 +179,15 @@ void U_CALLCONV CharacterProperties::initInclusion(UPropertySource src, UErrorCo } if (U_FAILURE(errorCode)) { - delete incl; - incl = nullptr; return; } - // Compact for caching + if (incl->isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + // Compact for caching. incl->compact(); + gInclusions[src].fSet = incl.orphan(); ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup); } @@ -199,15 +198,66 @@ const UnicodeSet *getInclusionsForSource(UPropertySource src, UErrorCode &errorC return nullptr; } Inclusion &i = gInclusions[src]; - umtx_initOnce(i.fInitOnce, &CharacterProperties::initInclusion, src, errorCode); + umtx_initOnce(i.fInitOnce, &initInclusion, src, errorCode); return i.fSet; } +void U_CALLCONV initIntPropInclusion(UProperty prop, UErrorCode &errorCode) { + // This function is invoked only via umtx_initOnce(). + U_ASSERT(UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT); + int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START; + U_ASSERT(gInclusions[inclIndex].fSet == nullptr); + UPropertySource src = uprops_getSource(prop); + const UnicodeSet *incl = getInclusionsForSource(src, errorCode); + if (U_FAILURE(errorCode)) { + return; + } + + LocalPointer intPropIncl(new UnicodeSet(0, 0)); + if (intPropIncl.isNull()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + int32_t numRanges = incl->getRangeCount(); + int32_t prevValue = 0; + for (int32_t i = 0; i < numRanges; ++i) { + UChar32 rangeEnd = incl->getRangeEnd(i); + for (UChar32 c = incl->getRangeStart(i); c <= rangeEnd; ++c) { + // TODO: Get a UCharacterProperty.IntProperty to avoid the property dispatch. + int32_t value = u_getIntPropertyValue(c, prop); + if (value != prevValue) { + intPropIncl->add(c); + prevValue = value; + } + } + } + + if (intPropIncl->isBogus()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + // Compact for caching. + intPropIncl->compact(); + gInclusions[inclIndex].fSet = intPropIncl.orphan(); + ucln_common_registerCleanup(UCLN_COMMON_CHARACTERPROPERTIES, characterproperties_cleanup); +} + +} // namespace + +U_NAMESPACE_BEGIN + const UnicodeSet *CharacterProperties::getInclusionsForProperty( UProperty prop, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - UPropertySource src = uprops_getSource(prop); - return getInclusionsForSource(src, errorCode); + if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) { + int32_t inclIndex = UPROPS_SRC_COUNT + prop - UCHAR_INT_START; + Inclusion &i = gInclusions[inclIndex]; + umtx_initOnce(i.fInitOnce, &initIntPropInclusion, prop, errorCode); + return i.fSet; + } else { + UPropertySource src = uprops_getSource(prop); + return getInclusionsForSource(src, errorCode); + } } U_NAMESPACE_END @@ -216,7 +266,7 @@ namespace { UnicodeSet *makeSet(UProperty property, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } - icu::LocalPointer set(new UnicodeSet()); + LocalPointer set(new UnicodeSet()); if (set.isNull()) { errorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -311,7 +361,7 @@ u_getBinaryPropertySet(UProperty property, UErrorCode *pErrorCode) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - Mutex m(&cpMutex); + Mutex m(cpMutex()); UnicodeSet *set = sets[property]; if (set == nullptr) { sets[property] = set = makeSet(property, *pErrorCode); @@ -327,7 +377,7 @@ u_getIntPropertyMap(UProperty property, UErrorCode *pErrorCode) { *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - Mutex m(&cpMutex); + Mutex m(cpMutex()); UCPMap *map = maps[property - UCHAR_INT_START]; if (map == nullptr) { maps[property - UCHAR_INT_START] = map = makeMap(property, *pErrorCode); diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index a6dd209d80b2f3..f501b20a14ca13 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -50,6 +50,7 @@ #define UPRV_LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) #define uprv_memset(buffer, mark, size) U_STANDARD_CPP_NAMESPACE memset(buffer, mark, size) #define uprv_memcmp(buffer1, buffer2, size) U_STANDARD_CPP_NAMESPACE memcmp(buffer1, buffer2,size) +#define uprv_memchr(ptr, value, num) U_STANDARD_CPP_NAMESPACE memchr(ptr, value, num) U_CAPI void * U_EXPORT2 uprv_malloc(size_t s) U_MALLOC_ATTR U_ALLOC_SIZE_ATTR(1); @@ -122,6 +123,9 @@ uprv_deleteUObject(void *obj); #ifdef __cplusplus +#include +#include "unicode/uobject.h" + U_NAMESPACE_BEGIN /** @@ -161,17 +165,6 @@ class LocalMemory : public LocalPointerBase { * @return *this */ LocalMemory &operator=(LocalMemory &&src) U_NOEXCEPT { - return moveFrom(src); - } - /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. - * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer - * @return *this - */ - LocalMemory &moveFrom(LocalMemory &src) U_NOEXCEPT { uprv_free(LocalPointerBase::ptr); LocalPointerBase::ptr=src.ptr; src.ptr=NULL; @@ -282,11 +275,18 @@ inline T *LocalMemory::allocateInsteadAndCopy(int32_t newCapacity, int32_t le * * WARNING: MaybeStackArray only works with primitive (plain-old data) types. * It does NOT know how to call a destructor! If you work with classes with - * destructors, consider LocalArray in localpointer.h. + * destructors, consider LocalArray in localpointer.h or MemoryPool. */ template class MaybeStackArray { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + /** * Default constructor initializes with internal T[stackCapacity] buffer. */ @@ -298,7 +298,7 @@ class MaybeStackArray { */ MaybeStackArray(int32_t newCapacity) : MaybeStackArray() { if (capacity < newCapacity) { resize(newCapacity); } - }; + } /** * Destructor deletes the array (if owned). */ @@ -399,20 +399,6 @@ class MaybeStackArray { /* No ownership transfer: No copy constructor, no assignment operator. */ MaybeStackArray(const MaybeStackArray & /*other*/) {} void operator=(const MaybeStackArray & /*other*/) {} - - // No heap allocation. Use only on the stack. - // (Declaring these functions private triggers a cascade of problems: - // MSVC insists on exporting an instantiation of MaybeStackArray, which - // requires that all functions be defined. - // An empty implementation of new() is rejected, it must return a value. - // Returning NULL is rejected by gcc for operator new. - // The expedient thing is just not to override operator new. - // While relatively pointless, heap allocated instances will function. - // static void * U_EXPORT2 operator new(size_t size); - // static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - // static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; template @@ -509,6 +495,13 @@ inline T *MaybeStackArray::orphanOrClone(int32_t length, int32 template class MaybeStackHeaderAndArray { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + /** * Default constructor initializes with internal H+T[stackCapacity] buffer. */ @@ -605,15 +598,6 @@ class MaybeStackHeaderAndArray { /* No ownership transfer: No copy constructor, no assignment operator. */ MaybeStackHeaderAndArray(const MaybeStackHeaderAndArray & /*other*/) {} void operator=(const MaybeStackHeaderAndArray & /*other*/) {} - - // No heap allocation. Use only on the stack. - // (Declaring these functions private triggers a cascade of problems; - // see the MaybeStackArray class for details.) - // static void * U_EXPORT2 operator new(size_t size); - // static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - // static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; template @@ -675,6 +659,78 @@ inline H *MaybeStackHeaderAndArray::orphanOrClone(int32_t l return p; } +/** + * A simple memory management class that creates new heap allocated objects (of + * any class that has a public constructor), keeps track of them and eventually + * deletes them all in its own destructor. + * + * A typical use-case would be code like this: + * + * MemoryPool pool; + * + * MyType* o1 = pool.create(); + * if (o1 != nullptr) { + * foo(o1); + * } + * + * MyType* o2 = pool.create(1, 2, 3); + * if (o2 != nullptr) { + * bar(o2); + * } + * + * // MemoryPool will take care of deleting the MyType objects. + * + * It doesn't do anything more than that, and is intentionally kept minimalist. + */ +template +class MemoryPool : public UMemory { +public: + MemoryPool() : count(0), pool() {} + + ~MemoryPool() { + for (int32_t i = 0; i < count; ++i) { + delete pool[i]; + } + } + + MemoryPool(const MemoryPool&) = delete; + MemoryPool& operator=(const MemoryPool&) = delete; + + MemoryPool(MemoryPool&& other) U_NOEXCEPT : count(other.count), + pool(std::move(other.pool)) { + other.count = 0; + } + + MemoryPool& operator=(MemoryPool&& other) U_NOEXCEPT { + count = other.count; + pool = std::move(other.pool); + other.count = 0; + return *this; + } + + /** + * Creates a new object of typename T, by forwarding any and all arguments + * to the typename T constructor. + * + * @param args Arguments to be forwarded to the typename T constructor. + * @return A pointer to the newly created object, or nullptr on error. + */ + template + T* create(Args&&... args) { + int32_t capacity = pool.getCapacity(); + if (count == capacity && + pool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity, + capacity) == nullptr) { + return nullptr; + } + return pool[count++] = new T(std::forward(args)...); + } + +private: + int32_t count; + MaybeStackArray pool; +}; + U_NAMESPACE_END #endif /* __cplusplus */ diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 0e4d0850fac912..6ceba21a244047 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -7,6 +7,8 @@ ******************************************************************************* */ +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_BREAK_ITERATION @@ -101,8 +103,8 @@ class PossibleWord { int32_t cpLengths[POSSIBLE_WORD_LIST_MAX]; // Word Lengths, in code points. public: - PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {}; - ~PossibleWord() {}; + PossibleWord() : count(0), prefix(0), offset(-1), mark(0), current(0) {} + ~PossibleWord() {} // Fill the list of candidates if needed, select the longest, and return the number found int32_t candidates( UText *text, DictionaryMatcher *dict, int32_t rangeEnd ); @@ -116,13 +118,13 @@ class PossibleWord { // Return the longest prefix this candidate location shares with a dictionary word // Return value is in code points. - int32_t longestPrefix() { return prefix; }; + int32_t longestPrefix() { return prefix; } // Mark the current candidate as the one we like - void markCurrent() { mark = current; }; + void markCurrent() { mark = current; } // Get length in code points of the marked word. - int32_t markedCPLength() { return cpLengths[mark]; }; + int32_t markedCPLength() { return cpLengths[mark]; } }; @@ -1204,8 +1206,8 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, inputMap->elementAti(inString.length()) : inString.length()+rangeStart; normalizedMap->addElement(nativeEnd, status); - inputMap.moveFrom(normalizedMap); - inString.moveFrom(normalizedInput); + inputMap = std::move(normalizedMap); + inString = std::move(normalizedInput); } int32_t numCodePts = inString.countChar32(); diff --git a/deps/icu-small/source/common/dictionarydata.h b/deps/icu-small/source/common/dictionarydata.h index 5aec8fe0283630..d86c6dfdbbc71b 100644 --- a/deps/icu-small/source/common/dictionarydata.h +++ b/deps/icu-small/source/common/dictionarydata.h @@ -68,7 +68,7 @@ class U_COMMON_API DictionaryData : public UMemory { */ class U_COMMON_API DictionaryMatcher : public UMemory { public: - DictionaryMatcher() {}; + DictionaryMatcher() {} virtual ~DictionaryMatcher(); // this should emulate CompactTrieDictionary::matches() /* @param text The text in which to look for matching words. Matching begins diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index cc82ad2454b440..fa1e4ee9affc7b 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -41,7 +41,7 @@ class U_COMMON_API Hashtable : public UMemory { * @param ignoreKeyCase If true, keys are case insensitive. * @param status Error code */ - Hashtable(UBool ignoreKeyCase, UErrorCode& status); + inline Hashtable(UBool ignoreKeyCase, UErrorCode& status); /** * Construct a hashtable @@ -49,7 +49,7 @@ class U_COMMON_API Hashtable : public UMemory { * @param size initial size allocation * @param status Error code */ - Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + inline Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); /** * Construct a hashtable @@ -57,57 +57,57 @@ class U_COMMON_API Hashtable : public UMemory { * @param valueComp Comparator for comparing the values * @param status Error code */ - Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); /** * Construct a hashtable * @param status Error code */ - Hashtable(UErrorCode& status); + inline Hashtable(UErrorCode& status); /** * Construct a hashtable, _disregarding any error_. Use this constructor * with caution. */ - Hashtable(); + inline Hashtable(); /** * Non-virtual destructor; make this virtual if Hashtable is subclassed * in the future. */ - ~Hashtable(); + inline ~Hashtable(); - UObjectDeleter *setValueDeleter(UObjectDeleter *fn); + inline UObjectDeleter *setValueDeleter(UObjectDeleter *fn); - int32_t count() const; + inline int32_t count() const; - void* put(const UnicodeString& key, void* value, UErrorCode& status); + inline void* put(const UnicodeString& key, void* value, UErrorCode& status); - int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); + inline int32_t puti(const UnicodeString& key, int32_t value, UErrorCode& status); - void* get(const UnicodeString& key) const; + inline void* get(const UnicodeString& key) const; - int32_t geti(const UnicodeString& key) const; + inline int32_t geti(const UnicodeString& key) const; - void* remove(const UnicodeString& key); + inline void* remove(const UnicodeString& key); - int32_t removei(const UnicodeString& key); + inline int32_t removei(const UnicodeString& key); - void removeAll(void); + inline void removeAll(void); - const UHashElement* find(const UnicodeString& key) const; + inline const UHashElement* find(const UnicodeString& key) const; /** * @param pos - must be UHASH_FIRST on first call, and untouched afterwards. * @see uhash_nextElement */ - const UHashElement* nextElement(int32_t& pos) const; + inline const UHashElement* nextElement(int32_t& pos) const; - UKeyComparator* setKeyComparator(UKeyComparator*keyComp); + inline UKeyComparator* setKeyComparator(UKeyComparator*keyComp); - UValueComparator* setValueComparator(UValueComparator* valueComp); + inline UValueComparator* setValueComparator(UValueComparator* valueComp); - UBool equals(const Hashtable& that) const; + inline UBool equals(const Hashtable& that) const; private: Hashtable(const Hashtable &other); // forbid copying of this class Hashtable &operator=(const Hashtable &other); // forbid copying of this class diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 82cb325b723311..e4b36f1055f15d 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -157,7 +157,7 @@ static void U_CALLCONV initSingletons(const char *what, UErrorCode &errorCode) { } else if (uprv_strcmp(what, "nfkc_cf") == 0) { nfkc_cfSingleton = Norm2AllModes::createInstance(NULL, "nfkc_cf", errorCode); } else { - U_ASSERT(FALSE); // Unknown singleton + UPRV_UNREACHABLE; // Unknown singleton } ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_cleanup); } diff --git a/deps/icu-small/source/common/localebuilder.cpp b/deps/icu-small/source/common/localebuilder.cpp new file mode 100644 index 00000000000000..fe931fcf759dfd --- /dev/null +++ b/deps/icu-small/source/common/localebuilder.cpp @@ -0,0 +1,436 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include + +#include "bytesinkutil.h" // CharStringByteSink +#include "charstr.h" +#include "cstring.h" +#include "ulocimp.h" +#include "unicode/localebuilder.h" +#include "unicode/locid.h" + +U_NAMESPACE_BEGIN + +#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) +#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) + +const char* kAttributeKey = "attribute"; + +static bool _isExtensionSubtags(char key, const char* s, int32_t len) { + switch (uprv_tolower(key)) { + case 'u': + return ultag_isUnicodeExtensionSubtags(s, len); + case 't': + return ultag_isTransformedExtensionSubtags(s, len); + case 'x': + return ultag_isPrivateuseValueSubtags(s, len); + default: + return ultag_isExtensionSubtags(s, len); + } +} + +LocaleBuilder::LocaleBuilder() : UObject(), status_(U_ZERO_ERROR), language_(), + script_(), region_(), variant_(nullptr), extensions_(nullptr) +{ + language_[0] = 0; + script_[0] = 0; + region_[0] = 0; +} + +LocaleBuilder::~LocaleBuilder() +{ + delete variant_; + delete extensions_; +} + +LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale) +{ + clear(); + setLanguage(locale.getLanguage()); + setScript(locale.getScript()); + setRegion(locale.getCountry()); + setVariant(locale.getVariant()); + extensions_ = locale.clone(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + } + return *this; +} + +LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) +{ + Locale l = Locale::forLanguageTag(tag, status_); + if (U_FAILURE(status_)) { return *this; } + // Because setLocale will reset status_ we need to return + // first if we have error in forLanguageTag. + setLocale(l); + return *this; +} + +static void setField(StringPiece input, char* dest, UErrorCode& errorCode, + UBool (*test)(const char*, int32_t)) { + if (U_FAILURE(errorCode)) { return; } + if (input.empty()) { + dest[0] = '\0'; + } else if (test(input.data(), input.length())) { + uprv_memcpy(dest, input.data(), input.length()); + dest[input.length()] = '\0'; + } else { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } +} + +LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) +{ + setField(language, language_, status_, &ultag_isLanguageSubtag); + return *this; +} + +LocaleBuilder& LocaleBuilder::setScript(StringPiece script) +{ + setField(script, script_, status_, &ultag_isScriptSubtag); + return *this; +} + +LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) +{ + setField(region, region_, status_, &ultag_isRegionSubtag); + return *this; +} + +static void transform(char* data, int32_t len) { + for (int32_t i = 0; i < len; i++, data++) { + if (*data == '_') { + *data = '-'; + } else { + *data = uprv_tolower(*data); + } + } +} + +LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) +{ + if (U_FAILURE(status_)) { return *this; } + if (variant.empty()) { + delete variant_; + variant_ = nullptr; + return *this; + } + CharString* new_variant = new CharString(variant, status_); + if (U_FAILURE(status_)) { return *this; } + if (new_variant == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + transform(new_variant->data(), new_variant->length()); + if (!ultag_isVariantSubtags(new_variant->data(), new_variant->length())) { + delete new_variant; + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + delete variant_; + variant_ = new_variant; + return *this; +} + +static bool +_isKeywordValue(const char* key, const char* value, int32_t value_len) +{ + if (key[1] == '\0') { + // one char key + return (UPRV_ISALPHANUM(uprv_tolower(key[0])) && + _isExtensionSubtags(key[0], value, value_len)); + } else if (uprv_strcmp(key, kAttributeKey) == 0) { + // unicode attributes + return ultag_isUnicodeLocaleAttributes(value, value_len); + } + // otherwise: unicode extension value + // We need to convert from legacy key/value to unicode + // key/value + const char* unicode_locale_key = uloc_toUnicodeLocaleKey(key); + const char* unicode_locale_type = uloc_toUnicodeLocaleType(key, value); + + return unicode_locale_key && unicode_locale_type && + ultag_isUnicodeLocaleKey(unicode_locale_key, -1) && + ultag_isUnicodeLocaleType(unicode_locale_type, -1); +} + +static void +_copyExtensions(const Locale& from, Locale* to, bool validate, UErrorCode& errorCode) +{ + if (U_FAILURE(errorCode)) { return; } + LocalPointer iter(from.createKeywords(errorCode)); + if (U_FAILURE(errorCode) || iter.isNull()) { return; } + const char* key; + while ((key = iter->next(nullptr, errorCode)) != nullptr) { + CharString value; + CharStringByteSink sink(&value); + from.getKeywordValue(key, sink, errorCode); + if (U_FAILURE(errorCode)) { return; } + if (uprv_strcmp(key, kAttributeKey) == 0) { + transform(value.data(), value.length()); + } + if (validate && + !_isKeywordValue(key, value.data(), value.length())) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + to->setKeywordValue(key, value.data(), errorCode); + if (U_FAILURE(errorCode)) { return; } + } +} + +void static +_clearUAttributesAndKeyType(Locale* locale, UErrorCode& errorCode) +{ + // Clear Unicode attributes + locale->setKeywordValue(kAttributeKey, "", errorCode); + + // Clear all Unicode keyword values + LocalPointer iter(locale->createUnicodeKeywords(errorCode)); + if (U_FAILURE(errorCode) || iter.isNull()) { return; } + const char* key; + while ((key = iter->next(nullptr, errorCode)) != nullptr) { + locale->setUnicodeKeywordValue(key, nullptr, errorCode); + } +} + +static void +_setUnicodeExtensions(Locale* locale, const CharString& value, UErrorCode& errorCode) +{ + // Add the unicode extensions to extensions_ + CharString locale_str("und-u-", errorCode); + locale_str.append(value, errorCode); + _copyExtensions( + Locale::forLanguageTag(locale_str.data(), errorCode), + locale, false, errorCode); +} + +LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) +{ + if (U_FAILURE(status_)) { return *this; } + if (!UPRV_ISALPHANUM(key)) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!value_str.isEmpty() && + !_isExtensionSubtags(key, value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + } + if (uprv_tolower(key) != 'u') { + // for t, x and others extension. + extensions_->setKeywordValue(StringPiece(&key, 1), value_str.data(), + status_); + return *this; + } + _clearUAttributesAndKeyType(extensions_, status_); + if (U_FAILURE(status_)) { return *this; } + if (!value.empty()) { + _setUnicodeExtensions(extensions_, value_str, status_); + } + return *this; +} + +LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword( + StringPiece key, StringPiece type) +{ + if (U_FAILURE(status_)) { return *this; } + if (!ultag_isUnicodeLocaleKey(key.data(), key.length()) || + (!type.empty() && + !ultag_isUnicodeLocaleType(type.data(), type.length()))) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + } + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + extensions_->setUnicodeKeywordValue(key, type, status_); + return *this; +} + +LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( + StringPiece value) +{ + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { + extensions_ = new Locale(); + if (extensions_ == nullptr) { + status_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + extensions_->setKeywordValue(kAttributeKey, value_str.data(), status_); + return *this; + } + + CharString attributes; + CharStringByteSink sink(&attributes); + UErrorCode localErrorCode = U_ZERO_ERROR; + extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + if (U_FAILURE(localErrorCode)) { + CharString new_attributes(value_str.data(), status_); + // No attributes, set the attribute. + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + return *this; + } + + transform(attributes.data(),attributes.length()); + const char* start = attributes.data(); + const char* limit = attributes.data() + attributes.length(); + CharString new_attributes; + bool inserted = false; + while (start < limit) { + if (!inserted) { + int cmp = uprv_strcmp(start, value_str.data()); + if (cmp == 0) { return *this; } // Found it in attributes: Just return + if (cmp > 0) { + if (!new_attributes.isEmpty()) new_attributes.append('_', status_); + new_attributes.append(value_str.data(), status_); + inserted = true; + } + } + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(start, status_); + start += uprv_strlen(start) + 1; + } + if (!inserted) { + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(value_str.data(), status_); + } + // Not yet in the attributes, set the attribute. + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + return *this; +} + +LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( + StringPiece value) +{ + CharString value_str(value, status_); + if (U_FAILURE(status_)) { return *this; } + transform(value_str.data(), value_str.length()); + if (!ultag_isUnicodeLocaleAttribute(value_str.data(), value_str.length())) { + status_ = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if (extensions_ == nullptr) { return *this; } + UErrorCode localErrorCode = U_ZERO_ERROR; + CharString attributes; + CharStringByteSink sink(&attributes); + extensions_->getKeywordValue(kAttributeKey, sink, localErrorCode); + // get failure, just return + if (U_FAILURE(localErrorCode)) { return *this; } + // Do not have any attributes, just return. + if (attributes.isEmpty()) { return *this; } + + char* p = attributes.data(); + // Replace null terminiator in place for _ and - so later + // we can use uprv_strcmp to compare. + for (int32_t i = 0; i < attributes.length(); i++, p++) { + *p = (*p == '_' || *p == '-') ? '\0' : uprv_tolower(*p); + } + + const char* start = attributes.data(); + const char* limit = attributes.data() + attributes.length(); + CharString new_attributes; + bool found = false; + while (start < limit) { + if (uprv_strcmp(start, value_str.data()) == 0) { + found = true; + } else { + if (!new_attributes.isEmpty()) { + new_attributes.append('_', status_); + } + new_attributes.append(start, status_); + } + start += uprv_strlen(start) + 1; + } + // Found the value in attributes, set the attribute. + if (found) { + extensions_->setKeywordValue(kAttributeKey, new_attributes.data(), status_); + } + return *this; +} + +LocaleBuilder& LocaleBuilder::clear() +{ + status_ = U_ZERO_ERROR; + language_[0] = 0; + script_[0] = 0; + region_[0] = 0; + delete variant_; + variant_ = nullptr; + clearExtensions(); + return *this; +} + +LocaleBuilder& LocaleBuilder::clearExtensions() +{ + delete extensions_; + extensions_ = nullptr; + return *this; +} + +Locale makeBogusLocale() { + Locale bogus; + bogus.setToBogus(); + return bogus; +} + +Locale LocaleBuilder::build(UErrorCode& errorCode) +{ + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + if (U_FAILURE(status_)) { + errorCode = status_; + return makeBogusLocale(); + } + CharString locale_str(language_, errorCode); + if (uprv_strlen(script_) > 0) { + locale_str.append('-', errorCode).append(StringPiece(script_), errorCode); + } + if (uprv_strlen(region_) > 0) { + locale_str.append('-', errorCode).append(StringPiece(region_), errorCode); + } + if (variant_ != nullptr) { + locale_str.append('-', errorCode).append(StringPiece(variant_->data()), errorCode); + } + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + Locale product(locale_str.data()); + if (extensions_ != nullptr) { + _copyExtensions(*extensions_, &product, true, errorCode); + } + if (U_FAILURE(errorCode)) { + return makeBogusLocale(); + } + return product; +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/localsvc.h b/deps/icu-small/source/common/localsvc.h index 724216aa64169e..0339a44dcd95ec 100644 --- a/deps/icu-small/source/common/localsvc.h +++ b/deps/icu-small/source/common/localsvc.h @@ -12,7 +12,7 @@ #include "unicode/utypes.h" -#if U_LOCAL_SERVICE_HOOK +#if defined(U_LOCAL_SERVICE_HOOK) && U_LOCAL_SERVICE_HOOK /** * Prototype for user-supplied service hook. This function is expected to return * a type of factory object specific to the requested service. diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index b3a3346a195995..1e608ffb9e1c84 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -125,8 +125,6 @@ static UBool U_CALLCONV uloc_cleanup(void) { // via the initOnce mechanism. static void U_CALLCONV loadInstalledLocales() { - UResourceBundle *indexLocale = NULL; - UResourceBundle installed; UErrorCode status = U_ZERO_ERROR; int32_t i = 0; int32_t localeCount; @@ -135,25 +133,25 @@ static void U_CALLCONV loadInstalledLocales() { U_ASSERT(_installedLocalesCount == 0); _installedLocalesCount = 0; - ures_initStackObject(&installed); - indexLocale = ures_openDirect(NULL, _kIndexLocaleName, &status); - ures_getByKey(indexLocale, _kIndexTag, &installed, &status); + + icu::LocalUResourceBundlePointer indexLocale(ures_openDirect(NULL, _kIndexLocaleName, &status)); + icu::StackUResourceBundle installed; + + ures_getByKey(indexLocale.getAlias(), _kIndexTag, installed.getAlias(), &status); if(U_SUCCESS(status)) { - localeCount = ures_getSize(&installed); + localeCount = ures_getSize(installed.getAlias()); _installedLocales = (char **) uprv_malloc(sizeof(char*) * (localeCount+1)); if (_installedLocales != NULL) { - ures_resetIterator(&installed); - while(ures_hasNext(&installed)) { - ures_getNextString(&installed, NULL, (const char **)&_installedLocales[i++], &status); + ures_resetIterator(installed.getAlias()); + while(ures_hasNext(installed.getAlias())) { + ures_getNextString(installed.getAlias(), NULL, (const char **)&_installedLocales[i++], &status); } _installedLocales[i] = NULL; _installedLocalesCount = localeCount; ucln_common_registerCleanup(UCLN_COMMON_ULOC, uloc_cleanup); } } - ures_close(&installed); - ures_close(indexLocale); } static void _load_installedLocales() diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 83c7bc30c02703..7216a3a3083e3d 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -22,6 +22,7 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" #include "unicode/locid.h" +#include "unicode/uenum.h" #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/ustring.h" @@ -306,14 +307,11 @@ _getStringOrCopyKey(const char *path, const char *locale, if(itemKey==NULL) { /* top-level item: normal resource bundle access */ - UResourceBundle *rb; - - rb=ures_open(path, locale, pErrorCode); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, pErrorCode)); if(U_SUCCESS(*pErrorCode)) { - s=ures_getStringByKey(rb, tableKey, &length, pErrorCode); + s=ures_getStringByKey(rb.getAlias(), tableKey, &length, pErrorCode); /* see comment about closing rb near "return item;" in _res_getTableStringWithFallback() */ - ures_close(rb); } } else { /* Language code should not be a number. If it is, set the error code. */ @@ -376,7 +374,12 @@ _getDisplayNameForComponent(const char *locale, return 0; } if(length==0) { - return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + // For the display name, we treat this as unknown language (ICU-20273). + if (getter == uloc_getLanguage) { + uprv_strcpy(localeBuffer, "und"); + } else { + return u_terminateUChars(dest, destCapacity, 0, pErrorCode); + } } root = tag == _kCountries ? U_ICUDATA_REGION : U_ICUDATA_LANG; @@ -510,15 +513,14 @@ uloc_getDisplayName(const char *locale, { UErrorCode status = U_ZERO_ERROR; - UResourceBundle* locbundle=ures_open(U_ICUDATA_LANG, displayLocale, &status); - UResourceBundle* dspbundle=ures_getByKeyWithFallback(locbundle, _kLocaleDisplayPattern, - NULL, &status); - separator=ures_getStringByKeyWithFallback(dspbundle, _kSeparator, &sepLen, &status); - pattern=ures_getStringByKeyWithFallback(dspbundle, _kPattern, &patLen, &status); + icu::LocalUResourceBundlePointer locbundle( + ures_open(U_ICUDATA_LANG, displayLocale, &status)); + icu::LocalUResourceBundlePointer dspbundle( + ures_getByKeyWithFallback(locbundle.getAlias(), _kLocaleDisplayPattern, NULL, &status)); - ures_close(dspbundle); - ures_close(locbundle); + separator=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kSeparator, &sepLen, &status); + pattern=ures_getStringByKeyWithFallback(dspbundle.getAlias(), _kPattern, &patLen, &status); } /* If we couldn't find any data, then use the defaults */ @@ -586,7 +588,7 @@ uloc_getDisplayName(const char *locale, int32_t langPos=0; /* position in output of language substitution */ int32_t restLen=0; /* length of 'everything else' substitution */ int32_t restPos=0; /* position in output of 'everything else' substitution */ - UEnumeration* kenum = NULL; /* keyword enumeration */ + icu::LocalUEnumerationPointer kenum; /* keyword enumeration */ /* prefix of pattern, extremely likely to be empty */ if(sub0Pos) { @@ -639,12 +641,11 @@ uloc_getDisplayName(const char *locale, len=uloc_getDisplayVariant(locale, displayLocale, p, cap, pErrorCode); break; case 3: - kenum = uloc_openKeywords(locale, pErrorCode); + kenum.adoptInstead(uloc_openKeywords(locale, pErrorCode)); U_FALLTHROUGH; default: { - const char* kw=uenum_next(kenum, &len, pErrorCode); + const char* kw=uenum_next(kenum.getAlias(), &len, pErrorCode); if (kw == NULL) { - uenum_close(kenum); len=0; /* mark that we didn't add a component */ subdone=TRUE; } else { @@ -833,16 +834,14 @@ uloc_getDisplayKeywordValue( const char* locale, int32_t dispNameLen = 0; const UChar *dispName = NULL; - UResourceBundle *bundle = ures_open(U_ICUDATA_CURR, displayLocale, status); - UResourceBundle *currencies = ures_getByKey(bundle, _kCurrencies, NULL, status); - UResourceBundle *currency = ures_getByKeyWithFallback(currencies, keywordValue, NULL, status); - - dispName = ures_getStringByIndex(currency, UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); + icu::LocalUResourceBundlePointer bundle( + ures_open(U_ICUDATA_CURR, displayLocale, status)); + icu::LocalUResourceBundlePointer currencies( + ures_getByKey(bundle.getAlias(), _kCurrencies, NULL, status)); + icu::LocalUResourceBundlePointer currency( + ures_getByKeyWithFallback(currencies.getAlias(), keywordValue, NULL, status)); - /*close the bundles */ - ures_close(currency); - ures_close(currencies); - ures_close(bundle); + dispName = ures_getStringByIndex(currency.getAlias(), UCURRENCY_DISPLAY_NAME_INDEX, &dispNameLen, status); if(U_FAILURE(*status)){ if(*status == U_MISSING_RESOURCE_ERROR){ diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 2d9389e910a2ab..da35be9e766e50 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -286,7 +286,6 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { #else UObject* capitalizationBrkIter; #endif - static UMutex capitalizationBrkIterLock; UnicodeString formatOpenParen; UnicodeString formatReplaceOpenParen; UnicodeString formatCloseParen; @@ -352,8 +351,6 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { struct CapitalizationContextSink; }; -UMutex LocaleDisplayNamesImpl::capitalizationBrkIterLock = U_MUTEX_INITIALIZER; - LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, UDialectHandling dialectHandling) : dialectHandling(dialectHandling) @@ -552,6 +549,7 @@ LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= NULL && ( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || fCapitalization[usage] ) ) { // note fCapitalization[usage] won't be set unless capitalizationContext is UI_LIST_OR_MENU or STANDALONE + static UMutex capitalizationBrkIterLock = U_MUTEX_INITIALIZER; Mutex lock(&capitalizationBrkIterLock); result.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); } diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index e0dcc8a88ec0ec..06986b636adc31 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -62,7 +62,10 @@ static Locale *gLocaleCache = NULL; static UInitOnce gLocaleCacheInitOnce = U_INITONCE_INITIALIZER; // gDefaultLocaleMutex protects all access to gDefaultLocalesHashT and gDefaultLocale. -static UMutex gDefaultLocaleMutex = U_MUTEX_INITIALIZER; +static UMutex *gDefaultLocaleMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gDefaultLocalesHashT = NULL; static Locale *gDefaultLocale = NULL; @@ -171,7 +174,7 @@ U_NAMESPACE_BEGIN Locale *locale_set_default_internal(const char *id, UErrorCode& status) { // Synchronize this entire function. - Mutex lock(&gDefaultLocaleMutex); + Mutex lock(gDefaultLocaleMutex()); UBool canonicalize = FALSE; @@ -569,9 +572,13 @@ Locale& Locale::init(const char* localeID, UBool canonicalize) variantBegin = length; /* after uloc_getName/canonicalize() we know that only '_' are separators */ + /* But _ could also appeared in timezone such as "en@timezone=America/Los_Angeles" */ separator = field[0] = fullName; fieldIdx = 1; - while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && fieldIdx < UPRV_LENGTHOF(field)-1) { + char* at = uprv_strchr(fullName, '@'); + while ((separator = uprv_strchr(field[fieldIdx-1], SEP_CHAR)) != 0 && + fieldIdx < UPRV_LENGTHOF(field)-1 && + (at == nullptr || separator < at)) { field[fieldIdx] = separator + 1; fieldLen[fieldIdx-1] = (int32_t)(separator - field[fieldIdx-1]); fieldIdx++; @@ -704,7 +711,7 @@ const Locale& U_EXPORT2 Locale::getDefault() { { - Mutex lock(&gDefaultLocaleMutex); + Mutex lock(gDefaultLocaleMutex()); if (gDefaultLocale != NULL) { return *gDefaultLocale; } @@ -736,46 +743,10 @@ Locale::addLikelySubtags(UErrorCode& status) { return; } - // The maximized locale ID string is often longer, but there is no good - // heuristic to estimate just how much longer. Leave that to CharString. CharString maximizedLocaleID; - int32_t maximizedLocaleIDCapacity = static_cast(uprv_strlen(fullName)); - - char* buffer; - int32_t reslen; - - for (;;) { - buffer = maximizedLocaleID.getAppendBuffer( - /*minCapacity=*/maximizedLocaleIDCapacity, - /*desiredCapacityHint=*/maximizedLocaleIDCapacity, - maximizedLocaleIDCapacity, - status); - - if (U_FAILURE(status)) { - return; - } - - reslen = uloc_addLikelySubtags( - fullName, - buffer, - maximizedLocaleIDCapacity, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - maximizedLocaleIDCapacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - maximizedLocaleID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. + { + CharStringByteSink sink(&maximizedLocaleID); + ulocimp_addLikelySubtags(fullName, sink, &status); } if (U_FAILURE(status)) { @@ -794,50 +765,10 @@ Locale::minimizeSubtags(UErrorCode& status) { return; } - // Except for a few edge cases (like the empty string, that is minimized to - // "en__POSIX"), minimized locale ID strings will be either the same length - // or shorter than their input. CharString minimizedLocaleID; - int32_t minimizedLocaleIDCapacity = static_cast(uprv_strlen(fullName)); - - char* buffer; - int32_t reslen; - - for (;;) { - buffer = minimizedLocaleID.getAppendBuffer( - /*minCapacity=*/minimizedLocaleIDCapacity, - /*desiredCapacityHint=*/minimizedLocaleIDCapacity, - minimizedLocaleIDCapacity, - status); - - if (U_FAILURE(status)) { - return; - } - - reslen = uloc_minimizeSubtags( - fullName, - buffer, - minimizedLocaleIDCapacity, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // Because of the internal minimal buffer size of CharString, I can't - // think of any input data for which this could possibly ever happen. - // Maybe it would be better replaced with an assertion instead? - minimizedLocaleIDCapacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - minimizedLocaleID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. + { + CharStringByteSink sink(&minimizedLocaleID); + ulocimp_minimizeSubtags(fullName, sink, &status); } if (U_FAILURE(status)) { @@ -869,43 +800,16 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) // parsing. Therefore the code here explicitly calls uloc_forLanguageTag() // and then Locale::init(), instead of just calling the normal constructor. - // All simple language tags will have the exact same length as ICU locale - // ID strings as they have as BCP-47 strings (like "en_US" for "en-US"). CharString localeID; - int32_t resultCapacity = tag.size(); - - char* buffer; - int32_t parsedLength, reslen; - - for (;;) { - buffer = localeID.getAppendBuffer( - /*minCapacity=*/resultCapacity, - /*desiredCapacityHint=*/resultCapacity, - resultCapacity, - status); - - if (U_FAILURE(status)) { - return result; - } - - reslen = ulocimp_forLanguageTag( + int32_t parsedLength; + { + CharStringByteSink sink(&localeID); + ulocimp_forLanguageTag( tag.data(), tag.length(), - buffer, - resultCapacity, + sink, &parsedLength, &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // For all BCP-47 language tags that use extensions, the corresponding - // ICU locale ID will be longer but uloc_forLanguageTag() does compute - // the exact length needed so this memory reallocation will be done at - // most once. - resultCapacity = reslen; - status = U_ZERO_ERROR; } if (U_FAILURE(status)) { @@ -917,15 +821,6 @@ Locale::forLanguageTag(StringPiece tag, UErrorCode& status) return result; } - localeID.append(buffer, reslen, status); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators provided by CharString. - } - - if (U_FAILURE(status)) { - return result; - } - result.init(localeID.data(), /*canonicalize=*/FALSE); if (result.isBogus()) { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -945,59 +840,7 @@ Locale::toLanguageTag(ByteSink& sink, UErrorCode& status) const return; } - // All simple language tags will have the exact same length as BCP-47 - // strings as they have as ICU locale IDs (like "en-US" for "en_US"). - LocalMemory scratch; - int32_t scratch_capacity = static_cast(uprv_strlen(fullName)); - - if (scratch_capacity == 0) { - scratch_capacity = 3; // "und" - } - - char* buffer; - int32_t result_capacity, reslen; - - for (;;) { - if (scratch.allocateInsteadAndReset(scratch_capacity) == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - - buffer = sink.GetAppendBuffer( - /*min_capacity=*/scratch_capacity, - /*desired_capacity_hint=*/scratch_capacity, - scratch.getAlias(), - scratch_capacity, - &result_capacity); - - reslen = uloc_toLanguageTag( - fullName, - buffer, - result_capacity, - /*strict=*/FALSE, - &status); - - if (status != U_BUFFER_OVERFLOW_ERROR) { - break; - } - - // For some very few edge cases a language tag will be longer as a - // BCP-47 string than it is as an ICU locale ID. Most notoriously "C" - // expands to the BCP-47 tag "en-US-u-va-posix", 16 times longer, and - // it'll take several calls to uloc_toLanguageTag() to figure that out. - // https://unicode-org.atlassian.net/browse/ICU-20132 - scratch_capacity = reslen; - status = U_ZERO_ERROR; - } - - if (U_FAILURE(status)) { - return; - } - - sink.Append(buffer, reslen); - if (status == U_STRING_NOT_TERMINATED_WARNING) { - status = U_ZERO_ERROR; // Terminators not used. - } + ulocimp_toLanguageTag(fullName, sink, /*strict=*/FALSE, &status); } Locale U_EXPORT2 @@ -1536,12 +1379,16 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName, return; } - const char* legacy_value = - uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data()); + const char* legacy_value = nullptr; - if (legacy_value == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return; + if (!keywordValue_nul.isEmpty()) { + legacy_value = + uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data()); + + if (legacy_value == nullptr) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } } setKeywordValue(legacy_key, legacy_value, status); diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index e5876e2ea22773..50cc2a65de0b2d 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -19,6 +19,7 @@ * that then do not depend on resource bundle code and likely-subtags data. */ +#include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/locid.h" #include "unicode/putil.h" @@ -26,11 +27,20 @@ #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/uscript.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "ulocimp.h" #include "ustr_imp.h" +/** + * These are the canonical strings for unknown languages, scripts and regions. + **/ +static const char* const unknownLanguage = "und"; +static const char* const unknownScript = "Zzzz"; +static const char* const unknownRegion = "ZZ"; + /** * This function looks for the localeID in the likelySubtags resource. * @@ -50,9 +60,22 @@ findLikelySubtags(const char* localeID, int32_t resLen = 0; const UChar* s = NULL; UErrorCode tmpErr = U_ZERO_ERROR; - UResourceBundle* subtags = ures_openDirect(NULL, "likelySubtags", &tmpErr); + icu::LocalUResourceBundlePointer subtags(ures_openDirect(NULL, "likelySubtags", &tmpErr)); if (U_SUCCESS(tmpErr)) { - s = ures_getStringByKey(subtags, localeID, &resLen, &tmpErr); + icu::CharString und; + if (localeID != NULL) { + if (*localeID == '\0') { + localeID = unknownLanguage; + } else if (*localeID == '_') { + und.append(unknownLanguage, *err); + und.append(localeID, *err); + if (U_FAILURE(*err)) { + return NULL; + } + localeID = und.data(); + } + } + s = ures_getStringByKey(subtags.getAlias(), localeID, &resLen, &tmpErr); if (U_FAILURE(tmpErr)) { /* @@ -69,10 +92,13 @@ findLikelySubtags(const char* localeID, } else { u_UCharsToChars(s, buffer, resLen + 1); + if (resLen >= 3 && + uprv_strnicmp(buffer, unknownLanguage, 3) == 0 && + (resLen == 3 || buffer[3] == '_')) { + uprv_memmove(buffer, buffer + 3, resLen - 3 + 1); + } result = buffer; } - - ures_close(subtags); } else { *err = tmpErr; } @@ -96,9 +122,10 @@ appendTag( const char* tag, int32_t tagLength, char* buffer, - int32_t* bufferLength) { + int32_t* bufferLength, + UBool withSeparator) { - if (*bufferLength > 0) { + if (withSeparator) { buffer[*bufferLength] = '_'; ++(*bufferLength); } @@ -111,13 +138,6 @@ appendTag( *bufferLength += tagLength; } -/** - * These are the canonical strings for unknown languages, scripts and regions. - **/ -static const char* const unknownLanguage = "und"; -static const char* const unknownScript = "Zzzz"; -static const char* const unknownRegion = "ZZ"; - /** * Create a tag string from the supplied parameters. The lang, script and region * parameters may be NULL pointers. If they are, their corresponding length parameters @@ -147,12 +167,10 @@ static const char* const unknownRegion = "ZZ"; * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. * @param alternateTags A string containing any alternate tags. - * @param tag The output buffer. - * @param tagCapacity The capacity of the output buffer. + * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. - * @return The length of the tag string, which may be greater than tagCapacity, or -1 on error. **/ -static int32_t U_CALLCONV +static void U_CALLCONV createTagStringWithAlternates( const char* lang, int32_t langLength, @@ -163,16 +181,13 @@ createTagStringWithAlternates( const char* trailing, int32_t trailingLength, const char* alternateTags, - char* tag, - int32_t tagCapacity, + icu::ByteSink& sink, UErrorCode* err) { if (U_FAILURE(*err)) { goto error; } - else if (tag == NULL || - tagCapacity <= 0 || - langLength >= ULOC_LANG_CAPACITY || + else if (langLength >= ULOC_LANG_CAPACITY || scriptLength >= ULOC_SCRIPT_CAPACITY || regionLength >= ULOC_COUNTRY_CAPACITY) { goto error; @@ -186,7 +201,6 @@ createTagStringWithAlternates( **/ char tagBuffer[ULOC_FULLNAME_CAPACITY]; int32_t tagLength = 0; - int32_t capacityRemaining = tagCapacity; UBool regionAppended = FALSE; if (langLength > 0) { @@ -194,18 +208,14 @@ createTagStringWithAlternates( lang, langLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/FALSE); } else if (alternateTags == NULL) { /* - * Append the value for an unknown language, if + * Use the empty string for an unknown language, if * we found no language. */ - appendTag( - unknownLanguage, - (int32_t)uprv_strlen(unknownLanguage), - tagBuffer, - &tagLength); } else { /* @@ -226,21 +236,17 @@ createTagStringWithAlternates( } else if (alternateLangLength == 0) { /* - * Append the value for an unknown language, if + * Use the empty string for an unknown language, if * we found no language. */ - appendTag( - unknownLanguage, - (int32_t)uprv_strlen(unknownLanguage), - tagBuffer, - &tagLength); } else { appendTag( alternateLang, alternateLangLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/FALSE); } } @@ -249,7 +255,8 @@ createTagStringWithAlternates( script, scriptLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); } else if (alternateTags != NULL) { /* @@ -273,7 +280,8 @@ createTagStringWithAlternates( alternateScript, alternateScriptLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); } } @@ -282,7 +290,8 @@ createTagStringWithAlternates( region, regionLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); regionAppended = TRUE; } @@ -307,61 +316,35 @@ createTagStringWithAlternates( alternateRegion, alternateRegionLength, tagBuffer, - &tagLength); + &tagLength, + /*withSeparator=*/TRUE); regionAppended = TRUE; } } - { - const int32_t toCopy = - tagLength >= tagCapacity ? tagCapacity : tagLength; - - /** - * Copy the partial tag from our internal buffer to the supplied - * target. - **/ - uprv_memcpy( - tag, - tagBuffer, - toCopy); - - capacityRemaining -= toCopy; - } + /** + * Copy the partial tag from our internal buffer to the supplied + * target. + **/ + sink.Append(tagBuffer, tagLength); if (trailingLength > 0) { - if (*trailing != '@' && capacityRemaining > 0) { - tag[tagLength++] = '_'; - --capacityRemaining; - if (capacityRemaining > 0 && !regionAppended) { + if (*trailing != '@') { + sink.Append("_", 1); + if (!regionAppended) { /* extra separator is required */ - tag[tagLength++] = '_'; - --capacityRemaining; + sink.Append("_", 1); } } - if (capacityRemaining > 0) { - /* - * Copy the trailing data into the supplied buffer. Use uprv_memmove, since we - * don't know if the user-supplied buffers overlap. - */ - const int32_t toCopy = - trailingLength >= capacityRemaining ? capacityRemaining : trailingLength; - - uprv_memmove( - &tag[tagLength], - trailing, - toCopy); - } + /* + * Copy the trailing data into the supplied buffer. + */ + sink.Append(trailing, trailingLength); } - tagLength += trailingLength; - - return u_terminateChars( - tag, - tagCapacity, - tagLength, - err); + return; } error: @@ -375,8 +358,6 @@ createTagStringWithAlternates( U_SUCCESS(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; } /** @@ -400,12 +381,10 @@ createTagStringWithAlternates( * @param regionLength The length of the region tag. * @param trailing Any trailing data to append to the new tag. * @param trailingLength The length of the trailing data. - * @param tag The output buffer. - * @param tagCapacity The capacity of the output buffer. + * @param sink The output sink receiving the tag string. * @param err A pointer to a UErrorCode for error reporting. - * @return The length of the tag string, which may be greater than tagCapacity. **/ -static int32_t U_CALLCONV +static void U_CALLCONV createTagString( const char* lang, int32_t langLength, @@ -415,11 +394,10 @@ createTagString( int32_t regionLength, const char* trailing, int32_t trailingLength, - char* tag, - int32_t tagCapacity, + icu::ByteSink& sink, UErrorCode* err) { - return createTagStringWithAlternates( + createTagStringWithAlternates( lang, langLength, script, @@ -429,8 +407,7 @@ createTagString( trailing, trailingLength, NULL, - tag, - tagCapacity, + sink, err); } @@ -502,15 +479,9 @@ parseTagString( *langLength = subtagLength; /* - * If no language was present, use the value of unknownLanguage - * instead. Otherwise, move past any separator. + * If no language was present, use the empty string instead. + * Otherwise, move past any separator. */ - if (*langLength == 0) { - uprv_strcpy( - lang, - unknownLanguage); - *langLength = (int32_t)uprv_strlen(lang); - } if (_isIDSeparator(*position)) { ++position; } @@ -578,7 +549,7 @@ parseTagString( goto exit; } -static int32_t U_CALLCONV +static UBool U_CALLCONV createLikelySubtagsString( const char* lang, int32_t langLength, @@ -588,17 +559,14 @@ createLikelySubtagsString( int32_t regionLength, const char* variants, int32_t variantsLength, - char* tag, - int32_t tagCapacity, - UErrorCode* err) -{ + icu::ByteSink& sink, + UErrorCode* err) { /** * ULOC_FULLNAME_CAPACITY will provide enough capacity * that we can build a string that contains the language, * script and region code without worrying about overrunning * the user-supplied buffer. **/ - char tagBuffer[ULOC_FULLNAME_CAPACITY]; char likelySubtagsBuffer[ULOC_FULLNAME_CAPACITY]; if(U_FAILURE(*err)) { @@ -612,25 +580,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - script, - scriptLength, - region, - regionLength, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + script, + scriptLength, + region, + regionLength, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -642,7 +613,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, NULL, @@ -652,9 +623,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -665,25 +636,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - script, - scriptLength, - NULL, - 0, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + script, + scriptLength, + NULL, + 0, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -695,7 +669,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, NULL, @@ -705,9 +679,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -718,25 +692,28 @@ createLikelySubtagsString( const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - NULL, - 0, - region, - regionLength, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + NULL, + 0, + region, + regionLength, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -748,7 +725,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, script, @@ -758,9 +735,9 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } @@ -770,25 +747,28 @@ createLikelySubtagsString( { const char* likelySubtags = NULL; - createTagString( - lang, - langLength, - NULL, - 0, - NULL, - 0, - NULL, - 0, - tagBuffer, - sizeof(tagBuffer), - err); + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); + createTagString( + lang, + langLength, + NULL, + 0, + NULL, + 0, + NULL, + 0, + sink, + err); + } if(U_FAILURE(*err)) { goto error; } likelySubtags = findLikelySubtags( - tagBuffer, + tagBuffer.data(), likelySubtagsBuffer, sizeof(likelySubtagsBuffer), err); @@ -800,7 +780,7 @@ createLikelySubtagsString( /* Always use the language tag from the maximal string, since it may be more specific than the one provided. */ - return createTagStringWithAlternates( + createTagStringWithAlternates( NULL, 0, script, @@ -810,17 +790,13 @@ createLikelySubtagsString( variants, variantsLength, likelySubtags, - tag, - tagCapacity, + sink, err); + return TRUE; } } - return u_terminateChars( - tag, - tagCapacity, - 0, - err); + return FALSE; error: @@ -828,7 +804,7 @@ createLikelySubtagsString( *err = U_ILLEGAL_ARGUMENT_ERROR; } - return -1; + return FALSE; } #define CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength) \ @@ -850,12 +826,10 @@ createLikelySubtagsString( } \ } -static int32_t -_uloc_addLikelySubtags(const char* localeID, - char* maximizedLocaleID, - int32_t maximizedLocaleIDCapacity, - UErrorCode* err) -{ +static void +_uloc_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err) { char lang[ULOC_LANG_CAPACITY]; int32_t langLength = sizeof(lang); char script[ULOC_SCRIPT_CAPACITY]; @@ -865,14 +839,12 @@ _uloc_addLikelySubtags(const char* localeID, const char* trailing = ""; int32_t trailingLength = 0; int32_t trailingIndex = 0; - int32_t resultLength = 0; + UBool success = FALSE; if(U_FAILURE(*err)) { goto error; } - else if (localeID == NULL || - maximizedLocaleID == NULL || - maximizedLocaleIDCapacity <= 0) { + if (localeID == NULL) { goto error; } @@ -903,7 +875,7 @@ _uloc_addLikelySubtags(const char* localeID, CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - resultLength = + success = createLikelySubtagsString( lang, langLength, @@ -913,55 +885,32 @@ _uloc_addLikelySubtags(const char* localeID, regionLength, trailing, trailingLength, - maximizedLocaleID, - maximizedLocaleIDCapacity, + sink, err); - if (resultLength == 0) { + if (!success) { const int32_t localIDLength = (int32_t)uprv_strlen(localeID); /* * If we get here, we need to return localeID. */ - uprv_memcpy( - maximizedLocaleID, - localeID, - localIDLength <= maximizedLocaleIDCapacity ? - localIDLength : maximizedLocaleIDCapacity); - - resultLength = - u_terminateChars( - maximizedLocaleID, - maximizedLocaleIDCapacity, - localIDLength, - err); + sink.Append(localeID, localIDLength); } - return resultLength; + return; error: if (!U_FAILURE(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; } -static int32_t -_uloc_minimizeSubtags(const char* localeID, - char* minimizedLocaleID, - int32_t minimizedLocaleIDCapacity, - UErrorCode* err) -{ - /** - * ULOC_FULLNAME_CAPACITY will provide enough capacity - * that we can build a string that contains the language, - * script and region code without worrying about overrunning - * the user-supplied buffer. - **/ - char maximizedTagBuffer[ULOC_FULLNAME_CAPACITY]; - int32_t maximizedTagBufferLength = sizeof(maximizedTagBuffer); +static void +_uloc_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err) { + icu::CharString maximizedTagBuffer; char lang[ULOC_LANG_CAPACITY]; int32_t langLength = sizeof(lang); @@ -976,9 +925,7 @@ _uloc_minimizeSubtags(const char* localeID, if(U_FAILURE(*err)) { goto error; } - else if (localeID == NULL || - minimizedLocaleID == NULL || - minimizedLocaleIDCapacity <= 0) { + else if (localeID == NULL) { goto error; } @@ -1011,32 +958,32 @@ _uloc_minimizeSubtags(const char* localeID, CHECK_TRAILING_VARIANT_SIZE(trailing, trailingLength); - createTagString( - lang, - langLength, - script, - scriptLength, - region, - regionLength, - NULL, - 0, - maximizedTagBuffer, - maximizedTagBufferLength, - err); - if(U_FAILURE(*err)) { - goto error; - } + { + icu::CharString base; + { + icu::CharStringByteSink sink(&base); + createTagString( + lang, + langLength, + script, + scriptLength, + region, + regionLength, + NULL, + 0, + sink, + err); + } - /** - * First, we need to first get the maximization - * from AddLikelySubtags. - **/ - maximizedTagBufferLength = - uloc_addLikelySubtags( - maximizedTagBuffer, - maximizedTagBuffer, - maximizedTagBufferLength, - err); + /** + * First, we need to first get the maximization + * from AddLikelySubtags. + **/ + { + icu::CharStringByteSink sink(&maximizedTagBuffer); + ulocimp_addLikelySubtags(base.data(), sink, err); + } + } if(U_FAILURE(*err)) { goto error; @@ -1046,9 +993,9 @@ _uloc_minimizeSubtags(const char* localeID, * Start first with just the language. **/ { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1058,19 +1005,19 @@ _uloc_minimizeSubtags(const char* localeID, 0, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } - else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + else if (!tagBuffer.isEmpty() && uprv_strnicmp( + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, NULL, @@ -1079,9 +1026,9 @@ _uloc_minimizeSubtags(const char* localeID, 0, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1090,9 +1037,9 @@ _uloc_minimizeSubtags(const char* localeID, **/ if (regionLength > 0) { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1102,19 +1049,19 @@ _uloc_minimizeSubtags(const char* localeID, regionLength, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, NULL, @@ -1123,9 +1070,9 @@ _uloc_minimizeSubtags(const char* localeID, regionLength, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1135,9 +1082,9 @@ _uloc_minimizeSubtags(const char* localeID, * maximal version that we already have. **/ if (scriptLength > 0 && regionLength > 0) { - char tagBuffer[ULOC_FULLNAME_CAPACITY]; - - const int32_t tagBufferLength = + icu::CharString tagBuffer; + { + icu::CharStringByteSink sink(&tagBuffer); createLikelySubtagsString( lang, langLength, @@ -1147,19 +1094,19 @@ _uloc_minimizeSubtags(const char* localeID, 0, NULL, 0, - tagBuffer, - sizeof(tagBuffer), + sink, err); + } if(U_FAILURE(*err)) { goto error; } else if (uprv_strnicmp( - maximizedTagBuffer, - tagBuffer, - tagBufferLength) == 0) { + maximizedTagBuffer.data(), + tagBuffer.data(), + tagBuffer.length()) == 0) { - return createTagString( + createTagString( lang, langLength, script, @@ -1168,9 +1115,9 @@ _uloc_minimizeSubtags(const char* localeID, 0, trailing, trailingLength, - minimizedLocaleID, - minimizedLocaleIDCapacity, + sink, err); + return; } } @@ -1179,18 +1126,8 @@ _uloc_minimizeSubtags(const char* localeID, * If we got here, return the locale ID parameter. **/ const int32_t localeIDLength = (int32_t)uprv_strlen(localeID); - - uprv_memcpy( - minimizedLocaleID, - localeID, - localeIDLength <= minimizedLocaleIDCapacity ? - localeIDLength : minimizedLocaleIDCapacity); - - return u_terminateChars( - minimizedLocaleID, - minimizedLocaleIDCapacity, - localeIDLength, - err); + sink.Append(localeID, localeIDLength); + return; } error: @@ -1198,10 +1135,6 @@ _uloc_minimizeSubtags(const char* localeID, if (!U_FAILURE(*err)) { *err = U_ILLEGAL_ARGUMENT_ERROR; } - - return -1; - - } static UBool @@ -1232,50 +1165,82 @@ do_canonicalize(const char* localeID, } U_CAPI int32_t U_EXPORT2 -uloc_addLikelySubtags(const char* localeID, - char* maximizedLocaleID, - int32_t maximizedLocaleIDCapacity, - UErrorCode* err) -{ - char localeBuffer[ULOC_FULLNAME_CAPACITY]; +uloc_addLikelySubtags(const char* localeID, + char* maximizedLocaleID, + int32_t maximizedLocaleIDCapacity, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } - if (!do_canonicalize( - localeID, - localeBuffer, - sizeof(localeBuffer), - err)) { - return -1; + icu::CheckedArrayByteSink sink( + maximizedLocaleID, maximizedLocaleIDCapacity); + + ulocimp_addLikelySubtags(localeID, sink, status); + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return sink.Overflowed() ? reslen : -1; } - else { - return _uloc_addLikelySubtags( - localeBuffer, - maximizedLocaleID, - maximizedLocaleIDCapacity, - err); + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars( + maximizedLocaleID, maximizedLocaleIDCapacity, reslen, status); } + + return reslen; } -U_CAPI int32_t U_EXPORT2 -uloc_minimizeSubtags(const char* localeID, - char* minimizedLocaleID, - int32_t minimizedLocaleIDCapacity, - UErrorCode* err) -{ +U_CAPI void U_EXPORT2 +ulocimp_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* status) { char localeBuffer[ULOC_FULLNAME_CAPACITY]; - if (!do_canonicalize( - localeID, - localeBuffer, - sizeof(localeBuffer), - err)) { - return -1; + if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) { + _uloc_addLikelySubtags(localeBuffer, sink, status); } - else { - return _uloc_minimizeSubtags( - localeBuffer, - minimizedLocaleID, - minimizedLocaleIDCapacity, - err); +} + +U_CAPI int32_t U_EXPORT2 +uloc_minimizeSubtags(const char* localeID, + char* minimizedLocaleID, + int32_t minimizedLocaleIDCapacity, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink( + minimizedLocaleID, minimizedLocaleIDCapacity); + + ulocimp_minimizeSubtags(localeID, sink, status); + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return sink.Overflowed() ? reslen : -1; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars( + minimizedLocaleID, minimizedLocaleIDCapacity, reslen, status); + } + + return reslen; +} + +U_CAPI void U_EXPORT2 +ulocimp_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* status) { + char localeBuffer[ULOC_FULLNAME_CAPACITY]; + + if (do_canonicalize(localeID, localeBuffer, sizeof localeBuffer, status)) { + _uloc_minimizeSubtags(localeBuffer, sink, status); } } @@ -1284,7 +1249,7 @@ uloc_minimizeSubtags(const char* localeID, static const char LANG_DIR_STRING[] = "root-en-es-pt-zh-ja-ko-de-fr-it-ar+he+fa+ru-nl-pl-th-tr-"; -// Implemented here because this calls uloc_addLikelySubtags(). +// Implemented here because this calls ulocimp_addLikelySubtags(). U_CAPI UBool U_EXPORT2 uloc_isRightToLeft(const char *locale) { UErrorCode errorCode = U_ZERO_ERROR; @@ -1297,26 +1262,30 @@ uloc_isRightToLeft(const char *locale) { errorCode = U_ZERO_ERROR; char lang[8]; int32_t langLength = uloc_getLanguage(locale, lang, UPRV_LENGTHOF(lang), &errorCode); - if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || - langLength == 0) { + if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { return FALSE; } - const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); - if (langPtr != NULL) { - switch (langPtr[langLength]) { - case '-': return FALSE; - case '+': return TRUE; - default: break; // partial match of a longer code + if (langLength > 0) { + const char* langPtr = uprv_strstr(LANG_DIR_STRING, lang); + if (langPtr != NULL) { + switch (langPtr[langLength]) { + case '-': return FALSE; + case '+': return TRUE; + default: break; // partial match of a longer code + } } } // Otherwise, find the likely script. errorCode = U_ZERO_ERROR; - char likely[ULOC_FULLNAME_CAPACITY]; - (void)uloc_addLikelySubtags(locale, likely, UPRV_LENGTHOF(likely), &errorCode); + icu::CharString likely; + { + icu::CharStringByteSink sink(&likely); + ulocimp_addLikelySubtags(locale, sink, &errorCode); + } if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING) { return FALSE; } - scriptLength = uloc_getScript(likely, script, UPRV_LENGTHOF(script), &errorCode); + scriptLength = uloc_getScript(likely.data(), script, UPRV_LENGTHOF(script), &errorCode); if (U_FAILURE(errorCode) || errorCode == U_STRING_NOT_TERMINATED_WARNING || scriptLength == 0) { return FALSE; @@ -1367,11 +1336,14 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, rgLen = 0; } else if (rgLen == 0 && inferRegion) { // no unicode_region_subtag but inferRegion TRUE, try likely subtags - char locBuf[ULOC_FULLNAME_CAPACITY]; rgStatus = U_ZERO_ERROR; - (void)uloc_addLikelySubtags(localeID, locBuf, ULOC_FULLNAME_CAPACITY, &rgStatus); + icu::CharString locBuf; + { + icu::CharStringByteSink sink(&locBuf); + ulocimp_addLikelySubtags(localeID, sink, &rgStatus); + } if (U_SUCCESS(rgStatus)) { - rgLen = uloc_getCountry(locBuf, rgBuf, ULOC_RG_BUFLEN, status); + rgLen = uloc_getCountry(locBuf.data(), rgBuf, ULOC_RG_BUFLEN, status); if (U_FAILURE(*status)) { rgLen = 0; } diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index a3cf2d5eb2dbcb..46986399b23e7a 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -32,18 +32,9 @@ #include "cmemory.h" #include "unicode/uloc.h" -#if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500) -/* - * TODO: It seems like we should widen this to - * either U_PLATFORM_USES_ONLY_WIN32_API (includes MinGW) - * or U_PLATFORM_HAS_WIN32_API (includes MinGW and Cygwin) - * but those use gcc and won't have defined(_MSC_VER). - * We might need to #include some Windows header and test for some version macro from there. - * Or call some Windows function and see what it returns. - */ -#define USE_WINDOWS_LCID_MAPPING_API +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API #include -#include +#include // LCIDToLocaleName and LocaleNameToLCID #endif /* @@ -973,7 +964,7 @@ idCmp(const char* id1, const char* id2) /** * Searches for a Windows LCID * - * @param posixid the Posix style locale id. + * @param posixID the Posix style locale id. * @param status gets set to U_ILLEGAL_ARGUMENT_ERROR when the Posix ID has * no equivalent Windows LCID. * @return the LCID @@ -1035,7 +1026,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) // ///////////////////////////////////// */ -#ifdef USE_WINDOWS_LCID_MAPPING_API +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API /* * Various language tags needs to be changed: * quz -> qu @@ -1053,6 +1044,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) } #endif + U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UErrorCode* status) { @@ -1061,8 +1053,10 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr UBool bLookup = TRUE; const char *pPosixID = NULL; -#ifdef USE_WINDOWS_LCID_MAPPING_API - char locName[LOCALE_NAME_MAX_LENGTH] = {}; // ICU name can't be longer than Windows name +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API + static_assert(ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH, "Windows locale names have smaller length than ICU locale names."); + + char locName[LOCALE_NAME_MAX_LENGTH] = {}; // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for @@ -1070,7 +1064,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr // use the Windows API to resolve locale ID for this specific case. if ((hostid & 0x3FF) != 0x92) { int32_t tmpLen = 0; - UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH + char16_t windowsLocaleName[LOCALE_NAME_MAX_LENGTH] = {}; // Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names. tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES); @@ -1110,7 +1104,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr pPosixID = locName; } } -#endif // USE_WINDOWS_LCID_MAPPING_API +#endif if (bLookup) { const char *pCandidate = NULL; @@ -1163,20 +1157,15 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr ///////////////////////////////////// */ U_CAPI uint32_t -uprv_convertToLCIDPlatform(const char* localeID) +uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) { - // The purpose of this function is to leverage native platform name->lcid - // conversion functionality when available. -#ifdef USE_WINDOWS_LCID_MAPPING_API - DWORD nameLCIDFlags = 0; - UErrorCode myStatus = U_ZERO_ERROR; - - // First check for a Windows name->LCID match, fall through to catch - // ICU special cases, but Windows may know it already. -#if LOCALE_ALLOW_NEUTRAL_NAMES - nameLCIDFlags = LOCALE_ALLOW_NEUTRAL_NAMES; -#endif /* LOCALE_ALLOW_NEUTRAL_NAMES */ + if (U_FAILURE(*status)) { + return 0; + } + // The purpose of this function is to leverage the Windows platform name->lcid + // conversion functionality when available. +#if U_PLATFORM_HAS_WIN32_API && UCONFIG_USE_WINDOWS_LCID_MAPPING_API int32_t len; char collVal[ULOC_KEYWORDS_CAPACITY] = {}; char baseName[ULOC_FULLNAME_CAPACITY] = {}; @@ -1185,8 +1174,8 @@ uprv_convertToLCIDPlatform(const char* localeID) // Check any for keywords. if (uprv_strchr(localeID, '@')) { - len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, &myStatus); - if (U_SUCCESS(myStatus) && len > 0) + len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, status); + if (U_SUCCESS(*status) && len > 0) { // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. return 0; @@ -1194,9 +1183,9 @@ uprv_convertToLCIDPlatform(const char* localeID) else { // If the locale ID contains keywords other than collation, just use the base name. - len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, &myStatus); + len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, status); - if (U_SUCCESS(myStatus) && len > 0) + if (U_SUCCESS(*status) && len > 0) { baseName[len] = 0; mylocaleID = baseName; @@ -1206,9 +1195,9 @@ uprv_convertToLCIDPlatform(const char* localeID) char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form - (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, status); - if (U_SUCCESS(myStatus)) + if (U_SUCCESS(*status)) { // Need it to be UTF-16, not 8-bit wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; @@ -1230,7 +1219,7 @@ uprv_convertToLCIDPlatform(const char* localeID) { // Ensure it's null terminated bcp47Tag[i] = L'\0'; - LCID lcid = LocaleNameToLCID(bcp47Tag, nameLCIDFlags); + LCID lcid = LocaleNameToLCID(bcp47Tag, LOCALE_ALLOW_NEUTRAL_NAMES); if (lcid > 0) { // Found LCID from windows, return that one, unless its completely ambiguous @@ -1244,10 +1233,10 @@ uprv_convertToLCIDPlatform(const char* localeID) } } #else - (void)localeID; // Suppress unused variable warning. -#endif /* USE_WINDOWS_LCID_MAPPING_API */ + (void) localeID; // Suppress unused variable warning. +#endif - // No found, or not implemented on platforms without native name->lcid conversion + // Nothing found, or not implemented. return 0; } diff --git a/deps/icu-small/source/common/locmap.h b/deps/icu-small/source/common/locmap.h index 2d7a3d37a04495..492a9413628ffb 100644 --- a/deps/icu-small/source/common/locmap.h +++ b/deps/icu-small/source/common/locmap.h @@ -33,7 +33,7 @@ U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char* posixID, int32_t posixIDCapacity, UErrorCode* status); /* Don't call these functions directly. Use uloc_getLCID instead. */ -U_CAPI uint32_t uprv_convertToLCIDPlatform(const char *localeID); // Leverage platform conversion if possible -U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status); +U_CAPI uint32_t uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status); // Leverage platform conversion if possible +U_CAPI uint32_t uprv_convertToLCID(const char* langID, const char* posixID, UErrorCode* status); #endif /* LOCMAP_H */ diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index f890411c9affd7..69d744306417d5 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -49,7 +49,6 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, UErrorCode *pErrorCode) { /* char localeBuffer[ULOC_FULLNAME_CAPACITY*4];*/ - UResourceBundle *rb=NULL, table, subTable; const UChar *item=NULL; UErrorCode errorCode; char explicitFallbackName[ULOC_FULLNAME_CAPACITY] = {0}; @@ -59,7 +58,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, * this falls back through the locale's chain to root */ errorCode=U_ZERO_ERROR; - rb=ures_open(path, locale, &errorCode); + icu::LocalUResourceBundlePointer rb(ures_open(path, locale, &errorCode)); if(U_FAILURE(errorCode)) { /* total failure, not even root could be opened */ @@ -73,24 +72,24 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, } for(;;){ - ures_initStackObject(&table); - ures_initStackObject(&subTable); - ures_getByKeyWithFallback(rb, tableKey, &table, &errorCode); + icu::StackUResourceBundle table; + icu::StackUResourceBundle subTable; + ures_getByKeyWithFallback(rb.getAlias(), tableKey, table.getAlias(), &errorCode); if (subTableKey != NULL) { /* - ures_getByKeyWithFallback(&table,subTableKey, &subTable, &errorCode); - item = ures_getStringByKeyWithFallback(&subTable, itemKey, pLength, &errorCode); + ures_getByKeyWithFallback(table.getAlias(), subTableKey, subTable.getAlias(), &errorCode); + item = ures_getStringByKeyWithFallback(subTable.getAlias(), itemKey, pLength, &errorCode); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; } break;*/ - ures_getByKeyWithFallback(&table,subTableKey, &table, &errorCode); + ures_getByKeyWithFallback(table.getAlias(), subTableKey, table.getAlias(), &errorCode); } if(U_SUCCESS(errorCode)){ - item = ures_getStringByKeyWithFallback(&table, itemKey, pLength, &errorCode); + item = ures_getStringByKeyWithFallback(table.getAlias(), itemKey, pLength, &errorCode); if(U_FAILURE(errorCode)){ const char* replacement = NULL; *pErrorCode = errorCode; /*save the errorCode*/ @@ -103,7 +102,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, } /*pointer comparison is ok since uloc_getCurrentCountryID & uloc_getCurrentLanguageID return the key itself is replacement is not found*/ if(replacement!=NULL && itemKey != replacement){ - item = ures_getStringByKeyWithFallback(&table, replacement, pLength, &errorCode); + item = ures_getStringByKeyWithFallback(table.getAlias(), replacement, pLength, &errorCode); if(U_SUCCESS(errorCode)){ *pErrorCode = errorCode; break; @@ -122,7 +121,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = errorCode; errorCode = U_ZERO_ERROR; - fallbackLocale = ures_getStringByKeyWithFallback(&table, "Fallback", &len, &errorCode); + fallbackLocale = ures_getStringByKeyWithFallback(table.getAlias(), "Fallback", &len, &errorCode); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -135,8 +134,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, *pErrorCode = U_INTERNAL_PROGRAM_ERROR; break; } - ures_close(rb); - rb = ures_open(path, explicitFallbackName, &errorCode); + rb.adoptInstead(ures_open(path, explicitFallbackName, &errorCode)); if(U_FAILURE(errorCode)){ *pErrorCode = errorCode; break; @@ -146,10 +144,7 @@ uloc_getTableStringWithFallback(const char *path, const char *locale, break; } } - /* done with the locale string - ready to close table and rb */ - ures_close(&subTable); - ures_close(&table); - ures_close(rb); + return item; } diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 02d2be50ca25e2..74745a37d6d47c 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -11,6 +11,7 @@ #if !UCONFIG_NO_SERVICE || !UCONFIG_NO_TRANSLITERATION #include "unicode/resbund.h" +#include "unicode/uenum.h" #include "cmemory.h" #include "ustrfmt.h" #include "locutil.h" @@ -229,15 +230,14 @@ LocaleUtility::getAvailableLocaleNames(const UnicodeString& bundleID) CharString cbundleID; cbundleID.appendInvariantChars(bundleID, status); const char* path = cbundleID.isEmpty() ? NULL : cbundleID.data(); - UEnumeration *uenum = ures_openAvailableLocales(path, &status); + icu::LocalUEnumerationPointer uenum(ures_openAvailableLocales(path, &status)); for (;;) { - const UChar* id = uenum_unext(uenum, NULL, &status); + const UChar* id = uenum_unext(uenum.getAlias(), NULL, &status); if (id == NULL) { break; } htp->put(UnicodeString(id), (void*)htp, status); } - uenum_close(uenum); if (U_FAILURE(status)) { delete htp; return NULL; diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 82a68097385285..c04bdac5ead393 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -12,27 +12,27 @@ #ifdef INCLUDED_FROM_NORMALIZER2_CPP static const UVersionInfo norm2_nfc_data_formatVersion={4,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={0xb,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0xc,1,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x50,0x4ab0,0x8708,0x8808,0x8808,0x8808,0x8808,0x8808,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, +0x50,0x4ae0,0x8738,0x8838,0x8838,0x8838,0x8838,0x8838,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, 0x3c24,0x3c56,0x300,0 }; -static const uint16_t norm2_nfc_data_trieIndex[1690]={ +static const uint16_t norm2_nfc_data_trieIndex[1712]={ 0,0x40,0x7b,0xbb,0xfb,0x13a,0x17a,0x1b2,0x1f2,0x226,0x254,0x226,0x294,0x2d4,0x313,0x353, 0x393,0x3d2,0x40f,0x44e,0x226,0x226,0x488,0x4c8,0x4f8,0x530,0x226,0x570,0x59f,0x5de,0x226,0x5f3, 0x631,0x65f,0x226,0x68c,0x6cc,0x709,0x729,0x768,0x7a7,0x7e4,0x803,0x840,0x729,0x879,0x8a7,0x8e6, -0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa4,0xacc,0xb09,0xb49,0xb83, -0xb9e,0x226,0xbd9,0x226,0xc19,0xc38,0xc6e,0xcab,0x226,0x226,0x226,0x226,0x226,0xcce,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfa,0x226,0x226,0xd2f, -0x226,0x226,0xd4d,0x226,0xd77,0x226,0x226,0x226,0xdb3,0xdd3,0xe13,0x226,0xe51,0xe91,0xec5,0xef1, -0x808,0x226,0x226,0xf25,0x226,0x226,0x226,0xf65,0xfa5,0xfe5,0x1025,0x1065,0x10a5,0x10e5,0x1125,0x1165, -0x11a5,0x226,0x226,0x11d5,0x1206,0x226,0x1236,0x1269,0x12a6,0x12e5,0x1325,0x135b,0x1389,0x226,0x226,0x226, +0x226,0x920,0x937,0x977,0x98e,0x9cd,0x226,0xa03,0xa23,0xa5e,0xa6a,0xaa5,0xacd,0xb0a,0xb4a,0xb84, +0xb9f,0x226,0xbda,0x226,0xc1a,0xc39,0xc6f,0xcac,0x226,0x226,0x226,0x226,0x226,0xccf,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xcfb,0x226,0x226,0xd30, +0x226,0x226,0xd4e,0x226,0xd78,0x226,0x226,0x226,0xdb4,0xdd4,0xe14,0x226,0xe52,0xe92,0xec6,0xef2, +0x808,0x226,0x226,0xf26,0x226,0x226,0x226,0xf66,0xfa6,0xfe6,0x1026,0x1066,0x10a6,0x10e6,0x1126,0x1166, +0x11a6,0x226,0x226,0x11d6,0x1207,0x226,0x1237,0x126a,0x12a7,0x12e6,0x1326,0x135c,0x138a,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b4,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0xcbc,0x226,0x13d1,0x226,0x1411,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x1451,0x148b,0x14c9,0x1509,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x13b5,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0xcbd,0x226,0x13d2,0x226,0x1412,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x1452,0x148c,0x14ca,0x150a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -61,20 +61,20 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1548,0x1586,0x15a6,0x226,0x226,0x226,0x226, -0x15e0,0x226,0x226,0x161c,0x164e,0x167c,0x80c,0x168f,0x226,0x226,0x169f,0x16df,0x226,0x226,0x226,0x13e3, -0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727, -0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737, -0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b, -0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f, -0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f, -0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723, -0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733, -0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727, -0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737, -0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b, -0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x1733,0x171f,0x1727,0x172f,0x1737,0x1723,0x172b,0x176b,0x226, -0x17ab,0x17e6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1549,0x1587,0x15a7,0x226,0x226,0x226,0x226, +0x15e1,0x226,0x226,0x161d,0x164f,0x167d,0x80c,0x1690,0x226,0x226,0x16a0,0x16e0,0x226,0x226,0x226,0x13e4, +0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728, +0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738, +0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c, +0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720, +0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730, +0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724, +0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734, +0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728, +0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738, +0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c, +0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x1734,0x1720,0x1728,0x1730,0x1738,0x1724,0x172c,0x176c,0x226, +0x17ac,0x17e7,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, @@ -82,53 +82,54 @@ static const uint16_t norm2_nfc_data_trieIndex[1690]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1826,0x1866,0x18a6,0x18e6,0x1926,0x1966,0x19a6,0x19e6,0x1a09,0x1a49,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a69,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x61f,0x62e,0x644,0x663,0x678,0x678,0x678,0x67c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x1827,0x1867,0x18a7,0x18e7,0x1927,0x1967,0x19a7,0x19e7,0x1a0a,0x1a4a,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a6a,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x635,0x644,0x65a,0x679,0x68e,0x68e,0x68e,0x692,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbda,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9c,0x226,0x226,0x1aac,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0xdc5,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abc,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac6,0x54f, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad6, -0x1ae3,0x1aef,0x226,0x226,0x226,0x226,0x414,0x226,0x1afa,0x1b0a,0x226,0x226,0x226,0x7e0,0x226,0x226, -0x226,0x226,0x1b1a,0x226,0x226,0x226,0x1b25,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x1b2c,0x226,0x226,0x226,0x226,0x1b37,0x1b46,0x8f6,0x1b54,0x412,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x1b62,0x798,0x226,0x226,0x226,0x226,0x226,0x1b72,0x1b81,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b89,0x1b99,0x226,0x226,0x226,0x9ba, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba3,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba0,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1a9d,0x226,0x226,0x1aad,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0xdc6,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1abd,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac7,0x54f, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7eb,0x226,0x226,0x9ba,0x226,0x1ad7, +0x1ae4,0x1af0,0x226,0x226,0x226,0x226,0x414,0x226,0x1afb,0x1b0b,0x226,0x226,0x226,0x7e0,0x226,0x226, +0x226,0x226,0x1b1b,0x226,0x226,0x226,0x1b26,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x1b2d,0x226,0x226,0x226,0x226,0x1b38,0x1b47,0x8f6,0x1b55,0x412,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x1b63,0x798,0x226,0x226,0x226,0x226,0x226,0x1b73,0x1b82,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x8d6,0x1b8a,0x1b9a,0x226,0x226,0x226,0x9ba, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba4,0x226,0x226,0x226,0x226,0x226,0x226,0x7e6,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ba1,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226,0x226,0x7e8, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x84d,0x226,0x226,0x226,0x7ed,0x7ea,0x226,0x226,0x226, +0x226,0x7e8,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd4,0x226,0x226,0x226,0x226,0x7ea,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb4,0x226, +0x226,0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb9, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x9ba,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xbd3,0x226,0x226,0x226,0x226,0x7ea,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb3,0x226,0x226,0x226, -0xebe,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bb8,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x1bc8,0x1bd8,0x1be6,0x1bf3,0x226,0x1bff,0x1c0d,0x1c1d,0x226,0x226, +0x226,0x226,0xcea,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2d,0x1c35, +0x1c43,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0xebf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x4fc,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x1c53,0x226,0x226,0x226,0x226,0x226,0x226,0x1c5f,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x1c6f,0x1c7f,0x1c8f,0x1c9f,0x1caf,0x1cbf,0x1ccf,0x1cdf,0x1cef,0x1cff,0x1d0f, +0x1d1f,0x1d2f,0x1d3f,0x1d4f,0x1d5f,0x1d6f,0x1d7f,0x1d8f,0x1d9f,0x1daf,0x1dbf,0x1dcf,0x1ddf,0x1def,0x1dff,0x1e0f, +0x1e1f,0x1e2f,0x1e3f,0x1e4f,0x1e5f,0x1e6f,0x1e7f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1bc7,0x1bd7,0x1be5,0x1bf2,0x226,0x1bfe,0x1c0c,0x1c1c,0x226,0x226,0x226,0x226, -0xce9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c2c,0x1c34,0x1c42,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c52,0x226,0x226,0x226, -0x226,0x226,0x226,0x1c5e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c6e, -0x1c7e,0x1c8e,0x1c9e,0x1cae,0x1cbe,0x1cce,0x1cde,0x1cee,0x1cfe,0x1d0e,0x1d1e,0x1d2e,0x1d3e,0x1d4e,0x1d5e,0x1d6e, -0x1d7e,0x1d8e,0x1d9e,0x1dae,0x1dbe,0x1dce,0x1dde,0x1dee,0x1dfe,0x1e0e,0x1e1e,0x1e2e,0x1e3e,0x1e4e,0x1e5e,0x1e6e, -0x1e7e,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x408, -0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf,0x4dc,0x4f9,0x516,0x533,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0x54d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0x226,0x226,0x226,0x226,0x226,0x408,0x428,0xc4,0xc4,0xc4,0x448,0x457,0x46a,0x486,0x4a3,0x4bf, +0x4dc,0x4f9,0x518,0x535,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x54f,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0x564,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x56f,0x58c,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0x5ac,0xc4,0xc4,0xc4,0x5bf,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x566,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0x571,0x58e,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5ae,0x5c2,0xc4,0xc4,0x5d5,0xc4,0xc4, 0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5df,0x5ff +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5f5,0x615 }; -static const uint16_t norm2_nfc_data_trieData[7822]={ +static const uint16_t norm2_nfc_data_trieData[7824]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -299,331 +300,331 @@ static const uint16_t norm2_nfc_data_trieData[7822]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0xfeec,0xfeec,1,1,1,1,1,1,1,1,0xfef4,0xfef4,0xfef4,0xfef4, +1,1,0xfeec,0xfeec,0xfe12,1,1,1,1,1,1,1,1,0xfef4,0xfef4,0xfef4, +0xfef4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2a4f,1,1, +1,1,1,1,1,1,1,0x2a55,1,1,1,1,0x2a5b,1,1,1, +1,0x2a61,1,1,1,1,0x2a67,1,1,1,1,1,1,1,1,1, +1,1,1,0x2a6d,1,1,1,1,1,1,1,0xff02,0xff04,0x3c40,0xff08,0x3c48, +0x2a72,1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2a7f,1,1, +1,1,1,1,1,1,1,0x2a85,1,1,1,1,0x2a8b,1,1,1, +1,0x2a91,1,1,1,1,0x2a97,1,1,1,1,1,1,1,1,1, +1,1,1,0x2a9d,1,1,1,1,1,1,0xffb8,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1,0x2a4f,1,1,1, -1,1,1,1,1,1,0x2a55,1,1,1,1,0x2a5b,1,1,1,1, -0x2a61,1,1,1,1,0x2a67,1,1,1,1,1,1,1,1,1,1, -1,1,0x2a6d,1,1,1,1,1,1,1,0xff02,0xff04,0x3c40,0xff08,0x3c48,0x2a72, -1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1,0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,0xffcc, -0xffcc,1,1,1,1,1,1,1,1,1,1,1,0x2a7f,1,1,1, -1,1,1,1,1,1,0x2a85,1,1,1,1,0x2a8b,1,1,1,1, -0x2a91,1,1,1,1,0x2a97,1,1,1,1,1,1,1,1,1,1, -1,1,0x2a9d,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x8c0,0x1a1f,1,1,1,1,1,1,1,0xfc00,1,1, +1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x8c0,0x1a1f,1,1,1,1,1,1,1,0xfc00,1,1,1, -1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xffb8,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, -0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, -0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0xfe12,1,1,1,1,1,1,1,1,1,1,0xffcc,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc, +0xffcc,0xffb8,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0,0x1a37,0x8d4, +0x1a3d,1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, -0xffb8,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0,0x1a37,0x8d4,0x1a3d, -1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a49,0x8e0,0x1a4f, +0x8e4,0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xfe0e,0xfc00,1,1,1,1,0x8dc,0x1a49,0x8e0,0x1a4f,0x8e4, -0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, -0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1,1, -1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc, -0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1, -1,1,0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1, -1,1,1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8, -0xffcc,0xffcc,0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, +0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1, +1,1,1,0xffb8,1,1,1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc, +1,1,1,1,1,1,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffb8,0xffcc,0xffcc,0xffd4,0xffac,0xffb8,0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, 0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,1, -0xffcc,0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,0x1aaa, -0x1ab0,0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,0x1b1a, -0x1b20,0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,0x1b82, -0x1b88,0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,0x1be6, -0x1bec,0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46, -0x1c4c,0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,0xdec, -0xdf6,0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,0x1d2e, -0x1d34,0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,0x1d98, -0x1da2,0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,0x1dff, -0x1e05,0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,1, -0x1e5f,1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,0x1eae, -0x1eb8,0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,0x1f38, -0x1f3e,0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,0x1fc0, -0x1fc6,0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,0x203e, -0x2048,0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,0x20ce, -0x20d8,0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,1, -1,1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,0xf06, -0xf14,0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,0x2177, -0x2181,0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,0x103e, -0x104c,0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,0x21db, -0x21e5,0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,0x223f, -0x2249,0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,1, -0x22a3,1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,0x11f4, -0x1202,0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,0x22d1, -0x3bb6,0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,0x2365, -0x2375,0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,0x244d, -0x245d,0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,0x2535, -0x2545,0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,0x25cb, -0x3bc6,0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,0x2607, -0x3bd6,0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,0x2657, -0x3bea,1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,0x26ad, -0x3bfe,0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,0x26e9, -0x3c16,0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02, -0xffcc,0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02, -0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0x2aae,1,1,1, -0x2ab2,0x3c1e,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1,1, -0x26f5,0x26fb,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x2701,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x2707,0x270d,0x2713,0x914,1,0x918,1,0x91c,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0x920,0x2719,1,1,1,0x924,0x271f, -1,0x928,0x2725,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0x92c,0x272b,0x930,0x2731,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0x934,1,1,1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,1, -1,1,0x944,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,1, -1,1,0x275b,0x2761,0x2767,0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,0x964, -0x968,0x96c,0x970,1,1,0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,1, -1,1,1,1,1,1,0x984,0x988,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994,1, -0x998,0x27b5,0x27bb,0x27c1,0x27c7,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x27cd,0x27d3,0x27d9,0x27df,1, -1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8, +1,0xffcc,0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3, +0x1aaa,0x1ab0,0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14, +0x1b1a,0x1b20,0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d, +0x1b82,0x1b88,0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde, +0x1be6,0x1bec,0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40, +0x1c46,0x1c4c,0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0, +0xdec,0xdf6,0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26, +0x1d2e,0x1d34,0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e, +0x1d98,0x1da2,0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9, +0x1dff,0x1e05,0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58, +1,0x1e5f,1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4, +0x1eae,0x1eb8,0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a, +0x1f38,0x1f3e,0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba, +0x1fc0,0x1fc6,0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034, +0x203e,0x2048,0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4, +0x20ce,0x20d8,0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146, +1,1,1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee, +0xf06,0xf14,0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82, +0x2177,0x2181,0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026, +0x103e,0x104c,0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6, +0x21db,0x21e5,0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102, +0x223f,0x2249,0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134, +1,0x22a3,1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc, +0x11f4,0x1202,0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae, +0x22d1,0x3bb6,0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356, +0x2365,0x2375,0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e, +0x244d,0x245d,0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526, +0x2535,0x2545,0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5, +0x25cb,0x3bc6,0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce, +0x2607,0x3bd6,0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651, +0x2657,0x3bea,1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7, +0x26ad,0x3bfe,0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e, +0x26e9,0x3c16,0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02, +0xfe02,0xffcc,0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc, +0xfe02,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x2aae,1,1, +1,0x2ab2,0x3c1e,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x908,1,0x90c,1,0x910,1,1,1,1, +1,0x26f5,0x26fb,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x2701,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x2707,0x270d,0x2713,0x914,1,0x918,1,0x91c,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x920,0x2719,1,1,1,0x924, +0x271f,1,0x928,0x2725,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x92c,0x272b,0x930,0x2731,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x934,1,1,1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749, +1,1,1,0x944,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1, +1,1,1,0x275b,0x2761,0x2767,0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b, +0x964,0x968,0x96c,0x970,1,1,0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af, +1,1,1,1,1,1,1,0x984,0x988,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x98c,1,1,1,1,1,0x990,0x994, +1,0x998,0x27b5,0x27bb,0x27c1,0x27c7,1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x27cd,0x27d3,0x27d9,0x27df, +1,1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc, +0xffc0,0xffc0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0x9ac,1,1,1,1,0x9b0,0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0, +0x2815,0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0,0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1, +0x9e0,0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1,1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863, +0x2869,0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c,0x2887,0x288d,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2893,1, +1,1,1,0xfc10,0xfc10,1,1,0xa14,0x2899,1,1,1,1,1,1,1, +0xa18,1,1,1,1,0xa1c,0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30, +0x28bd,0xa34,0x28c3,0xa38,0x28c9,0xa3c,0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7, +0xa50,0x28ed,0xa54,0x28f3,1,1,1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68, +0x2911,0x2917,0xa70,0x291d,0x2923,0xa78,0x2929,0x292f,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1, +1,0x293b,0x2941,0x2947,0x294d,1,1,0xa90,0x2953,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0, -0xffc0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0x9ac,1,1,1,1,0x9b0,0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,0x2815, -0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0,0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,0x9e0, -0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1,1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,0x2869, -0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c,0x2887,0x288d,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,0x2893,1,1, -1,1,0xfc10,0xfc10,1,1,0xa14,0x2899,1,1,1,1,1,1,1,0xa18, -1,1,1,1,0xa1c,0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,0x28bd, -0xa34,0x28c3,0xa38,0x28c9,0xa3c,0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,0xa50, -0x28ed,0xa54,0x28f3,1,1,1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,0x2911, -0x2917,0xa70,0x291d,0x2923,0xa78,0x2929,0x292f,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,1, -0x293b,0x2941,0x2947,0x294d,1,1,0xa90,0x2953,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12, +0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc, -1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc,1, -0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1,1,1,0xffcc,0xffcc, +1,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,0xadc, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283, 0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, -0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, 0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, -0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, 0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, -0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, -0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,0x3c56,0x3c56,0x3c56, -0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1,0x3c56, -1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x3b87,1,0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,0x2ae5, -0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd,0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25, -0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d,0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65, -0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d,0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5, -0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd,0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5, -0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd,0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25, -0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39,0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61, -0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79,0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1, -0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9,0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1, -0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9,0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21, -0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39,0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,0x2d5d, -0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71,0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99, -0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11,0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5, -0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded,0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15, -0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29,0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51, -0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69,0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91, -0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9,0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1, -0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1,0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,0x2efd, -0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1,0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,1, -0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39,0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61, -0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79,0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1, -0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9,0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,0x2fdd, -0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1,0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,0x3015, -0x3019,0x301d,0x3021,0x3027,1,1,0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,0x304b, -0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f,0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,0x2f79, -0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097,0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,0x30af, -0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf,0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,0x30df, -0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3,0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,0x310f, -0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001,0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,0x3133, -0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f,0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,0x3173, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1,1,1,1, -1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0,0x31c6,0x31cc,0x31d2, -1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208,0x320e,1,0x3214, -0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1,1, -1,1,1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1,1, -0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc, -0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,0xa94, -0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d,1, -1,1,1,1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,1, -1,0xfc00,1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,1, -1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1, -1,1,1,1,0xfe0e,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1, -1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1, -1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1,1, -1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1,1,1, -1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f,0x29a9,0xfc00, -0x29b3,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1,1, -1,0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, -1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02,0xfe02, -0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,1,1,1,1,1,1,1,1, -0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,1, -1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, -1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc, -0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1, -1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1, -1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,0x334b,0x334f, -0x3353,0x3357,0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,0x3387, -0x338b,0x3391,0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,0x33c9, -0x33cd,0x33d1,0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,0x33f1, -0x33f1,0x33f1,0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,0x342d, -0x3431,0x3435,0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,0x345d, -0x3461,0x3465,0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,0x34a1, -0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,0x34dd, -0x34e3,0x34e7,0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,0x351f, -0x3523,0x3527,0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,0x355f, -0x355f,0x3565,0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,0x359d, -0x35a1,0x2f71,0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,0x2af5, -0x35cb,0x35cf,0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,0x360b, -0x360f,0x3613,0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,0x3645, -0x3649,0x364d,0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,0x367f, -0x2f8d,0x3683,0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,0x36bd, -0x36c1,0x36c5,0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,0x2f91, -0x2dd9,0x3701,0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,0x373b, -0x3741,0x3745,0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,0x30bb, -0x377f,0x3783,0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,0x37b9, -0x37bd,0x37c1,0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,0x37fd, -0x3803,0x3809,0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,0x3833, -0x3837,0x2fbd,0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,0x386d, -0x3873,0x3877,0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,0x38b3, -0x38b7,0x38bd,0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,0x38ff, -0x3903,0x3907,0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,0x3943, -0x3947,0x394b,0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,0x397d, -0x3981,0x3985,0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,0x39c9, -0x39cf,0x39d3,0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,0x3a03, -0x3a07,0x3a0b,0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,0x311b, -0x3a45,0x3a49,0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,0x3a87, -0x3a8d,0x3a91,0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,0x3acd, -0x3ad3,0x3ad7,0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,0x3b0f, -0x3b15,0x3b19,0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,0x3b51, -0x3b55,0x3b5b,0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1 +1,1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,0x3c56,0x3c56, +0x3c56,0x3c56,0x3c56,0x3c56,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x3c56,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x3c56,1,1,1,1, +0x3c56,1,1,1,0x3c56,1,0x3c56,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x3b87,1,0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1, +0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd,0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21, +0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d,0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61, +0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d,0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1, +0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd,0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1, +0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd,0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21, +0x2c25,0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39,0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d, +0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79,0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d, +0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9,0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd, +0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9,0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d, +0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39,0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59, +0x2d5d,0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71,0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95, +0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11,0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1, +0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded,0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11, +0x2e15,0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29,0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d, +0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69,0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d, +0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9,0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd, +0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1,0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9, +0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1,0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1, +1,0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39,0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d, +0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79,0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d, +0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9,0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9, +0x2fdd,0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1,0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011, +0x3015,0x3019,0x301d,0x3021,0x3027,1,1,0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55, +0x304b,0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f,0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083, +0x2f79,0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097,0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab, +0x30af,0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf,0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db, +0x30df,0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3,0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9, +0x310f,0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001,0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09, +0x3133,0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f,0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f, +0x3173,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1,1,1, +1,1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0,0x31c6,0x31cc, +0x31d2,1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208,0x320e,1, +0x3214,0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffb8,1,0xffcc,1,1,1, +1,1,1,1,1,0xffcc,0xfe02,0xffb8,1,1,1,1,0xfe12,1,1,1, +1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,0xaa0,1,1,1,1,1,0x296d, +1,1,1,1,1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1, +1,1,0xfc00,1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12, +1,1,1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1, +1,1,1,1,1,0xfe0e,1,1,1,1,1,0xfe12,0xfe0e,1,1,1, +1,1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,0xfe0e,0xfe0e,1,0xfc00,1,1,1,1,1,1,1,0xab2,1, +1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f,0x29a9, +0xfc00,0x29b3,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1,1,1, +1,1,0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1, +1,1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02, +0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,1,1,1,1,1,1,1, +1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1, +1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1, +1,1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324,0x333c,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1, +1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,0x334b, +0x334f,0x3353,0x3357,0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383, +0x3387,0x338b,0x3391,0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5, +0x33c9,0x33cd,0x33d1,0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed, +0x33f1,0x33f1,0x33f1,0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429, +0x342d,0x3431,0x3435,0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead, +0x345d,0x3461,0x3465,0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b, +0x34a1,0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9, +0x34dd,0x34e3,0x34e7,0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b, +0x351f,0x3523,0x3527,0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b, +0x355f,0x355f,0x3565,0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599, +0x359d,0x35a1,0x2f71,0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d, +0x2af5,0x35cb,0x35cf,0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607, +0x360b,0x360f,0x3613,0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641, +0x3645,0x3649,0x364d,0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b, +0x367f,0x2f8d,0x3683,0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7, +0x36bd,0x36c1,0x36c5,0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd, +0x2f91,0x2dd9,0x3701,0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735, +0x373b,0x3741,0x3745,0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b, +0x30bb,0x377f,0x3783,0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3, +0x37b9,0x37bd,0x37c1,0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db, +0x37fd,0x3803,0x3809,0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7, +0x3833,0x3837,0x2fbd,0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869, +0x386d,0x3873,0x3877,0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af, +0x38b3,0x38b7,0x38bd,0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9, +0x38ff,0x3903,0x3907,0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f, +0x3943,0x3947,0x394b,0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979, +0x397d,0x3981,0x3985,0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3, +0x39c9,0x39cf,0x39d3,0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff, +0x3a03,0x3a07,0x3a0b,0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117, +0x311b,0x3a45,0x3a49,0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81, +0x3a87,0x3a8d,0x3a91,0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9, +0x3acd,0x3ad3,0x3ad7,0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b, +0x3b0f,0x3b15,0x3b19,0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b, +0x3b51,0x3b55,0x3b5b,0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1,1 }; static const UCPTrie norm2_nfc_data_trie={ norm2_nfc_data_trieIndex, { norm2_nfc_data_trieData }, - 1690, 7822, + 1712, 7824, 0x2fc00, 0x30, 0, 0, 0, 0, diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index e7ae646c41ae6d..b2dd7ad4b868d1 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -86,8 +86,7 @@ UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { case 4: return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f); default: - U_ASSERT(FALSE); // Should not occur. - return U_SENTINEL; + UPRV_UNREACHABLE; // Should not occur. } } diff --git a/deps/icu-small/source/common/normalizer2impl.h b/deps/icu-small/source/common/normalizer2impl.h index 2e6aff308819c5..7ecdef6d9c8032 100644 --- a/deps/icu-small/source/common/normalizer2impl.h +++ b/deps/icu-small/source/common/normalizer2impl.h @@ -264,7 +264,9 @@ class U_COMMON_API Normalizer2Impl : public UObject { // The trie stores values for lead surrogate code *units*. // Surrogate code *points* are inert. uint16_t getNorm16(UChar32 c) const { - return U_IS_LEAD(c) ? INERT : UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); + return U_IS_LEAD(c) ? + static_cast(INERT) : + UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } uint16_t getRawNorm16(UChar32 c) const { return UCPTRIE_FAST_GET(normTrie, UCPTRIE_16, c); } diff --git a/deps/icu-small/source/common/normlzr.cpp b/deps/icu-small/source/common/normlzr.cpp index 3911c90b5bb537..20b9f3df2ffccc 100644 --- a/deps/icu-small/source/common/normlzr.cpp +++ b/deps/icu-small/source/common/normlzr.cpp @@ -23,7 +23,7 @@ #include "normalizer2impl.h" #include "uprops.h" // for uniset_getUnicode32Instance() -#if defined(_ARM64_) && defined(move32) +#if defined(move32) // System can define move32 intrinsics, but the char iters define move32 method // using same undef trick in headers, so undef here to re-enable the method. #undef move32 diff --git a/deps/icu-small/source/common/patternprops.cpp b/deps/icu-small/source/common/patternprops.cpp index 01e33ce109f57a..c38a7e276def15 100644 --- a/deps/icu-small/source/common/patternprops.cpp +++ b/deps/icu-small/source/common/patternprops.cpp @@ -173,6 +173,16 @@ PatternProps::skipWhiteSpace(const UChar *s, int32_t length) { return s; } +int32_t +PatternProps::skipWhiteSpace(const UnicodeString& s, int32_t start) { + int32_t i = start; + int32_t length = s.length(); + while(i # include "unicode/uloc.h" # include "wintz.h" -#if U_PLATFORM_HAS_WINUWP_API -typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef -#include -#include -#include -#include - -using namespace ABI::Windows::Foundation; -using namespace Microsoft::WRL; -using namespace Microsoft::WRL::Wrappers; -#endif #elif U_PLATFORM == U_PF_OS400 # include # include /* error code structure */ @@ -252,7 +241,6 @@ u_signBit(double d) { UDate fakeClock_t0 = 0; /** Time to start the clock from **/ UDate fakeClock_dt = 0; /** Offset (fake time - real time) **/ UBool fakeClock_set = FALSE; /** True if fake clock has spun up **/ -static UMutex fakeClockMutex = U_MUTEX_INTIALIZER; static UDate getUTCtime_real() { struct timeval posixTime; @@ -261,6 +249,7 @@ static UDate getUTCtime_real() { } static UDate getUTCtime_fake() { + static UMutex fakeClockMutex = U_MUTEX_INTIALIZER; umtx_lock(&fakeClockMutex); if(!fakeClock_set) { UDate real = getUTCtime_real(); @@ -997,7 +986,8 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { /* Check each entry in the directory. */ while((dirEntry = readdir(dirp)) != NULL) { const char* dirName = dirEntry->d_name; - if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0) { + if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0 + && uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) { /* Create a newpath with the new entry to test each entry in the directory. */ CharString newpath(curpath, status); newpath.append(dirName, -1, status); @@ -1024,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { */ if (result != NULL) break; - } else if (uprv_strcmp(TZFILE_SKIP, dirName) != 0 && uprv_strcmp(TZFILE_SKIP2, dirName) != 0) { + } else { if(compareBinaryFiles(TZDEFAULT, newpath.data(), tzInfo)) { int32_t amountToSkip = sizeof(TZZONEINFO) - 1; if (amountToSkip > newpath.length()) { @@ -1078,7 +1068,7 @@ uprv_tzname(int n) // the other code path returns a pointer to a heap location. // If we don't have a name already, then tzname wouldn't be any // better, so just fall back. - return uprv_strdup("Etc/UTC"); + return uprv_strdup(""); #endif // !U_TZNAME #else @@ -1317,9 +1307,9 @@ uprv_pathIsAbsolute(const char *path) return FALSE; } -/* Temporary backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR - until some client wrapper makefiles are updated */ -#if U_PLATFORM_IS_DARWIN_BASED && TARGET_IPHONE_SIMULATOR +/* Backup setting of ICU_DATA_DIR_PREFIX_ENV_VAR + (needed for some Darwin ICU build environments) */ +#if U_PLATFORM_IS_DARWIN_BASED && TARGET_OS_SIMULATOR # if !defined(ICU_DATA_DIR_PREFIX_ENV_VAR) # define ICU_DATA_DIR_PREFIX_ENV_VAR "IPHONE_SIMULATOR_ROOT" # endif @@ -1430,12 +1420,7 @@ static void U_CALLCONV dataDirectoryInitFn() { if(path==NULL) { /* It looks really bad, set it to something. */ -#if U_PLATFORM_HAS_WIN32_API - // Windows UWP will require icudtl.dat file in same directory as icuuc.dll - path = ".\\"; -#else path = ""; -#endif } u_setDataDirectory(path); @@ -1633,11 +1618,7 @@ The variant cannot have dots in it. The 'rightmost' variant (@xxx) wins. The leftmost codepage (.xxx) wins. */ - char *correctedPOSIXLocale = 0; const char* posixID = uprv_getPOSIXIDForDefaultLocale(); - const char *p; - const char *q; - int32_t len; /* Format: (no spaces) ll [ _CC ] [ . MM ] [ @ VV] @@ -1645,38 +1626,29 @@ The leftmost codepage (.xxx) wins. l = lang, C = ctry, M = charmap, V = variant */ - if (gCorrectedPOSIXLocale != NULL) { + if (gCorrectedPOSIXLocale != nullptr) { return gCorrectedPOSIXLocale; } - if ((p = uprv_strchr(posixID, '.')) != NULL) { - /* assume new locale can't be larger than old one? */ - correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID)+1)); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); - correctedPOSIXLocale[p-posixID] = 0; + // Copy the ID into owned memory. + // Over-allocate in case we replace "@" with "__". + char *correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID) + 1 + 1)); + if (correctedPOSIXLocale == nullptr) { + return nullptr; + } + uprv_strcpy(correctedPOSIXLocale, posixID); - /* do not copy after the @ */ - if ((p = uprv_strchr(correctedPOSIXLocale, '@')) != NULL) { - correctedPOSIXLocale[p-correctedPOSIXLocale] = 0; + char *limit; + if ((limit = uprv_strchr(correctedPOSIXLocale, '.')) != nullptr) { + *limit = 0; + if ((limit = uprv_strchr(correctedPOSIXLocale, '@')) != nullptr) { + *limit = 0; } } /* Note that we scan the *uncorrected* ID. */ - if ((p = uprv_strrchr(posixID, '@')) != NULL) { - if (correctedPOSIXLocale == NULL) { - /* new locale can be 1 char longer than old one if @ -> __ */ - correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID)+2)); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - uprv_strncpy(correctedPOSIXLocale, posixID, p-posixID); - correctedPOSIXLocale[p-posixID] = 0; - } + const char *p; + if ((p = uprv_strrchr(posixID, '@')) != nullptr) { p++; /* Take care of any special cases here.. */ @@ -1685,16 +1657,17 @@ The leftmost codepage (.xxx) wins. /* Don't worry about no__NY. In practice, it won't appear. */ } - if (uprv_strchr(correctedPOSIXLocale,'_') == NULL) { + if (uprv_strchr(correctedPOSIXLocale,'_') == nullptr) { uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b (note this can make the new locale 1 char longer) */ } else { uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */ } - if ((q = uprv_strchr(p, '.')) != NULL) { + const char *q; + if ((q = uprv_strchr(p, '.')) != nullptr) { /* How big will the resulting string be? */ - len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); + int32_t len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); uprv_strncat(correctedPOSIXLocale, p, q-p); correctedPOSIXLocale[len] = 0; } @@ -1710,28 +1683,15 @@ The leftmost codepage (.xxx) wins. */ } - /* Was a correction made? */ - if (correctedPOSIXLocale != NULL) { - posixID = correctedPOSIXLocale; - } - else { - /* copy it, just in case the original pointer goes away. See j2395 */ - correctedPOSIXLocale = (char *)uprv_malloc(uprv_strlen(posixID) + 1); - /* Exit on memory allocation error. */ - if (correctedPOSIXLocale == NULL) { - return NULL; - } - posixID = uprv_strcpy(correctedPOSIXLocale, posixID); - } - - if (gCorrectedPOSIXLocale == NULL) { + if (gCorrectedPOSIXLocale == nullptr) { gCorrectedPOSIXLocale = correctedPOSIXLocale; gCorrectedPOSIXLocaleHeapAllocated = true; ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); - correctedPOSIXLocale = NULL; + correctedPOSIXLocale = nullptr; } + posixID = gCorrectedPOSIXLocale; - if (correctedPOSIXLocale != NULL) { /* Was already set - clean up. */ + if (correctedPOSIXLocale != nullptr) { /* Was already set - clean up. */ uprv_free(correctedPOSIXLocale); } diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index f744746b1f0feb..f9c13d8e1b27bf 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -204,7 +204,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_STD_ATOMICS - * Defines whether to use the standard C++11 functions + * Defines whether to use the C++11 std::atomic functions. * If false, ICU will fall back to compiler or platform specific alternatives. * Note: support for these fall back options for atomics will be removed in a future version * of ICU, and the use of C++ 11 atomics will be required. @@ -232,6 +232,22 @@ typedef size_t uintptr_t; # define U_HAVE_CLANG_ATOMICS 0 #endif + +/** + * \def U_HAVE_STD_MUTEX + * Defines whether to use the C++11 std::mutex functions. + * If false, ICU will fall back to compiler or platform specific alternatives. + * std::mutex is preferred, and used by default unless this setting is overridden. + * Note: support for other options for mutexes will be removed in a future version + * of ICU, and the use of std::mutex will be required. + * @internal + */ +#ifdef U_HAVE_STD_MUTEX + /* Use the predefined value. */ +#else +# define U_HAVE_STD_MUTEX 1 +#endif + /*===========================================================================*/ /** @{ Programs used by ICU code */ /*===========================================================================*/ diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index cb3766506f4082..3b116ffaf6cba7 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -30,6 +30,7 @@ #include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" +#include "localsvc.h" #include "rbbidata.h" #include "rbbi_cache.h" #include "rbbirb.h" @@ -37,11 +38,6 @@ #include "umutex.h" #include "uvectr32.h" -// if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included. -#if U_LOCAL_SERVICE_HOOK -#include "localsvc.h" -#endif - #ifdef RBBI_DEBUG static UBool gTrace = FALSE; #endif @@ -720,7 +716,7 @@ struct LookAheadResults { int32_t fPositions[8]; int16_t fKeys[8]; - LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {}; + LookAheadResults() : fUsedSlotLimit(0), fPositions(), fKeys() {} int32_t getPosition(int16_t key) { for (int32_t i=0; i= kMaxLookaheads) { - U_ASSERT(FALSE); - i = kMaxLookaheads - 1; + UPRV_UNREACHABLE; } fKeys[i] = key; fPositions[i] = position; diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp index 519c61049894e6..17ee2320802f60 100644 --- a/deps/icu-small/source/common/rbbi_cache.cpp +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -74,9 +74,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_ return TRUE; } } - U_ASSERT(FALSE); - fPositionInCache = -1; - return FALSE; + UPRV_UNREACHABLE; } @@ -116,9 +114,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_ return TRUE; } } - U_ASSERT(FALSE); - fPositionInCache = -1; - return FALSE; + UPRV_UNREACHABLE; } void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos, @@ -388,8 +384,7 @@ UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorC // Add following position(s) to the cache. while (fBoundaries[fEndBufIdx] < position) { if (!populateFollowing()) { - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } } fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer. diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h index fd6deb4333a97e..864ff811aaaff3 100644 --- a/deps/icu-small/source/common/rbbi_cache.h +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -95,7 +95,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory { fTextIdx = fBI->fPosition = fBoundaries[fBufIdx]; fBI->fRuleStatusIndex = fStatuses[fBufIdx]; } - }; + } void nextOL(); @@ -178,7 +178,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory { void dumpCache(); private: - static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }; + static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); } static constexpr int32_t CACHE_SIZE = 128; static_assert((CACHE_SIZE & (CACHE_SIZE-1)) == 0, "CACHE_SIZE must be power of two."); diff --git a/deps/icu-small/source/common/rbbiscan.h b/deps/icu-small/source/common/rbbiscan.h index 3d484db0e9be5d..cac60fb18a11b8 100644 --- a/deps/icu-small/source/common/rbbiscan.h +++ b/deps/icu-small/source/common/rbbiscan.h @@ -54,7 +54,7 @@ class RBBIRuleScanner : public UMemory { struct RBBIRuleChar { UChar32 fChar; UBool fEscaped; - RBBIRuleChar() : fChar(0), fEscaped(FALSE) {}; + RBBIRuleChar() : fChar(0), fEscaped(FALSE) {} }; RBBIRuleScanner(RBBIRuleBuilder *rb); diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 29c3463ed59396..00dbf6f8fe2e9c 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -376,8 +376,8 @@ void ResourceBundle::getVersion(UVersionInfo versionInfo) const { ures_getVersion(fResource, versionInfo); } -static UMutex gLocaleLock = U_MUTEX_INITIALIZER; const Locale &ResourceBundle::getLocale(void) const { + static UMutex gLocaleLock = U_MUTEX_INITIALIZER; Mutex lock(&gLocaleLock); if (fLocale != NULL) { return *fLocale; diff --git a/deps/icu-small/source/common/serv.cpp b/deps/icu-small/source/common/serv.cpp index 2fb35bd1a5994f..40940740d02b45 100644 --- a/deps/icu-small/source/common/serv.cpp +++ b/deps/icu-small/source/common/serv.cpp @@ -333,7 +333,10 @@ U_CDECL_END ****************************************************************** */ -static UMutex lock = U_MUTEX_INITIALIZER; +static UMutex *lock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} ICUService::ICUService() : name() @@ -358,7 +361,7 @@ ICUService::ICUService(const UnicodeString& newName) ICUService::~ICUService() { { - Mutex mutex(&lock); + Mutex mutex(lock()); clearCaches(); delete factories; factories = NULL; @@ -449,7 +452,7 @@ ICUService::getKey(ICUServiceKey& key, UnicodeString* actualReturn, const ICUSer // if factory is not null, we're calling from within the mutex, // and since some unix machines don't have reentrant mutexes we // need to make sure not to try to lock it again. - XMutex mutex(&lock, factory != NULL); + XMutex mutex(lock(), factory != NULL); if (serviceCache == NULL) { ncthis->serviceCache = new Hashtable(status); @@ -615,7 +618,7 @@ ICUService::getVisibleIDs(UVector& result, const UnicodeString* matchID, UErrorC } { - Mutex mutex(&lock); + Mutex mutex(lock()); const Hashtable* map = getVisibleIDMap(status); if (map != NULL) { ICUServiceKey* fallbackKey = createKey(matchID, status); @@ -692,7 +695,7 @@ ICUService::getDisplayName(const UnicodeString& id, UnicodeString& result, const { { UErrorCode status = U_ZERO_ERROR; - Mutex mutex(&lock); + Mutex mutex(lock()); const Hashtable* map = getVisibleIDMap(status); if (map != NULL) { ICUServiceFactory* f = (ICUServiceFactory*)map->get(id); @@ -744,7 +747,7 @@ ICUService::getDisplayNames(UVector& result, result.setDeleter(userv_deleteStringPair); if (U_SUCCESS(status)) { ICUService* ncthis = (ICUService*)this; // cast away semantic const - Mutex mutex(&lock); + Mutex mutex(lock()); if (dnCache != NULL && dnCache->locale != locale) { delete dnCache; @@ -849,7 +852,7 @@ URegistryKey ICUService::registerFactory(ICUServiceFactory* factoryToAdopt, UErrorCode& status) { if (U_SUCCESS(status) && factoryToAdopt != NULL) { - Mutex mutex(&lock); + Mutex mutex(lock()); if (factories == NULL) { factories = new UVector(deleteUObject, NULL, status); @@ -880,7 +883,7 @@ ICUService::unregister(URegistryKey rkey, UErrorCode& status) ICUServiceFactory *factory = (ICUServiceFactory*)rkey; UBool result = FALSE; if (factory != NULL && factories != NULL) { - Mutex mutex(&lock); + Mutex mutex(lock()); if (factories->removeElement(factory)) { clearCaches(); @@ -900,7 +903,7 @@ void ICUService::reset() { { - Mutex mutex(&lock); + Mutex mutex(lock()); reInitializeFactories(); clearCaches(); } diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index 907fe7fecfe1fb..0b1b1b947d514e 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -26,7 +26,6 @@ U_NAMESPACE_BEGIN -static UMutex llock = U_MUTEX_INITIALIZER; ICULocaleService::ICULocaleService() : fallbackLocale(Locale::getDefault()) { @@ -264,6 +263,7 @@ ICULocaleService::validateFallbackLocale() const { const Locale& loc = Locale::getDefault(); ICULocaleService* ncThis = (ICULocaleService*)this; + static UMutex llock = U_MUTEX_INITIALIZER; { Mutex mutex(&llock); if (loc != fallbackLocale) { diff --git a/deps/icu-small/source/common/servnotf.cpp b/deps/icu-small/source/common/servnotf.cpp index 5159452f0a32da..9b5997bd17f509 100644 --- a/deps/icu-small/source/common/servnotf.cpp +++ b/deps/icu-small/source/common/servnotf.cpp @@ -21,7 +21,10 @@ U_NAMESPACE_BEGIN EventListener::~EventListener() {} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(EventListener) -static UMutex notifyLock = U_MUTEX_INITIALIZER; +static UMutex *notifyLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} ICUNotifier::ICUNotifier(void) : listeners(NULL) @@ -30,7 +33,7 @@ ICUNotifier::ICUNotifier(void) ICUNotifier::~ICUNotifier(void) { { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); delete listeners; listeners = NULL; } @@ -47,7 +50,7 @@ ICUNotifier::addListener(const EventListener* l, UErrorCode& status) } if (acceptsListener(*l)) { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners == NULL) { listeners = new UVector(5, status); } else { @@ -80,7 +83,7 @@ ICUNotifier::removeListener(const EventListener *l, UErrorCode& status) } { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners != NULL) { // identity equality check for (int i = 0, e = listeners->size(); i < e; ++i) { @@ -103,7 +106,7 @@ void ICUNotifier::notifyChanged(void) { if (listeners != NULL) { - Mutex lmx(¬ifyLock); + Mutex lmx(notifyLock()); if (listeners != NULL) { for (int i = 0, e = listeners->size(); i < e; ++i) { EventListener* el = (EventListener*)listeners->elementAt(i); diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index f866e0a1a120e2..76d8f54efd4aea 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -246,15 +246,24 @@ UnicodeString &SimpleFormatter::formatAndReplace( } UnicodeString SimpleFormatter::getTextWithNoArguments( - const UChar *compiledPattern, int32_t compiledPatternLength) { + const UChar *compiledPattern, + int32_t compiledPatternLength, + int32_t* offsets, + int32_t offsetsLength) { + for (int32_t i = 0; i < offsetsLength; i++) { + offsets[i] = -1; + } int32_t capacity = compiledPatternLength - 1 - getArgumentLimit(compiledPattern, compiledPatternLength); UnicodeString sb(capacity, 0, 0); // Java: StringBuilder for (int32_t i = 1; i < compiledPatternLength;) { - int32_t segmentLength = compiledPattern[i++] - ARG_NUM_LIMIT; - if (segmentLength > 0) { - sb.append(compiledPattern + i, segmentLength); - i += segmentLength; + int32_t n = compiledPattern[i++]; + if (n > ARG_NUM_LIMIT) { + n -= ARG_NUM_LIMIT; + sb.append(compiledPattern + i, n); + i += n; + } else if (n < offsetsLength) { + offsets[n] = sb.length(); } } return sb; diff --git a/deps/icu-small/source/common/static_unicode_sets.cpp b/deps/icu-small/source/common/static_unicode_sets.cpp index 5d598a0e33b6d4..5dab3931a707fd 100644 --- a/deps/icu-small/source/common/static_unicode_sets.cpp +++ b/deps/icu-small/source/common/static_unicode_sets.cpp @@ -23,7 +23,7 @@ using namespace icu::unisets; namespace { -UnicodeSet* gUnicodeSets[COUNT] = {}; +UnicodeSet* gUnicodeSets[UNISETS_KEY_COUNT] = {}; // Save the empty instance in static memory to have well-defined behavior if a // regular UnicodeSet cannot be allocated. @@ -97,14 +97,28 @@ class ParseDataSink : public ResourceSink { saveSet(isLenient ? COMMA : STRICT_COMMA, str, status); } else if (str.indexOf(u'+') != -1) { saveSet(PLUS_SIGN, str, status); - } else if (str.indexOf(u'‒') != -1) { + } else if (str.indexOf(u'-') != -1) { saveSet(MINUS_SIGN, str, status); } else if (str.indexOf(u'$') != -1) { saveSet(DOLLAR_SIGN, str, status); } else if (str.indexOf(u'£') != -1) { saveSet(POUND_SIGN, str, status); - } else if (str.indexOf(u'₨') != -1) { + } else if (str.indexOf(u'₹') != -1) { saveSet(RUPEE_SIGN, str, status); + } else if (str.indexOf(u'¥') != -1) { + saveSet(YEN_SIGN, str, status); + } else if (str.indexOf(u'₩') != -1) { + saveSet(WON_SIGN, str, status); + } else if (str.indexOf(u'%') != -1) { + saveSet(PERCENT_SIGN, str, status); + } else if (str.indexOf(u'‰') != -1) { + saveSet(PERMILLE_SIGN, str, status); + } else if (str.indexOf(u'’') != -1) { + saveSet(APOSTROPHE_SIGN, str, status); + } else { + // Unknown class of parse lenients + // TODO(ICU-20428): Make ICU automatically accept new classes? + U_ASSERT(FALSE); } if (U_FAILURE(status)) { return; } } @@ -122,7 +136,7 @@ UBool U_CALLCONV cleanupNumberParseUniSets() { reinterpret_cast(gEmptyUnicodeSet)->~UnicodeSet(); gEmptyUnicodeSetInitialized = FALSE; } - for (int32_t i = 0; i < COUNT; i++) { + for (int32_t i = 0; i < UNISETS_KEY_COUNT; i++) { delete gUnicodeSets[i]; gUnicodeSets[i] = nullptr; } @@ -155,27 +169,35 @@ void U_CALLCONV initNumberParseUniSets(UErrorCode& status) { U_ASSERT(gUnicodeSets[STRICT_COMMA] != nullptr); U_ASSERT(gUnicodeSets[PERIOD] != nullptr); U_ASSERT(gUnicodeSets[STRICT_PERIOD] != nullptr); + U_ASSERT(gUnicodeSets[APOSTROPHE_SIGN] != nullptr); - gUnicodeSets[OTHER_GROUPING_SEPARATORS] = new UnicodeSet( - u"['٬‘’'\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]", status); + LocalPointer otherGrouping(new UnicodeSet( + u"[٬‘\\u0020\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]", + status + ), status); + if (U_FAILURE(status)) { return; } + otherGrouping->addAll(*gUnicodeSets[APOSTROPHE_SIGN]); + gUnicodeSets[OTHER_GROUPING_SEPARATORS] = otherGrouping.orphan(); gUnicodeSets[ALL_SEPARATORS] = computeUnion(COMMA, PERIOD, OTHER_GROUPING_SEPARATORS); gUnicodeSets[STRICT_ALL_SEPARATORS] = computeUnion( STRICT_COMMA, STRICT_PERIOD, OTHER_GROUPING_SEPARATORS); U_ASSERT(gUnicodeSets[MINUS_SIGN] != nullptr); U_ASSERT(gUnicodeSets[PLUS_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[PERCENT_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[PERMILLE_SIGN] != nullptr); - gUnicodeSets[PERCENT_SIGN] = new UnicodeSet(u"[%٪]", status); - gUnicodeSets[PERMILLE_SIGN] = new UnicodeSet(u"[‰؉]", status); - gUnicodeSets[INFINITY_KEY] = new UnicodeSet(u"[∞]", status); + gUnicodeSets[INFINITY_SIGN] = new UnicodeSet(u"[∞]", status); + if (U_FAILURE(status)) { return; } U_ASSERT(gUnicodeSets[DOLLAR_SIGN] != nullptr); U_ASSERT(gUnicodeSets[POUND_SIGN] != nullptr); U_ASSERT(gUnicodeSets[RUPEE_SIGN] != nullptr); - gUnicodeSets[YEN_SIGN] = new UnicodeSet(u"[¥\\uffe5]", status); + U_ASSERT(gUnicodeSets[YEN_SIGN] != nullptr); + U_ASSERT(gUnicodeSets[WON_SIGN] != nullptr); gUnicodeSets[DIGITS] = new UnicodeSet(u"[:digit:]", status); - + if (U_FAILURE(status)) { return; } gUnicodeSets[DIGITS_OR_ALL_SEPARATORS] = computeUnion(DIGITS, ALL_SEPARATORS); gUnicodeSets[DIGITS_OR_STRICT_ALL_SEPARATORS] = computeUnion(DIGITS, STRICT_ALL_SEPARATORS); diff --git a/deps/icu-small/source/common/static_unicode_sets.h b/deps/icu-small/source/common/static_unicode_sets.h index 5f18b3217eae2b..9d8a5fcddc9953 100644 --- a/deps/icu-small/source/common/static_unicode_sets.h +++ b/deps/icu-small/source/common/static_unicode_sets.h @@ -1,7 +1,17 @@ // © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +// This file contains utilities to deal with static-allocated UnicodeSets. +// +// Common use case: you write a "private static final" UnicodeSet in Java, and +// want something similarly easy in C++. Originally written for number +// parsing, but this header can be used for other applications. +// +// Main entrypoint: `unisets::get(unisets::MY_SET_ID_HERE)` +// // This file is in common instead of i18n because it is needed by ucurr.cpp. +// +// Author: sffc #include "unicode/utypes.h" @@ -35,6 +45,7 @@ enum Key { PERIOD, STRICT_COMMA, STRICT_PERIOD, + APOSTROPHE_SIGN, OTHER_GROUPING_SEPARATORS, ALL_SEPARATORS, STRICT_ALL_SEPARATORS, @@ -44,13 +55,14 @@ enum Key { PLUS_SIGN, PERCENT_SIGN, PERMILLE_SIGN, - INFINITY_KEY, // INFINITY is defined in cmath + INFINITY_SIGN, // Currency Symbols DOLLAR_SIGN, POUND_SIGN, RUPEE_SIGN, - YEN_SIGN, // not in CLDR data, but Currency.java wants it + YEN_SIGN, + WON_SIGN, // Other DIGITS, @@ -60,7 +72,7 @@ enum Key { DIGITS_OR_STRICT_ALL_SEPARATORS, // The number of elements in the enum. - COUNT + UNISETS_KEY_COUNT }; /** @@ -69,6 +81,13 @@ enum Key { * * Exported as U_COMMON_API for ucurr.cpp * + * This method is always safe and OK to chain: in the case of a memory or other + * error, it returns an empty set from static memory. + * + * Example: + * + * UBool hasIgnorables = unisets::get(unisets::DEFAULT_IGNORABLES)->contains(...); + * * @param key The desired UnicodeSet according to the enum in this file. * @return The requested UnicodeSet. Guaranteed to be frozen and non-null, but * may be empty if an error occurred during data loading. @@ -99,6 +118,7 @@ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1); */ U_COMMON_API Key chooseFrom(UnicodeString str, Key key1, Key key2); +// TODO: Load these from data: ICU-20108 // Unused in C++: // Key chooseCurrency(UnicodeString str); // Used instead: @@ -108,8 +128,9 @@ static const struct { } kCurrencyEntries[] = { {DOLLAR_SIGN, u'$'}, {POUND_SIGN, u'£'}, - {RUPEE_SIGN, u'₨'}, + {RUPEE_SIGN, u'₹'}, {YEN_SIGN, u'¥'}, + {WON_SIGN, u'₩'}, }; } // namespace unisets diff --git a/deps/icu-small/source/common/uassert.h b/deps/icu-small/source/common/uassert.h index 2c080eb402f07c..f0f7a92574b4d4 100644 --- a/deps/icu-small/source/common/uassert.h +++ b/deps/icu-small/source/common/uassert.h @@ -10,23 +10,40 @@ * * File uassert.h * -* Contains U_ASSERT macro -* -* By default, U_ASSERT just wraps the C library assert macro. -* By changing the definition here, the assert behavior for ICU can be changed -* without affecting other non-ICU uses of the C library assert(). +* Contains the U_ASSERT and UPRV_UNREACHABLE macros * ****************************************************************************** */ - #ifndef U_ASSERT_H #define U_ASSERT_H + /* utypes.h is included to get the proper define for uint8_t */ #include "unicode/utypes.h" +/* for abort */ +#include + +/** + * \def U_ASSERT + * By default, U_ASSERT just wraps the C library assert macro. + * By changing the definition here, the assert behavior for ICU can be changed + * without affecting other non - ICU uses of the C library assert(). +*/ #if U_DEBUG # include # define U_ASSERT(exp) assert(exp) #else # define U_ASSERT(exp) #endif + +/** + * \def UPRV_UNREACHABLE + * This macro is used to unconditionally abort if unreachable code is ever executed. + * @internal +*/ +#if defined(UPRV_UNREACHABLE) + // Use the predefined value. +#else +# define UPRV_UNREACHABLE abort() +#endif + #endif diff --git a/deps/icu-small/source/common/ubidi.cpp b/deps/icu-small/source/common/ubidi.cpp index 4b65d491859bfa..3ddb45721e25ec 100644 --- a/deps/icu-small/source/common/ubidi.cpp +++ b/deps/icu-small/source/common/ubidi.cpp @@ -2047,8 +2047,7 @@ processPropertySeq(UBiDi *pBiDi, LevState *pLevState, uint8_t _prop, break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } if((addLevel) || (start < start0)) { @@ -2251,8 +2250,7 @@ resolveImplicitLevels(UBiDi *pBiDi, start2=i; break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } } @@ -2726,8 +2724,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, break; default: /* we should never get here */ - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } /* * If there are no external levels specified and there diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 55e331b612efcb..70083892048f80 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -11,539 +11,539 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={0xb,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0xc,1,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x647c,0x5e98,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x663c,0x6058,0x28,0x620,0x8c0,0x10ac0,0x10d24,0,0,0,0,0,0,0,0x6502b6}; -static const uint16_t ubidi_props_trieIndex[12100]={ -0x36f,0x377,0x37f,0x387,0x39f,0x3a7,0x3af,0x3b7,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x38f,0x397, -0x38f,0x397,0x38f,0x397,0x3bd,0x3c5,0x3cd,0x3d5,0x3dd,0x3e5,0x3e1,0x3e9,0x3f1,0x3f9,0x3f4,0x3fc, -0x38f,0x397,0x38f,0x397,0x404,0x40c,0x38f,0x397,0x38f,0x397,0x38f,0x397,0x412,0x41a,0x422,0x42a, -0x432,0x43a,0x442,0x44a,0x450,0x458,0x460,0x468,0x470,0x478,0x47e,0x486,0x48e,0x496,0x49e,0x4a6, -0x4b2,0x4ae,0x4ba,0x4c2,0x424,0x4d2,0x4da,0x4ca,0x4e2,0x4e4,0x4ec,0x4f4,0x4fc,0x4fd,0x505,0x50d, -0x515,0x4fd,0x51d,0x522,0x515,0x4fd,0x52a,0x532,0x4fc,0x53a,0x542,0x4f4,0x547,0x38f,0x54f,0x553, -0x55b,0x55d,0x565,0x56d,0x4fc,0x575,0x57d,0x4f4,0x406,0x581,0x505,0x4f4,0x38f,0x38f,0x589,0x38f, -0x38f,0x58f,0x597,0x38f,0x38f,0x59b,0x5a3,0x38f,0x5a7,0x5ae,0x38f,0x5b6,0x5be,0x5c5,0x546,0x38f, -0x38f,0x5cd,0x5d5,0x5dd,0x5e5,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x5ed,0x38f,0x5f5,0x38f,0x38f,0x38f, -0x5fd,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x605,0x38f,0x38f,0x38f,0x60d,0x60d,0x509,0x509,0x38f,0x613,0x61b,0x5f5, -0x631,0x623,0x623,0x639,0x640,0x629,0x38f,0x38f,0x38f,0x648,0x650,0x38f,0x38f,0x38f,0x652,0x65a, -0x662,0x38f,0x669,0x671,0x38f,0x679,0x38f,0x38f,0x539,0x681,0x547,0x689,0x406,0x691,0x38f,0x698, -0x38f,0x69d,0x38f,0x38f,0x38f,0x38f,0x6a3,0x6ab,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0x6b3, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x6bb,0x6c3,0x6c7, -0x6df,0x6e5,0x6cf,0x6d7,0x6ed,0x6f5,0x6f9,0x5c8,0x701,0x709,0x711,0x38f,0x719,0x65a,0x65a,0x65a, -0x729,0x731,0x739,0x741,0x746,0x74e,0x756,0x721,0x75e,0x766,0x38f,0x76c,0x773,0x65a,0x65a,0x65a, -0x65a,0x573,0x779,0x65a,0x781,0x38f,0x38f,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x789,0x65a,0x65a,0x65a,0x65a,0x65a,0x78f,0x65a,0x65a,0x797,0x79f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a,0x65a,0x65a,0x7af,0x7b7,0x7bf,0x7a7, -0x7cf,0x7d7,0x7df,0x7e6,0x7ed,0x7f5,0x7f9,0x7c7,0x65a,0x65a,0x65a,0x801,0x807,0x65a,0x80d,0x810, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x818,0x38f,0x38f,0x38f,0x820,0x38f,0x38f,0x38f,0x3dd, -0x828,0x830,0x835,0x38f,0x83d,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x844,0x84a, -0x85a,0x852,0x38f,0x38f,0x862,0x5fd,0x38f,0x3b6,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x81f, -0x3c4,0x38f,0x839,0x86a,0x38f,0x872,0x87a,0x38f,0x38f,0x38f,0x38f,0x87e,0x38f,0x38f,0x652,0x3b5, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x65a,0x65a, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x839,0x65a,0x573,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x885,0x38f,0x38f,0x88a,0x55d,0x38f,0x38f,0x5a9,0x65a,0x651,0x38f,0x38f,0x892,0x38f,0x38f,0x38f, -0x89a,0x8a1,0x623,0x8a9,0x38f,0x38f,0x57f,0x8b1,0x38f,0x8b9,0x8c0,0x38f,0x4e2,0x8c5,0x38f,0x4fb, -0x38f,0x8cd,0x8d5,0x4fd,0x38f,0x8d9,0x4fc,0x8e1,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8e8, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x8fc,0x8f0,0x8f4,0x48e,0x48e,0x48e,0x48e,0x48e, -0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x904,0x48e,0x48e,0x48e,0x48e,0x90c,0x910, -0x918,0x920,0x924,0x92c,0x48e,0x48e,0x48e,0x930,0x938,0x37f,0x940,0x948,0x38f,0x38f,0x38f,0x950, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xe3c,0xe3c,0xe7c,0xebc,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xe3c,0xef4,0xf34,0xf74,0xf84,0xfc4,0xfd0, -0xe3c,0xe3c,0x1010,0xe3c,0xe3c,0xe3c,0x1048,0x1088,0x10c8,0x1108,0x1140,0x1180,0x11c0,0x11f8,0x1238,0x1278, -0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb37,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb74,0x1a0,0x1a0,0xba9,0xbe9,0xc29,0xc69,0xca9,0xce9, +static const uint16_t ubidi_props_trieIndex[12324]={ +0x37c,0x384,0x38c,0x394,0x3ac,0x3b4,0x3bc,0x3c4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4, +0x39c,0x3a4,0x39c,0x3a4,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3ee,0x3f6,0x3fe,0x406,0x401,0x409, +0x39c,0x3a4,0x39c,0x3a4,0x411,0x419,0x39c,0x3a4,0x39c,0x3a4,0x39c,0x3a4,0x41f,0x427,0x42f,0x437, +0x43f,0x447,0x44f,0x457,0x45d,0x465,0x46d,0x475,0x47d,0x485,0x48b,0x493,0x49b,0x4a3,0x4ab,0x4b3, +0x4bf,0x4bb,0x4c7,0x4cf,0x431,0x4df,0x4e7,0x4d7,0x4ef,0x4f1,0x4f9,0x501,0x509,0x50a,0x512,0x51a, +0x522,0x50a,0x52a,0x52f,0x522,0x50a,0x537,0x53f,0x509,0x547,0x54f,0x501,0x554,0x39c,0x55c,0x560, +0x568,0x56a,0x572,0x57a,0x509,0x582,0x58a,0x501,0x413,0x58e,0x512,0x501,0x39c,0x39c,0x596,0x39c, +0x39c,0x59c,0x5a4,0x39c,0x39c,0x5a8,0x5b0,0x39c,0x5b4,0x5bb,0x39c,0x5c3,0x5cb,0x5d2,0x553,0x39c, +0x39c,0x5da,0x5e2,0x5ea,0x5f2,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x5fa,0x39c,0x602,0x39c,0x39c,0x39c, +0x60a,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x612,0x39c,0x39c,0x39c,0x61a,0x61a,0x516,0x516,0x39c,0x620,0x628,0x602, +0x63e,0x630,0x630,0x646,0x64d,0x636,0x39c,0x39c,0x39c,0x655,0x65d,0x39c,0x39c,0x39c,0x65f,0x667, +0x66f,0x39c,0x676,0x67e,0x39c,0x686,0x39c,0x39c,0x546,0x68e,0x554,0x696,0x413,0x69e,0x39c,0x6a5, +0x39c,0x6aa,0x39c,0x39c,0x39c,0x39c,0x6b0,0x6b8,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0x6c0, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x6c8,0x6d0,0x6d4, +0x6ec,0x6f2,0x6dc,0x6e4,0x6fa,0x702,0x706,0x5d5,0x70e,0x716,0x71e,0x39c,0x726,0x667,0x667,0x667, +0x736,0x73e,0x746,0x74e,0x753,0x75b,0x763,0x72e,0x76b,0x773,0x39c,0x779,0x780,0x667,0x667,0x667, +0x667,0x580,0x786,0x667,0x78e,0x39c,0x39c,0x664,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x667,0x667,0x796,0x667,0x667,0x667,0x667,0x667,0x79c,0x667,0x667,0x7a4,0x7ac, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x7bc,0x7c4,0x7cc,0x7b4, +0x7dc,0x7e4,0x7ec,0x7f3,0x7fa,0x802,0x806,0x7d4,0x667,0x667,0x667,0x80e,0x814,0x667,0x667,0x81a, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x822,0x39c,0x39c,0x39c,0x82a,0x39c,0x39c,0x39c,0x3ea, +0x832,0x83a,0x66b,0x39c,0x83d,0x667,0x667,0x66a,0x667,0x667,0x667,0x667,0x667,0x667,0x844,0x84a, +0x85a,0x852,0x39c,0x39c,0x862,0x60a,0x39c,0x3c3,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x829, +0x3d1,0x39c,0x86a,0x872,0x39c,0x87a,0x882,0x39c,0x39c,0x39c,0x39c,0x886,0x39c,0x39c,0x65f,0x3c2, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x86a,0x667,0x580,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x88d,0x39c,0x39c,0x892,0x56a,0x39c,0x39c,0x5b6,0x667,0x65e,0x39c,0x39c,0x89a,0x39c,0x39c,0x39c, +0x8a2,0x8a9,0x630,0x8b1,0x39c,0x39c,0x58c,0x8b9,0x39c,0x8c1,0x8c8,0x39c,0x4ef,0x8cd,0x39c,0x508, +0x39c,0x8d5,0x8dd,0x50a,0x39c,0x8e1,0x509,0x8e9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x8f0, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x904,0x8f8,0x8fc,0x49b,0x49b,0x49b,0x49b,0x49b, +0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x90c,0x49b,0x49b,0x49b,0x49b,0x914,0x918, +0x920,0x928,0x92c,0x934,0x49b,0x49b,0x49b,0x938,0x940,0x38c,0x948,0x950,0x39c,0x39c,0x39c,0x958, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xe70,0xe70,0xeb0,0xef0,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xf28,0xf68,0xfa8,0xfb8,0xff8,0x1004, +0xe70,0xe70,0x1044,0xe70,0xe70,0xe70,0x107c,0x10bc,0x10fc,0x113c,0x1174,0x11b4,0x11f4,0x122c,0x126c,0x12ac, +0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb68,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xba8,0x1a0,0x1a0,0xbdd,0xc1d,0xc5d,0xc9d,0xcdd,0xd1d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, -0xd69,0xd79,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, +0xd9d,0xdad,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd29, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x958,0x38f,0x65a,0x65a,0x960,0x5fd,0x38f,0x4f5, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x968,0x38f,0x38f,0x38f,0x96f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x977,0x424,0x424,0x424,0x424,0x424,0x424,0x424, -0x97f,0x983,0x424,0x424,0x424,0x424,0x993,0x98b,0x424,0x99b,0x424,0x424,0x9a3,0x9a9,0x424,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x9b9,0x9b1,0x424,0x424,0x424,0x424,0x424,0x424, -0x424,0x424,0x424,0x9c1,0x424,0x424,0x424,0x424,0x424,0x9c9,0x9d0,0x9d6,0x424,0x424,0x424,0x424, -0x4fc,0x9de,0x9e5,0x9ec,0x406,0x9ef,0x38f,0x38f,0x4e2,0x9f6,0x38f,0x9fc,0x406,0xa01,0xa09,0x38f, -0x38f,0xa0e,0x38f,0x38f,0x38f,0x38f,0x820,0xa16,0x406,0x581,0x55c,0xa1d,0x38f,0x38f,0x38f,0x38f, -0x38f,0x9de,0xa25,0x38f,0x38f,0xa2d,0xa35,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa39,0xa41,0x38f, -0x38f,0xa49,0x55c,0xa51,0x38f,0xa57,0x38f,0x38f,0x5ed,0xa5f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xa64,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xa6c, -0xa70,0xa78,0x38f,0xa7f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0xa86,0x38f,0x38f,0xa94,0xa8e,0x38f,0x38f,0x38f,0xa9c,0xaa4,0x38f,0xaa8,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x583,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xaae,0x38f, -0xab4,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0xaba,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x516,0xac2,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0xac9,0xad1,0xad7,0x38f,0x38f,0x65a,0x65a,0xadf,0x38f,0x38f,0x38f,0x38f, -0x38f,0x65a,0x65a,0x833,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xae1, -0x38f,0xae8,0x38f,0xae4,0x38f,0xaeb,0x38f,0xaf3,0xaf7,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x3dd,0xaff,0x3dd,0xb06,0xb0d,0xb15,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xb1d,0xb25,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x424,0x424,0x424,0x424,0x424,0x424,0xb2d, -0x424,0xb35,0xb35,0xb3c,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x8f4,0x48e,0x48e,0x424, -0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e,0x48e, -0xb44,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x424,0x65a,0xb4c,0x65a,0x65a,0x65d,0xb51,0xb55, -0x844,0xb5d,0x3b1,0x38f,0xb63,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x76a,0x38f,0x38f,0x38f, -0x38f,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0xb6b, -0xb73,0x65a,0x65a,0x65a,0x65d,0x65a,0x65a,0xb7b,0x38f,0xb4c,0x65a,0xb83,0x65a,0xb8b,0x846,0x38f, -0x38f,0xb4c,0xb8f,0x65a,0xb97,0x65a,0xb9f,0xba7,0x65a,0x38f,0x38f,0x38f,0x846,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f, -0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0x38f,0xbaf,0xbbf,0xbb7,0xbb7,0xbb7,0xbc0,0xbc0,0xbc0, -0xbc0,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0x3dd,0xbc8,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0x36e,0x36e,0x36e,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4, -4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2, -2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0xa,0xa,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12, -0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,6,0xa,4,4, -4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa,4,4,2,2, -0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd5d, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x960,0x39c,0x667,0x667,0x968,0x60a,0x39c,0x502, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x970,0x39c,0x39c,0x39c,0x977,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x97f,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x987,0x98b,0x431,0x431,0x431,0x431,0x99b,0x993,0x431,0x9a3,0x431,0x431,0x9ab,0x9b1,0x431,0x431, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x9c1,0x9b9,0x431,0x431,0x431,0x431,0x431,0x431, +0x431,0x431,0x431,0x9c9,0x431,0x431,0x431,0x431,0x431,0x9d1,0x9d8,0x9de,0x431,0x431,0x431,0x431, +0x509,0x9e6,0x9ed,0x9f4,0x413,0x9f7,0x39c,0x39c,0x4ef,0x9fe,0x39c,0xa04,0x413,0xa09,0xa11,0x39c, +0x39c,0xa16,0x39c,0x39c,0x39c,0x39c,0x82a,0xa1e,0x413,0x58e,0x569,0xa25,0x39c,0x39c,0x39c,0x39c, +0x39c,0x9e6,0xa2d,0x39c,0x39c,0xa35,0xa3d,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa41,0xa49,0x39c, +0x39c,0xa51,0x569,0xa59,0x39c,0xa5f,0x39c,0x39c,0x5fa,0xa67,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xa6c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xa73,0x569,0xa7b, +0xa7f,0xa87,0x39c,0xa8e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xa95,0x39c,0x39c,0xaa3,0xa9d,0x39c,0x39c,0x39c,0xaab,0xab3,0x39c,0xab7,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x590,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xac4,0xabf,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0xacc,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad3, +0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0xa05,0x39c,0xadf,0x39c,0x39c,0xae7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x523,0xaef,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xaf6,0xafe,0xb04,0x39c,0x39c,0x667,0x667,0xb0c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0xb14,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0xb1a,0x39c,0xb21,0x39c,0xb1d,0x39c,0xb24,0x39c,0xb2c,0xb30,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x3ea,0xb38,0x3ea, +0xb3f,0xb46,0xb4e,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xb56,0xb5e,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xad9,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0xb63,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x431,0x431,0x431, +0x431,0x431,0x431,0xb6b,0x431,0xb73,0xb73,0xb7a,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431, +0x8fc,0x49b,0x49b,0x431,0x431,0x49b,0x49b,0x9de,0x431,0x431,0x431,0x431,0x431,0x49b,0x49b,0x49b, +0x49b,0x49b,0x49b,0x49b,0xb82,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x431,0x667,0xb8a,0x667, +0x667,0x66a,0xb8f,0xb93,0x844,0xb9b,0x3be,0x39c,0xba1,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x777,0x39c,0x39c,0x39c,0x39c,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667,0x667, +0x667,0x667,0x667,0x844,0xba9,0x667,0x667,0x667,0x66a,0x667,0x667,0xbb1,0x66c,0xb8a,0x667,0xbb9, +0x667,0xbc1,0x846,0x39c,0x39c,0x796,0x667,0x667,0xbc5,0x667,0xbcd,0xbd3,0x667,0x667,0x667,0x66a, +0xbd8,0xbe7,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xbdf,0xbf7,0xbef,0xbef, +0xbef,0xbf8,0xbf8,0xbf8,0xbf8,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0xc00,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8, +0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0xbf8,0x37b,0x37b,0x37b, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,8,7,8,9,7,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,7,7,7,8, +9,0xa,0xa,4,4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6, +2,2,2,2,2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0xa, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x12, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, -0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x12,0x12,0x12,0x12,0x12,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +6,0xa,4,4,4,4,0xa,0xa,0xa,0xa,0,0x900a,0xa,0xb2,0xa,0xa, +4,4,2,2,0xa,0,0xa,0xa,0xa,2,0,0x900a,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0,0,0,0,0, -0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xa,0xa,0,0, +0,0,0,0,0,0,0xa,0,0,0,0,0,0xa,0xa,0,0xa, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1,0xb1,0xb1,1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,0xb1,1,0xb1,0xb1,1, +0xb1,0xb1,1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,5,5,5,5,5,0xa,0xa, -0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5,5,5,5,5, -5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d,0xd,0x8d,0x8d,0x8d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5, +5,5,0xa,0xa,0xd,4,4,0xd,6,0xd,0xa,0xa,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0x8ad,0xd,0xd,0xd,0x4d,0xd,0x8d,0x8d, +0x8d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x2d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,5,5,5, +5,5,5,5,5,5,4,5,5,0xd,0x4d,0x4d,0xb1,0x8d,0x8d,0x8d, +0xd,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x8d,0x4d,0x8d, -0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,0xa,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0x8d,0x8d, -2,2,2,2,2,2,2,2,2,2,0x4d,0x4d,0x4d,0xd,0xd,0x4d, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xad, -0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d, -0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x4d,0x8d,0x4d,0x8d,0x4d,0x4d,0x8d,0x8d,0xd,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,5,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xb1,0xb1,0xa,0xb1,0xb1, +0xb1,0xb1,0x8d,0x8d,2,2,2,2,2,2,2,2,2,2,0x4d,0x4d, +0x4d,0xd,0xd,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xad,0x8d,0xb1,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x8d,0x8d,0x4d,0x4d, +0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d,0x4d, +0x8d,0x4d,0x4d,0x8d,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x8d, +0x8d,0x4d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1, -1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa, -0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1, -1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1, -0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81, -0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1, -1,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d, -0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +1,1,0xa,0xa,0xa,0xa,0x21,1,1,0xb1,1,1,0xb1,0xb1,0xb1,0xb1, +1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41, +0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0x81,0x41,1,1,1,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d, +0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,5,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d,0x4d,0xd,0x4d,0x4d, -0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d, +0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d,0x8d,0xd,0x8d,0x4d,0x4d,0x8d,0x8d,0x4d, +0x4d,0xd,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,4, -0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0xb1, -0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, +0,0,0,4,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0, +0xb1,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0xa0,0,0,0,0,0,0,0xa0,0, 0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1, -0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0, -0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x310a, -0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0,0,0,0,0,4,0,0xb1,0,0,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0, +0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, -0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0, -0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, -0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a, +0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0,0,0,0,0xa,0,0,0,0xa,0xa,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, -0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0, +0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0, +0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa, -6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2, -0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0, -2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9, -9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae, -0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,3,3, -0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0, +0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9, +0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, +2,0,0,0,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0, +9,9,9,9,9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa, +0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, +2,2,3,3,0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, -0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a, -0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a, -0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a, -0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, -0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a, -0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, +4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa, +0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa, +0,0xa,0,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,0,0xa,0xa,0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0, +0,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a, +0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa, +0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa, +0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x900a,0x900a,0x900a,0x900a,0xa,0x900a,0xa,0x100a,0xa, +0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa, +0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x900a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a, +0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a, -0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a, -0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, -0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a, -0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a, -0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a,0x900a,0xa,0x100a,0x900a, -0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a, -0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa, -0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a, -0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa,0xa,0xa,0xa,0x100a, -0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa, -0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa, +2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa, +0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0x300a,0xf00a,0xa, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa, +0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a, +0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x900a,0x100a,0x100a,0x100a,0x100a, +0x900a,0xa,0x100a,0x900a,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a, +0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa, +0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x900a,0xa, +0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a, +0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a, +0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, 0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0, -0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0,0,0,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, @@ -555,6 +555,8 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, @@ -579,7 +581,7 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, 0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -683,89 +685,101 @@ static const uint16_t ubidi_props_trieIndex[12100]={ 0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa0,0xa0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0, -0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xa0,0xa0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0xb1,0,0xb1,0,0,0,0,0,0,0,0,4,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0, +0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2, +0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1, -0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, -0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2, +0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0,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,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, -1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,0xa, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xa1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +2,2,2,2,2,2,2,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, 0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa, -0xa,0xa,0xa,0,0,0,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xa,0xa,0xa,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, @@ -876,16 +890,16 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_jgArray2, { ubidi_props_trieIndex, - ubidi_props_trieIndex+3516, + ubidi_props_trieIndex+3568, NULL, - 3516, - 8584, + 3568, + 8756, 0x1a0, - 0xe3c, + 0xe70, 0x0, 0x0, 0x110000, - 0x2f40, + 0x3020, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiln.cpp b/deps/icu-small/source/common/ubidiln.cpp index 71c581fe1c713b..3545f4e111ce78 100644 --- a/deps/icu-small/source/common/ubidiln.cpp +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -517,7 +517,7 @@ reorderLine(UBiDi *pBiDi, UBiDiLevel minLevel, UBiDiLevel maxLevel) { /* compute the runs array --------------------------------------------------- */ -static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UErrorCode *pErrorCode) { +static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex) { Run *runs=pBiDi->runs; int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; @@ -530,9 +530,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError visualStart+=length; } /* we should never get here */ - U_ASSERT(FALSE); - *pErrorCode = U_INVALID_STATE_ERROR; - return 0; + UPRV_UNREACHABLE; } /* @@ -547,7 +545,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex, UError * negative number of BiDi control characters within this run. */ U_CFUNC UBool -ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { +ubidi_getRuns(UBiDi *pBiDi, UErrorCode*) { /* * This method returns immediately if the runs are already set. This * includes the case of length==0 (handled in setPara).. @@ -688,7 +686,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { *limit=start+pBiDi->insertPoints.size; int32_t runIndex; for(point=start; pointpos, pErrorCode); + runIndex=getRunFromLogicalIndex(pBiDi, point->pos); pBiDi->runs[runIndex].insertRemove|=point->flag; } } @@ -699,7 +697,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode *pErrorCode) { const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; for(pu=start; puruns[runIndex].insertRemove--; } } diff --git a/deps/icu-small/source/common/ubidiwrt.cpp b/deps/icu-small/source/common/ubidiwrt.cpp index a89099dad0e700..aa4d6b544c1787 100644 --- a/deps/icu-small/source/common/ubidiwrt.cpp +++ b/deps/icu-small/source/common/ubidiwrt.cpp @@ -40,7 +40,7 @@ * Further assumptions for all UTFs: * - u_charMirror(c) needs the same number of code units as c */ -#if UTF_SIZE==8 +#if defined(UTF_SIZE) && UTF_SIZE==8 # error reimplement ubidi_writeReordered() for UTF-8, see comment above #endif diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index eb7d9ff9099d18..68554b3130c83f 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -11,145 +11,145 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={0xb,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0xc,1,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6e72,0x5e50,0x67f,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6fea,0x5fb8,0x687,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[12064]={ -0x32c,0x334,0x33c,0x344,0x352,0x35a,0x362,0x36a,0x372,0x37a,0x381,0x389,0x391,0x399,0x3a1,0x3a9, -0x3af,0x3b7,0x3bf,0x3c7,0x3cf,0x3d7,0x3df,0x3e7,0x3ef,0x3f7,0x3ff,0x407,0x40f,0x417,0x41f,0x427, -0x42f,0x437,0x43f,0x447,0x44f,0x457,0x45f,0x467,0x463,0x46b,0x470,0x478,0x47f,0x487,0x48f,0x497, -0x49f,0x4a7,0x4af,0x4b7,0x34b,0x353,0x4bc,0x4c4,0x4c9,0x4d1,0x4d9,0x4e1,0x4e0,0x4e8,0x4ed,0x4f5, -0x4fd,0x504,0x508,0x34b,0x34b,0x32c,0x518,0x510,0x520,0x522,0x52a,0x532,0x536,0x537,0x53f,0x547, -0x54f,0x537,0x557,0x55c,0x54f,0x537,0x564,0x56c,0x536,0x574,0x57c,0x584,0x58c,0x34b,0x594,0x34b, -0x59c,0x4e2,0x5a4,0x584,0x536,0x574,0x5ab,0x584,0x5b3,0x5b5,0x53f,0x584,0x34b,0x34b,0x5bd,0x34b, -0x34b,0x5c3,0x5ca,0x34b,0x34b,0x5ce,0x5d6,0x34b,0x5da,0x5e1,0x34b,0x5e8,0x5f0,0x5f7,0x5ff,0x34b, -0x34b,0x604,0x60c,0x614,0x61c,0x624,0x62b,0x633,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x63b,0x34b,0x34b,0x64b,0x64b,0x643, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x653,0x653,0x543,0x543,0x34b,0x659,0x661,0x34b, -0x669,0x34b,0x671,0x34b,0x678,0x67e,0x34b,0x34b,0x34b,0x686,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x68d,0x34b,0x694,0x69c,0x34b,0x6a4,0x34b,0x34b,0x573,0x6ac,0x6b4,0x6ba,0x5b3,0x6c2,0x34b,0x6c9, -0x34b,0x6ce,0x34b,0x6d4,0x6dc,0x6e0,0x6e8,0x6f0,0x6f8,0x6fd,0x700,0x708,0x718,0x710,0x728,0x720, -0x372,0x730,0x372,0x738,0x73b,0x372,0x743,0x372,0x74b,0x753,0x75b,0x763,0x76b,0x773,0x77b,0x783, -0x78b,0x792,0x34b,0x79a,0x7a2,0x34b,0x7aa,0x7b2,0x7ba,0x7c2,0x7ca,0x7d2,0x7da,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x7dd,0x7e3,0x7e9,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x7f1,0x7f6,0x7fa,0x802,0x372,0x372,0x372,0x80a,0x812,0x819,0x34b,0x81e,0x34b,0x34b,0x34b,0x826, -0x34b,0x66e,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x535,0x82e,0x34b,0x34b,0x835,0x34b,0x34b,0x83d,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x845,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x6d4,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x84b,0x34b,0x853,0x858,0x860,0x34b,0x34b,0x868,0x870,0x878,0x372,0x87d,0x885,0x88b,0x34b,0x892, -0x89a,0x678,0x34b,0x34b,0x34b,0x34b,0x8a1,0x8a9,0x34b,0x8b1,0x8b8,0x34b,0x520,0x8bd,0x8c5,0x678, -0x34b,0x8cb,0x8d3,0x8d7,0x34b,0x8df,0x8e7,0x8ef,0x34b,0x8f5,0x8f9,0x901,0x911,0x909,0x34b,0x919, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x921,0x34b,0x34b,0x34b,0x34b,0x929,0x5b3,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x92e,0x936,0x93a,0x34b,0x34b,0x34b,0x34b,0x32e,0x334,0x942,0x94a,0x951,0x4e2,0x34b,0x34b,0x959, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0xd30,0xd30,0xd48,0xd88,0xdc8,0xe04,0xe44,0xe84,0xebc,0xefc,0xf3c,0xf7c,0xfbc,0xffc,0x103c,0x107c, -0x10bc,0x10fc,0x113c,0x117c,0x118c,0x11c0,0x11fc,0x123c,0x127c,0x12bc,0xd2c,0x12f0,0x1324,0x1364,0x1380,0x13b4, -0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xac8,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb08,0x188,0x188,0xb3d,0xb7c,0xbbc,0xbf6,0xc2d,0x188, +static const uint16_t ucase_props_trieIndex[12244]={ +0x336,0x33e,0x346,0x34e,0x35c,0x364,0x36c,0x374,0x37c,0x384,0x38b,0x393,0x39b,0x3a3,0x3ab,0x3b3, +0x3b9,0x3c1,0x3c9,0x3d1,0x3d9,0x3e1,0x3e9,0x3f1,0x3f9,0x401,0x409,0x411,0x419,0x421,0x429,0x431, +0x439,0x441,0x449,0x451,0x459,0x461,0x469,0x471,0x46d,0x475,0x47a,0x482,0x489,0x491,0x499,0x4a1, +0x4a9,0x4b1,0x4b9,0x4c1,0x355,0x35d,0x4c6,0x4ce,0x4d3,0x4db,0x4e3,0x4eb,0x4ea,0x4f2,0x4f7,0x4ff, +0x507,0x50e,0x512,0x355,0x355,0x336,0x522,0x51a,0x52a,0x52c,0x534,0x53c,0x540,0x541,0x549,0x551, +0x559,0x541,0x561,0x566,0x559,0x541,0x56e,0x576,0x540,0x57e,0x586,0x58e,0x596,0x355,0x59e,0x355, +0x5a6,0x4ec,0x5ae,0x58e,0x540,0x57e,0x5b5,0x58e,0x5bd,0x5bf,0x549,0x58e,0x355,0x355,0x5c7,0x355, +0x355,0x5cd,0x5d4,0x355,0x355,0x5d8,0x5e0,0x355,0x5e4,0x5eb,0x355,0x5f2,0x5fa,0x601,0x609,0x355, +0x355,0x60e,0x616,0x61e,0x626,0x62e,0x635,0x63d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x645,0x355,0x355,0x655,0x655,0x64d, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x65d,0x65d,0x54d,0x54d,0x355,0x663,0x66b,0x355, +0x673,0x355,0x67b,0x355,0x682,0x688,0x355,0x355,0x355,0x690,0x355,0x355,0x355,0x355,0x355,0x355, +0x697,0x355,0x69e,0x6a6,0x355,0x6ae,0x355,0x355,0x57d,0x6b6,0x6be,0x6c4,0x5bd,0x6cc,0x355,0x6d3, +0x355,0x6d8,0x355,0x6de,0x6e6,0x6ea,0x6f2,0x6fa,0x702,0x707,0x70a,0x712,0x722,0x71a,0x732,0x72a, +0x37c,0x73a,0x37c,0x742,0x745,0x37c,0x74d,0x37c,0x755,0x75d,0x765,0x76d,0x775,0x77d,0x785,0x78d, +0x795,0x79c,0x355,0x7a4,0x7ac,0x355,0x7b4,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x7e7,0x7ed,0x7f3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x7fb,0x800,0x804,0x80c,0x37c,0x37c,0x37c,0x814,0x81c,0x823,0x355,0x828,0x355,0x355,0x355,0x830, +0x355,0x678,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x53f,0x838,0x355,0x355,0x83f,0x355,0x355,0x847,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x84f,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x6de,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x855,0x355,0x85d,0x862,0x86a,0x355,0x355,0x872,0x87a,0x882,0x37c,0x887,0x88f,0x895,0x89d,0x89f, +0x8a7,0x682,0x355,0x355,0x355,0x355,0x8ae,0x8b6,0x355,0x8be,0x8c5,0x355,0x52a,0x8ca,0x8d2,0x682, +0x355,0x8d8,0x8e0,0x8e4,0x355,0x8ec,0x8f4,0x8fc,0x355,0x902,0x906,0x90e,0x91e,0x916,0x355,0x926, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x92e,0x355,0x355,0x355,0x355,0x936,0x5bd,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x93b,0x943,0x947,0x355,0x355,0x355,0x355,0x338,0x33e,0x94f,0x957,0x95e,0x4ec,0x355,0x355,0x966, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0xd58,0xd58,0xd70,0xdb0,0xdf0,0xe2c,0xe6c,0xeac,0xee4,0xf24,0xf64,0xfa4,0xfe4,0x1024,0x1064,0x10a4, +0x10e4,0x1124,0x1164,0x11a4,0x11b4,0x11e8,0x1224,0x1264,0x12a4,0x12e4,0xd54,0x1318,0x134c,0x138c,0x13a8,0x13dc, +0x9e1,0xa11,0xa51,0xa90,0x188,0x188,0xac8,0x188,0x188,0x188,0x188,0x188,0x188,0xaf1,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xb31,0x188,0x188,0xb66,0xba5,0xbe5,0xc1f,0xc56,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, @@ -174,605 +174,617 @@ static const uint16_t ucase_props_trieIndex[12064]={ 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0xc6d,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x960,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x968,0x34b,0x34b,0x34b,0x96b,0x34b,0x34b,0x34b, -0x34b,0x973,0x979,0x97d,0x34b,0x34b,0x981,0x985,0x98b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x993,0x997,0x34b,0x34b,0x34b,0x34b,0x34b,0x99f,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x9a7,0x9ab,0x9b3,0x9b7,0x34b,0x9be,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9c5,0x34b,0x34b,0x34b,0x34b, -0x34b,0x536,0x9ca,0x9d1,0x5b4,0x5b3,0x9d5,0x533,0x34b,0x9dd,0x9e4,0x34b,0x9ea,0x5b3,0x9ef,0x9f7, -0x34b,0x34b,0x9fc,0x34b,0x34b,0x34b,0x34b,0x32e,0xa04,0x5b3,0x5b5,0xa0c,0xa13,0x34b,0x34b,0x34b, -0x34b,0x34b,0x9ca,0xa1b,0x34b,0x34b,0xa23,0xa2b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa2f,0xa37, -0x34b,0x34b,0xa3f,0x4a6,0x34b,0x34b,0xa47,0x34b,0x34b,0xa4d,0xa55,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0xa5a,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0xa72,0xa76,0xa7e,0x34b,0xa85,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0xa8c,0x34b,0x34b,0x929,0xa94,0x34b,0x34b,0x34b,0xa9a,0xaa2,0x34b,0xaa6,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaac,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xab2, -0x34b,0xab8,0x573,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xa62,0xa6a,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0xabe,0x34b,0x34b,0x5b3,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xac6,0x573,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xace,0xad6,0xadc,0x34b,0x34b,0x34b,0x34b,0xae4, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xaec,0xaf4,0xaf9, -0xaff,0xb07,0xb0f,0xb17,0xaf0,0xb1f,0xb27,0xb2f,0xb36,0xaf1,0xaec,0xaf4,0xaef,0xaff,0xaf2,0xaed, -0xb3e,0xaf0,0xb46,0xb4e,0xb56,0xb5d,0xb49,0xb51,0xb59,0xb60,0xb4c,0xb68,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x870,0xb70,0x870,0xb77, -0xb7e,0xb86,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb8e,0xb96,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xb9a,0x34b,0xba2,0xbaa, -0xbb1,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xae8,0xbb9,0xbb9,0xbbf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x9df,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x536,0x870,0x870, -0x870,0x34b,0x34b,0x34b,0x34b,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xac2,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, -0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x32b,0x32b,0x32b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,4,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, -0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0, -4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0, +0xc96,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x96d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x975,0x355,0x355,0x355,0x978,0x355,0x355,0x355, +0x355,0x980,0x986,0x98a,0x355,0x355,0x98e,0x992,0x998,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x9a0,0x9a4,0x355,0x355,0x355,0x355,0x355,0x9ac,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x9b4,0x9b8,0x9c0,0x9c4,0x355,0x9cb,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9d2,0x355,0x355,0x355,0x355, +0x355,0x540,0x9d7,0x9de,0x5be,0x5bd,0x9e2,0x53d,0x355,0x9ea,0x9f1,0x355,0x9f7,0x5bd,0x9fc,0xa04, +0x355,0x355,0xa09,0x355,0x355,0x355,0x355,0x338,0xa11,0x5bd,0x5bf,0xa19,0xa20,0x355,0x355,0x355, +0x355,0x355,0x9d7,0xa28,0x355,0x355,0xa30,0xa38,0x355,0x355,0x355,0x355,0x355,0x355,0xa3c,0xa44, +0x355,0x355,0xa4c,0x4b0,0x355,0x355,0xa54,0x355,0x355,0xa5a,0xa62,0x355,0x355,0x355,0x355,0x355, +0x355,0xa67,0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xa7f,0x975, +0xa87,0xa8b,0xa93,0x355,0xa9a,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0xaa1,0x355,0x355,0x936,0xaa9,0x355,0x355,0x355,0xaaf,0xab7,0x355,0xabb,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac1,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xac7,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xace,0x355,0xad4,0x57d,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0xa6f,0xa77,0x355,0x355,0x355,0x355,0x355,0x355,0x678,0x355,0xada,0x355,0x355, +0xae2,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xae3,0x57d,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0xaeb,0xaf3,0xaf9,0x355,0x355,0x355,0x355,0xb01,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0xb09,0xb11,0xb16,0xb1c,0xb24,0xb2c,0xb34,0xb0d,0xb3c,0xb44, +0xb4c,0xb53,0xb0e,0xb09,0xb11,0xb0c,0xb1c,0xb0f,0xb0a,0xb5b,0xb0d,0xb63,0xb6b,0xb73,0xb7a,0xb66, +0xb6e,0xb76,0xb7d,0xb69,0xb85,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x87a,0xb8d,0x87a,0xb94,0xb9b,0xba3,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xbab,0xbb3,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xbb7,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x9c9,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0xbbf,0x355,0xbc7,0xbcf,0xbd6,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0xb05, +0xbde,0xbde,0xbe4,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x9ec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x540,0x87a,0x87a,0x87a,0x355,0x355,0x355,0x355,0x87a,0x87a, +0x87a,0x87a,0x87a,0x87a,0x87a,0xbec,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355,0x355, +0x355,0x355,0x355,0x355,0x355,0x355,0x335,0x335,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0xa,0x5a,0x7a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xba,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf9,0xf031,0x149,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x189,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,1,0,0,4,0,4,0,0,0,0,4,0x1c9,0,4, -4,0,1,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0,0,0,0,0,0,0,0,4,0,1,0,0,4,0,4, +0,0,0,0,4,0x1c9,0,4,4,0,1,0,0,0,0,0, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1fa,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x5a,0x5a,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x239, +0xf011,0xf011,0xf011,0xf011,0xf011,0x2d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x3c91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1,0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xff91,0x92,0xff91,0x92,0xff91,0x31a,0xffb1, +0x33a,0x389,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x3d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92, -0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91,0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92, -0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1, -0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1, -0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92,0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0, -0x92,0xff91,1,0x1c11,0,0,0,0,0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb, -0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, -0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759,0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x459,0x6191,0x6912,0x92,0xff91, +0x92,0xff91,0x6712,0x92,0xff91,0x6692,0x6692,0x92,0xff91,1,0x2792,0x6512,0x6592,0x92,0xff91,0x6692, +0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,1,0x6992,0x6a92,0x4111,0x6b12,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x6d12,0x92,0xff91,0x6d12,1,1,0x92,0xff91,0x6d12,0x92,0xff91,0x6c92,0x6c92,0x92, +0xff91,0x92,0xff91,0x6d92,0x92,0xff91,1,0,0x92,0xff91,1,0x1c11,0,0,0,0, +0x48a,0x4bb,0x4f9,0x52a,0x55b,0x599,0x5ca,0x5fb,0x639,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xd891,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x669,0x6ea,0x71b,0x759, +0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,1,1,1,1,1,0x78a,0x92,0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92, -0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711, -0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91,0x849,1,1,1,0x9991,0x869,1,0x9891, -1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9,0x8e9,1,1,0x9691,1,0x909,0x9591,1, -1,0x9511,1,1,1,1,1,1,1,0x929,1,1,0x9311,1,1,0x9311, -1,1,1,0x949,0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1, -0,1,1,1,1,1,1,1,1,0x969,0x989,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,5,5,0x25,5, -5,5,5,5,5,4,4,4,0x14,4,0x14,4,5,5,4,4, +0x92,0xff91,0x92,0xff91,0xbf12,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,1,1,1,1,0x78a,0x92, +0xff91,0xae92,0x7aa,0x7c9,0x7c9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91,0x92,0xffb1,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x7e9,0x809,0x829,0x9711,0x9911,1,0x9991,0x9991,1,0x9b11,1,0x9a91, +0x849,1,1,1,0x9991,0x869,1,0x9891,1,0x889,0x8a9,1,0x97b1,0x9691,0x8a9,0x8c9, +0x8e9,1,1,0x9691,1,0x909,0x9591,1,1,0x9511,1,1,1,1,1,1, +1,0x929,1,1,0x9311,1,0x949,0x9311,1,1,1,0x969,0x9311,0xdd91,0x9391,0x9391, +0xdc91,1,1,1,1,1,0x9291,1,0,1,1,1,1,1,1,1, +1,0x989,0x9a9,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,5,5,0x25,5,5,5,5,5,5,4,4,4, +0x14,4,0x14,4,5,5,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,5,5,5,5,5,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5, -5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,0x54,0x54,0x44,0x44, -0x44,0x44,0x44,0x9ac,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54, -0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44, -0x44,0x9bd,0x44,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x64,4,0x44,0x44,0x44,0x64, -0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91, -4,4,0x92,0xff91,0,0,5,0x4111,0x4111,0x4111,0,0x3a12,0,0,0,0, -4,4,0x1312,4,0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92,0xa09,0x1012,0xada,0x1012, -0x1012,0xb1a,0x1012,0x1012,0xb5a,0xbaa,0xbfa,0x1012,0xc3a,0x1012,0x1012,0x1012,0xc7a,0xcba,0,0xcfa, -0x1012,0x1012,0xd3a,0x1012,0x1012,0xd7a,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xdb9,0xf011,0xe89,0xf011, -0xf011,0xec9,0xf011,0xf011,0xf09,0xf59,0xfa9,0xf011,0xfe9,0xf011,0xf011,0xf011,0x1029,0x1069,0x10a9,0x10d9, -0xf011,0xf011,0x1119,0xf011,0xf011,0x1159,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x1199,0x11c9,2,2, -2,0x1219,0x1249,0xfc11,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x1279,0x12a9,0x391,0xc631, -0x12da,0x1329,0,0x92,0xff91,0xfc92,0x92,0xff91,1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812, -0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x135a,0x1012, -0x139a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x13da,0x1012,0x1012,0x141a,0x145a,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14aa,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x14e9,0xf011, -0x1529,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1569,0xf011,0xf011,0x15a9,0x15e9,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1639,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811, -0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x167a,0x16b9, +4,4,4,4,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x9cc,0x54,0x44,0x54,0x44, +0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x74,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x9dd,0x44,0x64,0x64,0x64,0x44,0x44, +0x44,0x64,0x64,4,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x64,0x64,0x64,0x44, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,4,4,0x92,0xff91,0,0,5,0x4111, +0x4111,0x4111,0,0x3a12,0,0,0,0,4,4,0x1312,4,0x1292,0x1292,0x1292,0, +0x2012,0,0x1f92,0x1f92,0xa29,0x1012,0xafa,0x1012,0x1012,0xb3a,0x1012,0x1012,0xb7a,0xbca,0xc1a,0x1012, +0xc5a,0x1012,0x1012,0x1012,0xc9a,0xcda,0,0xd1a,0x1012,0x1012,0xd5a,0x1012,0x1012,0xd9a,0x1012,0x1012, +0xed11,0xed91,0xed91,0xed91,0xdd9,0xf011,0xea9,0xf011,0xf011,0xee9,0xf011,0xf011,0xf29,0xf79,0xfc9,0xf011, +0x1009,0xf011,0xf011,0xf011,0x1049,0x1089,0x10c9,0x10f9,0xf011,0xf011,0x1139,0xf011,0xf011,0x1179,0xf011,0xf011, +0xe011,0xe091,0xe091,0x412,0x11b9,0x11e9,2,2,2,0x1239,0x1269,0xfc11,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44, -0x44,0x44,0x44,0x44,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x1299,0x12c9,0x391,0xc631,0x12fa,0x1349,0,0x92,0xff91,0xfc92,0x92,0xff91, +1,0xbf12,0xbf12,0xbf12,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812, +0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x137a,0x1012,0x13ba,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x13fa,0x1012,0x1012,0x143a,0x147a,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x14ca,0x1012, +0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1509,0xf011,0x1549,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0x1589,0xf011,0xf011,0x15c9,0x1609,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1659,0xf011, +0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811,0xd831,0xd811,0xd811,0xd811, +0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x169a,0x16d9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,0x44,0x44,0x44,0x44,4,4,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92, -0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0,4,0,0,0,0,0,0, -1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x92,0xff91,0x92,0xff91,0x792,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0xf891,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0, +0,4,0,0,0,0,0,0,1,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0x16f9,1,0,0,0,0,0,0,0,0,0x64,0x44,0x44, -0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64, -0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0x64,0,0x64,0x64,0, -0x44,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1719,1,0,0,0, +0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0,0x64,0,0x64,0x64,0,0x44,0x64,0,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x64,0x64,0x64,0,4,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, -0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,0,0x44, -0x44,0x44,0x44,0x64,0x44,4,4,0x44,0x44,0,0x64,0x44,0x44,0x64,0,0, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44, +0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,4,0,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0x44, +0x44,0,0x64,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,0,0x64,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44, +0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44, +0x64,0x44,0x64,0x44,0x64,0x44,0x44,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x44,0x64, -0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x64,0x44,0x44,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +4,4,0,0,0,0,4,0,0,0x64,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,4,4,0,0,0,0,4,0, -0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,4,0x44, -0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,0,0, +0,0,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44,0x44,0x44,4,0x44,0x44,0x44, +4,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0,0,0,0, -0x44,0x44,4,0x64,0x44,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64, -0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44, +0,0x64,0x64,0x64,0,0,0,0,0x44,0x44,4,0x64,0x44,0x44,0x64,0x44, +0x44,0x64,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0x64,0,0,0, +0,4,4,4,4,4,4,4,4,0,0,0,0,0x64,0,0, +0,0x44,0x64,0x44,0x44,4,4,4,0,0,0,0,0,0,0,0, +0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,0,0x64,0,0,0,0,4,4,4,4,4,4,4, -4,0,0,0,0,0x64,0,0,0,0x44,0x64,0x44,0x44,4,4,4, -0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0x64,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0,0,0,0,4,4,4, -4,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +0,0,0x44,0,0,4,4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0,0,4,4,0, +0,0,0,0,0,4,4,0,0,0,0,4,4,0,0,4, +4,0x64,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4, +4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0, -0,0,0,4,4,0,0,4,4,0x64,0,0,0,4,0,0, +0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,4,0,4,4,0,0,0,0,0x64,0,0, +0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,4,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, +0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4, -0,4,4,4,4,0,0,0,0,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0, -0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,4,4, +4,0,4,4,4,0x64,0,0,0,0,0,0,0,0x64,0x64,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, +4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0, +0,0,0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,4,4, +4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,4,4,4,4,0x64,0x64,0x64,0, +0,0,0,0,0,0,4,4,0x64,0x64,0x64,0x64,4,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,4,4,4,4,0x64,0x64,0x64,4,4,0,0,0, +0,0,0,0,0,0,4,0,0x64,0x64,0x64,0x64,4,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,4,4,4,0,4,4,4,0x64,0,0, -0,0,0,0,0,0x64,0x64,0,0,0,0,0,0,0,0,0, -0,0,4,0,0,0,0,0,4,0x64,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,0,0,0,0,0,0x64,0x64,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0, -0,0,0,0,0,0,4,4,4,0,4,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, -4,4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,4,4, -0x64,0x64,0x64,0x64,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4, -0x64,0x64,0,4,4,0,0,0,0,0,0,0,0,0,4,0, -0x64,0x64,0x64,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x64,0,0x64,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0x64,4,0x64,4,4,4,4,4,0x64,0x64,0x64,0x64,4,0, -0x64,4,0x44,0x44,0x64,0,0x44,0x44,0,0,0,0,0,4,4,4, -4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4, +0,0x64,0,0x64,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x64,0x64,4,0x64,4,4,4, +4,4,0x64,0x64,0x64,0x64,4,0,0x64,4,0x44,0x44,0x64,0,0x44,0x44, +0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4, +0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, -4,0,4,4,4,4,4,0x64,0,0x64,0x64,0,0,4,4,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,4,4, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,0,0,4,4,0,0,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, -0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a, -0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a,0x177a, -0x177a,0x177a,0,0x177a,0,0,0,0,0,0x177a,0,0,0x1799,0x17c9,0x17f9,0x1829, -0x1859,0x1889,0x18b9,0x18e9,0x1919,0x1949,0x1979,0x19a9,0x19d9,0x1a09,0x1a39,0x1a69,0x1a99,0x1ac9,0x1af9,0x1b29, -0x1b59,0x1b89,0x1bb9,0x1be9,0x1c19,0x1c49,0x1c79,0x1ca9,0x1cd9,0x1d09,0x1d39,0x1d69,0x1d99,0x1dc9,0x1df9,0x1e29, -0x1e59,0x1e89,0x1eb9,0x1ee9,0x1f19,0x1f49,0x1f79,0,4,0x1fa9,0x1fd9,0x2009,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x205a,0x205a,0x205a,0x205a, -0x205a,0x205a,0,0,0x2079,0x20a9,0x20d9,0x2109,0x2139,0x2169,0,0,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a, -0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0x203a,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,4,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,4,0,0,4,4,4, -4,4,4,4,4,4,0x64,4,0,0,0,4,0,0,0,0, -0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,4,4,4,0,4,4,4,4,4,0x64, +0,0x64,0x64,0,0,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,0,0,0,0,4,4,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,4,4,4,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,4,0, +0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0,0x179a,0,0,0,0, +0,0x179a,0,0,0x17b9,0x17e9,0x1819,0x1849,0x1879,0x18a9,0x18d9,0x1909,0x1939,0x1969,0x1999,0x19c9, +0x19f9,0x1a29,0x1a59,0x1a89,0x1ab9,0x1ae9,0x1b19,0x1b49,0x1b79,0x1ba9,0x1bd9,0x1c09,0x1c39,0x1c69,0x1c99,0x1cc9, +0x1cf9,0x1d29,0x1d59,0x1d89,0x1db9,0x1de9,0x1e19,0x1e49,0x1e79,0x1ea9,0x1ed9,0x1f09,0x1f39,0x1f69,0x1f99,0, +4,0x1fc9,0x1ff9,0x2029,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x44,0x44,0x44,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x207a,0x207a,0x207a,0x207a,0x207a,0x207a,0,0,0x2099,0x20c9,0x20f9,0x2129, +0x2159,0x2189,0,0,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a,0x205a, +0x205a,0x205a,0x205a,0x205a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,0x64,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,0,4,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,4,0,0,4,4,4,4,4,4,4,4,4,0x64,4, +0,0,0,4,0,0,0,0,0,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,4, -4,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0, -0,0x64,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,4,4,4,4,4,4,4,0, -0x64,0,4,0,0,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x64, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,4,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0,4,4,4,4,4,0,4,0,0,0, -0,0,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0, -4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0, -0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0, -0x2199,0x21c9,0x21f9,0x2229,0x2259,0x22a9,0x22f9,0x2329,0x2359,0,0,0,0,0,0,0, -0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a, -0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0x238a,0,0,0x238a,0x238a,0x238a, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64, -0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0, -0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0, -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,0x64,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,0,0,0,0,4,4,0,0,0,0,0,0,0, +0,0,4,0,0,0,0,0,0,0x64,0x44,0x64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x44,0x64,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, +4,4,4,4,4,4,4,0,0x64,0,4,0,0,4,4,4, +4,4,4,4,4,0,0,0,0,0,0,4,4,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0,0,0x64,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64, +0x64,0x64,0x64,0x44,0x44,0x64,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,4,4, +4,4,4,0,4,0,0,0,0,0,4,0,0x60,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,0,0,4,4,0x60,0x64,4,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x64,0,4,4,0,0,0,4,0,4,4,4,0x60,0x60, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,0,0,4,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,4,4,4,0,0,0x21b9,0x21e9,0x2219,0x2249,0x2279,0x22c9,0x2319,0x2349, +0x2379,0,0,0,0,0,0,0,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa,0x23aa, +0x23aa,0x23aa,0x23aa,0,0,0x23aa,0x23aa,0x23aa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64, +0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0,0,0,0,0x64,0,0,0,0,0,0,0x44,0,0,0, +0x44,0x44,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,0x23a9,1,1,1,0x23c9,1,1, -5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0,0x44,0x64,0x64,0x44,0x64, -0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91, +5,5,5,5,5,5,5,5,5,5,0x25,5,5,5,5,5, +5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1, +5,0x23c9,1,1,1,0x23e9,1,1,5,5,5,5,0x25,5,5,5, +0x25,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x2409,1,1,1,1,1,1,1,0x21,1, +1,1,1,5,5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64, +0x64,0x64,0,0x44,0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x242a,0x2469,0x92,0xff91,0x92,0xff91,0x92,0xff91, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x23ea,0x2429,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x24a9,0x2529,0x25a9,0x2629,0x26a9,0x2729, +1,1,0x275a,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1, 0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x2469,0x24e9,0x2569,0x25e9,0x2669,0x26e9,1,1,0x271a,1,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0,0,0x2769,0x411,0x27e9,0x411, -0x2899,0x411,0x2949,0x411,0,0xfc12,0,0xfc12,0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11, -0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811,0x3f11,0x3f11,0,0,0x29f9,0x2a69,0x2ad9,0x2b49, -0x2bb9,0x2c29,0x2c99,0x2d09,0x2d7b,0x2deb,0x2e5b,0x2ecb,0x2f3b,0x2fab,0x301b,0x308b,0x30f9,0x3169,0x31d9,0x3249, -0x32b9,0x3329,0x3399,0x3409,0x347b,0x34eb,0x355b,0x35cb,0x363b,0x36ab,0x371b,0x378b,0x37f9,0x3869,0x38d9,0x3949, -0x39b9,0x3a29,0x3a99,0x3b09,0x3b7b,0x3beb,0x3c5b,0x3ccb,0x3d3b,0x3dab,0x3e1b,0x3e8b,0x411,0x411,0x3ef9,0x3f79, -0x3fe9,0,0x4069,0x40e9,0xfc12,0xfc12,0xdb12,0xdb12,0x419b,4,0x4209,4,4,4,0x4259,0x42d9, -0x4349,0,0x43c9,0x4449,0xd512,0xd512,0xd512,0xd512,0x44fb,4,4,4,0x411,0x411,0x4569,0x4619, -0,0,0x46e9,0x4769,0xfc12,0xfc12,0xce12,0xce12,0,4,4,4,0x411,0x411,0x4819,0x48c9, -0x4999,0x391,0x4a19,0x4a99,0xfc12,0xfc12,0xc812,0xc812,0xfc92,4,4,4,0,0,0x4b49,0x4bc9, -0x4c39,0,0x4cb9,0x4d39,0xc012,0xc012,0xc112,0xc112,0x4deb,4,4,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4, -0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,4,0,0x25,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44, -0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,1,2,2,2,1,1,2,2,2,1,0,2,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0x4e5a,0, -2,0,0x4e9a,0x4eda,2,2,0,1,2,2,0xe12,2,1,0,0,0, -0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1, -0x21,0x21,0,0,0,0,0xf211,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, -0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, -0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0,0,0,0x92,0xff91,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, -0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311, -0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x92,0xff91,0x92,0xff91,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0,0,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0,0,0x27a9,0x411,0x2829,0x411,0x28d9,0x411,0x2989,0x411,0,0xfc12,0,0xfc12, +0,0xfc12,0,0xfc12,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0xfc12,0xfc12,0xfc12,0xfc12, +0xfc12,0xfc12,0xfc12,0xfc12,0x2511,0x2511,0x2b11,0x2b11,0x2b11,0x2b11,0x3211,0x3211,0x4011,0x4011,0x3811,0x3811, +0x3f11,0x3f11,0,0,0x2a39,0x2aa9,0x2b19,0x2b89,0x2bf9,0x2c69,0x2cd9,0x2d49,0x2dbb,0x2e2b,0x2e9b,0x2f0b, +0x2f7b,0x2feb,0x305b,0x30cb,0x3139,0x31a9,0x3219,0x3289,0x32f9,0x3369,0x33d9,0x3449,0x34bb,0x352b,0x359b,0x360b, +0x367b,0x36eb,0x375b,0x37cb,0x3839,0x38a9,0x3919,0x3989,0x39f9,0x3a69,0x3ad9,0x3b49,0x3bbb,0x3c2b,0x3c9b,0x3d0b, +0x3d7b,0x3deb,0x3e5b,0x3ecb,0x411,0x411,0x3f39,0x3fb9,0x4029,0,0x40a9,0x4129,0xfc12,0xfc12,0xdb12,0xdb12, +0x41db,4,0x4249,4,4,4,0x4299,0x4319,0x4389,0,0x4409,0x4489,0xd512,0xd512,0xd512,0xd512, +0x453b,4,4,4,0x411,0x411,0x45a9,0x4659,0,0,0x4729,0x47a9,0xfc12,0xfc12,0xce12,0xce12, +0,4,4,4,0x411,0x411,0x4859,0x4909,0x49d9,0x391,0x4a59,0x4ad9,0xfc12,0xfc12,0xc812,0xc812, +0xfc92,4,4,4,0,0,0x4b89,0x4c09,0x4c79,0,0x4cf9,0x4d79,0xc012,0xc012,0xc112,0xc112, +0x4e2b,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +4,4,4,4,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,0,4,0,0,4,0,0,4,4,4,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4, +0,0x25,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4, +4,0x44,4,4,4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64, +0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,2,0,0,1,2,2,2,1,1, +2,2,2,1,0,2,0,0,0,2,2,2,2,2,0,0, +0,0,0,0,2,0,0x4e9a,0,2,0,0x4eda,0x4f1a,2,2,0,1, +2,2,0xe12,2,1,0,0,0,0,1,0,0,1,1,2,2, +0,0,0,0,0,2,1,1,0x21,0x21,0,0,0,0,0xf211,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812,0x812, +0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811,0xf811, +0,0,0,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12,0xd12, +0xd12,0xd12,0xd12,0xd12,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0xf311, +0xf311,0xf311,0xf311,0xf311,0xf311,0xf311,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1812,0x1812,0x1812,0x1812, 0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0, 0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811, -0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0,0x92,0xff91,0x4f1a,0x4f3a,0x4f5a,0x4f79,0x4f99,0x92, -0xff91,0x92,0xff91,0x92,0xff91,0x4fba,0x4fda,0x4ffa,0x501a,1,0x92,0xff91,1,0x92,0xff91,1, -1,1,1,1,0x25,5,0x503a,0x503a,0x92,0xff91,0x92,0xff91,1,0,0,0, -0,0,0,0x92,0xff91,0x92,0xff91,0x44,0x44,0x44,0x92,0xff91,0,0,0,0, -0,0,0,0,0,0,0,0,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059, -0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059, -0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0x5059,0,0x5059,0,0,0,0, -0,0x5059,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0, +0x92,0xff91,0x4f5a,0x4f7a,0x4f9a,0x4fb9,0x4fd9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x4ffa,0x501a,0x503a, +0x505a,1,0x92,0xff91,1,0x92,0xff91,1,1,1,1,1,0x25,5,0x507a,0x507a, +0x92,0xff91,0x92,0xff91,1,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91,0x44, +0x44,0x44,0x92,0xff91,0,0,0,0,0,0,0,0,0,0,0,0, +0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099, +0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099,0x5099, +0x5099,0x5099,0,0x5099,0,0,0,0,0,0x5099,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0, -0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4,4,4,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,4, -4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x507a,0x50b9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44, -4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,4, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,5,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60, +0,4,4,4,4,4,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +0,0,0,0,0,0x64,0x64,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x50ba,0x50f9, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,5,5,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,5,1,1,1,1,1,1,1,1,0x92,0xff91,0x92, -0xff91,0x50fa,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,4,4,4,0x92, -0xff91,0x511a,1,0,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x513a,0x515a,0x517a,0x519a,0x513a,1,0x51ba,0x51da,0x51fa,0x521a, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,1,0,0,0,0,0,0,0,4,0,0,0,0x64,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,4,4,4,4,4,0x64, -0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, -4,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0, -4,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,4,4,4,4,4,0,0,4,4,0, -0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, -0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x44,0,0x44,0x44, -0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,4, -4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0x5239,1,1,1,1,1,1,1,4, -5,5,5,5,1,1,1,1,1,1,0,0,0,0,0,0, -0,0,0,0,0x5259,0x5289,0x52b9,0x52e9,0x5319,0x5349,0x5379,0x53a9,0x53d9,0x5409,0x5439,0x5469, -0x5499,0x54c9,0x54f9,0x5529,0x5b59,0x5b89,0x5bb9,0x5be9,0x5c19,0x5c49,0x5c79,0x5ca9,0x5cd9,0x5d09,0x5d39,0x5d69, -0x5d99,0x5dc9,0x5df9,0x5e29,0x5e59,0x5e89,0x5eb9,0x5ee9,0x5f19,0x5f49,0x5f79,0x5fa9,0x5fd9,0x6009,0x6039,0x6069, -0x6099,0x60c9,0x60f9,0x6129,0x5559,0x5589,0x55b9,0x55e9,0x5619,0x5649,0x5679,0x56a9,0x56d9,0x5709,0x5739,0x5769, -0x5799,0x57c9,0x57f9,0x5829,0x5859,0x5889,0x58b9,0x58e9,0x5919,0x5949,0x5979,0x59a9,0x59d9,0x5a09,0x5a39,0x5a69, -0x5a99,0x5ac9,0x5af9,0x5b29,0,0,0,0,0,4,0,0,4,0,0,0, -0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x6159,0x61d9,0x6259,0x62d9,0x6389,0x6439,0x64d9,0,0,0,0,0, -0,0,0,0,0,0,0,0x6579,0x65f9,0x6679,0x66f9,0x6779,0,0,0,0, -0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64, -0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0, -0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +4,4,4,4,4,4,4,4,4,4,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,1,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,5,1,1,1, +1,1,1,1,1,0x92,0xff91,0x92,0xff91,0x513a,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,4,4,4,0x92,0xff91,0x515a,1,0,0x92,0xff91,0x92,0xff91, +0x1811,1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x517a,0x519a, +0x51ba,0x51da,0x517a,1,0x51fa,0x521a,0x523a,0x525a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0,0,0x92,0xff91,0xe812,0x527a,0x529a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,1,0,0,0,0,0,0,0,4,0, +0,0,0x64,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,4,4, +4,4,4,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4,4, +4,4,0,0,4,4,0,0,0x60,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0, +0,4,4,0,0,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,4,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0,0x44,0x44,0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44, +0,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,4,4,0,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x52b9,1,1,1,1, +1,1,1,4,5,5,5,5,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0,0x52d9,0x5309,0x5339,0x5369,0x5399,0x53c9,0x53f9,0x5429, +0x5459,0x5489,0x54b9,0x54e9,0x5519,0x5549,0x5579,0x55a9,0x5bd9,0x5c09,0x5c39,0x5c69,0x5c99,0x5cc9,0x5cf9,0x5d29, +0x5d59,0x5d89,0x5db9,0x5de9,0x5e19,0x5e49,0x5e79,0x5ea9,0x5ed9,0x5f09,0x5f39,0x5f69,0x5f99,0x5fc9,0x5ff9,0x6029, +0x6059,0x6089,0x60b9,0x60e9,0x6119,0x6149,0x6179,0x61a9,0x55d9,0x5609,0x5639,0x5669,0x5699,0x56c9,0x56f9,0x5729, +0x5759,0x5789,0x57b9,0x57e9,0x5819,0x5849,0x5879,0x58a9,0x58d9,0x5909,0x5939,0x5969,0x5999,0x59c9,0x59f9,0x5a29, +0x5a59,0x5a89,0x5ab9,0x5ae9,0x5b19,0x5b49,0x5b79,0x5ba9,0,0,0,0,0,4,0,0, +4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x61d9,0x6259,0x62d9,0x6359,0x6409,0x64b9,0x6559,0, +0,0,0,0,0,0,0,0,0,0,0,0x65f9,0x6679,0x66f9,0x6779,0x67f9, +0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, +0,4,0,0,0,0,0,0,0,0,0,0,0,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,4,0,4,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412, +0,0x64,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, 0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0xec11,0xec11,0xec11,0xec11, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, -0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0,0xec11,0xec11,0xec11,0xec11, +0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412, +0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0x1412,0,0,0,0, 0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11, -0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, +0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0xec11,0,0,0,0, +0,4,4,4,0,4,4,0,0,0,0,0,4,0x64,4,0x44, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, -0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2012,0x2012,0x2012,0x2012, +0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64, +0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, 0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012, -0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0x2012,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011, +0x2012,0x2012,0x2012,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, -0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x44,0x44,0x44,0x64, -0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, +0xe011,0xe011,0xe011,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64, +0x44,0x44,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,0x64,0,0,0,0,0, +0,0,0,0,4,4,4,4,4,4,4,4,4,4,0x64,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0, -0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,0, +0,0x64,0x64,0,0,4,0,0,0x44,0x44,0x44,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4, -4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,4,4,4,4,4,4,0x64,0x64,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,0,0x60,0,0,0, -0,0,0,0,0,4,0x64,4,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,0,0,4,0x60,0x64,4,0,0,0,0,0,0,4,0, -0,0,0,4,4,4,4,4,4,0x64,0x64,0,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0, +0x60,0,0,0,0,0,0,0,0,4,0x64,4,4,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,0,0,0,0,0,0,0x60,0,0, +0,0,0,4,4,4,0,0,4,0x60,0x64,4,0,0,0,0, +0,0,4,0,0,0,0,4,4,4,4,4,4,0x64,0x64,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0x44,0x44,0x44,0x44, -0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,4, -4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,4,4,0,4,0,0,0,0,4,4,0,0x64,0x64, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0, +0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x64,4,4,0,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, -4,4,0,0,0,0,0,0,4,4,0,0x64,0x64,0,0,0, +0,0,0,4,4,4,4,4,4,0,4,0,0,0,0,4, +4,0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,4,4,4,4,0,0,4,0,0x64,0,0,0,0, -0,0,0,0,0,0,0,4,0,4,0,0,4,4,4,4, -4,4,0x60,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,0,0,0,0,0,0,4,4,0,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,0,0,4,4,4,4,0,4,4,4,4,0x64, +0,0,0,4,4,4,4,4,4,4,4,0,0,4,0,0x64, +0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0, +4,4,4,4,4,4,0x60,0x64,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, -0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0,0,0,0,0,4,4,4,0,0,4,4,4,4,0,4, +4,4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +4,4,4,4,0,0x64,0x64,0,0,0,0,0,0x1012,0x1012,0x1012,0x1012, 0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0xf011,0xf011, 0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,4,4,4,4,4,4,4, -4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,0x64,4,4,4, -4,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0x64, -0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0, -0,4,4,4,0,0,0,0,0,0,0,0,0,0,4,4, -4,4,4,4,4,4,4,4,4,4,4,0,4,0x64,0,0, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,0x64, -4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4, -4,0,4,4,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,0, -0,0,4,0,4,4,0,4,4,4,0x64,4,0x64,0x64,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0x64, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0, +4,4,4,4,0,0,4,4,0,0,0,0,0,4,4,4, +4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0x64,4,4,4,4,0,0,4,4,4,4,0,0,0,0,0, +0,0,0,0x64,0,0,0,0,0,0,0,0,0,4,4,4, +4,4,4,0,0,4,4,4,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0, +4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,4,4,4,4,4,4,4,0,4,4,4,4, +4,4,0,0x64,4,4,4,4,4,4,4,4,0,0,4,4, +4,4,4,4,4,0,4,4,0,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, +4,4,4,0,0,0,4,0,4,4,0,4,4,4,0x64,4, +0x64,0x64,0,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, +0,4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, +4,4,4,4,4,4,4,4,4,4,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0x64,0,0,0,0,0,0,0x60,0x60,0x64, -0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4, -4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,0x64,0,0,0,0,0, +0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4, +4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0, +0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44, +0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,1,1,1,1,1,1,1,0,0x21,0x21,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +0,0,0,0,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,0x21,0x21,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0, -0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2, -2,2,1,1,1,1,0,1,0,1,0x21,0x21,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2, -2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0, +2,2,2,2,2,2,1,1,1,1,1,1,1,0,0x21,0x21, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2, +2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,0,2,2, +0,0,2,0,0,2,2,0,0,2,2,2,2,0,2,2, +2,2,2,2,2,2,1,1,1,1,0,1,0,1,0x21,0x21, +1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +1,1,1,1,2,2,0,2,2,2,2,0,0,2,2,2, +2,2,2,2,2,0,2,2,2,2,2,2,2,0,1,1, +1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,2,2,0,2,2,2,2,0, +2,2,2,2,2,0,2,0,0,0,2,2,2,2,2,2, +2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,0,0,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,0,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, +1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,1,0,1,1,1,1,1,1,2,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0,0x44,0x44, -0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0, -0,0,0,0,0,0,0,0,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, +0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44, +0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,4,4,4,4,4,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0x1112,0x1112,0x1112,0x1112, 0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112, -0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, +0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0x1112,0xef11,0xef11, 0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11, -0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0, +0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0xef11,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2, +2,2,0,0,0,0,0,0,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0 }; -static const uint16_t ucase_props_exceptions[1663]={ +static const uint16_t ucase_props_exceptions[1671]={ 0xc850,0x20,2,0x130,0x131,0x4810,0x20,0x841,0x6b,1,0x212a,0x841,0x73,1,0x17f,0x5c50, 0x20,2,0x130,0x131,0x844,0x4b,1,0x212a,0x844,0x53,1,0x17f,0x806,0x3bc,0x39c,0x841, 0xe5,1,0x212b,0x8c0,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e,0x844,0xc5,1, @@ -782,101 +794,102 @@ static const uint16_t ucase_props_exceptions[1663]={ 0x1cc,0x1ca,0x1cb,0x80c,0x1ca,0x1cb,0x880,0x2220,0x6a,0x30c,0x4a,0x30c,0x4a,0x30c,0x809,0x1f3, 0x1f2,0x80d,0x1f3,0x1f1,0x1f2,0x80c,0x1f1,0x1f2,0x810,0x2a2b,0x810,0x2a28,0x810,0x2a3f,0x810,0x2a1f, 0x810,0x2a1c,0x810,0x2a1e,0x810,0xa54f,0x810,0xa54b,0x810,0xa528,0x810,0xa544,0x810,0x29f7,0x810,0xa541, -0x810,0x29fd,0x810,0x29e7,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399,1,0x1fbe, -0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841,0x3b2,1, -0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345,0x1fbe,0x841, -0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1,0x3f1,0x4850, -0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330,0x3c5,0x308, -0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395,1,0x3f5, -0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0,0x844,0x39c, -1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844,0x3a3,1, -0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8,0x398,1, -0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841,0x3b8,2, -0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841,0x43e,1, -0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86,0x844,0x412, -1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83,0x844,0x422, -2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1,0x1c87,0x880, -0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91,0x10d1,0x80c, -0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6,0x80c,0x1c97, -0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c,0x1c9c,0x10dc, -0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1,0x10e1,0x80c, -0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6,0x80c,0x1ca7, -0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c,0x1cac,0x10ec, -0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1,0x10f1,0x80c, -0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6,0x80c,0x1cb7, -0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c,0x1cbe,0x10fe, -0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806,0x13f2,0x13f2, -0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434,0x414,0x806, -0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1,0x1c84,0x806, -0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6,0x841,0x1e61, -1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x880,0x2220, -0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x880,0x2220, -0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,0x806,0x1e61, -0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x880,0x3330, -0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5,0x313,0x301,0x3a5,0x313, -0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x890, -8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0x890,8,0x220, -0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890,8,0x220,0x1f04,0x3b9, -0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220,0x1f06,0x3b9,0x1f0e,0x399, -0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0xc90,8, -0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0xc90,8,0x220,0x1f03, -0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8,0x220,0x1f05,0x3b9,0x1f0d, -0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x890, -8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0x890,8,0x220, -0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890,8,0x220,0x1f24,0x3b9, -0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220,0x1f26,0x3b9,0x1f2e,0x399, -0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0xc90,8, -0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0xc90,8,0x220,0x1f23, -0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8,0x220,0x1f25,0x3b9,0x1f2d, -0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x890, -8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0x890,8,0x220, -0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890,8,0x220,0x1f64,0x3b9, -0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220,0x1f66,0x3b9,0x1f6e,0x399, -0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0xc90,8, -0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0xc90,8,0x220,0x1f63, -0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8,0x220,0x1f65,0x3b9,0x1f6d, -0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x880, -0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9,0x391,0x399,0x880,0x2220, -0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x880,0x3330, -0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220,0x3b1,0x3b9,0x391,0x399, -0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x890,9,0x220, -0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x880,0x2220,0x3b7,0x342, -0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0xc90, -9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308, -0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,0x880,0x2220, -0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308, -0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0x8c0,1,0x3330,0x3c5, -0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1, -0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5,0x308,0x342,0x3a5,0x308, -0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x890,9,0x220,0x3c9, -0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880,0x2220,0x3c9,0x342,0x3a9, -0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0xc90,9, -0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1,0x4b,0xc50,0x2046,1, -0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10,0x2a1c,0xc10,0x29fd,0xc10, -0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844,0xa64a,1,0x1c88,0xc10, -0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10,0xa512,0xc10,0xa52a,0xc10, -0xa515,0x810,0x3a0,0xc10,0x3a0,0x806,0x13a0,0x13a0,0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3, -0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806,0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8, -0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab,0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806, -0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0,0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3, -0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806,0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8, -0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb,0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806, -0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0,0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3, -0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806,0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8, -0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb,0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806, -0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0,0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3, -0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806,0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8, -0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db,0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806, -0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0,0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3, -0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806,0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8, -0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb,0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806, -0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66, -0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66, -0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69,0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c, -0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220, -0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880, -0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880, -0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d +0x810,0x29fd,0x810,0x29e7,0x810,0xa543,0x810,0xa52a,0x1810,0xa515,0x810,0xa512,0x6800,0x3846,0x3b9,0x399, +1,0x1fbe,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x841, +0x3b2,1,0x3d0,0x841,0x3b5,1,0x3f5,0x841,0x3b8,2,0x3d1,0x3f4,0x841,0x3b9,2,0x345, +0x1fbe,0x841,0x3ba,1,0x3f0,0x841,0x3bc,1,0xb5,0x841,0x3c0,1,0x3d6,0x841,0x3c1,1, +0x3f1,0x4850,0x20,1,0x3c2,0x841,0x3c6,1,0x3d5,0x841,0x3c9,1,0x2126,0x8c0,1,0x3330, +0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x1fe3,0x844,0x392,1,0x3d0,0x844,0x395, +1,0x3f5,0x844,0x398,2,0x3d1,0x3f4,0x844,0x399,2,0x345,0x1fbe,0x844,0x39a,1,0x3f0, +0x844,0x39c,1,0xb5,0x844,0x3a0,1,0x3d6,0x844,0x3a1,1,0x3f1,0x806,0x3c3,0x3a3,0x844, +0x3a3,1,0x3c2,0x844,0x3a6,1,0x3d5,0x844,0x3a9,1,0x2126,0x806,0x3b2,0x392,0x846,0x3b8, +0x398,1,0x3f4,0x806,0x3c6,0x3a6,0x806,0x3c0,0x3a0,0x806,0x3ba,0x39a,0x806,0x3c1,0x3a1,0x841, +0x3b8,2,0x398,0x3d1,0x806,0x3b5,0x395,0x841,0x432,1,0x1c80,0x841,0x434,1,0x1c81,0x841, +0x43e,1,0x1c82,0x841,0x441,1,0x1c83,0x841,0x442,2,0x1c84,0x1c85,0x841,0x44a,1,0x1c86, +0x844,0x412,1,0x1c80,0x844,0x414,1,0x1c81,0x844,0x41e,1,0x1c82,0x844,0x421,1,0x1c83, +0x844,0x422,2,0x1c84,0x1c85,0x844,0x42a,1,0x1c86,0x841,0x463,1,0x1c87,0x844,0x462,1, +0x1c87,0x880,0x2220,0x565,0x582,0x535,0x552,0x535,0x582,0x810,0x1c60,0x80c,0x1c90,0x10d0,0x80c,0x1c91, +0x10d1,0x80c,0x1c92,0x10d2,0x80c,0x1c93,0x10d3,0x80c,0x1c94,0x10d4,0x80c,0x1c95,0x10d5,0x80c,0x1c96,0x10d6, +0x80c,0x1c97,0x10d7,0x80c,0x1c98,0x10d8,0x80c,0x1c99,0x10d9,0x80c,0x1c9a,0x10da,0x80c,0x1c9b,0x10db,0x80c, +0x1c9c,0x10dc,0x80c,0x1c9d,0x10dd,0x80c,0x1c9e,0x10de,0x80c,0x1c9f,0x10df,0x80c,0x1ca0,0x10e0,0x80c,0x1ca1, +0x10e1,0x80c,0x1ca2,0x10e2,0x80c,0x1ca3,0x10e3,0x80c,0x1ca4,0x10e4,0x80c,0x1ca5,0x10e5,0x80c,0x1ca6,0x10e6, +0x80c,0x1ca7,0x10e7,0x80c,0x1ca8,0x10e8,0x80c,0x1ca9,0x10e9,0x80c,0x1caa,0x10ea,0x80c,0x1cab,0x10eb,0x80c, +0x1cac,0x10ec,0x80c,0x1cad,0x10ed,0x80c,0x1cae,0x10ee,0x80c,0x1caf,0x10ef,0x80c,0x1cb0,0x10f0,0x80c,0x1cb1, +0x10f1,0x80c,0x1cb2,0x10f2,0x80c,0x1cb3,0x10f3,0x80c,0x1cb4,0x10f4,0x80c,0x1cb5,0x10f5,0x80c,0x1cb6,0x10f6, +0x80c,0x1cb7,0x10f7,0x80c,0x1cb8,0x10f8,0x80c,0x1cb9,0x10f9,0x80c,0x1cba,0x10fa,0x80c,0x1cbd,0x10fd,0x80c, +0x1cbe,0x10fe,0x80c,0x1cbf,0x10ff,0xa10,0x97d0,0xa10,8,0x806,0x13f0,0x13f0,0x806,0x13f1,0x13f1,0x806, +0x13f2,0x13f2,0x806,0x13f3,0x13f3,0x806,0x13f4,0x13f4,0x806,0x13f5,0x13f5,0x806,0x432,0x412,0x806,0x434, +0x414,0x806,0x43e,0x41e,0x806,0x441,0x421,0x846,0x442,0x422,1,0x1c85,0x846,0x442,0x422,1, +0x1c84,0x806,0x44a,0x42a,0x806,0x463,0x462,0x806,0xa64b,0xa64a,0xc10,0xbc0,0x810,0x8a04,0x810,0xee6, +0x810,0x8a38,0x841,0x1e61,1,0x1e9b,0x844,0x1e60,1,0x1e9b,0x880,0x2220,0x68,0x331,0x48,0x331, +0x48,0x331,0x880,0x2220,0x74,0x308,0x54,0x308,0x54,0x308,0x880,0x2220,0x77,0x30a,0x57,0x30a, +0x57,0x30a,0x880,0x2220,0x79,0x30a,0x59,0x30a,0x59,0x30a,0x880,0x2220,0x61,0x2be,0x41,0x2be, +0x41,0x2be,0x806,0x1e61,0x1e60,0xc90,0x1dbf,0x20,0x73,0x73,0x880,0x2220,0x3c5,0x313,0x3a5,0x313, +0x3a5,0x313,0x880,0x3330,0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x880,0x3330,0x3c5, +0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x880,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342, +0x3a5,0x313,0x342,0x890,8,0x220,0x1f00,0x3b9,0x1f08,0x399,0x890,8,0x220,0x1f01,0x3b9,0x1f09, +0x399,0x890,8,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x890,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x890, +8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x890,8,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x890,8,0x220, +0x1f06,0x3b9,0x1f0e,0x399,0x890,8,0x220,0x1f07,0x3b9,0x1f0f,0x399,0xc90,8,0x220,0x1f00,0x3b9, +0x1f08,0x399,0xc90,8,0x220,0x1f01,0x3b9,0x1f09,0x399,0xc90,8,0x220,0x1f02,0x3b9,0x1f0a,0x399, +0xc90,8,0x220,0x1f03,0x3b9,0x1f0b,0x399,0xc90,8,0x220,0x1f04,0x3b9,0x1f0c,0x399,0xc90,8, +0x220,0x1f05,0x3b9,0x1f0d,0x399,0xc90,8,0x220,0x1f06,0x3b9,0x1f0e,0x399,0xc90,8,0x220,0x1f07, +0x3b9,0x1f0f,0x399,0x890,8,0x220,0x1f20,0x3b9,0x1f28,0x399,0x890,8,0x220,0x1f21,0x3b9,0x1f29, +0x399,0x890,8,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x890,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x890, +8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x890,8,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x890,8,0x220, +0x1f26,0x3b9,0x1f2e,0x399,0x890,8,0x220,0x1f27,0x3b9,0x1f2f,0x399,0xc90,8,0x220,0x1f20,0x3b9, +0x1f28,0x399,0xc90,8,0x220,0x1f21,0x3b9,0x1f29,0x399,0xc90,8,0x220,0x1f22,0x3b9,0x1f2a,0x399, +0xc90,8,0x220,0x1f23,0x3b9,0x1f2b,0x399,0xc90,8,0x220,0x1f24,0x3b9,0x1f2c,0x399,0xc90,8, +0x220,0x1f25,0x3b9,0x1f2d,0x399,0xc90,8,0x220,0x1f26,0x3b9,0x1f2e,0x399,0xc90,8,0x220,0x1f27, +0x3b9,0x1f2f,0x399,0x890,8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x890,8,0x220,0x1f61,0x3b9,0x1f69, +0x399,0x890,8,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x890,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x890, +8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x890,8,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x890,8,0x220, +0x1f66,0x3b9,0x1f6e,0x399,0x890,8,0x220,0x1f67,0x3b9,0x1f6f,0x399,0xc90,8,0x220,0x1f60,0x3b9, +0x1f68,0x399,0xc90,8,0x220,0x1f61,0x3b9,0x1f69,0x399,0xc90,8,0x220,0x1f62,0x3b9,0x1f6a,0x399, +0xc90,8,0x220,0x1f63,0x3b9,0x1f6b,0x399,0xc90,8,0x220,0x1f64,0x3b9,0x1f6c,0x399,0xc90,8, +0x220,0x1f65,0x3b9,0x1f6d,0x399,0xc90,8,0x220,0x1f66,0x3b9,0x1f6e,0x399,0xc90,8,0x220,0x1f67, +0x3b9,0x1f6f,0x399,0x880,0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x890,9,0x220,0x3b1,0x3b9, +0x391,0x399,0x880,0x2220,0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x880,0x2220,0x3b1,0x342,0x391,0x342, +0x391,0x342,0x880,0x3330,0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0xc90,9,0x220, +0x3b1,0x3b9,0x391,0x399,0x846,0x3b9,0x399,1,0x345,0x880,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca, +0x345,0x890,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345, +0x880,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x880,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399, +0x397,0x342,0x345,0xc90,9,0x220,0x3b7,0x3b9,0x397,0x399,0x880,0x3330,0x3b9,0x308,0x300,0x399, +0x308,0x300,0x399,0x308,0x300,0x8c0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308, +0x301,0x390,0x880,0x2220,0x3b9,0x342,0x399,0x342,0x399,0x342,0x880,0x3330,0x3b9,0x308,0x342,0x399, +0x308,0x342,0x399,0x308,0x342,0x880,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300, +0x8c0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x880,0x2220,0x3c1, +0x313,0x3a1,0x313,0x3a1,0x313,0x880,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x880,0x3330,0x3c5, +0x308,0x342,0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x880,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345, +0x890,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0x880,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x880, +0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9,0x342,0x880,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9, +0x342,0x345,0xc90,9,0x220,0x3c9,0x3b9,0x3a9,0x399,0xc50,0x1d5d,1,0x3a9,0xc50,0x20bf,1, +0x4b,0xc50,0x2046,1,0xc5,0xc10,0x29f7,0xc10,0xee6,0xc10,0x29e7,0xc10,0x2a2b,0xc10,0x2a28,0xc10, +0x2a1c,0xc10,0x29fd,0xc10,0x2a1f,0xc10,0x2a1e,0xc10,0x2a3f,0xc10,0x1c60,0x841,0xa64b,1,0x1c88,0x844, +0xa64a,1,0x1c88,0xc10,0x8a04,0xc10,0xa528,0xc10,0xa544,0xc10,0xa54f,0xc10,0xa54b,0xc10,0xa541,0xc10, +0xa512,0xc10,0xa52a,0xc10,0xa515,0x810,0x3a0,0xc10,0xa543,0xc10,0x8a38,0xc10,0x3a0,0x806,0x13a0,0x13a0, +0x806,0x13a1,0x13a1,0x806,0x13a2,0x13a2,0x806,0x13a3,0x13a3,0x806,0x13a4,0x13a4,0x806,0x13a5,0x13a5,0x806, +0x13a6,0x13a6,0x806,0x13a7,0x13a7,0x806,0x13a8,0x13a8,0x806,0x13a9,0x13a9,0x806,0x13aa,0x13aa,0x806,0x13ab, +0x13ab,0x806,0x13ac,0x13ac,0x806,0x13ad,0x13ad,0x806,0x13ae,0x13ae,0x806,0x13af,0x13af,0x806,0x13b0,0x13b0, +0x806,0x13b1,0x13b1,0x806,0x13b2,0x13b2,0x806,0x13b3,0x13b3,0x806,0x13b4,0x13b4,0x806,0x13b5,0x13b5,0x806, +0x13b6,0x13b6,0x806,0x13b7,0x13b7,0x806,0x13b8,0x13b8,0x806,0x13b9,0x13b9,0x806,0x13ba,0x13ba,0x806,0x13bb, +0x13bb,0x806,0x13bc,0x13bc,0x806,0x13bd,0x13bd,0x806,0x13be,0x13be,0x806,0x13bf,0x13bf,0x806,0x13c0,0x13c0, +0x806,0x13c1,0x13c1,0x806,0x13c2,0x13c2,0x806,0x13c3,0x13c3,0x806,0x13c4,0x13c4,0x806,0x13c5,0x13c5,0x806, +0x13c6,0x13c6,0x806,0x13c7,0x13c7,0x806,0x13c8,0x13c8,0x806,0x13c9,0x13c9,0x806,0x13ca,0x13ca,0x806,0x13cb, +0x13cb,0x806,0x13cc,0x13cc,0x806,0x13cd,0x13cd,0x806,0x13ce,0x13ce,0x806,0x13cf,0x13cf,0x806,0x13d0,0x13d0, +0x806,0x13d1,0x13d1,0x806,0x13d2,0x13d2,0x806,0x13d3,0x13d3,0x806,0x13d4,0x13d4,0x806,0x13d5,0x13d5,0x806, +0x13d6,0x13d6,0x806,0x13d7,0x13d7,0x806,0x13d8,0x13d8,0x806,0x13d9,0x13d9,0x806,0x13da,0x13da,0x806,0x13db, +0x13db,0x806,0x13dc,0x13dc,0x806,0x13dd,0x13dd,0x806,0x13de,0x13de,0x806,0x13df,0x13df,0x806,0x13e0,0x13e0, +0x806,0x13e1,0x13e1,0x806,0x13e2,0x13e2,0x806,0x13e3,0x13e3,0x806,0x13e4,0x13e4,0x806,0x13e5,0x13e5,0x806, +0x13e6,0x13e6,0x806,0x13e7,0x13e7,0x806,0x13e8,0x13e8,0x806,0x13e9,0x13e9,0x806,0x13ea,0x13ea,0x806,0x13eb, +0x13eb,0x806,0x13ec,0x13ec,0x806,0x13ed,0x13ed,0x806,0x13ee,0x13ee,0x806,0x13ef,0x13ef,0x880,0x2220,0x66, +0x66,0x46,0x46,0x46,0x66,0x880,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x880,0x2220,0x66, +0x6c,0x46,0x4c,0x46,0x6c,0x880,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69, +0x880,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0x8c0,1,0x2220,0x73,0x74, +0x53,0x54,0x53,0x74,0xfb06,0x8c0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x880, +0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x880,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x880, +0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x880,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x880, +0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d }; static const uint16_t ucase_props_unfold[370]={ @@ -913,16 +926,16 @@ static const UCaseProps ucase_props_singleton={ ucase_props_unfold, { ucase_props_trieIndex, - ucase_props_trieIndex+3248, + ucase_props_trieIndex+3288, NULL, - 3248, - 8816, + 3288, + 8956, 0x188, - 0xd2c, + 0xd54, 0x0, 0x0, 0xe0800, - 0x2f1c, + 0x2fd0, NULL, 0, FALSE, FALSE, 0, NULL }, { 4,0,0,0 } diff --git a/deps/icu-small/source/common/uchar.cpp b/deps/icu-small/source/common/uchar.cpp index 996c3fdc40227b..60fe75c78dec03 100644 --- a/deps/icu-small/source/common/uchar.cpp +++ b/deps/icu-small/source/common/uchar.cpp @@ -453,12 +453,18 @@ u_getNumericValue(UChar32 c) { } return numValue; - } else if(ntv>2); return (double)numerator/denominator; + } else if(ntv>2); + return (double)numerator/denominator; } else { /* reserved */ return U_NO_NUMERIC_VALUE; diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index e9c231908e8288..10c25b3048ee3f 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -11,9 +11,9 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={0xb,0,0,0}; +static const UVersionInfo dataVersion={0xc,1,0,0}; -static const uint16_t propsTrie_index[21452]={ +static const uint16_t propsTrie_index[21968]={ 0x45d,0x465,0x46d,0x475,0x48d,0x495,0x49d,0x4a5,0x4ad,0x4b5,0x4bb,0x4c3,0x4cb,0x4d3,0x4db,0x4e3, 0x4e9,0x4f1,0x4f9,0x501,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x528,0x530,0x538,0x540,0x545,0x54d, 0x555,0x55d,0x561,0x569,0x571,0x579,0x581,0x589,0x585,0x58d,0x592,0x59a,0x5a0,0x5a8,0x5b0,0x5b8, @@ -21,29 +21,29 @@ static const uint16_t propsTrie_index[21452]={ 0x635,0x62d,0x63d,0x645,0x47d,0x655,0x65d,0x64d,0x66d,0x66f,0x677,0x665,0x687,0x68d,0x695,0x67f, 0x6a5,0x6ab,0x6b3,0x69d,0x6c3,0x6c9,0x6d1,0x6bb,0x6e1,0x6e7,0x6ef,0x6d9,0x6ff,0x707,0x70f,0x6f7, 0x71f,0x725,0x72d,0x717,0x73d,0x743,0x74b,0x735,0x75b,0x760,0x768,0x753,0x778,0x77f,0x787,0x770, -0x609,0x78f,0x797,0x47d,0x79f,0x7a7,0x7af,0x47d,0x7b7,0x7bf,0x7c7,0x7cc,0x7d4,0x7db,0x7e3,0x47d, -0x5c8,0x7eb,0x7f3,0x7fb,0x803,0x555,0x813,0x80b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x81b,0x5c8,0x823,0x827,0x82f,0x5c8,0x835,0x5c8,0x83b,0x843,0x84b,0x555,0x555,0x853, -0x85b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x860,0x868,0x5c8,0x5c8,0x870,0x878,0x880,0x888,0x890,0x5c8,0x898,0x8a0,0x8a8, -0x8b8,0x5c8,0x8c0,0x8c2,0x8ca,0x8b0,0x5c8,0x8cd,0x8e1,0x8d5,0x8dd,0x8e9,0x5c8,0x8f1,0x8f7,0x8ff, -0x907,0x5c8,0x917,0x91f,0x927,0x90f,0x47d,0x47d,0x937,0x93a,0x942,0x92f,0x952,0x94a,0x5c8,0x959, -0x5c8,0x968,0x961,0x970,0x978,0x97c,0x984,0x98c,0x4fd,0x994,0x997,0x99d,0x9a4,0x997,0x524,0x9ac, -0x4ad,0x4ad,0x4ad,0x4ad,0x9b4,0x4ad,0x4ad,0x4ad,0x9c4,0x9cc,0x9d4,0x9dc,0x9e4,0x9e8,0x9f0,0x9bc, -0xa08,0xa10,0x9f8,0xa00,0xa18,0xa20,0xa28,0xa30,0xa48,0xa38,0xa40,0xa50,0xa58,0xa67,0xa6c,0xa5f, -0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa7c,0xa84,0x8ff,0xa87,0xa8f,0xa96,0xa9b,0xaa3, -0x8ff,0xaaa,0xaa9,0xaba,0xabd,0x8ff,0x8ff,0xab2,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xacc,0xad4,0xac4, -0x8ff,0x8ff,0x8ff,0xad9,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xadf,0xae7,0x8ff,0xaef,0xaf6, -0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xa74,0xa74,0xa74,0xa74,0xafe,0xa74,0xb05,0xb0c, -0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x8ff,0xb14,0xb1b,0xb1f,0xb25,0x8ff,0xb2b,0xaa4, -0x555,0xb3b,0xb33,0xb43,0x4ad,0x4ad,0x4ad,0xb4b,0x4fd,0xb53,0x5c8,0xb59,0xb69,0xb61,0xb61,0x524, -0xb71,0xb79,0xb81,0x47d,0xb89,0x8ff,0x8ff,0xb90,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0xb9e, -0xbae,0xba6,0x609,0x5c8,0xbb6,0x85b,0x5c8,0xbbe,0xbc6,0xbca,0x5c8,0x5c8,0xbcf,0xbd7,0x8ff,0xbdf, -0xaa4,0xbe7,0xbed,0x8ff,0xbe7,0xbf5,0x8ff,0xaa4,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0xbfd,0x5c8,0x5c8,0x5c8,0xc05,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x609,0x78f,0x797,0x47d,0x79f,0x7a6,0x7ae,0x47d,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47d, +0x5c8,0x7ea,0x7f2,0x7fa,0x802,0x555,0x812,0x80a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x81a,0x5c8,0x822,0x826,0x82e,0x5c8,0x834,0x5c8,0x83a,0x842,0x84a,0x555,0x555,0x852, +0x85a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x85f,0x867,0x5c8,0x5c8,0x86f,0x877,0x87f,0x887,0x88f,0x5c8,0x897,0x89f,0x8a7, +0x8b7,0x5c8,0x8bf,0x8c1,0x8c9,0x8af,0x5c8,0x8cc,0x8e0,0x8d4,0x8dc,0x8e8,0x5c8,0x8f0,0x8f6,0x8fe, +0x906,0x5c8,0x916,0x91e,0x926,0x90e,0x47d,0x47d,0x936,0x939,0x941,0x92e,0x951,0x949,0x5c8,0x958, +0x5c8,0x967,0x960,0x96f,0x977,0x97b,0x983,0x98b,0x4fd,0x993,0x996,0x99c,0x9a3,0x996,0x524,0x9ab, +0x4ad,0x4ad,0x4ad,0x4ad,0x9b3,0x4ad,0x4ad,0x4ad,0x9c3,0x9cb,0x9d3,0x9db,0x9e3,0x9e7,0x9ef,0x9bb, +0xa07,0xa0f,0x9f7,0x9ff,0xa17,0xa1f,0xa27,0xa2f,0xa47,0xa37,0xa3f,0xa4f,0xa57,0xa66,0xa6b,0xa5e, +0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa7b,0xa83,0x8fe,0xa86,0xa8e,0xa95,0xa9a,0xaa2, +0x8fe,0xaa9,0xaa8,0xab9,0xabc,0x8fe,0x8fe,0xab1,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xacb,0xad3,0xac3, +0x8fe,0x8fe,0x8fe,0xad8,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xade,0xae6,0x8fe,0xaee,0xaf5, +0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xa73,0xa73,0xa73,0xa73,0xafd,0xa73,0xb04,0xb0b, +0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0xa73,0x8fe,0xb13,0xb1a,0xb1e,0xb24,0x8fe,0x8fe,0x8fe, +0x555,0xb34,0xb2c,0xb3c,0x4ad,0x4ad,0x4ad,0xb44,0x4fd,0xb4c,0x5c8,0xb52,0xb62,0xb5a,0xb5a,0x524, +0xb6a,0xb72,0xb7a,0x47d,0xb82,0x8fe,0x8fe,0xb89,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0xb97, +0xba7,0xb9f,0x609,0x5c8,0xbaf,0x85a,0x5c8,0xbb7,0xbbf,0xbc3,0x5c8,0x5c8,0xbc8,0xbd0,0x8fe,0xbd8, +0xaa3,0xbe0,0xbe6,0x8fe,0xbe0,0xbee,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0xbf6,0x5c8,0x5c8,0x5c8,0xbfe,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xc0b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc10,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xc04,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc09,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, @@ -52,54 +52,54 @@ static const uint16_t propsTrie_index[21452]={ 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cd,0x8ff,0x8ff, -0xc18,0x5c8,0xc1b,0x5c8,0xc23,0xc29,0xc31,0xc39,0xc3e,0x5c8,0x5c8,0xc42,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc49,0x5c8,0xc50,0xc56,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc5e,0x5c8,0x5c8,0x5c8,0xc66,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x8fe,0x8fe, +0xc11,0x5c8,0xc14,0x5c8,0xc1c,0xc22,0xc2a,0xc32,0xc37,0x5c8,0x5c8,0xc3b,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc42,0x5c8,0xc49,0xc4f,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc57,0x5c8,0x5c8,0x5c8,0xc5f,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc61,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc68,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xc76,0x5c8,0x5c8,0x5c8,0xc7d,0xc85,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xc6f,0x5c8,0x5c8,0x5c8,0xc76,0xc7e,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8a,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc83,0x5c8,0x5c8,0xc8b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc96,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc8f,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc99,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc92,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc9c,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xc95,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xca2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xc9b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0xcaa,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0xca3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xcaf,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xca8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb4,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcad,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0xcc1,0xcc8,0xccc,0x5c8,0x5c8,0x5c8,0xcd3,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0xcba,0xcc1,0xcc5,0x5c8,0x5c8,0x5c8,0xccc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd9, -0xce9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcd2, +0xce2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0xce1,0x8ff,0xcf1,0x970,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0xcf6,0xcfe,0x4ad,0xd0e,0xd06,0x5c8,0x5c8,0xd16,0xd1e,0xd2e,0x4ad,0xd33,0xd3b,0xd41,0x47d,0xd26, -0xd49,0xd51,0x5c8,0xd59,0xd69,0xd6c,0xd61,0xd74,0x61d,0xd7c,0xd83,0x8c1,0x66d,0xd93,0xd8b,0xd9b, -0x5c8,0xda3,0xdab,0xdb3,0x5c8,0xdbb,0xdc3,0xdcb,0xdd3,0xddb,0xddf,0xde7,0x4fd,0x4fd,0x5c8,0xdef, +0x5c8,0x5c8,0x5c8,0x5c8,0xcda,0x8fe,0xcea,0x96f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0xcef,0xcf7,0x4ad,0xd07,0xcff,0x5c8,0x5c8,0xd0f,0xd17,0xd27,0x4ad,0xd2c,0xd34,0xd3a,0xd42,0xd1f, +0xd4a,0xd52,0x5c8,0xd5a,0xd6a,0xd6d,0xd62,0xd75,0x61d,0xd7d,0xd84,0x8c0,0x66d,0xd94,0xd8c,0xd9c, +0x5c8,0xda4,0xdac,0xdb4,0x5c8,0xdbc,0xdc4,0xdcc,0xdd4,0xddc,0xde0,0xde8,0x4fd,0x4fd,0x5c8,0xdf0, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, @@ -121,29 +121,29 @@ static const uint16_t propsTrie_index[21452]={ 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf7,0xe03,0xdfb, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdf8,0xe04,0xdfc, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0x5c8,0x5c8,0x5c8,0xe1b,0x5c8,0xcd4,0xe22,0xe27, -0x5c8,0x5c8,0x5c8,0xe2f,0x5c8,0x5c8,0x8cc,0x47d,0xe45,0xe35,0xe3d,0x5c8,0x5c8,0xe4d,0xe55,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5a,0xe62,0x5c8,0xe66,0x5c8,0xe6c,0xe70, -0xe78,0xe80,0xe87,0xe8f,0x5c8,0x5c8,0x5c8,0xe95,0xead,0x46d,0xeb5,0xebd,0xec2,0x8e1,0xe9d,0xea5, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0xe0b, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0x5c8,0x5c8,0x5c8,0xe1c,0x5c8,0xccd,0xe23,0xe28, +0x5c8,0x5c8,0x5c8,0xe30,0x5c8,0x5c8,0x8cb,0x47d,0xe46,0xe36,0xe3e,0x5c8,0x5c8,0xe4e,0xe56,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xe5b,0xe63,0x5c8,0xe67,0x5c8,0xe6d,0xe71, +0xe79,0xe81,0xe88,0xe90,0x5c8,0x5c8,0x5c8,0xe96,0xeae,0x46d,0xeb6,0xebe,0xec3,0x8e0,0xe9e,0xea6, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, +0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c,0xe0c, 0x11f4,0x11f4,0x1234,0x1274,0x12b4,0x12ec,0x132c,0x136c,0x13a4,0x13e4,0x1410,0x1450,0x1490,0x14a0,0x14e0,0x1514, 0x1554,0x1584,0x15c4,0x1604,0x1614,0x1648,0x1680,0x16c0,0x1700,0x1740,0x1774,0x17a0,0x17e0,0x1818,0x1834,0x1874, 0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xbe2,0xa40,0xa40,0xa40,0xa40,0xc22,0x1db,0x1db, @@ -182,118 +182,118 @@ static const uint16_t propsTrie_index[21452]={ 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0xeca,0xed1,0xed9,0x47d,0x5c8,0x5c8,0x5c8,0xbd7,0xee9,0xee1,0xf00,0xef1,0xef8,0xf08,0xb85,0xf10, -0x47d,0x47d,0x47d,0x47d,0x8c1,0x5c8,0xf18,0xf20,0x5c8,0xf28,0xf30,0xf34,0xf3c,0x5c8,0xf44,0x47d, -0x555,0x55f,0xf4c,0x5c8,0xf50,0xf58,0xf68,0xf60,0x5c8,0xf70,0x5c8,0xf77,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb69,0x8cd,0xe6c,0x47d,0x47d,0x47d,0x47d, -0xf87,0xf7f,0xf8a,0xf92,0x8e1,0xf9a,0x47d,0xfa2,0xfaa,0xfb2,0x47d,0x47d,0x5c8,0xfc2,0xfca,0xfba, -0xfda,0xfe1,0xfd2,0xfe9,0xff1,0x47d,0x1001,0xff9,0x5c8,0x1004,0x100c,0x1014,0x101c,0x1024,0x47d,0x47d, -0x5c8,0x5c8,0x102c,0x47d,0x555,0x1034,0x4fd,0x103c,0x5c8,0x1044,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x104c,0x47d,0x47d,0x47d,0x47d,0x1054,0x105c,0x1063,0x47d,0x47d,0x47d,0x47d,0x47d, -0x1073,0x5fe,0x107b,0x106b,0x952,0x1083,0x108b,0x1091,0x10a9,0x1099,0x10a1,0x10ad,0x952,0x10bd,0x10b5,0x10c5, -0x10d5,0x10cd,0x47d,0x47d,0x10dc,0x10e4,0x620,0x10ec,0x10fc,0x1102,0x110a,0x10f4,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x1112,0x111a,0x47d,0x5c8,0x1122,0x112a,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1132,0x113a,0x47d, -0x5c8,0x1142,0x114a,0x1152,0x5c8,0x1162,0x115a,0x47d,0x83b,0x116a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x1172,0x47d,0x47d,0x47d,0x555,0x4fd,0x117a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x1192,0x1182,0x118a,0x5c8,0x11a2,0x119a,0x5c8,0x8c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x11b8,0x11bd,0x11aa,0x11b2,0x11cd,0x11c5,0x47d,0x47d,0x11dc,0x11e0,0x11d4,0x11f0,0x11e8,0x115a,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x11f4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cc,0x47d,0x47d,0x47d, -0x1204,0x120c,0x1214,0x11fc,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x121c,0x47d,0x47d,0x47d,0x47d,0x47d, +0xecb,0xed2,0xeda,0x47d,0x5c8,0x5c8,0x5c8,0xbd0,0xeea,0xee2,0xf01,0xef2,0xef9,0xf09,0xb7e,0xf11, +0x47d,0x47d,0x47d,0x47d,0x8c0,0x5c8,0xf19,0xf21,0x5c8,0xf29,0xf31,0xf35,0xf3d,0x5c8,0xf45,0x47d, +0x555,0x55f,0xf4d,0x5c8,0xf51,0xf59,0xf69,0xf61,0x5c8,0xf71,0x5c8,0xf78,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xb62,0x8cc,0xe6d,0x47d,0x47d,0x47d,0x47d, +0xf88,0xf80,0xf8b,0xf93,0x8e0,0xf9b,0x47d,0xfa3,0xfab,0xfb3,0x47d,0x47d,0x5c8,0xfc3,0xfcb,0xfbb, +0xfdb,0xfe2,0xfd3,0xfea,0xff2,0x47d,0x1002,0xffa,0x5c8,0x1005,0x100d,0x1015,0x101d,0x1025,0x47d,0x47d, +0x5c8,0x5c8,0x102d,0x47d,0x555,0x1035,0x4fd,0x103d,0x5c8,0x1045,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x104d,0x47d,0x47d,0x47d,0x47d,0x1055,0x105d,0x1064,0x47d,0x47d,0x47d,0x47d,0xb62, +0x1074,0x5fe,0x107c,0x106c,0x951,0x1084,0x108c,0x1092,0x10aa,0x109a,0x10a2,0x10ae,0x951,0x10be,0x10b6,0x10c6, +0x10d6,0x10ce,0x47d,0x47d,0x10dd,0x10e5,0x620,0x10ed,0x10fd,0x1103,0x110b,0x10f5,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1113,0x111b,0x47d,0x5c8,0x1123,0x112b,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x1133,0x113b,0x47d, +0x5c8,0x1143,0x114b,0x1153,0x5c8,0x1163,0x115b,0x47d,0x83a,0x116b,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1173,0x47d,0x47d,0x47d,0x555,0x4fd,0x117b,0x47d,0x47d,0x47d,0x47d,0x47d,0x118b,0x118f,0x1183, +0x11a7,0x1197,0x119f,0x5c8,0x11b7,0x11af,0x5c8,0x8c1,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x11cd,0x11d2,0x11bf,0x11c7,0x11e2,0x11da,0x47d,0x47d,0x11f1,0x11f5,0x11e9,0x1205,0x11fd,0x115b,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1209,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x1219,0x1211, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8cb,0x47d,0x47d,0x47d, +0x1229,0x1231,0x1239,0x1221,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1241,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x1224,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x1249,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x1226,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x5c8,0x5c8,0x1251,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x8c2,0x8e1,0x122e,0x47d,0x47d,0xe62,0x1236,0x5c8,0x123e,0x1246,0x124e,0xcd9,0x47d, +0x5c8,0x5c8,0x5c8,0x8c1,0x8e0,0x1259,0x47d,0x47d,0xe63,0x1261,0x5c8,0x1269,0x1271,0x1279,0xcd2,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1256,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x125e,0x1263,0x126b,0x47d, -0x47d,0x1273,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x47d,0x47d,0x47d,0x47d,0x555,0x4fd,0x1281,0x47d,0x47d,0x47d,0x5c8,0x5c8,0x1289,0x128e,0x1294,0x47d, +0x47d,0x129c,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x127b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1283,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x12a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x12ac,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e1,0x47d,0x47d,0xe62,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x8e0,0x47d,0x12b1,0x12b8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xdfc,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x128b,0x1290,0x1298,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x12be,0x12c3,0x12cb,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0xb98,0x8ff,0x12a0,0x8ff,0x12a7,0x12af,0x12b5, -0x8ff,0x12bb,0x8ff,0x8ff,0x12c3,0x47d,0x47d,0x47d,0x47d,0x12cb,0x8ff,0x8ff,0xaa6,0x12d3,0x47d,0x47d, -0x47d,0x47d,0x12e3,0x12ea,0x12ef,0x12f5,0x12fd,0x1305,0x130d,0x12e7,0x1315,0x131d,0x1325,0x132a,0x12fc,0x12e3, -0x12ea,0x12e6,0x12f5,0x1332,0x12e4,0x1335,0x12e7,0x133d,0x1345,0x134d,0x1354,0x1340,0x1348,0x1350,0x1357,0x1343, -0x135f,0x12db,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x8ff,0x524,0x136f,0x524,0x1376,0x137d,0x1367,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x8fe,0x12d3,0x8fe,0x12da,0x12e2,0x12e8, +0x8fe,0x12ee,0x8fe,0x8fe,0x12f6,0x47d,0x47d,0x47d,0x47d,0x12fe,0x8fe,0x8fe,0xaa5,0x1306,0x47d,0x47d, +0x47d,0x47d,0x1316,0x131d,0x1322,0x1328,0x1330,0x1338,0x1340,0x131a,0x1348,0x1350,0x1358,0x135d,0x132f,0x1316, +0x131d,0x1319,0x1328,0x1365,0x1317,0x1368,0x131a,0x1370,0x1378,0x1380,0x1387,0x1373,0x137b,0x1383,0x138a,0x1376, +0x1392,0x130e,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x8fe,0x524,0x13a2,0x524,0x13a9,0x13b0,0x139a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x1384,0x138c,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x13b7,0x13bf,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13cf,0x13c7,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x5c8,0x13d7,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x13df,0x47d,0x555,0x13ef,0x13e7,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1394,0x47d,0x555,0x13a4,0x139c,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x13f7,0x1407,0x13ff,0x47d,0x47d,0x1417,0x140f,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x1427,0x142f,0x1437,0x143f,0x1447,0x144f,0x47d,0x141f,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x8fe,0x1457,0x8fe,0x8fe,0xb89,0x145c,0x1460,0xb91,0x1468,0x8fe,0x8fe,0x146d,0x8fe,0x12ed, +0x47d,0x1475,0x147d,0x1481,0x1489,0x1491,0x47d,0x47d,0x47d,0x47d,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x1499,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe, +0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0x8fe,0xb91,0x14a1,0x8fe,0x8fe,0x8fe,0xb89,0x8fe,0x8fe, +0x14a9,0x14b1,0x1457,0x8fe,0x14b9,0x8fe,0x14c1,0xb93,0x47d,0x47d,0x14c6,0x8fe,0x8fe,0x14ca,0x8fe,0x14d2, +0x14d8,0x8fe,0x8fe,0x8fe,0xb89,0x14dd,0x14e3,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x13ac,0x13bc,0x13b4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x13cc,0x13d4,0x13dc,0x13e4,0x13ec,0x13f4,0x47d,0x13c4,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x8ff,0x13fc,0x8ff,0x8ff,0xb90,0x1401,0x1405,0xb98,0x140d,0x8ff,0x8ff,0x13fc,0x8ff,0x12ba, -0x47d,0x1415,0x141d,0x1421,0x1429,0x1431,0x47d,0x47d,0x47d,0x47d,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x1439,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff, -0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x8ff,0x1441,0x1449,0x8ff,0x8ff,0x8ff,0xb90,0x8ff,0x8ff, -0x1451,0x47d,0x13fc,0x8ff,0x1459,0x8ff,0x1461,0xb9a,0x47d,0x47d,0x13fc,0xaa4,0x8ff,0x1465,0x8ff,0x146d, -0x141d,0x8ff,0x47d,0x47d,0x47d,0xb9a,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x1475,0x5c8,0x5c8,0x147c,0x5c8,0x5c8,0x5c8,0x1484,0x5c8,0x148c,0x5c8,0x5c8,0x5c8,0x5c8, +0x47d,0x47d,0x14eb,0x5c8,0x5c8,0x14f2,0x5c8,0x5c8,0x5c8,0x14fa,0x5c8,0x1502,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0xc7a,0x5c8,0x5c8,0x1494,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x149c,0x14a4,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0xc73,0x5c8,0x5c8,0x150a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x1512,0x151a,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0xcb2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14ab,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1521,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x14b2,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x1528,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14b9,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x152f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0xb69,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0xb62,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x14bd,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0xf50,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x1533,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0xf51,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x127f,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x153b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, 0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x14c2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x5c8,0x5c8,0x1543,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x14ca,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, -0x5c8,0x5c8,0x5c8,0xf50,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x5c8,0x5c8,0x5c8,0x5c8,0x154b,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8,0x5c8, +0x5c8,0x5c8,0x5c8,0xf51,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0x14da,0x14d2,0x14d2,0x14d2,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524, -0x524,0x524,0x14e2,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x155b,0x1553,0x1553,0x1553,0x47d,0x47d,0x47d,0x47d,0x524,0x524,0x524,0x524,0x524, +0x524,0x524,0x1563,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, 0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, -0x47d,0x47d,0x47d,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0x14ea,0x45c,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x47d,0x47d,0x47d,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14,0xe14, +0xe14,0xe14,0x156b,0x45c,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, 0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, @@ -469,7 +469,7 @@ static const uint16_t propsTrie_index[21452]={ 0,0,8,8,8,0,8,8,8,6,0,0,5,0,0,0, 0,0,0,8,0,0,0,0,0,0,0,0,5,5,6,6, 0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0, -0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8, +0,0,0,0x17,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8, 6,5,5,5,5,5,5,5,5,0,5,5,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, @@ -502,803 +502,827 @@ static const uint16_t propsTrie_index[21452]={ 6,6,6,6,6,6,6,0,0,0,0,0x19,5,5,5,5, 5,5,4,6,6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109, 0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0, -5,0,0,5,5,0,5,0,0,5,0,0,0,0,0,0, -5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,5, -0,5,0,5,0,0,5,5,0,5,5,5,5,6,5,5, -6,6,6,6,6,6,0,6,6,5,0,0,5,5,5,5, -5,0,4,0,6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b, -0x17,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b, -0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, -0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,8, -6,6,6,6,6,0x17,6,6,5,5,5,5,5,6,6,6, -6,6,6,6,6,6,6,6,0,6,6,6,6,6,6,6, +5,0,5,5,5,5,5,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,5,0,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,6,6,5,0,0,5,5,5,5,5,0,4,0, +6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b, +6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6, +0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,8,6,6,6,6, +6,0x17,6,6,5,5,5,5,5,6,6,6,6,6,6,6, +6,6,6,6,0,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17, -0x17,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,8,8,6,6,6,6,8,6,6, -6,6,6,6,8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, -5,5,8,8,6,6,5,5,5,5,6,6,6,5,8,8, -8,5,5,8,8,8,8,8,8,8,5,5,5,6,6,6, -6,5,5,5,5,5,5,5,5,5,5,5,5,5,6,8, -8,6,6,8,8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,8,8,8,6,0x1b,0x1b,2,2,2,2, +6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b, +0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,8,8,6,6,6,6,8,6,6,6,6,6,6, +8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8, +6,6,5,5,5,5,6,6,6,5,8,8,8,5,5,8, +8,8,8,8,8,8,5,5,5,6,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,8,8,6,6,8, +8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,8,8,8,6,0x1b,0x1b,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,0x17,4,2,2,2,1,1,1,1, -1,1,0,1,0,0,0,0,0,1,0,0,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5, -5,5,5,0,5,0,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,0,0,5,5,5,5,5,5,5,0,5,0,5,5, -5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b, -0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,0,0,0x13,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0xc,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x14,0x15,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca, -0xa0a,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,6,6,0x17,0x17,0,0,0,0,0,0,0,0,0, +2,2,2,0x17,4,2,2,2,1,1,1,1,1,1,0,1, +0,0,0,0,0,1,0,0,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,0, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,6,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, +2,2,2,2,2,2,0,0,0x13,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x1b,0x17,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0xc,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x14,0x15,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6, +6,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,0x17,0x17,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,0,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,6,8,6,6,6,6,6,6,6,8,8, -8,8,8,8,8,8,6,8,8,6,6,6,6,6,6,6, -6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,6,5,0,0,0,0,0, +6,6,8,6,6,6,6,6,6,6,8,8,8,8,8,8, +8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,6,5,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,4, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,5,5,5,5,5,6,6,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,5,5,5,5,5,6,6,5, +5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, +6,6,6,8,8,8,8,6,6,8,8,8,0,0,0,0, +8,8,6,8,8,8,8,8,8,6,6,6,0,0,0,0, +0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0, -0,0,0,0,6,6,6,8,8,8,8,6,6,8,8,8, -0,0,0,0,8,8,6,8,8,8,8,8,8,6,6,6, -0,0,0,0,0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,5,5,5,5,5,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,7,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,8,6,8,6,6,6,6,6,6,6,0,6,8,6,8, -8,6,6,6,6,6,6,6,6,8,8,8,8,8,8,6, -6,6,6,6,6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6, -8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,8,6,6, -6,6,6,8,6,8,8,8,8,8,6,8,8,5,5,5, -5,5,5,5,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8, -6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,6,6,8,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,8,6,6,8,8, -8,6,8,6,6,6,8,8,0,0,0,0,0,0,0,0, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, -5,5,5,5,8,8,8,8,8,8,8,8,6,6,6,6, -6,6,6,6,8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,4,4,4,4,4,4,0x17,0x17, -2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,4, +0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,7,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,6,8, +6,6,6,6,6,6,6,0,6,8,6,8,8,6,6,6, +6,6,6,6,6,8,8,8,8,8,8,6,6,6,6,6, +6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6,8,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8, +6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,6,6,8,6, +6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,5,5,5,6,6,8,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,8,6,6,8,8,8,6,8,6, +6,6,8,8,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,5,5,5, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, +8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,4,4,4,4,4,4,0x17,0x17,2,2,2,2, +2,2,2,2,2,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, -6,6,6,0x17,6,6,6,6,6,6,6,6,6,6,6,6, -6,8,6,6,6,6,6,6,6,5,5,5,5,6,5,5, -5,5,8,8,6,5,5,8,6,6,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4, +1,1,1,1,1,1,1,0,0,1,1,1,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,6,6,6,0x17, +6,6,6,6,6,6,6,6,6,6,6,6,6,8,6,6, +6,6,6,6,6,5,5,5,5,6,5,5,5,5,5,5, +6,5,5,8,6,6,5,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2, -2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2, +4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2, +2,2,2,2,2,2,2,2,4,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,2,2,4,4,4,4,4, +2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,0,6,6,6,6,6, +6,6,6,6,6,6,0,6,6,6,6,6,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,2,2,2,2,2,2,2,2,1,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a, -0,0,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,0,0,1,1,1,1,1,1,0,0, -2,2,2,2,2,2,2,2,0,1,0,1,0,1,0,1, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, -2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, -2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3, -2,2,2,2,2,0,2,2,1,1,1,1,3,0x1a,2,0x1a, -0x1a,0x1a,2,2,2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a, -2,2,2,2,0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a, -0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc, -0x10,0x10,0x10,0x10,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10, -0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16, -0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, -0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,0,1,0,1,0,1,0,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,0,2,2,1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2, +0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17, +0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17, +0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10, +0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x2cb,4,0,0, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13, +0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,0,0,0,0x19,0x19,0x19,0x19, 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7, -7,6,7,7,7,6,6,6,6,6,6,6,6,6,6,6, -6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2, -1,1,1,1,2,5,5,5,5,2,0x1b,0x1b,2,2,1,1, -0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b, -0x358b,0x360b,0x364b,0x348b,0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b, -0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2, -1,1,1,2,0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b, -0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a, -0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a, -0x784a,0x984a,0x788a,1,2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0, -0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18, -0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18, -0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,7,7,7,7,6,7,7, +7,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,1,1,1,1, +2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,0x18,0x18,0x18,0x18, +0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b, +0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b, +0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,1,1,1,2, +0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1, +2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b, -0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, -0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, +0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b, +0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14, -0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18, +0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,2,2,2,2, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 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,0,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1, -1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2, -2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2, -2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2, -0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2, -2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,6,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, -0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17, -0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17, -0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17, -0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13, -0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a, -0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b, -0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,0x1b,4,5,0x54a, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15, -0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5,5,5,5,5, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +1,2,1,1,1,2,2,1,2,1,2,1,2,1,1,1, +1,2,1,2,2,1,2,2,2,2,2,2,4,4,1,1, +1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6, +6,6,1,2,0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17, +2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0,0,0,0,0,0,0,4,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,6,6,0x1a,0x1a,4,4,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0x17,4,4,4,5,0,0,0,0,0,5,5,5, +0,0,0,0,0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17, +0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13, +0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15, +0x14,0x15,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4, +4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17, +0x1b,4,5,0x54a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0x1b,0x1b,0x58b,0x5cb, -0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5, +5,5,5,0,0,6,6,0x1a,0x1a,4,4,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b, -0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b, -0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b, -0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,0x100b,0x104b,0x108b,0x10cb, -0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x17,4,4,4,5,0,0,0,0, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,5, +0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b, +0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb, +0x100b,0x104b,0x108b,0x10cb,0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, -0x685,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,5,5,5,5, +5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0x7845,5,5,5,5,5,5,5,5,0x605,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5, +5,5,5,5,0x685,5,0x645,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x7985,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x7a85,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5, +0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,0xa45,0xcc5,5,5, -5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,0x605,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5, -5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845, +0xa45,0xcc5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,0x605,0x605, +0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0x585,5,5,5,5,5,5,5,0x585,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x785,0xa45,5,5,5,5,5,5,5,5,5,5,5,5, -0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x745,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x705,5,5,5,5,5, +5,5,5,5,5,5,0x785,0xa45,5,5,5,5,5,5,5,5, +5,5,5,5,0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x745,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,0x645,5, +5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x7885,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5, -5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5, +5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x7885,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x6c5,5,5,5,5,5,0x1e45,5,5,5, +5,5,0x5c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5, +0x1e45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x545,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5, -5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,4,0x17,0x17,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,2,1,2,1,2,1,2, +5,5,5,5,5,5,0x545,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,4,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,4,4,6,6,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,5,6,7,7,7,0x17,6,6,6,6, -6,6,6,6,6,6,0x17,4,5,5,5,5,5,5,0x58a,0x5ca, -0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, -4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,4,2,2,2, -2,2,2,2,2,1,2,1,2,1,1,2,1,2,1,2, -1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,1,2,1,2, -2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1, -1,1,1,2,1,1,1,1,1,2,1,2,1,2,0,0, -0,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,8,8,6,6,8,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,8,8,8,8,6,6,0,0,0,0,0,0, -0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,8,8,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,8,8,8,8,8,8,8,8,8, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,0x17,5,5,6, -5,5,5,5,5,5,6,6,6,6,6,6,6,6,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,6,6,6,6,6,6,6,6,6,8,8, -0,0,0,0,0,0,0,0,0,0,0,0x17,8,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, -8,8,6,6,6,6,8,8,6,8,8,8,5,5,5,5, -5,6,4,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,5,5,5,5, -5,5,5,5,5,6,6,6,6,6,6,8,8,6,6,8, -8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,6, -5,5,5,5,5,5,5,5,6,8,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, -5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,5,6,6, -6,5,5,6,6,5,5,5,5,5,6,6,5,6,5,0, +1,2,1,2,1,2,1,2,4,4,6,6,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,5,6,7,7,7,0x17, +6,6,6,6,6,6,6,6,6,6,0x17,4,5,5,5,5, +5,5,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,4,4,2,5,5,5,5,5,0x1a,0x1a,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,2,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +4,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2, +1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5, +1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,2, +1,2,1,2,1,2,1,2,0,0,1,2,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,5,5,4,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,8,6,6,8,8,0x17,0x17,5,4, -4,8,6,0,0,0,0,0,0,0,0,0,0,5,5,5, -5,5,5,0,0,5,5,5,5,5,5,0,0,5,5,5, -5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2, +0,0,0,0,0,0,0,0,5,5,6,5,5,5,6,5, +5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,8, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b, +0x19,0x1b,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, +0,0,0,0,0,0,0,0,8,8,8,8,6,6,0,0, +0,0,0,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,8,8,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,8,8,8,8,8,8,8,8, +8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,5,5,5,5,5,5,0x17,0x17,0x17,5, +0x17,5,5,6,5,5,5,5,5,5,6,6,6,6,6,6, +6,6,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6, +6,6,8,8,0,0,0,0,0,0,0,0,0,0,0,0x17, +8,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,6,8,8,6,6,6,6,8,8,6,6,8,8, +5,5,5,5,5,6,4,5,5,5,5,5,5,5,5,5, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,8, +8,6,6,8,8,6,6,0,0,0,0,0,0,0,0,0, +5,5,5,6,5,5,5,5,5,5,5,5,6,8,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +4,5,5,5,5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,5,6,6,6,5,5,6,6,5,5,5,5,5,6,6, +5,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,5,4,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,8,6,6,8,8, +0x17,0x17,5,4,4,8,6,0,0,0,0,0,0,0,0,0, +0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,0, +0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2, -2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,8, -8,6,8,8,6,8,8,0x17,8,6,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +2,2,2,2,2,2,2,2,2,2,2,0x1a,4,4,4,4, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +5,5,5,8,8,6,8,8,6,8,8,0x17,8,6,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +5,5,5,5,5,5,5,0,0,0,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,5,5,5,5, -5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5, -5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,0x7c5, -5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x18,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0, -0,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x15,0x14,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0, -0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13, -0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0x10,0,0,5,5,5,5,5,5,0,0,5,5, -5,5,5,5,0,0,5,5,5,5,5,5,0,0,5,5, -5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18, -0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10, -0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, -0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0x18,0x18,0x18,0x17,0x1a,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,0x14, -0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5, -5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5,5, +5,5,5,0x7c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b, -0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b, -0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b, -0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a, -0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a, -0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a, -0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0, -0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,0,5,5,5, +5,0x18,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,0,5,0,5,5,0,5,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0, +5,5,5,5,5,5,5,5,2,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2, +0,0,0,0,0,5,6,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,0x15,0x14,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +0x19,0x1b,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16, +0x17,0x17,0x17,0,0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17, +0x17,0x17,0x18,0x13,0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0, +5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, -0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,0,0,0x10,0,0,5,5,5,5,5,5, +0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5, +0,0,5,5,5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0, +0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0, +0,0x10,0x10,0x10,0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17, +0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x1a,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,0x14,0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5, +5,5,5,5,5,5,5,5,4,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,0,0,0,0,0x17,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,4,4,5,5,5,5, +5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5, -5,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b, -0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b, -0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,0, -0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb, -0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b, -0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b, -0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, -0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b, -0x344b,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,5,6,6,6,0,6,6,0, -0,0,0,0,6,6,6,6,5,5,5,5,0,5,5,5, +5,5,5,0,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b, +0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b, +0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca, +0x11ca,0x11ca,0x1e4a,0x880a,0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b, +0x3ccb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb, +0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a, +0x980a,0x784a,0x984a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca, +0x5ca,0x5ca,0x5ca,0x68a,0x1b,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b, +0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b, +0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0, 0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,6,6,6,0, -0,0,0,6,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0x17,5,5,5,5,0,0,0,0,5,5,5,5, +5,5,5,5,0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0, +0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5, +5,5,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0,0,0,0,2,2,2,2, +2,2,2,2,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0x17, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +5,5,5,5,5,5,0,5,5,0,0,0,5,0,0,5, +5,5,5,5,5,5,0,0,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0, +0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,0,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b, -5,5,5,5,6,6,6,6,0,0,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb, -0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0, +5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b, +0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb, +0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,6,6,6,6,6,6,6,6,6,6,0x58b,0x7cb,0xa4b, -0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0x144b,0x16cb,0x194b,0x1bcb, -0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,8,6,8,5, +5,5,5,5,0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b, +0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b, +0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb, +0x7cb,0xa4b,0x1e4b,0x784b,0x344b,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,5,6,6,6, +0,6,6,0,0,0,0,0,6,6,6,6,5,5,5,5, +0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +6,6,6,0,0,0,0,6,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, -6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b, -0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, -6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0,0, -0,0,0,0,0,0,0,0,0,0x10,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +5,5,5,5,5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0, +0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +0x1b,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0,0,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b, +0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b, +0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,0,0,0,0,0,0x17,0x17,0x17, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b, +0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,0,0,0,0,0,0,0,0x58b,0x68b, +0x7cb,0x11cb,0x1e4b,0x784b,5,5,5,5,6,6,6,6,0,0,0,0, 0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,5,5,5,5,6,6,6,6,6, -8,6,6,6,6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,8,8,0,0,0,0,0, +0,0,0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b, +0x34cb,0x348b,0x388b,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0xccb,0x1e4b,0x344b,5,0,0,0,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,6,6,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,0x17,0x17,5,0,0,0,0,0, -0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,0x17,6,6,6, -6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17, -5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,6, -6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b, -0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,0x58b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, +0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, +8,6,8,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, +0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17, +0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0x10,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6, +6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,8,8,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,6,6,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,6,0x17,0x17,5,0, +0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17, +0x17,6,6,6,6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, +6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6, +0x17,0x17,0x17,0x17,0x17,0x17,6,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,0x17,0,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17, -0x17,0x17,6,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, -5,5,5,5,5,5,5,5,5,0x17,0,0,0,0,0,0, +5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6, +6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0, +0,0,0,0,6,6,8,8,0,5,5,5,5,5,5,5, +5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5, +0,5,5,5,5,5,0,6,6,5,8,8,6,8,8,8, +8,0,0,8,8,0,0,8,8,8,0,0,5,0,0,0, +0,0,0,8,0,0,0,0,0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0, -6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, -6,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, -5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5, -5,5,0,6,6,5,8,8,6,8,8,8,8,0,0,8, -8,0,0,8,8,8,0,0,5,0,0,0,0,0,0,8, -0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8, -6,6,6,6,6,6,6,6,8,8,6,6,6,8,6,5, -5,5,5,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0x17,0,0x17,6,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6, -6,8,6,8,8,8,8,6,6,8,6,6,5,5,0x17,5, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,8,8,8,6,6,6,6,0,0, -8,8,8,8,6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +5,8,8,8,6,6,6,6,6,6,6,6,8,8,6,6, +6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17,0,0x17,6,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,6,6,8,6,8,8,8,8,6,6,8,6,6, +5,5,0x17,5,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, +6,6,0,0,8,8,8,8,6,6,8,6,6,0x17,0x17,0x17, 0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -5,5,5,5,6,6,0,0,5,5,5,5,5,5,5,5, +0x17,0x17,0x17,0x17,5,5,5,5,6,6,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,6,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17, +5,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,6,8,6,8,8,6,6,6,6, +6,6,8,6,5,0,0,0,0,0,0,0,8,8,6,6, +6,6,8,6,6,6,6,6,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b,5,5,5,5, 5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6, -6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,5,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,6,8,6,8,8,6,6,6,6,6,6,8,6, -0,0,0,0,0,0,0,0,8,8,6,6,6,6,8,6, -6,6,6,6,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,6, -8,6,6,0x17,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0, -0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6, -6,8,5,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,6, -0,0,0,0,0,0,0,0,5,6,6,6,6,6,6,8, -8,6,6,6,5,5,5,5,5,6,6,6,6,6,6,6, -6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x17,0x17,0x17,0,0,0,0,0, +6,6,6,6,8,6,6,0x17,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0, +0,0,0,0,0,0,0,0,0,0,0,5,6,5,0x17,5, +8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,8,8, +6,6,6,6,0,0,6,6,8,8,8,8,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +6,6,6,6,6,8,5,6,6,6,6,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,6,0,0,0,0,0,0,0,0,5,6,6,6, +6,6,6,8,8,6,6,6,5,5,5,5,5,6,6,6, +6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,0,0,5,5, -5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,8, -6,6,0x17,0x17,0x17,5,0x17,0x17,5,0x17,0x17,0x17,0x17,0x17,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, -0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,6,6,8,6,6,0x17,0x17,0x17,5,0x17,0x17,5,0x17,0x17,0x17, +0x17,0x17,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb, +0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,8,6,6,6,6,6,6,6,0,6,6,6,6, -6,6,8,6,6,6,6,6,6,6,6,6,0,8,6,6, -6,6,6,6,6,8,6,6,8,6,6,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,5,6,0,0,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,5,5,5,5,5,0,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,6,6,6,6,6,0,0,0,6,0,6,6,0,6, -5,5,5,5,5,5,5,5,5,5,8,8,8,8,8,0, -6,6,0,8,8,6,8,6,5,0,0,0,0,0,0,0, -5,5,5,5,5,5,0,5,5,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,8,8,0x17,0x17,0,0,0,0,0,0,0, -0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a, -0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca, -0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a, -0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a, -0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a, -0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,8,6,6,6,6,6,6,6,0, +6,6,6,6,6,6,8,6,6,6,6,6,6,6,6,6, +0,8,6,6,6,6,6,6,6,8,6,6,8,6,6,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,5,6,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,5,5,5,5,5,0,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,6,6,6,6,6,6,0,0,0,6,0, +6,6,0,6,5,5,5,5,5,5,5,5,5,5,8,8, +8,8,8,0,6,6,0,8,8,6,8,6,5,0,0,0, +0,0,0,0,5,5,5,5,5,5,0,5,5,0,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,6,8,8,0x17,0x17,0,0,0, +0,0,0,0,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x17,0xcd0b,0xcc0b,0xcb0b,0xd00b,0xca0b,0xcf0b,0xcb4b,0xd04b,0xc90b,0x37cb,0x37cb,0x364b, +0x35cb,0xc94b,0x3fcb,0x350b,0x34cb,0x344b,0x344b,0x3ccb,0xcd0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x19,0x19,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca, +0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca, +0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a, +0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a, +0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a, +0x64a,0x64a,0x64a,0x64a,0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x58a,0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a, +0x454a,0x348a,0x388a,0x35ca,5,5,5,5,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0x17,0x17,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,6,6,6,6,6,0x17,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17, -0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,5,5,5,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17, -0x17,0x17,0x17,0,0,0,0,0,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,6,6,6,6,6,0x17,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17, +0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0,0,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb, +0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,5,5,5,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0x58b,0x5cb,0x60b,0x17,0x17,0x17,0x17,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,6,5,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0, +8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,6, +6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,0x17,4,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,0,0,0x1b,6,6,0x17, -0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6, +6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10, +0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b,0x1b,6,6,6, +6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b, -0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6, -6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,6,6, -6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b, -0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b, -0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x58b,0x68b,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1, +0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,6,6,6,0x1b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0,0,0,0, +0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, +0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x58b,0x5cb,0x60b,0x64b,0x68b,0x58b, +0x68b,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,2,2,2,2,2,2,2,0,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,2,2,2,2,2,2,2,2,2,2, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,0,1,1, +0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1, +1,1,1,1,1,1,2,2,2,2,0,2,0,2,2,2, +2,2,2,2,0,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, +2,2,2,2,1,1,0,1,1,1,1,0,0,1,1,1, +1,1,1,1,1,0,1,1,1,1,1,1,1,0,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1, -1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2, -0,2,2,2,2,2,2,2,0,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,2,2,2,2,1,1,0,1,1,1,1,0, -0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +2,2,2,2,2,2,2,2,1,1,0,1,1,1,1,0, +1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1, 1,0,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,0,1, -1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1, -1,1,1,1,1,0,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,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,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,2,2,2,2,2,2,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x18,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,0x18, -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,0x18, +2,2,2,2,2,2,0,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x18,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,0x18,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,0x18,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,0x18,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18, -2,2,2,2,2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0,0,6,6,6,6,6, -6,6,0,6,6,0,6,6,6,6,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, -6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, -2,2,2,2,6,6,6,6,6,6,6,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,0x18,2,2,2,2,2,2,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,2,2,2,0x18,2,2,2,2, +2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b, +0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6, +6,6,6,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,0,0,6,6,6,6,6,6,6,0,6, +6,0,6,6,6,6,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,5,0x1b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,6, +6,6,6,4,4,4,4,4,4,4,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,6,6,6,6,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0x19,5,5,5,5, +5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6, +6,6,6,0,0,0,0,0,0,0,0,0,2,2,2,2, +6,6,6,6,6,6,6,4,0,0,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, -0x78cb,0x794b,0x814b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb, -0x19,0x58b,0x5cb,0x788b,0x78cb,0,0,0,0,0,0,0,0,0,0,0, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b, -0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0, -0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5, -0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5, -0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x78cb,0x794b,0x814b,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x1b,0x34cb,0x344b,0x3ccb,0x19,0x58b,0x5cb,0x788b, +0x78cb,0,0,0,0,0,0,0,0,0,0,0,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b, +0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x984b,0xa04b,0xa84b,0xb04b, +0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x1b,0x5cb,0x60b,0x64b,0x68b,0x6cb, +0x70b,0x74b,0x78b,0x7cb,0x900b,0xa00b,0x804b,0x788b,0x344b,0x354b,0,0,0,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,0, +5,0,0,5,0,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,0,5,0,5,0,0,0,0,0,0,5,0, +0,0,0,5,0,5,0,5,0,5,5,5,0,5,5,0, +5,0,0,5,0,5,0,5,0,5,0,5,0,5,5,0, +5,0,0,5,5,5,5,0,5,5,5,5,5,5,5,0, +5,5,5,5,0,5,5,5,5,0,5,0,5,5,5,5, +5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5, +0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b, -0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0, @@ -1311,50 +1335,58 @@ static const uint16_t propsTrie_index[21452]={ 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a, 0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, -0,0,0,0,5,0x705,5,5,5,5,5,5,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0, +0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,5,0x705,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x645,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x685,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0xcc5,5,5,5,5,5,5,5,5,0xf45,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0xf45,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,5,5, +5,5,5,5,5,5,5,5,5,5,5,0xcc5,5,5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,0x6c5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x605,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x605,5,5,5,5,5,5, +5,0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x605,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x605,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0x605,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,5,5,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,0,0,0,0, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 }; static const UTrie2 propsTrie={ @@ -1362,1911 +1394,1947 @@ static const UTrie2 propsTrie={ propsTrie_index+4468, NULL, 4468, - 16984, + 17500, 0xa40, 0x11f4, 0x0, 0x0, 0x110000, - 0x53c8, + 0x55cc, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[30012]={ -0x4d5,0x4dd,0x4e5,0x4ed,0x505,0x50d,0x515,0x51d,0x525,0x52d,0x535,0x53d,0x545,0x54d,0x555,0x55d, -0x564,0x56c,0x574,0x57c,0x57f,0x587,0x58f,0x597,0x59f,0x5a7,0x5af,0x5b7,0x5bf,0x5c7,0x5cf,0x5d7, -0x5df,0x5e7,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e,0x626,0x62b,0x633,0x63a,0x642,0x64a,0x652, -0x65a,0x662,0x66a,0x672,0x679,0x681,0x689,0x691,0x699,0x6a1,0x6a9,0x6b1,0x6b9,0x6c1,0x6c9,0x6d1, -0x19a7,0xd68,0xe47,0x6d9,0x4f5,0xeae,0xeb6,0x1b46,0x1276,0x128e,0x127e,0x1286,0x7ae,0x7b4,0x7bc,0x7c4, -0x7cc,0x7d2,0x7da,0x7e2,0x7ea,0x7f0,0x7f8,0x800,0x808,0x80e,0x816,0x81e,0x826,0x82e,0x836,0x83d, -0x845,0x84b,0x853,0x85b,0x863,0x869,0x871,0x879,0x881,0x1296,0x889,0x891,0x899,0x8a0,0x8a8,0x8b0, -0x8b8,0x8bc,0x8c4,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x15a6,0x15ae,0x8f3,0x8fb,0x903,0x90b,0x913,0x91a, -0x160c,0x15fc,0x1604,0x18e2,0x18ea,0x12a6,0x922,0x129e,0x14f0,0x14f0,0x14f2,0x12ba,0x12bb,0x12ae,0x12b0,0x12b2, -0x1614,0x1616,0x92a,0x1616,0x932,0x937,0x93f,0x161b,0x945,0x1616,0x94b,0x953,0xc3d,0x1623,0x1623,0x95b, -0x1633,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634, -0x1634,0x1634,0x1634,0x162b,0x963,0x163c,0x163c,0x96b,0xb52,0xb5a,0xb62,0xb6a,0x164c,0x1644,0x973,0x97b, -0x983,0x1656,0x165e,0x98b,0x1654,0x993,0x19af,0xd70,0xb72,0xb7a,0xb82,0xb87,0x1850,0xc70,0xc77,0x17b8, -0xc0d,0x19b7,0xd78,0xd80,0xd88,0xd90,0xf66,0xf66,0x18a8,0x18ad,0xcab,0xcb3,0x191e,0x1926,0x1a68,0xe4f, -0x192e,0xcfc,0xd04,0x1936,0x112a,0x11ca,0xf46,0xd98,0x17d8,0x17c0,0x17d0,0x17c8,0x1868,0x1860,0x1828,0xc1d, -0x12c3,0x12c3,0x12c3,0x12c3,0x12c6,0x12c3,0x12c3,0x12ce,0x99b,0x12d6,0x99f,0x9a7,0x12d6,0x9af,0x9b7,0x9bf, -0x12e6,0x12de,0x12ee,0x9c7,0x9cf,0x12f6,0x9d7,0x9df,0x12fe,0x1306,0x130e,0x1316,0x9e7,0x131e,0x1325,0x132d, -0x1335,0x133d,0x1345,0x134d,0x1355,0x135c,0x1364,0x136c,0x1374,0x137c,0x137f,0x1381,0x1666,0x174b,0x1751,0x1898, -0x1389,0x9ef,0x9f7,0x14a3,0x14a8,0x14ab,0x14b3,0x1391,0x14bb,0x14bb,0x13a1,0x1399,0x13a9,0x13b1,0x13b9,0x13c1, -0x13c9,0x13d1,0x13d9,0x13e1,0x1759,0x17b0,0x18f2,0x1a48,0x13f1,0x13f8,0x1400,0x1408,0x13e9,0x1410,0x1761,0x1768, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x1770,0x1773,0x1770,0x1770,0x177b,0x1782,0x1784,0x178b, -0x1793,0x1797,0x1797,0x179a,0x1797,0x1797,0x17a0,0x1797,0x17e0,0x18a0,0x18fa,0xb8f,0xb95,0x1b7a,0xb9b,0xba0, -0x1840,0xc4d,0xc51,0x18b5,0x1830,0x1830,0x1830,0xc25,0x1838,0xc45,0x1880,0xc9b,0xc2d,0xc35,0xc35,0x193e, -0x1870,0x1902,0xc87,0xc8b,0x9ff,0x1676,0x1676,0xa07,0x167e,0x167e,0x167e,0x167e,0x167e,0x167e,0xa0f,0x6dd, -0x14d8,0x14fa,0xa17,0x1502,0xa1f,0x150a,0x1512,0x151a,0xa27,0xa2c,0x1522,0x1529,0xa31,0xa39,0x1890,0xc15, -0xa41,0x1580,0x1587,0x1531,0x158f,0x1596,0x1539,0xa49,0x1552,0x1552,0x1554,0x1541,0x1549,0x1549,0x154a,0x159e, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x122b,0x17e8,0x17e8, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c, -0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x155c,0x1563,0x199f,0x1233, -0x168e,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694, -0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694,0x1694, -0x1694,0x1694,0x1694,0x1694,0xa51,0x169c,0xa59,0x19bf,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, -0x1946,0xd0c,0x195a,0x1952,0x195c,0x19c7,0x19c7,0xda0,0x1848,0x18bd,0x1912,0x1916,0x190a,0xcbb,0xcc2,0xcc5, -0x1878,0xc93,0x18c5,0xccd,0x1964,0x1967,0xd14,0x19cf,0x1977,0x196f,0xd1c,0xda8,0x19d7,0x19db,0xdb0,0x100d, -0x197f,0xd24,0xd2c,0x19e3,0x19f3,0x19eb,0xdb8,0xf09,0xe57,0xe5f,0x1bc1,0xfc5,0x1c66,0x1c66,0x19fb,0xdc0, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef, -0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1, -0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3, -0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee, -0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0, -0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2, -0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4, -0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0x15f4,0x15ee,0x15ef,0x15f0,0x15f1,0x15f2,0x15f3,0xa61,0xdc8,0xdcb, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3, -0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x14c3,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b, -0x1570,0x1578,0x17a8,0x123b,0x1888,0x1888,0x123f,0x1246,0xa69,0xa71,0xa79,0x1430,0x1437,0x143f,0xa81,0x1447, -0x1478,0x1478,0x1420,0x1428,0x144f,0x146f,0x1470,0x1480,0x1457,0x1418,0xa89,0x145f,0xa91,0x1467,0xa99,0xa9d, -0xca3,0x1488,0xaa5,0xaad,0x1490,0x1496,0x149b,0xab5,0xac5,0x14e0,0x14e8,0x14cb,0x14d0,0xacd,0xad5,0xabd, -0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6, -0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15b6,0x15be,0x15be,0x15be,0x15be, -0x13d4,0x13d4,0x1414,0x1454,0x1494,0x14d4,0x1514,0x1554,0x1590,0x15d0,0x15fc,0x163c,0x167c,0x16bc,0x16fc,0x173c, -0x177c,0x17b8,0x17f8,0x1838,0x1878,0x18ac,0x18e8,0x1928,0x1968,0x19a8,0x19e4,0x1a24,0x1a64,0x1aa4,0x1ae4,0x1b24, -0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xbc0,0xa40,0xea8,0xa40,0xa40,0xa40,0xa40,0xc00,0x12d3,0x12d3, -0xee8,0xf28,0xa40,0xa40,0xa40,0xa40,0xc40,0xc60,0xa40,0xa40,0xca0,0xce0,0xd20,0xd60,0xe68,0xdd8, -0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213,0x1213, -0x1213,0x1213,0x1213,0x1213,0xf68,0x1253,0x1088,0x10c8,0x1293,0x10d3,0x1313,0x1313,0x1313,0xfa8,0xfc8,0x1008, -0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8, -0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0xfc8,0x1048, +static const uint16_t propsVectorsTrie_index[30588]={ +0x4d6,0x4de,0x4e6,0x4ee,0x506,0x50e,0x516,0x51e,0x526,0x52e,0x536,0x53e,0x546,0x54e,0x556,0x55e, +0x565,0x56d,0x575,0x57d,0x580,0x588,0x590,0x598,0x5a0,0x5a8,0x5b0,0x5b8,0x5c0,0x5c8,0x5d0,0x5d8, +0x5e0,0x5e8,0x5ef,0x5f7,0x5ff,0x607,0x60f,0x617,0x61f,0x627,0x62c,0x634,0x63b,0x643,0x64b,0x653, +0x65b,0x663,0x66b,0x673,0x67a,0x682,0x68a,0x692,0x69a,0x6a2,0x6aa,0x6b2,0x6ba,0x6c2,0x6ca,0x6d2, +0x19e4,0xd43,0xe2a,0x6da,0x4f6,0xe91,0xe99,0x1b8e,0x12b7,0x12c7,0x12af,0x12bf,0x7a3,0x7a9,0x7b1,0x7b9, +0x7c1,0x7c7,0x7cf,0x7d7,0x7df,0x7e5,0x7ed,0x7f5,0x7fd,0x803,0x80b,0x813,0x81b,0x823,0x82b,0x832, +0x83a,0x840,0x848,0x850,0x858,0x85e,0x866,0x86e,0x876,0x12cf,0x87e,0x886,0x88e,0x895,0x89d,0x8a5, +0x8ad,0x8b1,0x8b9,0x8c0,0x8c8,0x8d0,0x8d8,0x8e0,0x15e3,0x15eb,0x8e8,0x8f0,0x8f8,0x900,0x908,0x90f, +0x1649,0x1639,0x1641,0x191f,0x1927,0x12df,0x917,0x12d7,0x1529,0x1529,0x152b,0x12f3,0x12f4,0x12e7,0x12e9,0x12eb, +0x1651,0x1653,0x91f,0x1653,0x927,0x92c,0x934,0x1658,0x93a,0x1653,0x940,0x948,0xc1f,0x1660,0x1660,0x950, +0x1670,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1668,0x958,0x1679,0x1679,0x960,0xb3f,0xb47,0xb4f,0xb57,0x1689,0x1681,0x968,0x970, +0x978,0x1693,0x169b,0x980,0x1691,0x988,0x19ec,0xd4b,0xb5f,0xb67,0xb6f,0xb74,0x188d,0xc52,0xc59,0x17f5, +0xbef,0x19f4,0xd53,0xd5b,0xd63,0xd6b,0xf44,0xf44,0x18e5,0x18ea,0xc8d,0xc95,0x195b,0x1963,0x1aad,0xe32, +0x196b,0xcd7,0xcdf,0x1973,0x1101,0x11a9,0xf24,0xd73,0x1815,0x17fd,0x180d,0x1805,0x18a5,0x189d,0x1865,0xbff, +0x12fc,0x12fc,0x12fc,0x12fc,0x12ff,0x12fc,0x12fc,0x1307,0x990,0x130f,0x994,0x99c,0x130f,0x9a4,0x9ac,0x9b4, +0x131f,0x1317,0x1327,0x9bc,0x9c4,0x132f,0x9cc,0x9d4,0x1337,0x133f,0x1347,0x134f,0x9dc,0x1357,0x135e,0x1366, +0x136e,0x1376,0x137e,0x1386,0x138e,0x1395,0x139d,0x13a5,0x13ad,0x13b5,0x13b8,0x13ba,0x16a3,0x1788,0x178e,0x18d5, +0x13c2,0x9e4,0x9ec,0x14dc,0x14e1,0x14e4,0x14ec,0x13ca,0x14f4,0x14f4,0x13da,0x13d2,0x13e2,0x13ea,0x13f2,0x13fa, +0x1402,0x140a,0x1412,0x141a,0x1796,0x17ed,0x192f,0x1a85,0x142a,0x1431,0x1439,0x1441,0x1422,0x1449,0x179e,0x17a5, +0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x16ab,0x17ad,0x17b0,0x17ad,0x17ad,0x17b8,0x17bf,0x17c1,0x17c8, +0x17d0,0x17d4,0x17d4,0x17d7,0x17d4,0x17d4,0x17dd,0x17d4,0x181d,0x18dd,0x1937,0xb7c,0xb82,0x1bca,0x1bd2,0x1ca9, +0x187d,0xc2f,0xc33,0x18f2,0x186d,0x186d,0x186d,0xc07,0x1875,0xc27,0x18bd,0xc7d,0xc0f,0xc17,0xc17,0x197b, +0x18ad,0x193f,0xc69,0xc6d,0x9f4,0x16b3,0x16b3,0x9fc,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0x16bb,0xa04,0x6de, +0x1511,0x1533,0xa0c,0x153b,0xa14,0x1543,0x154b,0x1553,0xa1c,0xa21,0x155b,0x1562,0xa26,0xa2e,0x18cd,0xbf7, +0xa36,0x15bd,0x15c4,0x156a,0x15cc,0x15d3,0x1572,0x1576,0x158f,0x158f,0x1591,0x157e,0x1586,0x1586,0x1587,0x15db, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3, +0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x16c3,0x1264,0x1825,0x1825, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x15a0,0x19dc,0x126c, +0x16cb,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0xa3e,0x16d9,0xa46,0x19fc,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987,0x1987, +0x1983,0xce7,0x1997,0x198f,0x1999,0x1a04,0x1a04,0xd7b,0x1885,0x18fa,0x194f,0x1953,0x1947,0x1aa5,0xc9d,0xca0, +0x18b5,0xc75,0x1902,0xca8,0x19a1,0x19a4,0xcef,0x1a0c,0x19b4,0x19ac,0xcf7,0xd83,0x1a14,0x1a18,0xd8b,0xfec, +0x19bc,0xcff,0xd07,0x1a20,0x1a30,0x1a28,0xd93,0xeec,0xe3a,0xe42,0x1c19,0xfa4,0x1cc6,0x1cc6,0x1a38,0xd9b, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c, +0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e, +0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630, +0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b, +0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d, +0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f, +0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631, +0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0x1631,0x162b,0x162c,0x162d,0x162e,0x162f,0x1630,0xa4e,0xda3,0xda6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603, +0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603,0x1603, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc, +0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x14fc,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15ad,0x15b5,0x17e5,0x1274,0x18c5,0x18c5,0x1278,0x127f,0xa56,0xa5e,0xa66,0x1469,0x1470,0x1478,0xa6e,0x1480, +0x14b1,0x14b1,0x1459,0x1461,0x1488,0x14a8,0x14a9,0x14b9,0x1490,0x1451,0xa76,0x1498,0xa7e,0x14a0,0xa86,0xa8a, +0xc85,0x14c1,0xa92,0xa9a,0x14c9,0x14cf,0x14d4,0xaa2,0xab2,0x1519,0x1521,0x1504,0x1509,0xaba,0xac2,0xaaa, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15fb,0x15fb,0x15fb,0x15fb, +0x13d8,0x13d8,0x1418,0x1458,0x1498,0x14d8,0x1518,0x1558,0x1594,0x15d4,0x1600,0x1640,0x1680,0x16c0,0x1700,0x1740, +0x1780,0x17bc,0x17fc,0x183c,0x187c,0x18b0,0x18ec,0x192c,0x196c,0x19ac,0x19e8,0x1a28,0x1a68,0x1aa8,0x1ae8,0x1b28, +0xa80,0xac0,0xb00,0xb40,0xb80,0xa40,0xe48,0xa40,0xe6a,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12d5,0x12d5, +0xeaa,0xeea,0xa40,0xa40,0xa40,0xa40,0xf2a,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xd00,0xe08,0xd78, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0xf6a,0x1255,0x108a,0x10ca,0x1295,0x10d5,0x1315,0x1315,0x1315,0xfaa,0xfca,0x100a, +0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca, +0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0xfca,0x104a, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, -0xe18,0xe28,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd98, -0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193, -0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1193,0x1113, -0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, -0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x1153, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0xba8,0xbaf,0xbb7,0xbbf,0x17f0,0x17f0,0x17f0,0xbc7,0xbcf,0xbd2,0x1820,0x1818,0xc05,0xd34,0xd38,0xd3c, -0x4f5,0x4f5,0x4f5,0x4f5,0xd44,0x1987,0xd4c,0xf5e,0x16a4,0xadd,0xae3,0x101d,0xbda,0x1858,0xc7f,0x4f5, -0x16b9,0x16ac,0x16b1,0x17f8,0xbe2,0xbea,0x1168,0x116e,0x1ba9,0xf7b,0x1b99,0x6e5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0x1bc9,0xfcd,0xfd5,0xfdd,0x4f5,0x4f5,0x4f5,0x4f5, -0xbf2,0xbf5,0xdd3,0x1c11,0x1015,0x6ed,0x4f5,0x10ae,0xcd5,0xd54,0x4f5,0x4f5,0x1b56,0xf11,0xf19,0x1c51, -0xc59,0xc60,0xc68,0x1a03,0x1bf1,0x4f5,0x1bd1,0xfed,0x1a0b,0xddb,0xde3,0xdeb,0x103d,0x6f5,0x4f5,0x4f5, -0x1a13,0x1a13,0x6fd,0x4f5,0x1c7e,0x10c6,0x1c76,0x10ce,0x1d26,0x11e0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0xdf3,0x4f5,0x4f5,0x4f5,0x4f5,0x1d46,0x1208,0x120f,0x705,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a70,0x1a72,0xe67,0xe6e,0x1a1b,0x1a23,0xdfb,0xf3e,0x1b4e,0xef9,0xf01,0xfe5,0x1b66,0x1b6a,0xf36,0x105d, -0xfb0,0xfb5,0x70d,0x4f5,0x10b6,0x10be,0x1bb9,0xfbd,0xf92,0xf98,0xfa0,0xfa8,0x4f5,0x4f5,0x4f5,0x4f5, -0x1cc6,0x1cbe,0x1158,0x1160,0x1c39,0x1c31,0x1084,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c21,0x1045,0x104d,0x1055, -0x1be9,0x1be1,0xffd,0x1150,0x1b72,0xf4e,0x715,0x4f5,0x1094,0x109c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1d1e,0x11c2,0x71d,0x4f5,0x4f5,0x1c49,0x1c41,0x108c,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1cf6,0x1cee,0x11b2,0x1ce6,0x11aa,0x725,0x1c19,0x1035,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x110e,0x1113,0x111b,0x1122,0x1142,0x1148,0x4f5,0x4f5,0x118e,0x1192,0x119a,0x11d2,0x11d8,0x72d,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x11f0,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd, -0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18cd,0x18d2,0xcdd,0xce4,0xce4,0xce4, -0x18da,0x18da,0x18da,0xcec,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x1c6e,0x735,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b, -0x1a2b,0x1a2b,0x1a2d,0x1a2b,0x1a35,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a2b,0x1a38,0x1a2b,0x1a2b,0x1a2b,0x1a2b, -0x1a2b,0x73d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a,0x1a7a, -0x1a7a,0xe76,0x1005,0x745,0x4f5,0x4f5,0x749,0xf56,0x1c09,0x1c01,0x1025,0x102d,0x751,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x1d3e,0x1d36,0x1200,0x4f5,0x4f5,0x4f5,0x1b5e,0x1b5e,0xf21,0xf26,0xf2e,0x4f5,0x4f5,0x113a, -0x1a8a,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1186,0x759,0x4f5,0x75d,0x1d16,0x1d16,0x1d16,0x1d16, -0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x1d16,0x11a2,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1ba1,0x1ba1,0x1ba1,0xf6e,0xf73,0x765,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0x16c1,0xaeb,0x16d1,0xaf3,0x16d2,0x16c9,0x16da,0x16e0,0x16e8,0xafb, -0x1810,0x1810,0x76d,0x4f5,0x4f5,0x4f5,0x4f5,0x11f8,0x1800,0x1800,0xbfd,0xcf4,0x4f5,0x4f5,0x4f5,0x4f5, -0x1719,0x1720,0xb03,0x1723,0xb0b,0xb13,0xb1b,0x171d,0xb23,0xb2b,0xb33,0x1722,0x172a,0x1719,0x1720,0x171c, -0x1723,0x172b,0x171a,0x1721,0x171d,0xb3a,0x16f0,0x16f8,0x16ff,0x1706,0x16f3,0x16fb,0x1702,0x1709,0xb42,0x1711, -0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96,0x1c96, -0x1c86,0x1c89,0x1c86,0x1c90,0x10fe,0x775,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1132,0x77d,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0x1bd9,0xff5,0x4f5,0x1cb6,0x1cae,0x1106,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x781,0x1d2e,0x11e8,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0xebe,0xec6,0xece,0xed6,0xede,0xee6,0xeed,0xef1,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x789,0x1065,0x1c29,0x106b,0x1c29,0x1073,0x1078,0x107c,0x107c, -0x10d6,0x10de,0x1cce,0x10e6,0x1ca6,0x10ee,0x10f6,0x1d06,0x11ba,0x11ba,0x11ba,0x791,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, -0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x796,0xb4a,0x1733,0x1733,0x1733,0x79e,0x79e,0x79e,0x79e, -0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x1808,0x7a6,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e, -0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x198f,0xd5c,0x1997,0x1997,0xd60,0xe7e,0xe86,0xe8e, -0xe03,0x1a40,0x1a58,0xe0b,0x1a50,0xe13,0xe17,0xe1e,0xe26,0xe2d,0xe35,0xe3d,0xe3f,0xe3f,0xe3f,0xe3f, -0x1ab1,0x1ab9,0x1ab1,0x1abf,0x1ac7,0x1a92,0x1acf,0x1ad7,0x1ab1,0x1adf,0x1ae7,0x1aee,0x1af6,0x1a9a,0x1ab1,0x1af8, -0x1aa2,0x1aa9,0x1b00,0x1b06,0x1b8a,0x1b91,0x1b82,0x1b0e,0x1b16,0x1b1e,0x1b26,0x1bf9,0x1b2e,0x1b36,0xe96,0xe9e, -0x1a82,0x1a82,0x1a82,0xea6,0x1bb1,0x1bb1,0xf83,0xf8a,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59, -0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c59,0x1c5e,0x1c59,0x1c59,0x1c59,0x10a4,0x10a6,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1176,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde, -0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x1cde,0x117e, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x124e,0x1217, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x121f,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1256,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217, -0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1217,0x1223,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x125e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1b3e,0x1266,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x126e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15ce,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15d6,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6,0x15e6, -0x15e6,0x15e6,0x15e6,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b,0x173b, -0x173b,0x173b,0x173b,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60,0x1a60, -0x1a60,0x1a60,0x1a60,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e,0x1c9e, -0x1c9e,0x1c9e,0x1c9e,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6,0x1cd6, -0x1cd6,0x1cd6,0x1cd6,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e,0x1d0e, -0x1d0e,0x1d0e,0x1d0e,0x4d4,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a3,0x2ac,0x2a6, -0x2a6,0x2a9,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, -0x2a0,0x2a0,0x2a0,0x2a0,0x7d4,0x7ce,0x7b3,0x7aa,0x7a1,0x79e,0x795,0x7b0,0x79b,0x7a7,0x7aa,0x7c5, -0x7bc,0x7ad,0x7d1,0x7a4,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x7b9,0x7b6, -0x7bf,0x7bf,0x7bf,0x7ce,0x795,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7da,0x7da,0x7da,0x7da,0x7da, -0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x79b, -0x7a1,0x7a7,0x7cb,0x78f,0x7c8,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7, -0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x7d7,0x79b, -0x7c2,0x798,0x7bf,0x2a0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, +0xdb8,0xdc8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd38, +0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195, +0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1195,0x1115, +0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5, +0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x11d5,0x1155, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0xb8a,0xb91,0xb99,0xba1,0x182d,0x182d,0x182d,0xba9,0xbb1,0xbb4,0x185d,0x1855,0xbe7,0xd0f,0xd13,0xd17, +0x4f6,0x4f6,0x4f6,0x4f6,0xd1f,0x19c4,0xd27,0xf3c,0x16e1,0xaca,0xad0,0xffc,0xbbc,0x1895,0xc61,0x4f6, +0x16f6,0x16e9,0x16ee,0x1835,0xbc4,0xbcc,0x113f,0x1145,0x1c01,0xf59,0x1bf1,0x6e6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0x1c21,0xfac,0xfb4,0xfbc,0x4f6,0x4f6,0x4f6,0x4f6, +0xbd4,0xbd7,0xdae,0x1c69,0xff4,0x6ee,0x4f6,0x108d,0xcb0,0xd2f,0x4f6,0x4f6,0x1b9e,0xef4,0xefc,0x1cb1, +0xc3b,0xc42,0xc4a,0x1a40,0x1c49,0x4f6,0x1c29,0xfcc,0x1a48,0xdb6,0xdbe,0xdc6,0x101c,0x6f6,0x4f6,0x4f6, +0x1a50,0x1a50,0x6fe,0x4f6,0x1cde,0x10a5,0x1cd6,0x10ad,0x1d96,0x11bf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0xdce,0x4f6,0x4f6,0x4f6,0x4f6,0x1db6,0x11e7,0x11ee,0x706,0x4f6,0x4f6,0x4f6,0x11f6, +0x1ab5,0x1ab7,0xe4a,0xe51,0x1a58,0x1a60,0xdd6,0xf1c,0x1b96,0xedc,0xee4,0xfc4,0x1bb6,0x1bba,0xf14,0x103c, +0xf8f,0xf94,0x70e,0x4f6,0x1095,0x109d,0x1c11,0xf9c,0xf71,0xf77,0xf7f,0xf87,0x4f6,0x4f6,0x4f6,0x4f6, +0x1d26,0x1d1e,0x112f,0x1137,0x1c91,0x1c89,0x1063,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1c79,0x1024,0x102c,0x1034, +0x1c41,0x1c39,0xfdc,0x1127,0x1bc2,0xf2c,0x716,0x4f6,0x1073,0x107b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1d8e,0x11a1,0x71e,0x4f6,0x4f6,0x1ca1,0x1c99,0x106b,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11fe,0x1202,0x120a, +0x1d66,0x1d5e,0x1189,0x1d56,0x1d4e,0x726,0x1c71,0x1014,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x10e5,0x10ea,0x10f2,0x10f9,0x1119,0x111f,0x4f6,0x4f6,0x116d,0x1171,0x1179,0x11b1,0x11b7,0x72e,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x11cf,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dce,0x1240, +0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a, +0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190a,0x190f,0xcb8,0xcbf,0xcbf,0xcbf, +0x1917,0x1917,0x1917,0xcc7,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x1cce,0x736,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf,0x1abf, +0x1abf,0xe59,0xfe4,0x73e,0x4f6,0x4f6,0x742,0xf34,0x1c61,0x1c59,0x1004,0x100c,0x74a,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x1dae,0x1da6,0x11df,0x4f6,0x4f6,0x4f6,0x1bae,0x1bae,0xf04,0x1ba6,0xf0c,0x4f6,0x4f6,0x1111, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1bf9,0x1bf9,0x1bf9,0xf4c,0xf51,0x752,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0xad8,0x170e,0xae0,0x170f,0x1706,0x1717,0x171d,0x1725,0xae8, +0x184d,0x184d,0x75a,0x4f6,0x4f6,0x4f6,0x4f6,0x11d7,0x183d,0x183d,0xbdf,0xccf,0x4f6,0x4f6,0x4f6,0x4f6, +0x1756,0x175d,0xaf0,0x1760,0xaf8,0xb00,0xb08,0x175a,0xb10,0xb18,0xb20,0x175f,0x1767,0x1756,0x175d,0x1759, +0x1760,0x1768,0x1757,0x175e,0x175a,0xb27,0x172d,0x1735,0x173c,0x1743,0x1730,0x1738,0x173f,0x1746,0xb2f,0x174e, +0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6,0x1cf6, +0x1ce6,0x1ce9,0x1ce6,0x1cf0,0x10d5,0x762,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1109,0x76a,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dc6,0x1212,0x772,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1dd6,0x1248,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0x1c31,0xfd4,0x4f6,0x1d16,0x1d0e,0x10dd,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x776,0x1d9e,0x11c7,0x4f6,0x4f6,0x121a,0x121b,0x77e,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec9,0xed0,0xed4,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x782,0x1044,0x1c81,0x104a,0x1c81,0x1052,0x1057,0x105b,0x105b, +0x10b5,0x1d2e,0x1d36,0x10bd,0x1d06,0x10c5,0x10cd,0x1d76,0x1dbe,0x1dbe,0x1191,0x1199,0x1232,0x1238,0x1238,0x1238, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a, +0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78a,0x78b,0xb37,0x1770,0x1770,0x1770,0x793,0x793,0x793,0x793, +0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x79b,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793, +0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x793,0x19cc,0xd37,0x19d4,0x19d4,0xd3b,0xe61,0xe69,0xe71, +0xde6,0x1a7d,0x1a95,0xdee,0x1a8d,0xdf6,0xdfa,0xe01,0xe09,0xe10,0xe18,0xe20,0xe22,0xe22,0xe22,0xe22, +0x1af6,0x1afe,0x1af6,0x1b04,0x1b0c,0x1ad7,0x1b14,0x1b1c,0x1af6,0x1b24,0x1b2c,0x1b33,0x1b3b,0x1adf,0x1af6,0x1b40, +0x1ae7,0x1aee,0x1b48,0x1b4e,0x1be2,0x1be9,0x1bda,0x1b56,0x1b5e,0x1b66,0x1b6e,0x1c51,0x1b76,0x1b7e,0xe79,0xe81, +0x1ac7,0x1ac7,0x1ac7,0xe89,0x1c09,0x1c09,0xf61,0xf69,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68, +0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0x1a6a,0x1a68,0x1a72,0x1a68,0x1a68,0x1a68, +0x1a68,0x1a68,0x1a68,0x1a75,0x1a68,0x1a68,0x1a68,0x1a68,0x1a68,0xdde,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9, +0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cb9,0x1cbe,0x1cb9,0x1cb9,0x1cb9,0x1083,0x1085,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x114d,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46,0x1d46, +0x1d46,0x1155,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1acf,0x1d6e,0x1d6e,0x1d6e,0x1d6e,0x1d6e, +0x1d6e,0x1d6e,0x115d,0x1165,0x1223,0x122a,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86,0x1d86, +0x1d86,0x1181,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6, +0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x4f6,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1287,0x1250,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1258,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780, +0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x1780,0x128f,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250, +0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x1250,0x125c,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1297,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x1b86,0x129f,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x12a7,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x160b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1613,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b,0x161b, +0x161b,0x161b,0x161b,0x161b,0x161b,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778,0x1778, +0x1778,0x1778,0x1778,0x1778,0x1778,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d, +0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1a9d,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe, +0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1cfe,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e, +0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d3e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e, +0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x1d7e,0x4d5,0x4d5,0x4d5,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2be,0x2c7,0x2c1,0x2c1,0x2c4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x7ef,0x7e9,0x7ce,0x7c5,0x7bc,0x7b9,0x7b0,0x7cb, +0x7b6,0x7c2,0x7c5,0x7e0,0x7d7,0x7c8,0x7ec,0x7bf,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad, +0x7ad,0x7ad,0x7d4,0x7d1,0x7da,0x7da,0x7da,0x7e9,0x7b0,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7f5, +0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5, +0x7f5,0x7f5,0x7f5,0x7b6,0x7bc,0x7c2,0x7e6,0x7aa,0x7e3,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f2, +0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, +0x7f2,0x7f2,0x7f2,0x7b6,0x7dd,0x7b3,0x7da,0x2bb,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x2af,0x2af,0x2af,0x2af,0x2af,0x2be,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0x2b2,0x62a,0x7e9,0x7ec,0x630,0x7ec,0x7e6,0x627,0x61e,0x2b8,0x63c,0x2bb, -0x7ef,0x615,0x633,0x7e3,0x62d,0x639,0x61b,0x61b,0x621,0x2b5,0x627,0x624,0x61e,0x61b,0x63c,0x2bb, -0x618,0x618,0x618,0x62a,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x636,0x645,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x645,0x63f,0x642,0x642,0x2c1,0x2c1,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x642,0x2c1, -0x642,0x642,0x2c1,0x2c1,0x63f,0x2c1,0x642,0x642,0x2c1,0x2c1,0x2c1,0x636,0x63f,0x642,0x642,0x2c1, -0x642,0x2c1,0x63f,0x2c1,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7, -0x2d0,0x2c7,0x2d0,0x2c7,0x2cd,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x648,0x654,0x64e,0x2d0,0x2c7,0x2d0,0x2c7,0x648,0x2d0,0x2c7,0x2d0, -0x2c7,0x2d0,0x2c7,0x654,0x64e,0x651,0x648,0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x64b,0x657,0x651,0x648, -0x2d0,0x64b,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x651,0x648,0x2d0,0x2c7,0x2d0,0x64b, -0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2c7,0x2d0,0x2d0,0x2c7,0x2d0, -0x2c7,0x2d0,0x2c7,0x2ca,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df, -0x2d3,0x2d3,0x2df,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2df,0x2df,0x2d3,0x2d3,0x2d3, -0x2df,0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2d3, -0x2df,0x2d3,0x2df,0x2e2,0x2d6,0x2df,0x2df,0x2df,0x2d3,0x2df,0x2d3,0x2df,0x2df,0x2d3,0x2d3,0x2dc, -0x2df,0x2d3,0x2d3,0x2d3,0x2dc,0x2dc,0x2dc,0x2dc,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5,0x2d9,0x2e5,0x2e5, -0x2d9,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2,0x65a,0x2e2, -0x65a,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2df,0x2d3,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2d6,0x2e5,0x2e5,0x2d9,0x2e2,0x2d6,0x9c3,0x9c3,0x9c6,0x9c0,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6, -0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x2e2,0x2d6,0x9c6,0x9c0,0x9c6,0x9c0,0x9c3,0x9bd,0x9c6,0x9c0, -0xb88,0xc90,0x9c3,0x9bd,0x9c3,0x9bd,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0,0x9c6,0x9c0, -0x9c6,0x9c0,0x9c6,0x9c0,0xc90,0xc90,0xc90,0xd8f,0xd8f,0xd8f,0xd92,0xd92,0xd8f,0xd92,0xd92,0xd8f, -0xd8f,0xd92,0xed3,0xed6,0xed6,0xed6,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3,0xed6,0xed3, -0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x65d,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2eb,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0xc93,0xc93,0x303,0x303,0x303,0x303, -0x303,0x303,0x303,0x303,0x303,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2fa,0x2f7,0x2f7,0x2f4,0x2f4, -0x663,0x2f4,0x2fa,0x666,0x2fd,0x666,0x666,0x666,0x2fd,0x666,0x2fa,0x2fa,0x669,0x300,0x2f4,0x2f4, -0x2f4,0x2f4,0x2f4,0x2f4,0x660,0x660,0x660,0x660,0x2f1,0x660,0x2f4,0xb01,0x303,0x303,0x303,0x303, -0x303,0x2ee,0x2ee,0x2ee,0x2ee,0x2ee,0x9d2,0x9d2,0x9cf,0x9cc,0x9cf,0xc96,0xc96,0xc96,0xc96,0xc96, -0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66c,0x66f,0x66f,0x927,0x66f, -0x66f,0x92a,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xc45,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xe9a,0xe9a,0xe9a,0xe9a,0xe9d,0xd5f,0xd5f,0xd5f,0x672,0x672,0xb07,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xf81,0xf7e,0xf81,0xf7e, -0x30f,0x318,0xf81,0xf7e,9,9,0x31e,0xed9,0xed9,0xed9,0x306,0x14d6,9,9,9,9, -0x31b,0x309,0x32d,0x30c,0x32d,0x32d,0x32d,9,0x32d,9,0x32d,0x32d,0x324,0x678,0x678,0x678, -0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,0x678,9,0x678, -0x678,0x678,0x678,0x678,0x678,0x678,0x32d,0x32d,0x324,0x324,0x324,0x324,0x324,0x675,0x675,0x675, -0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x321,0x675, -0x675,0x675,0x675,0x675,0x675,0x675,0x324,0x324,0x324,0x324,0x324,0xf81,0x330,0x330,0x333,0x32d, -0x32d,0x330,0x327,0x9d5,0xb91,0xb8e,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x32a,0x9d5,0x315,0x312, -0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x315,0x312,0x330,0x330,0x327,0x321, -0xb40,0xb3d,0xb8b,0xc9c,0xc99,0xc9f,0xc9c,0xc99,0xd95,0xd98,0xd98,0xd98,0x9e4,0x684,0x33f,0x342, -0x33f,0x33f,0x33f,0x342,0x33f,0x33f,0x33f,0x33f,0x342,0x9e4,0x342,0x33f,0x681,0x681,0x681,0x681, -0x681,0x681,0x681,0x681,0x681,0x684,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681, -0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x681,0x67b,0x67b,0x67b,0x67b, -0x67b,0x67b,0x67b,0x67b,0x67b,0x67e,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b, -0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x67b,0x9de,0x67e,0x339,0x33c,0x339,0x339,0x339,0x33c, -0x339,0x339,0x339,0x339,0x33c,0x9de,0x33c,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x342,0x33c, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x336,0x933,0x936,0x918,0x918,0x112b, -0x9d8,0x9d8,0xb97,0xb94,0x9e1,0x9db,0x9e1,0x9db,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339, -0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x339,0x33f,0x342,0x33c,0x33f,0x339,0xb97,0xb94,0x33f, -0x339,0xb97,0xb94,0x33f,0x339,0xb97,0xb94,0xedc,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c, -0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x33f,0x339,0x342,0x33c,0x342,0x33c,0x342,0x33c, -0x33f,0x339,0x342,0x33c,0x9e4,0x9de,0x342,0x33c,0x342,0x33c,0x342,0x33c,0x342,0x33c,0xd9e,0xd9b, -0x342,0x33c,0xedf,0xedc,0xedf,0xedc,0xedf,0xedc,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03, -0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xc06,0xc03,0xf0c,0xf09,0xf0c,0xf09,0xfff,0xffc,0xfff,0xffc, -0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0xfff,0xffc,0x1164,0x1161,0x134a,0x1347, -0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0x150f,0x150c,0xc,0x354,0x354,0x354,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0xc,0xc,0x357,0x345,0x348,0x348,0x34b,0x348,0x345,0x1917,0x34e,0x34e,0x34e, -0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e, -0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x351, -0x1917,0x89d,0x9e7,0xc,0xc,0x14d9,0x14d9,0x13f5,0xf,0x957,0x957,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0xda1,0x957,0x957,0x957,0x957,0x957, -0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x957,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35a,0xee2,0x35a,0x35a,0x35a,0x366,0x35a,0x35d,0x35a,0x35a,0x369,0x95a,0xda4,0xda7,0xda4, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c, -0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c, -0x36c,0x36c,0x36c,0xf,0xf,0xf,0xf,0x191a,0x36c,0x36c,0x36c,0x363,0x360,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcb4,0xcb4,0xcb4,0xcb4,0x13f8,0x14dc,0xf8a,0xf8a, -0xf8a,0xf87,0xf87,0xdad,0x8a3,0xcae,0xcab,0xcab,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xf84,0xf84, -0xf84,0xf84,0xf84,0x8a0,0x14d3,0x12,0xdb0,0x8a6,0x1311,0x387,0x38a,0x38a,0x38a,0x38a,0x38a,0x387, -0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x8a9,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0xb37,0xb37,0xb37,0xca2,0xca8, -0xca5,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0xdaa,0x130e,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x381,0x37e,0x37b,0x378,0xb9a,0xb9a,0x91b,0x387,0x387,0x393,0x387,0x38d,0x38d,0x38d, -0x38d,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0,0,0,0,0,0,0,0,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2d9,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2cd,0x645,0x804,0x807,0x64b,0x807,0x801,0x642, +0x639,0x2d3,0x657,0x2d6,0x80a,0x630,0x64e,0x7fe,0x648,0x654,0x636,0x636,0x63c,0x2d0,0x642,0x63f, +0x639,0x636,0x657,0x2d6,0x633,0x633,0x633,0x645,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df, +0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x651, +0x660,0x2df,0x2df,0x2df,0x2df,0x2df,0x660,0x65a,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x2dc,0x65a,0x2dc, +0x65d,0x65d,0x65d,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x65a,0x2dc,0x65d,0x65d,0x2dc,0x2dc,0x2dc,0x651, +0x65a,0x65d,0x65d,0x2dc,0x65d,0x2dc,0x65a,0x2dc,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e8,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x663,0x66f,0x669,0x2eb,0x2e2,0x2eb,0x2e2, +0x663,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66f,0x669,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb, +0x666,0x672,0x66c,0x663,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x66c,0x663, +0x2eb,0x2e2,0x2eb,0x666,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2, +0x2eb,0x2eb,0x2e2,0x2eb,0x2e2,0x2eb,0x2e2,0x2e5,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa, +0x2ee,0x2fa,0x2fa,0x2fa,0x2ee,0x2ee,0x2fa,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fa, +0x2fa,0x2ee,0x2ee,0x2ee,0x2fa,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa,0x2fa, +0x2ee,0x2fa,0x2ee,0x2ee,0x2fa,0x2ee,0x2fa,0x2fd,0x2f1,0x2fa,0x2fa,0x2fa,0x2ee,0x2fa,0x2ee,0x2fa, +0x2fa,0x2ee,0x2ee,0x2f7,0x2fa,0x2ee,0x2ee,0x2ee,0x2f7,0x2f7,0x2f7,0x2f7,0x300,0x300,0x2f4,0x300, +0x300,0x2f4,0x300,0x300,0x2f4,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd,0x675,0x2fd, +0x675,0x2fd,0x675,0x2fd,0x675,0x2ee,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fa,0x2ee,0x2fd,0x2f1, +0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2f1,0x300,0x300,0x2f4,0x2fd,0x2f1,0x9e1,0x9e1, +0x9e4,0x9de,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1, +0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x2fd,0x2f1,0x9e4,0x9de,0x9e4,0x9de, +0x9e1,0x9db,0x9e4,0x9de,0xba6,0xcae,0x9e1,0x9db,0x9e1,0x9db,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de, +0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0x9e4,0x9de,0xcae,0xcae,0xcae,0xdad,0xdad,0xdad,0xdb0,0xdb0, +0xdad,0xdb0,0xdb0,0xdad,0xdad,0xdb0,0xeee,0xef1,0xef1,0xef1,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee, +0xef1,0xeee,0xef1,0xeee,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x678,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x306,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303, +0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x303,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0xcb1,0xcb1, +0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x315,0x315,0x315,0x315,0x315,0x315,0x315, +0x312,0x312,0x30f,0x30f,0x67e,0x30f,0x315,0x681,0x318,0x681,0x681,0x681,0x318,0x681,0x315,0x315, +0x684,0x31b,0x30f,0x30f,0x30f,0x30f,0x30f,0x30f,0x67b,0x67b,0x67b,0x67b,0x30c,0x67b,0x30f,0xb1c, +0x31e,0x31e,0x31e,0x31e,0x31e,0x309,0x309,0x309,0x309,0x309,0x9f0,0x9f0,0x9ed,0x9ea,0x9ed,0xcb4, +0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687,0x687, +0x68a,0x68a,0x942,0x68a,0x68a,0x945,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xc63, +0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xeb5,0xeb5,0xeb5,0xeb5,0xeb8,0xd7d,0xd7d,0xd7d, +0x68d,0x68d,0xb22,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xf9c,0xf99,0xf9c,0xf99,0x32a,0x333,0xf9c,0xf99,9,9,0x339,0xef4,0xef4,0xef4,0x321,0x14f1, +9,9,9,9,0x336,0x324,0x348,0x327,0x348,0x348,0x348,9,0x348,9,0x348,0x348, +0x33f,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693, +0x693,0x693,9,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x348,0x348,0x33f,0x33f,0x33f,0x33f, +0x33f,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690, +0x690,0x690,0x33c,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x33f,0x33f,0x33f,0x33f,0x33f,0xf9c, +0x34b,0x34b,0x34e,0x348,0x348,0x34b,0x342,0x9f3,0xbaf,0xbac,0x345,0x9f3,0x345,0x9f3,0x345,0x9f3, +0x345,0x9f3,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d,0x330,0x32d, +0x34b,0x34b,0x342,0x33c,0xb5e,0xb5b,0xba9,0xcba,0xcb7,0xcbd,0xcba,0xcb7,0xdb3,0xdb6,0xdb6,0xdb6, +0xa02,0x69f,0x35a,0x35d,0x35a,0x35a,0x35a,0x35d,0x35a,0x35a,0x35a,0x35a,0x35d,0xa02,0x35d,0x35a, +0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69f,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c, +0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c, +0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x699,0x696,0x696,0x696,0x696,0x696,0x696, +0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x9fc,0x699,0x354,0x357, +0x354,0x354,0x354,0x357,0x354,0x354,0x354,0x354,0x357,0x9fc,0x357,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x351,0x94e, +0x951,0x933,0x933,0x1143,0x9f6,0x9f6,0xbb5,0xbb2,0x9ff,0x9f9,0x9ff,0x9f9,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354, +0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x354,0x35a,0x35d,0x357,0x35a, +0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0x35a,0x354,0xbb5,0xbb2,0xef7,0x35d,0x357,0x35d,0x357, +0x35a,0x354,0x35d,0x357,0x35a,0x354,0x35d,0x357,0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357, +0x35d,0x357,0x35d,0x357,0x35a,0x354,0x35d,0x357,0xa02,0x9fc,0x35d,0x357,0x35d,0x357,0x35d,0x357, +0x35d,0x357,0xdbc,0xdb9,0x35d,0x357,0xefa,0xef7,0xefa,0xef7,0xefa,0xef7,0xc24,0xc21,0xc24,0xc21, +0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xc24,0xc21,0xf27,0xf24,0xf27,0xf24, +0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014,0x1017,0x1014, +0x117c,0x1179,0x1365,0x1362,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0x152a,0x1527,0xc,0x36f,0x36f,0x36f, +0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, +0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0xc,0xc,0x372,0x360,0x363,0x363,0x366,0x363,0x360, +0x1932,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369, +0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369, +0x369,0x369,0x369,0x36c,0x1932,0x8b8,0xa05,0xc,0xc,0x14f4,0x14f4,0x1410,0xf,0x975,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xdbf,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0xefd,0x375,0x375,0x375,0x381,0x375,0x378,0x375,0x375,0x384, +0x978,0xdc2,0xdc5,0xdc2,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x387,0x387,0x387,0x387, 0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x9ed,0x9ed,0x387,0x387, -0x387,0x387,0x387,0x9ed,0x38a,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x9ed,0x387,0x387,0x387,0x38a,0x93c,0x387,0x372,0x372,0x372,0x372,0x372,0x372, -0x372,0x36f,0x378,0x375,0x375,0x372,0x372,0x372,0x372,0x390,0x390,0x372,0x372,0x378,0x375,0x375, -0x375,0x372,0xcb1,0xcb1,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x9ed,0x9ed, -0x9ed,0x9ea,0x9ea,0xcb1,0xa02,0xa02,0xa02,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9f9, -0x9fc,0x9f9,0x15,0xa05,0x9ff,0x9f0,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff,0x9ff, -0x9ff,0xcb7,0xcb7,0xcb7,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6,0x9f6, -0x9f6,0x9f6,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x15, -0x15,0xcb7,0xcb7,0xcb7,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, -0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, -0xe10,0xe10,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, -0x1011,0x1011,0x1011,0x1011,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b, -0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa08,0xa08,0xb9d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf27,0xf27, -0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27, -0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf27,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf2a,0xf2a,0xf1e,0xf1e,0xf21,0xf30,0xf2d,0x10e, -0x10e,0x193e,0x1941,0x1941,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x25b, -0x25b,0x25b,0x25b,0x25b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb13,0xb13,0xb16,0xb16,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0x72,0x72,0x72,0x72,0x1593,0x1593,0x1593,0x1593,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1590,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x177,0x177,0x177, -0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, -0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7, -0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1bc,0x1bc, -0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, -0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x18c0,0x18c3,0x18c3,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1782,0x1782,0x1782,0x1782,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, -0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x180,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1ef,0x1ef, -0x1ef,0x1ef,0x163e,0x163e,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x158a,0x158a,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x16ec,0x16ec,0x16ec,0x16ec,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, -0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xe07,0xe07,0xe04,0xe04,0xe04,0xe07,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x181b,0x181b,0x237,0x181b,0x181b,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x237, -0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x270,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0,0,0,0,0,0,0,0,0,0,0,0, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0xf,0xf,0xf,0xf,0x1935,0x387,0x387,0x387,0x37e, +0x37b,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xcd2,0xcd2,0xcd2,0xcd2, +0x1413,0x14f7,0xfa5,0xfa5,0xfa5,0xfa2,0xfa2,0xdcb,0x8be,0xccc,0xcc9,0xcc9,0xcc0,0xcc0,0xcc0,0xcc0, +0xcc0,0xcc0,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x8bb,0x14ee,0x12,0xdce,0x8c1,0x132c,0x3a2,0x3a5,0x3a5, +0x3a5,0x3a5,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8,0x8c4,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0xb55, +0xb55,0xb55,0xcc0,0xcc6,0xcc3,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0x1329,0x954,0x954,0x954,0x954, +0x954,0x954,0x954,0x954,0x954,0x954,0x39c,0x399,0x396,0x393,0xbb8,0xbb8,0x936,0x3a2,0x3a2,0x3ae, +0x3a2,0x3a8,0x3a8,0x3a8,0x3a8,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0xa0b,0xa0b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a5,0x3a2,0x3a5,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0xa0b,0x3a2,0x3a2,0x3a2,0x3a5,0x957,0x3a2,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38a,0x393,0x390,0x390,0x38d,0x38d,0x38d,0x38d,0x3ab,0x3ab,0x38d, +0x38d,0x393,0x390,0x390,0x390,0x38d,0xccf,0xccf,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f,0x39f, +0x39f,0x39f,0xa0b,0xa0b,0xa0b,0xa08,0xa08,0xccf,0xa20,0xa20,0xa20,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a, +0xa1a,0xa1a,0xa1a,0xa17,0xa1a,0xa17,0x15,0xa23,0xa1d,0xa0e,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, +0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xcd5,0xcd5,0xcd5,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14, +0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa14,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11,0xa11, +0xa11,0xa11,0xa11,0x15,0x15,0xcd5,0xcd5,0xcd5,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029, +0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa26,0xa26, +0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xbbb,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f, +0xf3f,0xf3f,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf45,0xf45,0xf39,0xf39, +0xf3c,0xf4b,0xf48,0x10e,0x10e,0x1959,0x195c,0x195c,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x18ed,0x18ed,0x25b,0x25b,0x25b,0x25b,0x25b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb2e,0xb2e,0xb31,0xb31,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0x72,0x72,0x72,0x72,0x15ae,0x15ae,0x15ae,0x15ae,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x15ab,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1668, +0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x201,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x126f,0x177,0x177,0x177,0x177,0x177,0x177,0x177,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, +0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca, +0x14ca,0x14ca,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18db,0x18de,0x18de,0x258,0x258,0x258,0x258,0x258, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x179d,0x179d,0x179d,0x179d,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1ef,0x1ef,0x1ef,0x1ef,0x1659,0x1659,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1707,0x1707,0x1707,0x1707,0x204,0x204,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe25,0xe25,0xe22,0xe22,0xe22,0xe25,0xdb,0xdb, +0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x22b,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1836,0x1836,0x237,0x1836,0x1836,0x237,0x1836,0x1836, +0x1836,0x1836,0x1836,0x237,0x237,0x237,0x237,0x237,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e,0x1a5e, +0x1a5e,0x1a5e,0x28b,0x28b,0x28b,0x28b,0x1a61,0x1a5b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x270,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e, +0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x954,0x954,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x261,0x261,3,3,3,3,3,3,3,3,3,3,3,3, +0,0,0,0,0,0,0x972,0x972,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,0x954,0x954,6,6,6,6,6,6,6,6, +3,3,3,3,3,3,3,3,3,3,0x972,0x972,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0x14e2,0x3ab,0x3ba,0x3ba,0x1b,0x3c0,0x3c0,0x3c0, -0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0, -0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0, -0x3c0,0x1b,0x3c0,0x1b,0x1b,0x1b,0x3c0,0x3c0,0x3c0,0x3c0,0x1b,0x1b,0x3ae,0xcbd,0x3ab,0x3ba, -0x3ba,0x3ab,0x3ab,0x3ab,0x3ab,0x1b,0x1b,0x3ba,0x3ba,0x1b,0x1b,0x3bd,0x3bd,0x3b1,0xdb6,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3ab,0x1b,0x1b,0x1b,0x1b,0x3c3,0x3c3,0x1b,0x3c3, -0x3c0,0x3c0,0x3ab,0x3ab,0x1b,0x1b,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, -0x3c0,0x3c0,0x3b7,0x3b7,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b7,0x3b4,0x113a,0x187b,0x1878,0x191d,0x1b, -0x1e,0xcc0,0x3c6,0xcc3,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x1e,0x1e,0x1e,0x3d2, -0x3d2,0x1e,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2, -0x3d2,0x1e,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x1e,0x3d2,0x3d5,0x1e,0x3d2,0x3d5,0x1e, -0x3d2,0x3d2,0x1e,0x1e,0x3c9,0x1e,0x3cf,0x3cf,0x3cf,0x3c6,0x3c6,0x1e,0x1e,0x1e,0x1e,0x3c6, -0x3c6,0x1e,0x1e,0x3c6,0x3c6,0x3cc,0x1e,0x1e,0x1e,0xf96,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x3d5,0x3d5,0x3d5,0x3d2,0x1e,0x3d5,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x945,0x945, -0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x3c6,0x3c6,0x3d2,0x3d2,0x3d2,0xf96,0x1920,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e4,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0xccc,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4, -0x3e4,0x21,0x3e4,0x3e4,0x21,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x21,0x21,0x3db,0x3e4,0x3e1,0x3e1, -0x3e1,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x21,0x3d8,0x3d8,0x3e1,0x21,0x3e1,0x3e1,0x3de,0x21,0x21, -0x3e4,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x3e4,0xccc,0xcc6,0xcc6,0x21,0x21,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, -0x13fb,0xcc9,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x16fe,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881, -0x24,0x3e7,0x3f6,0x3f6,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x24,0x3fc, -0x3fc,0x24,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc, -0x3fc,0x24,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x24,0x3fc,0x3fc,0x24,0xccf,0x3fc,0x3fc, -0x3fc,0x3fc,0x24,0x24,0x3ea,0x3fc,0x3e7,0x3e7,0x3f6,0x3e7,0x3e7,0x3e7,0xf99,0x24,0x24,0x3f6, -0x3f9,0x24,0x24,0x3f9,0x3f9,0x3ed,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3e7,0x3e7, -0x24,0x24,0x24,0x24,0x3ff,0x3ff,0x24,0x3fc,0x3fc,0x3fc,0xf99,0xf99,0x24,0x24,0x3f3,0x3f3, -0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f0,0xccf,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x402,0x40e,0x27,0x40e,0x40e,0x40e, -0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x27,0x40e,0x40e,0x411,0x40e,0x27,0x27, -0x27,0x40e,0x40e,0x27,0x40e,0x27,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x27,0x27,0x27, -0x40e,0x40e,0x40e,0x27,0x27,0x27,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0xdb9,0x40e, -0x40e,0x40e,0x27,0x27,0x27,0x27,0x402,0x408,0x402,0x408,0x408,0x27,0x27,0x27,0x408,0x408, -0x408,0x27,0x40b,0x40b,0x40b,0x405,0x27,0x27,0xf9c,0x27,0x27,0x27,0x27,0x27,0x27,0x402, -0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xed0,0x94e,0x94e,0x94e,0x94e,0x94e, -0x94e,0x94e,0x94e,0x94e,0x94b,0x94b,0x94b,0xd89,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd5,0xcd2,0x27, -0x27,0x27,0x27,0x27,0x14e5,0x420,0x420,0x420,0x1923,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x423,0x2a,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x423,0x423,0x423,0x423,0x423,0x2a,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423,0x423, -0x14e8,0x423,0x423,0x423,0x423,0x423,0x2a,0x2a,0x2a,0xfa5,0x414,0x414,0x414,0x420,0x420,0x420, -0x420,0x2a,0x414,0x414,0x417,0x2a,0x414,0x414,0x414,0x41a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, -0x2a,0x414,0x414,0x2a,0xfa5,0xfa5,0x1701,0x2a,0x2a,0x2a,0x2a,0x2a,0x423,0x423,0xf9f,0xf9f, -0x2a,0x2a,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x41d,0x2a,0x2a,0x2a,0x2a, -0x2a,0x2a,0x2a,0x2a,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0x17be,0x14eb,0x42f,0x42f, -0x1926,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x2d,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x2d,0x435,0x435,0x435,0x435,0x435,0x2d,0x2d, -0xcd8,0xcdb,0x42f,0x426,0x432,0x42f,0x426,0x42f,0x42f,0x2d,0x426,0x432,0x432,0x2d,0x432,0x432, -0x426,0x429,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x426,0x426,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x2d,0x435,0x2d,0x435,0x435,0xee8,0xee8,0x2d,0x2d,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x2d,0xeeb,0xeeb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x2d,0x2d,0x2d,0x1884,0x14ee,0x441,0x441,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x30,0x447,0x447,0x447,0x30,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x441,0x438,0x438,0x438,0xfa8,0x30,0x441,0x441,0x441,0x30,0x444,0x444, -0x444,0x43b,0x1323,0x17c1,0x30,0x30,0x30,0x30,0x17c4,0x17c4,0x17c4,0x438,0x17c1,0x17c1,0x17c1,0x17c1, -0x17c1,0x17c1,0x17c1,0x1704,0x447,0x447,0xfa8,0xfa8,0x30,0x30,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x17c1,0x17c1,0x17c1,0xfae,0xfb1,0xfb1, -0xfb1,0xfb1,0xfb1,0xfb1,0x33,0x33,0xa17,0xa17,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0x33,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0xa1d,0x33,0x33, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0x33,0x33,0x33,0xa11,0x33,0x33,0x33,0x33,0xa0e, -0xa17,0xa17,0xa0e,0xa0e,0xa0e,0x33,0xa0e,0x33,0xa17,0xa17,0xa1a,0xa17,0xa1a,0xa1a,0xa1a,0xa0e, -0x33,0x33,0x33,0x33,0x33,0x33,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1, -0x33,0x33,0xa17,0xa17,0xa14,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, -0x462,0x44d,0x462,0x45f,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x453,0x36,0x36,0x36,0x36,0x44a, -0x468,0x468,0x468,0x468,0x468,0x462,0x465,0x450,0x450,0x450,0x450,0x450,0x450,0x44d,0x450,0x456, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x459,0x459,0x36,0x36,0x36,0x36, +6,6,6,6,6,6,6,6,6,6,6,6,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x14fd,0x3c9,0x3d8,0x3d8, +0x1b,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b,0x3de,0x3de,0x1b,0x1b,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x1b,0x3de,0x1b,0x1b,0x1b,0x3de,0x3de,0x3de,0x3de,0x1b,0x1b, +0x3cc,0xcdb,0x3c9,0x3d8,0x3d8,0x3c9,0x3c9,0x3c9,0x3c9,0x1b,0x1b,0x3d8,0x3d8,0x1b,0x1b,0x3db, +0x3db,0x3cf,0xdd4,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x3c9,0x1b,0x1b,0x1b,0x1b, +0x3e1,0x3e1,0x1b,0x3e1,0x3de,0x3de,0x3c9,0x3c9,0x1b,0x1b,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x3de,0x3de,0x3d5,0x3d5,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d5,0x3d2,0x1152, +0x1896,0x1893,0x1938,0x1b,0x1e,0xcde,0x3e4,0xce1,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e, +0x1e,0x1e,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0, +0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x1e,0x3f0,0x3f3, +0x1e,0x3f0,0x3f3,0x1e,0x3f0,0x3f0,0x1e,0x1e,0x3e7,0x1e,0x3ed,0x3ed,0x3ed,0x3e4,0x3e4,0x1e, +0x1e,0x1e,0x1e,0x3e4,0x3e4,0x1e,0x1e,0x3e4,0x3e4,0x3ea,0x1e,0x1e,0x1e,0xfb1,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x3f3,0x3f3,0x3f3,0x3f0,0x1e,0x3f3,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3f0,0x3f0, +0x3f0,0xfb1,0x193b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x3f6,0x3f6,0x3ff, +0x21,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0xcea,0x402,0x21,0x402,0x402,0x402,0x21,0x402, +0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402, +0x402,0x402,0x402,0x402,0x402,0x21,0x402,0x402,0x21,0x402,0x402,0x402,0x402,0x402,0x21,0x21, +0x3f9,0x402,0x3ff,0x3ff,0x3ff,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x21,0x3f6,0x3f6,0x3ff,0x21,0x3ff, +0x3ff,0x3fc,0x21,0x21,0x402,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x402,0xcea,0xce4,0xce4,0x21,0x21,0x963,0x963,0x963,0x963,0x963,0x963, +0x963,0x963,0x963,0x963,0x1416,0xce7,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1719,0x1899,0x1899, +0x1899,0x189c,0x189c,0x189c,0x24,0x405,0x414,0x414,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a, +0x41a,0x24,0x24,0x41a,0x41a,0x24,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a, +0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x24,0x41a,0x41a, +0x24,0xced,0x41a,0x41a,0x41a,0x41a,0x24,0x24,0x408,0x41a,0x405,0x405,0x414,0x405,0x405,0x405, +0xfb4,0x24,0x24,0x414,0x417,0x24,0x24,0x417,0x417,0x40b,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x405,0x405,0x24,0x24,0x24,0x24,0x41d,0x41d,0x24,0x41a,0x41a,0x41a,0xfb4,0xfb4, +0x24,0x24,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x40e,0xced,0x1338,0x1338, +0x1338,0x1338,0x1338,0x1338,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x27,0x420,0x42c, +0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x42c,0x42c, +0x42f,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x27,0x42c,0x27,0x42c,0x42c,0x27,0x27,0x27,0x42c, +0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, +0x42c,0x42c,0xdd7,0x42c,0x42c,0x42c,0x27,0x27,0x27,0x27,0x420,0x426,0x420,0x426,0x426,0x27, +0x27,0x27,0x426,0x426,0x426,0x27,0x429,0x429,0x429,0x423,0x27,0x27,0xfb7,0x27,0x27,0x27, +0x27,0x27,0x27,0x420,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xeeb,0x969, +0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x966,0x966,0x966,0xda7,0xcf0,0xcf0,0xcf0,0xcf0, +0xcf0,0xcf3,0xcf0,0x27,0x27,0x27,0x27,0x27,0x1500,0x43e,0x43e,0x43e,0x193e,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x2a,0x441,0x441,0x441,0x441,0x441,0x441, +0x441,0x441,0x441,0x441,0x1503,0x441,0x441,0x441,0x441,0x441,0x2a,0x2a,0x2a,0xfc0,0x432,0x432, +0x432,0x43e,0x43e,0x43e,0x43e,0x2a,0x432,0x432,0x435,0x2a,0x432,0x432,0x432,0x438,0x2a,0x2a, +0x2a,0x2a,0x2a,0x2a,0x2a,0x432,0x432,0x2a,0xfc0,0xfc0,0x171c,0x2a,0x2a,0x2a,0x2a,0x2a, +0x441,0x441,0xfba,0xfba,0x2a,0x2a,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b, +0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x1a0a,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd, +0x17d9,0x1506,0x44a,0x44a,0x1941,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450, +0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450, +0x450,0x2d,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x2d,0x450,0x450,0x450, +0x450,0x450,0x2d,0x2d,0xcf6,0xcf9,0x44a,0x444,0x44d,0x44a,0x444,0x44a,0x44a,0x2d,0x444,0x44d, +0x44d,0x2d,0x44d,0x44d,0x444,0x447,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x444,0x444,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x450,0x2d,0x450,0x450,0xf03,0xf03,0x2d,0x2d,0x96c,0x96c, +0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x2d,0xf06,0xf06,0x2d,0x2d,0x2d,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x189f,0x1509,0x45c,0x45c,0x30,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x30,0x462,0x462,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x45c,0x453,0x453,0x453,0xfc3,0x30,0x45c,0x45c, +0x45c,0x30,0x45f,0x45f,0x45f,0x456,0x133e,0x17dc,0x30,0x30,0x30,0x30,0x17df,0x17df,0x17df,0x453, +0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x171f,0x462,0x462,0xfc3,0xfc3,0x30,0x30,0x459,0x459, +0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0x17dc,0x17dc, +0x17dc,0xfc9,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x33,0x33,0xa35,0xa35,0x33,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33, +0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0x33,0xa3b,0x33,0x33,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x33,0x33,0x33,0xa2f,0x33, +0x33,0x33,0x33,0xa2c,0xa35,0xa35,0xa2c,0xa2c,0xa2c,0x33,0xa2c,0x33,0xa35,0xa35,0xa38,0xa35, +0xa38,0xa38,0xa38,0xa2c,0x33,0x33,0x33,0x33,0x33,0x33,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0x33,0x33,0xa35,0xa35,0xa32,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +0x33,0x33,0x33,0x33,0x36,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d,0x47d, +0x47d,0x47d,0x47d,0x47d,0x47d,0x468,0x47d,0x47a,0x468,0x468,0x468,0x468,0x468,0x468,0x46e,0x36, +0x36,0x36,0x36,0x465,0x483,0x483,0x483,0x483,0x483,0x47d,0x480,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x468,0x46b,0x471,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x474,0x474, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x477,0x477,0x39, -0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x39,0x39,0x477,0x39,0x39,0x39,0x39,0x39,0x39, -0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x39,0x477,0x477,0x477, -0x39,0x477,0x39,0x477,0x39,0x39,0x477,0x477,0x39,0x477,0x477,0x477,0x477,0x46b,0x477,0x474, -0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x39,0x46b,0x46b,0x477,0x39,0x39,0x480,0x480,0x480,0x480, -0x480,0x39,0x47d,0x39,0x46e,0x46e,0x46e,0x46e,0x46e,0x46b,0x39,0x39,0x471,0x471,0x471,0x471, -0x471,0x471,0x471,0x471,0x471,0x471,0x39,0x39,0x47a,0x47a,0x13fe,0x13fe,0x39,0x39,0x39,0x39, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x39,0x492,0x492,0x39,0x492,0x39,0x1a10,0x492,0x492,0x1a10,0x492,0x39,0x1a10,0x492,0x1a10,0x1a10, +0x1a10,0x1a10,0x1a10,0x1a10,0x492,0x492,0x492,0x492,0x1a10,0x492,0x492,0x492,0x492,0x492,0x492,0x492, +0x1a10,0x492,0x492,0x492,0x39,0x492,0x39,0x492,0x1a10,0x1a10,0x492,0x492,0x1a10,0x492,0x492,0x492, +0x492,0x486,0x492,0x48f,0x486,0x486,0x486,0x486,0x486,0x486,0x1a0d,0x486,0x486,0x492,0x39,0x39, +0x49b,0x49b,0x49b,0x49b,0x49b,0x39,0x498,0x39,0x489,0x489,0x489,0x489,0x489,0x486,0x39,0x39, +0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x39,0x39,0x495,0x495,0x1419,0x1419, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x990,0x990,0x990,0x993, -0x990,0x990,0x990,0x990,0x3c,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990, -0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x993,0x990,0x990,0x990,0x990,0x990,0x990,0x990, -0x990,0x990,0x990,0x990,0x990,0x993,0xa2c,0xfbd,0xfbd,0x3c,0x3c,0x3c,0x3c,0x95d,0x95d,0x960, -0x95d,0x960,0x960,0x969,0x960,0x969,0x95d,0x95d,0x95d,0x95d,0x95d,0x98a,0x95d,0x960,0x963,0x963, -0x966,0x96f,0x963,0x963,0x990,0x990,0x990,0x990,0x132c,0x1326,0x1326,0x1326,0x95d,0x95d,0x95d,0x960, -0x95d,0x95d,0xa20,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d, -0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0xa20,0xa20,0xa20,0x95d,0x95d,0x95d, -0x95d,0x95d,0x95d,0x95d,0xa20,0x960,0xa20,0xa20,0xa20,0x3c,0xa29,0xa29,0xa26,0xa26,0xa26,0xa26, -0xa26,0xa26,0xa23,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0x3c,0xfb4,0xa26,0xdbc,0xdbc,0xfb7,0xfba, -0xfb4,0x113d,0x113d,0x113d,0x113d,0x1329,0x1329,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x3c,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae, +0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9ae,0x9ae,0x9ae, +0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0xa4a,0xfd8,0xfd8,0x3c,0x3c,0x3c, +0x3c,0x97b,0x97b,0x97e,0x97b,0x97e,0x97e,0x987,0x97e,0x987,0x97b,0x97b,0x97b,0x97b,0x97b,0x9a8, +0x97b,0x97e,0x981,0x981,0x984,0x98d,0x981,0x981,0x9ae,0x9ae,0x9ae,0x9ae,0x1347,0x1341,0x1341,0x1341, +0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0xa3e,0x97b,0x3c,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b, +0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0x97b,0x97b,0x97b,0x97e,0x97b,0xa3e,0xa3e, +0xa3e,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0xa3e,0x97e,0xa3e,0xa3e,0xa3e,0x3c,0xa47,0xa47, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0x3c,0xfcf,0xa44, +0xdda,0xdda,0xfd2,0xfd5,0xfcf,0x1155,0x1155,0x1155,0x1155,0x1344,0x1344,0x3c,0x3c,0x3c,0x3c,0x3c, 0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x486,0x486,0x486,0x486,0x486,0x486,0x3f,0x1404, -0x3f,0x3f,0x3f,0x3f,0x3f,0x1404,0x3f,0x3f,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483, -0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb, -0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56, -0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0xa56,0x42,0xa56,0xa56, -0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xdcb,0xa56,0x42,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0x42,0x42,0x132f,0x132f,0xdc5,0xdc8,0xa50,0xa59,0xa4d, -0xa4d,0xa4d,0xa4d,0xa59,0xa59,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa53,0xa4a,0xa4a, -0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0x42,0x42,0x42,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0x170a,0x45,0x45,0x1707,0x1707,0x1707,0x1707,0x1707,0x1707,0x45,0x45,0xa6e,0xa71,0xa71,0xa71, -0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, -0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa6b,0xa68,0x48,0x48,0x48,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa74,0xa74,0xa74,0xa77,0xa77,0xa77,0x14f4,0x14f4,0x14f4, -0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa7a,0xa98,0xa98,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa80,0xa7d, -0xa8f,0xa8f,0xa92,0xa9b,0xa89,0xa86,0xa8f,0xa8c,0xa9b,0xcde,0x4e,0x4e,0xa95,0xa95,0xa95,0xa95, -0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xce1,0xce1,0xce1,0xce1, -0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xaaa,0xaaa,0xb2e,0xb31, -0xab0,0xb2b,0xaad,0xaaa,0xab3,0xac2,0xab6,0xac5,0xac5,0xac5,0xaa1,0x51,0xab9,0xab9,0xab9,0xab9, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0x1929,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xfde,0x51,0x51,0x51,0x51,0x51,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x54,0x54,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x54,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x54,0x54,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49e,0x4a4,0x49e,0x49e,0x49b,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4, -0x54,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x54,0x49b,0x49b,0x49b,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x49b,0x49b,0x49b,0x54,0x54,0x4a4,0x4a4, -0x4a4,0x54,0x4a4,0x4a4,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a1,0x49e,0x54,0xba3,0xba6,0xba6,0xba6, -0xfe7,0x57,0x14d0,0x14d0,0x14d0,0x14d0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4fb,0xbb8,0x5a,0x5a, -0x6ba,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x501,0x513,0x501,0x50d,0x507,0x6bd,0x4f8,0x6b7,0x6b7,0x6b7, -0x6b7,0x4f8,0x4f8,0x4f8,0x4f8,0x4f8,0x4fe,0x510,0x4fe,0x50a,0x504,0x5a,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x522,0x522,0x522,0x522, -0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x51f,0x51f,0x51f,0x51f,0x522,0xad7,0xada, -0xbbe,0xbc4,0xbc4,0xbc1,0xbc1,0xbc1,0xbc1,0xdda,0xeee,0xeee,0xeee,0xeee,0x1128,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x552,0x552,0x552,0xae3, -0xef7,0xfed,0xfed,0xfed,0xfed,0x1287,0x1710,0x1710,0x63,0x63,0x63,0x63,0x6e4,0x6e4,0x6e4,0x6e4, -0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x55e,0x55e,0x55b,0x55b,0x55b,0x55b,0x585,0x585,0x585,0x585, -0x585,0xaef,0xaef,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, -0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0x6c,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0d, -0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x81c,0x816,0x81c, -0x816,0x81c,0x816,0x81c,0x816,0x81c,0x816,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816, -0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x819,0x816,0x816,0x816,0x816,0x81c, -0x816,0x81c,0x816,0x81c,0x816,0x816,0x816,0x816,0x816,0x816,0x81c,0x816,0x816,0x816,0x816,0x816, -0x819,0xc6c,0xc6c,0x75,0x75,0x930,0x930,0x8fa,0x8fa,0x81f,0x822,0xc69,0x78,0x78,0x78,0x78, -0x78,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834, -0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x1116,0x18f3,0x19d7, -0x7b,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x7b,0x903,0x903,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906, -0x906,0x906,0x906,0x906,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0x13c5,0x13c5,0x13c5,0x7e, -0x7e,0x7e,0x7e,0x7e,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, -0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840,0x840, -0x840,0xd71,0xd71,0x81,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x81,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0x84,0x84,0x84,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xc75,0xb28,0x87,0x87,0x87,0x87,0x87, -0x87,0x87,0x87,0x87,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x9b4,0x9b4,0x9b4,0x9b4,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, -0x8a,0x8a,0x8a,0x8a,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230, -0x1230,0x1230,0x1230,0x1230,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x8d,0x8d,0x8d,0x8d, -0x8d,0xafb,0x5d6,0x5dc,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5e2,0x5d9,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x8d,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x8d,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc,0x5dc, -0x5dc,0x5dc,0x5dc,0x5df,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x1344,0x1344,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7, -0x5f1,0x5f7,0x5f7,0x5f1,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1, -0x5f4,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1, -0x5f4,0x5f4,0x5f4,0x5f4,0x90,0x90,0x5f4,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f1,0x5f1,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0x5f7,0x5f7,0x951,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee, -0xbfd,0xd8c,0x90,0x90,0x858,0x86a,0x867,0x86a,0x867,0xc8a,0xc8a,0xd7d,0xd7a,0x85b,0x85b,0x85b, -0x85b,0x86d,0x86d,0x86d,0x885,0x888,0x897,0x93,0x88b,0x88e,0x89a,0x89a,0x882,0x879,0x873,0x879, -0x873,0x879,0x873,0x876,0x876,0x891,0x891,0x894,0x891,0x891,0x891,0x93,0x891,0x87f,0x87c,0x876, -0x93,0x93,0x93,0x93,0x603,0x60f,0x603,0xc00,0x603,0x96,0x603,0x60f,0x603,0x60f,0x603,0x60f, -0x603,0x60f,0x603,0x60f,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c, -0x606,0x96,0x96,0x600,0x756,0x759,0x76e,0x771,0x750,0x759,0x759,0x9c,0x738,0x73b,0x73b,0x73b, -0x73b,0x738,0x738,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xafe,0xafe,0xafe, -0x9b7,0x732,0x612,0x612,0x9c,0x780,0x75f,0x750,0x759,0x756,0x750,0x762,0x753,0x74d,0x750,0x76e, -0x765,0x75c,0x77d,0x750,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x76b,0x768, -0x76e,0x76e,0x76e,0x780,0x741,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e, -0x73e,0x73e,0x73e,0x9c,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e, -0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x9c,0x9c,0x73e,0x73e, -0x73e,0x9c,0x9c,0x9c,0xb46,0xb46,0xb46,0xb46,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x1890,0x1890,0x1890,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xa2,0xa2,0xa2,0xa2,0xa2,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xa8,0xa8,0xff9,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716,0x1716,0x1716, -0x1716,0x1716,0x1716,0x1716,0x1716,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, -0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xab,0xb79,0xb79,0xab,0xab,0xb79,0xab, -0xab,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb76,0xb76,0xb76,0xb76,0xab,0xb76,0xab,0xb76,0xb76,0xb76,0xb76,0xd02,0xb76,0xb76, -0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb76, -0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79,0xab,0xb79,0xb79,0xb79,0xb79, -0xb79,0xab,0xb79,0xab,0xab,0xab,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xab,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xdef,0xdef,0xab,0xab, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xf06,0xf03,0xab,0xab,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xae,0xb7f,0xae,0xae,0xae,0xae,0xae,0xae, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x3f,0x141f,0x3f,0x3f,0x3f,0x3f,0x3f,0x141f,0x3f,0x3f,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0x42,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42, +0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0x42,0xa74,0xa74,0xa74,0xa74,0x42,0x42, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0x42,0x42,0x134a,0x134a,0xde3, +0xde6,0xa6e,0xa77,0xa6b,0xa6b,0xa6b,0xa6b,0xa77,0xa77,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, +0xa71,0xa71,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0x42,0x42,0x42, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0x1725,0x45,0x45,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x45,0x45, +0xa8c,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f, +0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa8f,0xa89,0xa86,0x48,0x48,0x48, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa92,0xa92,0xa92,0xa95,0xa95, +0xa95,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xa98,0xab6,0xab6,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9e,0xa9b,0xaad,0xaad,0xab0,0xab9,0xaa7,0xaa4,0xaad,0xaaa,0xab9,0xcfc,0x4e,0x4e, +0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e, +0xac8,0xac8,0xb49,0xb4c,0xace,0xb46,0xacb,0xac8,0xad1,0xae0,0xad4,0xae3,0xae3,0xae3,0xabf,0x51, +0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0x51,0x51,0x51,0x51,0x51,0x51, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x1944,0x51,0x51,0x51,0x51,0x51,0x51,0x51, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xac2,0xff6,0x51,0x51,0x51,0x51,0x51, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x54, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2,0x54,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b9,0x4bf,0x4b9, +0x4b9,0x4b6,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6, +0x4bf,0x4bf,0x4bf,0x4bf,0x54,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x54,0x4b6,0x4b6,0x4b6, +0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4b6,0x4b6,0x4b6, +0x54,0x54,0x4bf,0x4bf,0x4bf,0x54,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bc,0x4b9,0x54, +0xbc1,0xbc4,0xbc4,0xbc4,0xfff,0x57,0x14eb,0x14eb,0x14eb,0x14eb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x516,0xbd6,0x5a,0x5a,0x6d5,0x516,0x516,0x516,0x516,0x516,0x51c,0x52e,0x51c,0x528,0x522,0x6d8, +0x513,0x6d2,0x6d2,0x6d2,0x6d2,0x513,0x513,0x513,0x513,0x513,0x519,0x52b,0x519,0x525,0x51f,0x5a, +0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x5a,0x5a,0x5a, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53a,0x53a, +0x53a,0x53d,0xaf2,0xaf5,0xbdc,0xbe2,0xbe2,0xbdf,0xbdf,0xbdf,0xbdf,0xdf8,0xf09,0xf09,0xf09,0xf09, +0x1140,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x56d,0x56d,0x56d,0xafe,0xf12,0x1005,0x1005,0x1005,0x1005,0x129f,0x172b,0x172b,0x63,0x63,0x63,0x63, +0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x702,0x702,0x702,0x702,0x702,0x579,0x579,0x576,0x576,0x576,0x576, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0xb0a,0xb0a,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, +0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0x6c,0xb25,0xb25,0xb25,0xb25,0xb28, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb28,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f, +0x75,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x834,0x831,0x834,0x831, +0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x834,0x831, +0x831,0x831,0x831,0x837,0x831,0x837,0x831,0x837,0x831,0x831,0x831,0x831,0x831,0x831,0x837,0x831, +0x831,0x831,0x831,0x831,0x834,0xc8a,0xc8a,0x75,0x75,0x94b,0x94b,0x915,0x915,0x83a,0x83d,0xc87, +0x78,0x78,0x78,0x78,0x78,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, +0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, +0x84f,0x112e,0x190e,0x19f2,0x7b,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x7b,0x91e,0x91e,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0x13e0,0x13e0,0x13e0,0x7e,0x7e,0x7e,0x7e,0x7e,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b, +0x85b,0x85b,0x85b,0x85b,0x85b,0xd8f,0xd8f,0x81,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0x84,0x84,0x84,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xc93,0xb43,0x87, +0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x9d2,0x9d2,0x9d2,0x9d2,0x8a,0x8a,0x8a,0x8a, +0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x600,0x600,0x600,0x600,0x600,0x600,0x600,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x5ee,0x5ee,0x5ee,0x5ee,0x5ee, +0x8d,0x8d,0x8d,0x8d,0x8d,0xb16,0x5f1,0x5f7,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd, +0x5fd,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d, +0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x8d,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7,0x8d,0x5f7,0x5f7, +0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5fa,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x135f,0x135f,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x612,0x60c,0x60f,0x615,0x612, +0x60c,0x612,0x60c,0x612,0x60c,0x612,0x612,0x60c,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60c,0x60f,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c, +0x60f,0x60f,0x60f,0x60c,0x60f,0x60f,0x60f,0x60f,0x90,0x90,0x60f,0x60f,0x60f,0x60f,0x60c,0x60c, +0x60f,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60c,0x60c, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, +0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x612,0x612,0x96f,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x609,0x609,0xc1b,0xdaa,0x90,0x90,0x873,0x885,0x882,0x885,0x882,0xca8,0xca8,0xd9b, +0xd98,0x876,0x876,0x876,0x876,0x888,0x888,0x888,0x8a0,0x8a3,0x8b2,0x93,0x8a6,0x8a9,0x8b5,0x8b5, +0x89d,0x894,0x88e,0x894,0x88e,0x894,0x88e,0x891,0x891,0x8ac,0x8ac,0x8af,0x8ac,0x8ac,0x8ac,0x93, +0x8ac,0x89a,0x897,0x891,0x93,0x93,0x93,0x93,0x61e,0x62a,0x61e,0xc1e,0x61e,0x96,0x61e,0x62a, +0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x61e,0x62a,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627, +0x621,0x627,0x621,0x627,0x621,0x96,0x96,0x61b,0x771,0x774,0x789,0x78c,0x76b,0x774,0x774,0x9c, +0x753,0x756,0x756,0x756,0x756,0x753,0x753,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, +0x99,0xb19,0xb19,0xb19,0x9d5,0x74d,0x62d,0x62d,0x9c,0x79b,0x77a,0x76b,0x774,0x771,0x76b,0x77d, +0x76e,0x768,0x76b,0x789,0x780,0x777,0x798,0x76b,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, +0x795,0x795,0x786,0x783,0x789,0x789,0x789,0x79b,0x75c,0x759,0x759,0x759,0x759,0x759,0x759,0x759, +0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x759, +0x759,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759, +0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759,0x9c,0x9c,0x759,0x759,0x759,0x759,0x759,0x759, +0x9c,0x9c,0x759,0x759,0x759,0x9c,0x9c,0x9c,0xb64,0xb64,0xb64,0xb64,0x9f,0x9f,0x9f,0x9f, +0x9f,0x9f,0x9f,0x9f,0x9f,0x18ab,0x18ab,0x18ab,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xa2,0xa2,0xa2,0xa2,0xa2, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xa8,0xa8,0x1011,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xab,0xb97,0xb97, +0xab,0xab,0xb97,0xab,0xab,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xab,0xb94,0xab,0xb94,0xb94,0xb94, +0xb94,0xd20,0xb94,0xb94,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab,0xab,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xab,0xb97,0xb97,0xb97,0xb97,0xab, +0xb97,0xb97,0xb97,0xb97,0xb97,0xab,0xb97,0xab,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xab,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xe0d,0xe0d,0xab,0xab,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb94,0xb94,0xb94,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xf21,0xf1e,0xab,0xab,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xae,0xb9d,0xae,0xae, 0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, -0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xb1,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09,0xc0c,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18, -0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc12,0xc12,0xc15,0xc7e,0xc7e,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, -0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1b,0xc1b,0xb7,0xb7,0xb7,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24, -0xc24,0xc24,0xc24,0xc24,0xc24,0xba,0xc24,0xc24,0xc24,0xba,0xc21,0xc21,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, -0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, -0xd14,0xd14,0xd14,0xd14,0xd14,0x1512,0x1512,0xbd,0xd05,0xd05,0xd05,0xd11,0xd11,0xd11,0xd11,0xd05, -0xd05,0xd11,0xd11,0xd11,0xbd,0xbd,0xbd,0xbd,0xd11,0xd11,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd11,0xd08,0xd08,0xd08,0xbd,0xbd,0xbd,0xbd,0xd0b,0xbd,0xbd,0xbd,0xd17,0xd17,0xd0e,0xd0e, -0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, -0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xc0,0xc0,0xd1a,0xd1a,0xd1a,0xd1a, -0xd1a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0xc3,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0xc3,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0xc3,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1893,0x192c, -0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1719,0x1719,0x1719,0x1719, -0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0xc3, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xd41,0xd41,0xc6,0xd41,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xd41,0xd41,0xd41,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xc2d,0xc2d,0xc2d,0xc2d, +0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xb1,0xc2d,0xc2d,0xc2d,0xc2d,0xc27,0xc27, +0xc2a,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xc36,0xc36,0xc36,0xc36, +0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc30,0xc30, +0xc33,0xc9c,0xc9c,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xc3c,0xc3c,0xc3c,0xc3c, +0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc39,0xc39, +0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xc42,0xc42,0xc42,0xc42, +0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xba,0xc42,0xc42,0xc42,0xba,0xc3f,0xc3f, +0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xd32,0xd32,0xd32,0xd32, +0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32, +0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0xd32,0x152d,0x152d,0xbd,0xd23,0xd23,0xd23,0xd2f, +0xd2f,0xd2f,0xd2f,0xd23,0xd23,0xd2f,0xd2f,0xd2f,0xbd,0xbd,0xbd,0xbd,0xd2f,0xd2f,0xd23,0xd2f, +0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd26,0xd26,0xd26,0xbd,0xbd,0xbd,0xbd,0xd29,0xbd,0xbd,0xbd, +0xd35,0xd35,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd38,0xd38,0xd38,0xd38, +0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0, +0xd38,0xd38,0xd38,0xd38,0xd38,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0xc3,0xc3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xc3,0xc3, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xc6, +0xd5f,0xd5f,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xc6,0xc6,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, 0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, -0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xc9,0xc9,0xc9,0xc9,0xc9,0xd86,0xd86,0xd86,0xcc, -0xcc,0xcc,0xcc,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80, -0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xd80,0xcc,0xcc,0xcc,0xd83, -0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xcf,0xd47,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd2,0xd2,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd5, -0xd56,0xd5,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5,0xd56,0xd56,0xd5,0xd5,0xd5, -0xd56,0xd5,0xd5,0xd56,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0x1518, -0x1518,0x17ca,0x17ca,0xde,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5, -0x135,0x135,0x135,0x135,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe13,0xe13,0xe19,0xe19,0xe13, -0xe1,0xe1,0xe16,0xe16,0x1125,0x1125,0x1125,0x1125,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe4,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b,0xc7b, -0xc7b,0xc7b,0xc7b,0xc7b,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151e,0x1896,0x1896,0x1896,0x1896,0xe7,0x17cd, -0x1350,0x1167,0xf15,0xf15,0xe2e,0xe2b,0xe2e,0xe2b,0xe2b,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1170, -0x116d,0x1170,0x116d,0x116a,0x116a,0x116a,0x140d,0x140a,0xea,0xea,0xea,0xea,0xea,0xe28,0xe25,0xe25, -0xe25,0xe22,0xe28,0xe25,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xed,0xed,0xed,0xed, -0xed,0xed,0xed,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xed,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xed,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37, -0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xf3,0x1410,0xf3,0xf3,0xf3,0xf3, -0xf3,0x1410,0xf3,0xf3,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, -0xe40,0xe40,0xe40,0xf6,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d, -0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d,0xe3d, -0xe3d,0xe3d,0xe3d,0xf6,0xe52,0xe46,0xe46,0xe46,0xf9,0xe46,0xe46,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe46,0xe46,0xe46,0xe46,0xe52,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52,0xf9,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0x1932,0x1932,0xf9,0xf9,0xe43,0xe43,0xe43,0xf9,0xf9,0xf9,0xf9,0xe49, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x192f,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe55,0xe55,0xe4c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0x1176,0x1176,0xfc,0xfc,0xfc,0xfc, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe61,0xe61,0xe64,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe5e,0xe5e,0xe5e,0xe5e, -0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x1173,0xfc,0xfc,0xfc,0xe5b,0xe5b,0xe6a,0xe6a,0xe6a,0xe6a, -0xff,0xff,0xff,0xff,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe67,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1527,0x152d,0x152a,0x1875, -0x17d0,0x1899,0x1899,0x1899,0x1899,0x1899,0x1938,0x1935,0x193b,0x1935,0x193b,0x102,0x102,0x102,0x102,0x102, +0xc6,0xc6,0xc6,0xc6,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xc9, +0xc9,0xc9,0xc9,0xc9,0xda4,0xda4,0xda4,0xcc,0xcc,0xcc,0xcc,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9e,0xd9e,0xd9e,0xd9e,0xcc,0xcc,0xcc,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, +0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68, +0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xcf,0xd65, +0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71, +0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd2,0xd2, +0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, +0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c, +0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd5,0xd5,0xd74,0xd5,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, +0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74, +0xd74,0xd74,0xd5,0xd74,0xd74,0xd5,0xd5,0xd5,0xd74,0xd5,0xd5,0xd74,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0x1533,0x1533,0x17e5,0x17e5,0xde,0x110d,0x110d,0x110d,0x110d, +0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x135,0x135,0x135,0x135,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe31,0xe31,0xe37,0xe37,0xe31,0xe1,0xe1,0xe34,0xe34,0x113d,0x113d,0x113d,0x113d, +0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc99,0xc99,0xc99,0xc99, +0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0xc99,0x102c,0x102c,0x102c,0x102c, +0x102c,0x102c,0x102c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x1539,0x18b1,0x18b1,0x18b1,0x18b1,0xe7,0x17e8,0x136b,0x117f,0xf30,0xf30,0xe4c,0xe49,0xe4c,0xe49, +0xe49,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0x1188,0x1185,0x1188,0x1185,0x1182,0x1182,0x1182,0x1428,0x1425, +0xea,0xea,0xea,0xea,0xea,0xe46,0xe43,0xe43,0xe43,0xe40,0xe46,0xe43,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xed,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xed,0xe55,0xe55,0xe55,0xe55, +0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xe58,0xe58,0xe58,0xe58, +0xe58,0xe58,0xf3,0x142b,0xf3,0xf3,0xf3,0xf3,0xf3,0x142b,0xf3,0xf3,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xf6,0xe5b,0xe5b,0xe5b,0xe5b, +0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b, +0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xf6,0xe70,0xe64,0xe64,0xe64, +0xf9,0xe64,0xe64,0xf9,0xf9,0xf9,0xf9,0xf9,0xe64,0xe64,0xe64,0xe64,0xe70,0xe70,0xe70,0xe70, +0xf9,0xe70,0xe70,0xe70,0xf9,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70, +0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x194d,0x194d,0xf9,0xf9, +0xe61,0xe61,0xe61,0xf9,0xf9,0xf9,0xf9,0xe67,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, +0x194a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe73,0xe73, +0xe6a,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0x118e,0x118e,0xfc,0xfc,0xfc,0xfc,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe82,0xe82,0xe82, +0xe7f,0xe7f,0xe82,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x118b,0xfc, +0xfc,0xfc,0xe79,0xe79,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe85,0xe88,0xe88,0xe88,0xe88,0xe88,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x1542,0x1548,0x1545,0x1890,0x17eb,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x1953,0x1950, +0x1956,0x1950,0x1956,0x1a16,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, 0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, -0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0xe91,0xe91,0xe91,0xe8e, -0xe8e,0xe85,0xe85,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0x105,0x105,0x105,0x105,0x12ed,0x12ed,0x12ed,0x12f0, -0x12f0,0x12f0,0x12e7,0x12e7,0x12ea,0x12e7,0x159,0x159,0x159,0x159,0x159,0x159,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0x141c,0x141c,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0xe97,0x1356,0x108,0x108,0x108, -0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x1353,0xc4b,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4e,0xec4,0xeb5,0xeaf,0xec1, -0xebe,0xeb8,0xeb8,0xec7,0xeb2,0xebb,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0xf48,0xf48,0xf33,0xf48, -0xf4b,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0x111,0x111,0x111,0x111,0xf42,0xf42,0xf42,0xf42, -0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf54,0xf54,0xf39,0xf3f,0xf54,0xf54,0xf3c,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0x111,0x111,0x111,0x135c,0x1359,0x135c,0x1359, -0x135c,0x1359,0x135c,0x1359,0x135c,0x1359,0x1422,0x1539,0x1539,0x1539,0x17d3,0x1944,0x1539,0x1539,0x1722,0x1722, -0x1722,0x171c,0x1722,0x171c,0x1947,0x1944,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x102,0x102,0x102,0x102,0xeac,0xeac,0xeac,0xea9,0xea9,0xea0,0xea0,0xea9,0xea6,0xea6,0xea6,0xea6, +0x105,0x105,0x105,0x105,0x1308,0x1308,0x1308,0x130b,0x130b,0x130b,0x1302,0x1302,0x1305,0x1302,0x159,0x159, +0x159,0x159,0x159,0x159,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0x1437,0x1437,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0xeb2,0x1371,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x136e,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69, +0xc69,0xc69,0xc69,0xc6c,0xedf,0xed0,0xeca,0xedc,0xed9,0xed3,0xed3,0xee2,0xecd,0xed6,0x10b,0x10b, +0x10b,0x10b,0x10b,0x10b,0xf63,0xf63,0xf4e,0xf63,0xf66,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69, +0x111,0x111,0x111,0x111,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf6f,0xf6f, +0xf54,0xf5a,0xf6f,0xf6f,0xf57,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf51, +0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf54, +0xf54,0x111,0x111,0x111,0x114,0x114,0x1a1c,0x1a19,0x1a1c,0x1a1c,0x1a1c,0x114,0x114,0x114,0x114,0x114, 0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, -0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1536,0x1425,0x1425,0x1359,0x1050, -0x1050,0x1050,0x1050,0x1050,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf60,0xf60,0xf66,0xf66,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f, -0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf69,0xf69,0xf69,0xf69,0x117f,0x117f, -0x11a,0x11a,0x11a,0xf6c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, -0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1725,0x11d,0x11d, -0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1551,0x1440,0x1440,0x1374,0x1068,0x1068,0x1068,0x1068,0x1068, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7b,0xf7b,0xf81,0xf81,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf84,0xf84,0xf84,0xf84,0x1197,0x1197,0x11a,0x11a,0x11a,0xf87, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1740,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, 0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, -0xf78,0xf78,0xf78,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x120, -0xf75,0xf75,0xf75,0xf75,0x153f,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b, -0xf7b,0xf7b,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x123,0x123,0x123,0x123,0x123,0x123,0x123, -0x1077,0x1077,0x1077,0x1077,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x1065,0x1065,0x1074,0x1074,0x106b,0x1068,0x126,0x126,0x126,0x107a,0x107a,0x106e,0x106e,0x106e, -0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x126,0x126,0x126,0x1077,0x1077,0x1077, -0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x129,0x129,0x129,0x129, -0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, -0x10bc,0x10bc,0x10bc,0x10bc,0x10b6,0x17d6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10c2,0x10c2, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4, -0x10d4,0x10d4,0x10da,0x10dd,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10d7, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10ec, -0x10ec,0x10e3,0x10e3,0x10ec,0x10ec,0x10e3,0x10e3,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x10ef,0x10ef,0x10ef,0x10e3,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10e3,0x10ec,0x132,0x132, -0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x132,0x132,0x10e6,0x10f2,0x10f2,0x10f2, -0x154e,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0xf93,0xf93,0xf93,0x155d, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x120,0xf90,0xf90,0xf90,0xf90, +0x155a,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0xf96,0xf96,0xf96,0xf96, +0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0x1965,0x1965, +0x1965,0x1965,0x1965,0x1965,0x1965,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x108f,0x108f,0x108f,0x108f, +0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d,0x107d, +0x108c,0x108c,0x1083,0x1080,0x126,0x126,0x126,0x1092,0x1092,0x1086,0x1086,0x1086,0x1089,0x1089,0x1089,0x1089, +0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x126,0x126,0x126,0x108f,0x108f,0x108f,0x1095,0x1095,0x1095,0x1095, +0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x10aa,0x10aa,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10ad,0x10ad,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x10d4,0x10d4,0x10d4,0x10d4, +0x10ce,0x17f1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10da,0x10da,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x10f8,0x10f8,0x10f8,0x10f8, +0x10f8,0x10f8,0x10f8,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10ec,0x10f2,0x10f5, +0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x10ef,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x1104,0x1104,0x10fb,0x10fb,0x1104, +0x1104,0x10fb,0x10fb,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x1107,0x1107,0x1107,0x10fb, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x10fb,0x1104,0x132,0x132,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x132,0x132,0x10fe,0x110a,0x110a,0x110a,0x1569,0x135,0x135,0x135, 0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, -0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10fb,0x138,0x138, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe, -0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x10fe,0x13b,0x13b,0x13b, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, -0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, -0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x141,0x141,0x141,0x141,0x141,0x1104, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x144,0x144,0x144,0x144, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, -0x1185,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x118e,0x1185,0x1185,0x1185,0x1185,0x1182,0x14a,0x14a, -0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x1191,0x118b,0x1191,0x118b,0x118b,0x118b,0x1191,0x1191,0x14a, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11ac,0x1197,0x11ac,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x150, -0x11a0,0x11a9,0x1197,0x11a9,0x11a9,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11ac,0x11ac,0x11ac, -0x11ac,0x11ac,0x11ac,0x1197,0x1197,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x150,0x150,0x119a, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x150,0x150,0x150,0x150,0x150,0x150, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11b2,0x11b5,0x11b5,0x11b5,0x11b5,0x11a3,0x11a3,0x150,0x150, -0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1596,0x1c8, -0x1302,0x12e1,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12d8,0x12e4,0x12d8,0x12d8,0x12ff,0x12d8,0x12d8, -0x12d8,0x12d8,0x12de,0x14c4,0x14ca,0x14c7,0x14c7,0x1914,0x16ef,0x16ef,0x153,0x153,0x153,0x153,0x153,0x153, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11c1,0x11c1,0x11c4,0x11cd,0x11c7,0x11c7,0x11c7,0x11cd,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156, -0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, -0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x15c,0x15c,0x15c, -0x11eb,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11e2,0x11f1,0x11f1,0x11df,0x11df,0x11df,0x11df,0x15f,0x12f3, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x15f,0x15f,0x15f,0x15f,0x11df,0x11df, -0x120f,0x1203,0x120f,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162, -0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x120c,0x120c,0x1212,0x1206,0x1209, -0x1227,0x1227,0x1227,0x1221,0x1221,0x1218,0x1221,0x1221,0x1218,0x1221,0x1221,0x122a,0x1224,0x121b,0x165,0x165, -0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x165,0x165,0x165,0x165,0x165,0x165, -0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x168,0x168,0x168,0x168,0x122d,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x168,0x168,0x168,0x168,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x16b,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x16e,0x16e,0x16e,0x1242,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x171,0x171,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1254,0x1254,0x1254,0x1254, -0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x174, -0x174,0x174,0x174,0x174,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x17a,0x1275,0x1275,0x17d,0x17d, -0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x1953,0x17d,0x17d,0x14a3,0x14a3,0x14a3,0x14a3, -0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x12a2,0x12a2,0x12a2,0x12a2, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x155a,0x155a,0x183,0x183,0x183,0x12a2,0x12a2,0x12a2,0x12a2, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x13ad,0x13ad,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1434,0x1434,0x183,0x183,0x183,0x183,0x13b3,0x13b3,0x13ad,0x13ad, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x12ab,0x12ab,0x13ad,0x13b3,0x12b1,0x1854,0x1854,0x1854,0x1854, -0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x183,0x183,0x183,0x183,0x183,0x183,0x183, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1113,0x138,0x138,0x1116,0x1116,0x1116,0x1116, +0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116, +0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x1116,0x13b,0x13b,0x13b,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x13e,0x13e,0x13e, +0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x111f,0x111f,0x111f,0x111f, +0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, +0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x141,0x141,0x141,0x141,0x141,0x111c,0x1122,0x1122,0x1122,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x144,0x144,0x144,0x144,0x1125,0x1125,0x1125,0x1125, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, +0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x119d,0x119d,0x119d,0x119d, +0x11a6,0x119d,0x119d,0x119d,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119a,0x14a,0x14a,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x11a3,0x11a9,0x11a3,0x11a9,0x11a3,0x11a3,0x11a3,0x11a9,0x11a9,0x14a,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c4,0x11af,0x11c4,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x150,0x11b8,0x11c1,0x11af,0x11c1, +0x11c1,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11af, +0x11af,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x150,0x150,0x11b2,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x150,0x150,0x150,0x150,0x150,0x150,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11ca,0x11cd,0x11cd,0x11cd,0x11cd,0x11bb,0x11bb,0x150,0x150,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b1,0x1c8,0x131d,0x12f6,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x12fc,0x12f9,0x12f0,0x12f0,0x131a,0x12f0,0x12f0,0x12f0,0x12f0,0x12ff,0x14df, +0x14e5,0x14e2,0x14e2,0x192f,0x170a,0x170a,0x1a9d,0x153,0x153,0x153,0x153,0x153,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11d9,0x11d9,0x11dc,0x11e5, +0x11df,0x11df,0x11df,0x11e5,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x12de,0x12de,0x12de,0x12de, +0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de, +0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x12de,0x15c,0x15c,0x15c,0x1203,0x11f7,0x11f7,0x11f7, +0x11f7,0x11f7,0x11f7,0x11fa,0x1209,0x1209,0x11f7,0x11f7,0x11f7,0x11f7,0x15f,0x130e,0x11fd,0x11fd,0x11fd,0x11fd, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x15f,0x15f,0x15f,0x15f,0x11f7,0x11f7,0x1227,0x121b,0x1227,0x162, +0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x162, +0x162,0x162,0x162,0x162,0x162,0x162,0x162,0x1224,0x1224,0x122a,0x121e,0x1221,0x123f,0x123f,0x123f,0x1239, +0x1239,0x1230,0x1239,0x1239,0x1230,0x1239,0x1239,0x1242,0x123c,0x1233,0x165,0x165,0x1236,0x1236,0x1236,0x1236, +0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x165,0x165,0x165,0x165,0x165,0x165,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x168,0x168,0x168,0x168,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, +0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x1245, +0x1245,0x1245,0x1245,0x1245,0x168,0x168,0x168,0x168,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251, +0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x16b,0x124e, +0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x124b,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x16e,0x16e, +0x16e,0x125a,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x171,0x171, +0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c, +0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x126c,0x174,0x174,0x174,0x174,0x174, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272, +0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272, +0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x1272,0x17a,0x128d,0x128d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d, +0x17d,0x17d,0x17d,0x17d,0x17d,0x196e,0x17d,0x17d,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be, +0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x180,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a43, +0x1a3d,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba, +0x12ba,0x12ba,0x12ba,0x1575,0x1575,0x183,0x183,0x183,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba, +0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x13c8,0x144f,0x144f,0x1a1f,0x183,0x183,0x183,0x13ce,0x13ce,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x12c3,0x13c8,0x12c3,0x12c3,0x13c8,0x13ce,0x12c9,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, +0x186f,0x186f,0x186f,0x186f,0x186f,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, 0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, -0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, -0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x12d2,0x13ce,0x13cb,0x186,0x186,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x12cc,0x12cc,0x12cc,0x12cf,0x12cc,0x12cc,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13cb,0x13ce,0x13ce,0x13ce,0x1857, -0x186,0x186,0x186,0x186,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x13f2,0x13f2,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x186,0x186,0x186,0x186,0x186,0x186, +0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, +0x1380,0x1380,0x1380,0x1380,0x12ea,0x13e9,0x13e6,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e7, +0x12e4,0x12e4,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e6,0x13e9,0x13e9,0x13e9,0x1872,0x186,0x186,0x186,0x186, +0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x140d,0x140d,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x1914,0x1914,0x1914,0x1914,0x1914,0x1914,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, 0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, -0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x136e,0x136e,0x136e,0x136e, -0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e, -0x136e,0x136e,0x136e,0x136e,0x136e,0x1368,0x1368,0x1368,0x189,0x189,0x136b,0x189,0x1380,0x1380,0x1380,0x1380, -0x1380,0x1380,0x1371,0x137a,0x1374,0x1374,0x137a,0x137a,0x137a,0x1374,0x137a,0x1374,0x1374,0x1374,0x137d,0x137d, -0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x1377,0x1377,0x1377,0x1377,0x18f,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x18f,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1383,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x18f,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x18f,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1389,0x139b,0x139b,0x138f,0x138f,0x138f,0x138f,0x138f,0x192,0x192,0x192,0x192,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, -0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x155d,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x198,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13d7,0x198,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560, -0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x198,0x198, -0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x1575,0x1575, -0x1575,0x1575,0x1575,0x1578,0x16e6,0x1578,0x1578,0x1578,0x17b2,0x1860,0x1860,0x189c,0x189c,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1575,0x1575, -0x1575,0x1578,0x1575,0x16e3,0x16e3,0x19b,0x19b,0x19b,0x1578,0x1575,0x1575,0x1578,0x1860,0x1860,0x1860,0x18ff, -0x18ff,0x19dd,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x1440,0x157e,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, -0x1440,0x1440,0x1440,0x1440,0x1440,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1737,0x1737,0x1a1,0x17e2,0x17e2, -0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1959,0x17df,0x17df,0x17df,0x17df, -0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x17df,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1a4,0x1446, -0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446, -0x1a4,0x1446,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1446,0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1a4,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446, -0x1446,0x1446,0x1446,0x1446,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1383,0x1383,0x1383,0x189,0x189,0x1386,0x189,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x138c,0x1395, +0x138f,0x138f,0x1395,0x1395,0x1395,0x138f,0x1395,0x138f,0x138f,0x138f,0x1398,0x1398,0x18c,0x18c,0x18c,0x18c, +0x18c,0x18c,0x18c,0x18c,0x1392,0x1392,0x1392,0x1392,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x18f,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611, +0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13b6, +0x13b6,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x192,0x192,0x192,0x192,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x13ad,0x13ad,0x13ad,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, +0x192,0x192,0x192,0x1578,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x195,0x195,0x195, +0x195,0x195,0x195,0x195,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x198,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x157b,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13f2,0x198,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x198,0x198,0x198,0x198,0x198,0x198, +0x198,0x198,0x198,0x198,0x1407,0x1404,0x1404,0x1404,0x1404,0x1404,0x1590,0x1590,0x1590,0x1590,0x1590,0x1593, +0x1701,0x1593,0x1593,0x1593,0x17cd,0x187b,0x187b,0x18b7,0x18b7,0x1a7f,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x19b,0x19b,0x19b,0x19b,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1590,0x1590,0x1590,0x1593,0x1590,0x16fe, +0x16fe,0x19b,0x19b,0x19b,0x1593,0x1590,0x1590,0x1593,0x187b,0x187b,0x187b,0x191a,0x191a,0x19f8,0x1a7f,0x19b, +0x19b,0x19b,0x19b,0x19b,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x145b,0x1599,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x145b,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1752,0x1752,0x1a1,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, +0x17fd,0x17fd,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1974,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461, +0x1a4,0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1a4,0x1461,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461, +0x1461,0x1a4,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1461,0x1461,0x1461,0x1a4,0x1461,0x1461,0x1461,0x1461,0x1461,0x1a4,0x1461, +0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, 0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1443,0x1443,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1449,0x1449,0x1449,0x1449,0x1449, -0x1458,0x1449,0x144c,0x144c,0x1449,0x1449,0x1449,0x144f,0x144f,0x1a7,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1452,0x145e,0x145e,0x145e,0x195f,0x195c,0x195c,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1467, -0x1461,0x1461,0x1467,0x1467,0x1470,0x1470,0x146a,0x146d,0x146d,0x1467,0x1464,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473, -0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1ad,0x1ad,0x1ad,0x1ad, -0x173a,0x173a,0x1473,0x1473,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x1ad,0x1ad,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x147f,0x147f,0x147f,0x147f,0x147f,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x147f,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c, -0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c, -0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1479,0x1479,0x1479,0x1479,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1494,0x1497,0x149a,0x149a,0x1497,0x149d,0x149d,0x1488, -0x148b,0x173d,0x1740,0x1740,0x1740,0x1584,0x1b3,0x1b3,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x1581,0x1746,0x1749,0x1743,0x174c,0x174c,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3, -0x14a3,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x12fc,0x12f9,0x12fc,0x12db,0x12f9,0x12ff,0x12ff,0x1302, -0x12ff,0x1302,0x1305,0x12f9,0x1302,0x1302,0x12f9,0x12f9,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14a9,0x14b2,0x14a9,0x14b2,0x14b2,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14b5,0x14ac, -0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x1bf,0x1bf,0x1587,0x1587,0x1587,0x1587,0x1587,0x158d,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x16f2,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x1c5,0x1c5,0x1c5,0x1c5,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x145e,0x145e,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1464,0x1464,0x1464,0x1464,0x1464,0x1473,0x1464,0x1467,0x1467, +0x1464,0x1464,0x1464,0x146a,0x146a,0x1a7,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x146d,0x1479,0x1479,0x1479,0x197a,0x1977,0x1977,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1482,0x147c,0x147c,0x1482,0x1482, +0x148b,0x148b,0x1485,0x1488,0x1488,0x1482,0x147f,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1ad,0x1ad,0x1ad,0x1ad,0x1755,0x1755,0x148e,0x148e, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1ad,0x1ad,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x149a,0x149a,0x149a,0x149a,0x149a,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1a28,0x1b0,0x1b0,0x1b0,0x1b0,0x1a22, +0x149a,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, +0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1a25,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1494, +0x1494,0x1494,0x1494,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x149d, +0x14af,0x14b2,0x14b5,0x14b5,0x14b2,0x14b8,0x14b8,0x14a3,0x14a6,0x1758,0x175b,0x175b,0x175b,0x159f,0x1b3,0x1b3, +0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x159c,0x1761,0x1764,0x175e,0x1767,0x1767, +0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, +0x1317,0x1314,0x1317,0x12f3,0x1314,0x131a,0x131a,0x131d,0x131a,0x131d,0x1320,0x1314,0x131d,0x131d,0x1314,0x1314, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14c4,0x14cd,0x14c4,0x14cd,0x14cd, +0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14d0,0x14c7,0x1a2b,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc,0x1bc, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1bf,0x1bf, +0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a8,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0x170d,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704, +0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1c5,0x1c5,0x1c5,0x1c5, 0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1cb,0x1cb,0x15a2,0x159c,0x159f,0x15a8,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x1962,0x1962,0x1962,0x1962,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1cb,0x1cb, +0x15bd,0x15b7,0x15ba,0x15c3,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1ce,0x1ce,0x1ce,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, +0x15ae,0x15ae,0x15ae,0x15ae,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x197d,0x197d,0x197d,0x197d,0x1d1,0x1d1,0x1d1, +0x1d1,0x1d1,0x1d1,0x1d1,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82, 0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x174f,0x16f5,0x15b7,0x16fb,0x1d4,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x1d4,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x1d4,0x15c0,0x15c0,0x1d4,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1d4,0x19ec,0x16f8,0x15c0,0x15b1,0x15b7, -0x15b1,0x15b7,0x15b7,0x15b7,0x15b7,0x1d4,0x1d4,0x15b7,0x15b7,0x1d4,0x1d4,0x15ba,0x15ba,0x15bd,0x1d4,0x1d4, -0x1752,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15b1,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15c3,0x15c0,0x15c0, -0x15c0,0x15c0,0x15b7,0x15b7,0x1d4,0x1d4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4, -0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d8,0x15d8,0x1d7,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d2,0x15d2,0x15d2,0x15c6,0x15c6,0x15c6,0x15d2,0x15d2,0x15c6,0x15d5,0x15c9,0x15c6,0x15db,0x15db,0x15cf,0x15db, -0x15db,0x15cc,0x17e5,0x1d7,0x15ea,0x15ea,0x15ea,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e1,0x15e4,0x1da, -0x1da,0x1da,0x1da,0x1da,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1755,0x1755,0x1755,0x1755,0x15f6,0x15f3,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1e0,0x1e0,0x1e0,0x1e0, +0x1d1,0x1d1,0x1d1,0x1d1,0x176a,0x1710,0x15d2,0x1716,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, +0x15db,0x1d4,0x1d4,0x15db,0x15db,0x1d4,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, +0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x15db,0x15db, +0x1d4,0x15db,0x15db,0x15db,0x15db,0x15db,0x1d4,0x1a07,0x1713,0x15db,0x15cc,0x15d2,0x15cc,0x15d2,0x15d2,0x15d2, +0x15d2,0x1d4,0x1d4,0x15d2,0x15d2,0x1d4,0x1d4,0x15d5,0x15d5,0x15d8,0x1d4,0x1d4,0x176d,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x15cc,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15de,0x15db,0x15db,0x15db,0x15db,0x15d2,0x15d2, +0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x1d4,0x1d4,0x1d4,0x15cf,0x15cf,0x15cf,0x15cf, +0x15cf,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x1d7,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ed,0x15ed,0x15ed,0x15e1, +0x15e1,0x15e1,0x15ed,0x15ed,0x15e1,0x15f0,0x15e4,0x15e1,0x15f6,0x15f6,0x15ea,0x15f6,0x15f6,0x15e7,0x1800,0x1d7, +0x1605,0x1605,0x1605,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15ff,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1770,0x1770,0x1770,0x1770,0x1611,0x160e,0x1a2e,0x1a2e,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, +0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, 0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x15ff,0x1602,0x1605,0x1608,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, -0x1e3,0x1e3,0x1e3,0x1e3,0x1617,0x1617,0x1617,0x1617,0x1617,0x160b,0x160b,0x1e6,0x1e6,0x1e6,0x1e6,0x160e, -0x160e,0x160e,0x160e,0x160e,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1611,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, -0x1e6,0x1e6,0x1e6,0x1e6,0x1620,0x1620,0x1620,0x1620,0x1620,0x1e9,0x1e9,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1623,0x1635,0x1635,0x1629,0x1632,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x1ef,0x1647,0x1647,0x1647,0x1647,0x1647,0x1641,0x164a,0x1647,0x1647,0x1647,0x1647,0x1647, -0x1647,0x1647,0x1647,0x1647,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1647,0x1647, -0x1647,0x1647,0x1647,0x1f2,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, -0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, -0x1650,0x1650,0x1650,0x1f5,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1674,0x1674,0x1677,0x1677,0x167a,0x166b,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, -0x1fb,0x1fb,0x1fb,0x1fb,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1fb,0x166b, -0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1fb,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1fb,0x1fb,0x1fb,0x1fb, -0x1fb,0x1674,0x1674,0x1674,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1fe,0x1fe,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, -0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1689,0x1689,0x1689, -0x1689,0x201,0x201,0x201,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x168f,0x16a1,0x16a1,0x168f,0x168f,0x168f,0x168f,0x207,0x207,0x16a1,0x16a1,0x16a4,0x16a4, -0x168f,0x168f,0x16a1,0x1695,0x1692,0x1698,0x16aa,0x16aa,0x169b,0x169b,0x169e,0x169e,0x169e,0x16aa,0x175e,0x175e, -0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175e,0x175b,0x175b,0x175b,0x175b, -0x1758,0x1758,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x161a,0x161d,0x1620,0x1623,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1e6,0x1e6,0x1e6,0x1e6,0x1629,0x1629,0x1629,0x1629,0x1629, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162c,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6, +0x163b,0x163b,0x163b,0x163b,0x163b,0x1e9,0x1e9,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, +0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, +0x163e,0x1650,0x1650,0x1644,0x164d,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1647,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1ef, +0x1662,0x1662,0x1662,0x1662,0x1662,0x165c,0x1665,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, +0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1662,0x1662,0x1662,0x1662,0x1662,0x1f2, +0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b, +0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x1f5, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1674,0x1674,0x1674,0x1674,0x1674,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, +0x168f,0x168f,0x1692,0x1692,0x1695,0x1686,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb, +0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x1fb,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1fb,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x168f,0x168f,0x168f, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x16a4,0x16a4,0x16a4,0x16a4,0x201,0x201,0x201, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16aa, +0x16bc,0x16bc,0x16aa,0x16aa,0x16aa,0x16aa,0x207,0x207,0x16bc,0x16bc,0x16bf,0x16bf,0x16aa,0x16aa,0x16bc,0x16b0, +0x16ad,0x16b3,0x16c5,0x16c5,0x16b6,0x16b6,0x16b9,0x16b9,0x16b9,0x16c5,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779, +0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1776,0x1776,0x1773,0x1773,0x207,0x207, 0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, -0x207,0x207,0x207,0x207,0x20a,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad, -0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x16ad,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x20d,0x20d, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, +0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0x20a,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, +0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, 0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, -0x16b3,0x16c2,0x16b9,0x16b6,0x16c8,0x16c8,0x16bc,0x16c8,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x210,0x210,0x210,0x210,0x210,0x210, -0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, -0x16cb,0x16cb,0x16cb,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16d4, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1965,0x216,0x216,0x1761,0x1761,0x1761, -0x176d,0x176d,0x1761,0x1761,0x1761,0x1761,0x176d,0x1761,0x1761,0x1761,0x1761,0x1764,0x216,0x216,0x216,0x216, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x1767,0x1767,0x1773,0x1773,0x1773,0x1767, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x16ce,0x16dd,0x16d4,0x16d1, +0x16e3,0x16e3,0x16d7,0x16e3,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x210,0x210,0x210,0x210,0x210,0x210,0x16e9,0x16e9,0x16e9,0x16e9, +0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x213, +0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x16ef,0x178b,0x178b,0x178b,0x178b, +0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, +0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x1980,0x216,0x216,0x177c,0x177c,0x177c,0x1788,0x1788,0x177c,0x177c, +0x177c,0x177c,0x1788,0x177c,0x177c,0x177c,0x177c,0x177f,0x216,0x216,0x216,0x216,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1782,0x1782,0x178e,0x178e,0x178e,0x1782,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, 0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, -0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x21f,0x1788,0x1788,0x21f,0x21f, -0x21f,0x21f,0x21f,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222, -0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, -0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x222,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, -0x178b,0x178e,0x222,0x222,0x222,0x222,0x222,0x222,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f,0x189f, -0x189f,0x189f,0x189f,0x189f,0x228,0x228,0x228,0x228,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, -0x17bb,0x1869,0x1869,0x1869,0x1869,0x1866,0x1869,0x1905,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1869,0x1866, -0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1869,0x1905,0x1905,0x1869,0x1869,0x1869,0x1869,0x1869, -0x1869,0x1869,0x1866,0x1863,0x1866,0x1869,0x1869,0x228,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, -0x1902,0x1902,0x1902,0x1902,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x228, -0x228,0x228,0x19e0,0x228,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e6,0x19e6,0x19e0, -0x19e6,0x19e6,0x228,0x228,0x228,0x228,0x228,0x228,0x17b8,0x19e0,0x19e0,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1902,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, -0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1902,0x1902,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x17a0, -0x17a3,0x17a0,0x17a0,0x179d,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, -0x22b,0x22b,0x22b,0x179a,0x179a,0x179a,0x179a,0x179a,0x17f7,0x17f7,0x17f7,0x17f7,0x17ee,0x17ee,0x17ee,0x17e8, -0x17eb,0x17eb,0x17eb,0x22e,0x22e,0x22e,0x22e,0x22e,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4, -0x17f4,0x17f4,0x22e,0x22e,0x22e,0x22e,0x17f1,0x17f1,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x231,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x180f,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x17fd,0x17fd,0x231,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x180f,0x1800,0x1812,0x1815,0x1815,0x1809, -0x1806,0x1806,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x231,0x231,0x231,0x1821,0x1824,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, -0x1818,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x237, -0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, -0x181b,0x237,0x237,0x181b,0x181b,0x181b,0x181b,0x181b,0x186c,0x1908,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, +0x219,0x219,0x219,0x219,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, +0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x21f,0x17a3,0x17a3,0x21f,0x21f,0x21f,0x21f,0x21f,0x17a0, +0x17a0,0x17a0,0x17a0,0x17a0,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x222,0x17a6,0x222,0x17a6,0x17a6, +0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, +0x17a6,0x17a6,0x222,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x222,0x222, +0x222,0x222,0x222,0x222,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1608,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, +0x225,0x225,0x225,0x225,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x17ac,0x17ac, +0x17ac,0x17ac,0x17ac,0x17ac,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x228,0x1a85,0x1a85,0x1a88,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d6,0x1884,0x1884,0x1884, +0x1884,0x1884,0x1884,0x1920,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1a85,0x228,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x228,0x19fb,0x1a85, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x228,0x228,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228, +0x228,0x228,0x1a85,0x1a85,0x19fe,0x19fe,0x19fe,0x19fe,0x19fb,0x1a01,0x1a01,0x19fb,0x1a01,0x1a01,0x1a85,0x1a88, +0x1a85,0x1a85,0x1a85,0x1a85,0x17d3,0x19fb,0x19fb,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x228, +0x228,0x1a88,0x1a88,0x1a88,0x191d,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920, +0x1920,0x1920,0x191d,0x191d,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17bb,0x17be,0x17bb,0x17bb,0x17b8, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x1812,0x1812,0x1812,0x1812,0x1809,0x1809,0x1809,0x1803,0x1806,0x1806,0x1806,0x1a31, +0x22e,0x22e,0x22e,0x22e,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x22e,0x22e, +0x22e,0x22e,0x180c,0x180c,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x231,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182a,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x231, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x182a,0x181b,0x182d,0x1830,0x1830,0x1824,0x1821,0x1821,0x231,0x231, +0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x231,0x231,0x231,0x183c,0x183f,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e, +0x199e,0x199e,0x199e,0x199e,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x1836,0x1836,0x1836,0x1836, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x237,0x237,0x1836, +0x1836,0x1836,0x1836,0x1836,0x1887,0x1923,0x1a8b,0x1a8e,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, 0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x23d,0x23d,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, -0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x23d,0x1827,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, -0x181e,0x1827,0x181e,0x181e,0x1827,0x181e,0x181e,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x240,0x240,0x240, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, -0x1845,0x1845,0x1836,0x1830,0x1830,0x1845,0x1833,0x1848,0x1848,0x1848,0x1848,0x184b,0x184b,0x183f,0x183c,0x1839, -0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x243,0x183f,0x243,0x1839,0x1968,0x243, +0x23a,0x23a,0x23a,0x23a,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, +0x1845,0x1845,0x1845,0x1845,0x23d,0x23d,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, +0x1839,0x1839,0x1839,0x1839,0x23d,0x1842,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1842,0x1839,0x1839, +0x1842,0x1839,0x1839,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x1848,0x1848,0x1848,0x1848, +0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x240,0x240,0x240,0x240,0x240,0x240,0x240, +0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x1860,0x1860,0x1851,0x184b, +0x184b,0x1860,0x184e,0x1863,0x1863,0x1863,0x1863,0x1866,0x1866,0x185a,0x1857,0x1854,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x243,0x185a,0x243,0x1854,0x1983,0x1a34,0x243,0x243,0x243,0x243, 0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x1851,0x1851,0x246,0x246,0x246,0x246,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e,0x184e, -0x184e,0x184e,0x184e,0x184e,0x246,0x246,0x246,0x246,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x19e9,0x19e9,0x19e9,0x19e9,0x19e9,0x249,0x249,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e, -0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x190e,0x24f,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x252, -0x18ae,0x18ae,0x252,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae, -0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x252, -0x252,0x252,0x18a2,0x252,0x18a2,0x18a2,0x252,0x18a2,0x18a2,0x18a2,0x18a5,0x18a2,0x18a8,0x18a8,0x18b1,0x18a2, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab,0x18ab, -0x18ab,0x18ab,0x252,0x252,0x252,0x252,0x252,0x252,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x255,0x255,0x255,0x255,0x18c9,0x18c9,0x18c9,0x18c9,0x258,0x258,0x18cc,0x18cc, -0x18cc,0x18cc,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6, -0x18b7,0x18ba,0x18bd,0x18cf,0x18cf,0x196b,0x18c0,0x18c0,0x18de,0x18e1,0x18f0,0x18f0,0x18e1,0x18e4,0x18de,0x18db, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x18c9,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18c6, -0x18c6,0x18b4,0x18b4,0x18b4,0x18c9,0x18c9,0x18c9,0x18c9,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x197d,0x197d,0x197d,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971, -0x197d,0x1977,0x1974,0x197a,0x264,0x264,0x264,0x264,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983,0x1983, -0x1983,0x1983,0x1983,0x267,0x267,0x1983,0x1983,0x1983,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x26a,0x1992, -0x1992,0x26a,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992, -0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x1992,0x198f,0x198f,0x198f,0x198f,0x198f,0x26a, -0x1986,0x1986,0x26a,0x198f,0x198f,0x1986,0x198f,0x1989,0x1992,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x199b,0x199b,0x199e,0x199e,0x1995,0x1995,0x1995,0x1995,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, -0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a4,0x19a1,0x19a1,0x19a1, -0x19a4,0x19a1,0x19a1,0x19a1,0x19a1,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, +0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x186c,0x186c,0x186c,0x186c, +0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c, +0x246,0x246,0x246,0x246,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869, +0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869, +0x246,0x246,0x246,0x246,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x1a04,0x1a04,0x1a04,0x1a04,0x1a04,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x249,0x249,0x249,0x249, +0x249,0x249,0x249,0x249,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929, +0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929,0x1929, +0x1929,0x1929,0x1929,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x252,0x18c9,0x18c9,0x252,0x18c9, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x252,0x252,0x252,0x18bd,0x252, +0x18bd,0x18bd,0x252,0x18bd,0x18bd,0x18bd,0x18c0,0x18bd,0x18c3,0x18c3,0x18cc,0x18bd,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x252,0x252, +0x252,0x252,0x252,0x252,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x255,0x255,0x255,0x255,0x18f9,0x18fc,0x190b,0x190b,0x18fc,0x18ff,0x18f9,0x18f6,0x25e,0x25e,0x25e,0x25e, +0x25e,0x25e,0x25e,0x25e,0x18e4,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1,0x18e1,0x18cf,0x18cf,0x18cf, +0x18e4,0x18e4,0x18e4,0x18e4,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, +0x261,0x261,0x261,0x261,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0x1989,0x1989,0x261,0x261,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x294, +0x294,0x294,0x294,0x294,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, +0x1998,0x1998,0x1998,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x1998,0x1992,0x198f,0x1995, +0x264,0x264,0x264,0x264,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e, +0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x199e,0x267, +0x267,0x199e,0x199e,0x199e,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x26a,0x19ad,0x19ad,0x26a,0x19ad,0x19ad, 0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad, -0x19ad,0x19ad,0x19ad,0x19a7,0x19a7,0x19aa,0x19aa,0x19b0,0x19b0,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3, -0x19b3,0x19b3,0x19b3,0x19b3,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b9,0x19c2,0x19b6,0x19b6,0x279,0x279,0x279,0x279,0x279, -0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c5,0x19c8,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19ad,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x26a,0x19a1,0x19a1,0x26a,0x19aa, +0x19aa,0x19a1,0x19aa,0x19a4,0x19ad,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x19b6,0x19b6,0x19b9,0x19b9, +0x19b0,0x19b0,0x19b0,0x19b0,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19b3,0x19b3,0x19b3,0x19b3, +0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x19bc,0x19bc,0x19bc,0x19bc, +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc,0x19bf,0x19bc,0x19bc,0x19bc, +0x19bc,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x19c8,0x19c8,0x19c8,0x19c8, +0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c2, +0x19c2,0x19c5,0x19c5,0x19cb,0x19cb,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x19ce,0x19ce,0x19ce,0x19ce, +0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x19d1,0x19d1,0x19d1,0x19d1, 0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1, -0x19d1,0x19d1,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19ce,0x19ce,0x19ce, -0x19ce,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x190b,0x29d,0x29d,0x29d, -0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x954,0x954,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x18f6,0x18f6,0x18f6,0x18f6, -0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x19da,0x19da,0x19da,0x19da,0x19da,0x288,0x288,0x288,0x288, -0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0xc78,0xc78,0xc78,0xc78, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0x12c0,0x12c0,0x12c0,0x28b,0x28b,0xeac,0xeac,0xeac,0xeac, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0x28e, -0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0x28e,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0x291,0x291,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x294,0x294,0x294, -0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x297,0x297,0x17b5,0x17b5,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1131,0x396,0x396,0x3a2,0xcba,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a2,0x396,0x396,0x396,0x396,0x396,0x396,0x396, -0x396,0x3a2,0x3a2,0x3a2,0x3a2,0x39c,0x1134,0x1317,0x3a5,0x921,0x924,0x399,0x399,0x1131,0x1314,0x1314, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a5,0x3a5,0x396,0x396,0x8ac,0x8af,0x93f,0x93f, -0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x39f,0xf93,0xf90,0x131a,0x131a,0x131a,0x131a,0x131a, -0x14df,0x1137,0x1137,0xee5,0xee5,0xdb3,0xee5,0xee5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a8,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a8,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x1314,0x1317,0x399,0x3a5,0x3a2,0x3a2,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x1320,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x1320,0x1887,0x1887,0xfb1,0x438,0x441,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483, -0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0x483,0xba0, -0xba0,0xdbf,0xdbf,0x8b2,0xdc2,0x1401,0x1401,0x1401,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x48c,0x48c,0x48c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x48f,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c, -0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c, -0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x48c,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x492,0x492, -0x492,0x492,0x495,0x996,0xfe1,0xfe1,0xfe4,0xfe1,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492,0x498,0x492, -0x498,0x492,0xfe4,0xfe1,0xfe4,0xfe1,0xfe4,0xfe1,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x687,0x687,0x68a,0x4c2,0x696,0x693,0x693,0x690, -0x4ec,0x4ec,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0xac8,0x699,0x4ce,0x6b1,0x6b4,0x4e3,0x699,0x4d1,0x4d1, -0x4c2,0x4dd,0x4dd,0x687,0x4e9,0x4e6,0x68d,0x4bc,0x4b3,0x4b3,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9, -0x4b6,0x4b6,0x4b6,0x4ad,0x4f5,0x4f2,0x4ef,0x4ef,0x6a5,0x4d7,0x4d4,0x6a2,0x69f,0x69c,0x6ae,0x4c5, -0x6ab,0x6ab,0x4da,0x4dd,0x6a8,0x6a8,0x4da,0x4dd,0x4bf,0x4c2,0x4c2,0x4c2,0x4e0,0x4cb,0x4c8,0xbb5, -0xace,0xad1,0xacb,0xacb,0xacb,0xacb,0xbac,0xbac,0xbac,0xbac,0xbb2,0xce7,0xce4,0xdce,0xdd1,0xbaf, -0xdd1,0xdd1,0xdd1,0xdd1,0xdce,0xdd1,0xdd1,0xba9,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x516, -0x51c,0x735,0x519,0x999,0x9ba,0xad4,0xad4,0xad4,0xbbb,0xbbb,0xdd7,0xdd7,0xdd7,0xdd7,0x1155,0x1158, -0x1158,0x1335,0x14cd,0x14f7,0x14fa,0x14fa,0x170d,0x188a,0x528,0x528,0x540,0x6c3,0x525,0x6c0,0x528,0x53d, -0x525,0x6c3,0x537,0x540,0x540,0x540,0x537,0x537,0x540,0x540,0x540,0x6cc,0x525,0x540,0x6c6,0x525, -0x534,0x540,0x540,0x540,0x540,0x540,0x525,0x525,0x52b,0x6c0,0x6c9,0x525,0x540,0x525,0x6cf,0x525, -0x540,0x52e,0x546,0x6d2,0x540,0x540,0x531,0x537,0x540,0x540,0x543,0x540,0x537,0x53a,0x53a,0x53a, -0x53a,0xae0,0xadd,0xcea,0xde0,0xbd0,0xbd3,0xbd3,0xbcd,0xbca,0xbca,0xbca,0xbca,0xbd3,0xbd0,0xbd0, -0xbd0,0xbd0,0xbc7,0xbca,0xddd,0xef1,0xef4,0xfea,0x115b,0x115b,0x115b,0x6d8,0x6d5,0x549,0x54c,0x54c, -0x54c,0x54c,0x54c,0x6d5,0x6d8,0x6d8,0x6d5,0x54c,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de, -0x6de,0x6de,0x6de,0x6de,0x555,0x555,0x555,0x555,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, -0x6db,0x6db,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x558,0x561,0x561,0x55b,0x55b,0x55b,0x55e,0x558,0x55b,0x55b,0x558,0x558,0x558,0x558,0x55b,0x55b, -0x6e1,0x6e1,0x558,0x558,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x55b,0x55e,0x55e,0x55e,0x55b,0x55b,0x6e4,0x55b,0x6e4,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b, -0x558,0x55b,0x558,0x558,0x558,0x558,0x558,0x558,0x55b,0x55b,0x558,0x6e1,0x558,0x558,0x558,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, -0xbd6,0xbd6,0xbd6,0xbd6,0x6ea,0x564,0x6ea,0x6ea,0x567,0x564,0x564,0x6ea,0x6ea,0x567,0x564,0x6ea, -0x567,0x564,0x564,0x6ea,0x564,0x6ea,0x573,0x570,0x564,0x6ea,0x564,0x564,0x564,0x564,0x6ea,0x564, -0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x567,0x6ea,0x567,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea, -0x6f0,0x56a,0x6ea,0x56a,0x56a,0x564,0x564,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x564,0x564, -0x6ea,0x6ea,0x564,0x564,0x564,0x567,0x564,0x564,0x567,0x564,0x564,0x567,0x6ea,0x567,0x564,0x564, -0x6ea,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x564,0x564,0x564,0x564,0x6ed,0x6ea,0x567,0x564,0x6ea,0x6ea,0x6ea,0x6ea,0x564,0x564,0x6ea,0x6ea, -0x564,0x567,0x6ed,0x6ed,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564,0x567,0x567,0x564,0x564, -0x564,0x564,0x564,0x564,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x6ea,0x6ea,0x567,0x567,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x6ea,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x6ea,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x6ea, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x567,0x567,0x567,0x567,0x564,0x564,0x564,0x564,0x564,0x564,0x567,0x567,0x567,0x567,0x564,0x56d, -0x564,0x564,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0x576,0xae9,0x576,0x576,0x576,0x576,0x576,0x576,0x582,0x57f,0x582,0x57f,0x576,0x576,0x576,0x576, -0x576,0x576,0x6f3,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x7f8,0x7f8,0x576,0x576,0x576,0x576, -0x57c,0x57c,0x576,0x576,0x576,0x576,0x576,0x576,0x579,0x7fe,0x7fb,0x576,0x576,0x576,0x576,0x576, -0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576, -0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0xae9, -0xbdf,0xae9,0xae9,0xae9,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x58b,0xc48, -0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48, -0xc48,0xc48,0xc48,0xd62,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x58e,0x591,0x591,0x591,0x591,0x591,0x591,0x591, -0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x591,0x591,0x591,0x591,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708, -0x708,0x708,0x708,0x708,0x594,0x594,0x708,0x708,0x708,0x708,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0x70e,0x70e,0x597,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x59a,0x59a, -0x597,0x597,0x59d,0x59d,0x59d,0x59d,0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597, -0x70e,0x70e,0x59d,0x59d,0x711,0x70e,0x597,0x597,0x597,0x597,0x70e,0x70e,0x70b,0x597,0x59d,0x70e, -0x597,0x597,0x70b,0x70e,0x70e,0x70e,0x59d,0x59d,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, -0x597,0x597,0x597,0x597,0x597,0x597,0x70e,0x70b,0x70e,0x70b,0x597,0x59d,0x59d,0x59d,0x59d,0x59d, -0x59d,0x597,0x597,0x70b,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xbe5,0xbe5,0xbe5,0xbe8, -0xbe8,0xc63,0xc63,0xbe5,0x5ac,0x5ac,0x5ac,0x5ac,0x5a9,0x723,0x720,0x5a3,0x5a3,0x714,0x5a3,0x5a3, -0x5a3,0x5a3,0x71a,0x714,0x5a3,0x5a9,0x5a3,0x5a0,0xd6b,0xd6b,0xbee,0xbee,0xdec,0xaf5,0x5a6,0x5a6, -0x717,0x5af,0x717,0x5a6,0x5a9,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a9,0x5a3,0x5a3,0x5a3,0x5a9,0x5a3, -0x5a3,0x5a3,0x5a9,0x5a9,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a9,0x5ac,0x5ac,0x5a6, -0x5a3,0x5a3,0x5a3,0x5a3,0x726,0x5a3,0x726,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x801,0x801,0x801,0x801, -0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3, -0x5a3,0x5a3,0x5a3,0x5a9,0x726,0x723,0x5b2,0x726,0x714,0x71a,0x5a9,0x714,0x71d,0x714,0x714,0x5a3, -0x714,0x723,0x5b2,0x723,0xaf5,0xaf5,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4, -0xbf1,0xbf1,0xde9,0xea3,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x1503,0x5c4,0x5cd,0x5c4,0x5c4,0x13bf,0x5b8,0x5b8,0x5cd,0x5cd,0x13c2,0x13c2, -0x5d0,0x5d0,0x5c1,0x5c7,0x5c1,0x5c1,0x5c7,0x5b8,0x5c7,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5c7,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x72c,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf,0x5b8,0x13bf,0x5b8, -0x5b8,0x5b8,0x5b8,0x13bf,0x13bf,0x13bf,0x5b8,0x12ba,0x5b8,0x5b8,0x5b8,0x5be,0x5be,0x5be,0x5be,0x1341, -0x1341,0x5b8,0x5bb,0x5ca,0x5cd,0x5c1,0x5c1,0x5c1,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7, -0xbfa,0xbf7,0xbfa,0xbf7,0xbfa,0xbf7,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, -0x5b8,0x5c7,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x13bf,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x13bf, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f1,0x5f7,0x5e8,0x5eb, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5ee,0x5ee, -0x5ee,0x5ee,0x5ee,0x5ee,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1, -0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x1344,0x1344, -0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x5f7,0x5f1,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f4,0x5fa,0x5f4,0x5fa,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1,0x5f7,0x5f1, -0x5f7,0x5f1,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5f7,0x5f1,0x5f4,0x5fa,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f1,0x5f4, -0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f4, -0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1, -0x5f4,0x5f4,0x5f1,0x5f1,0x5f4,0x5f1,0x5f4,0x5f1,0x5f1,0x5f1,0x5f1,0x5f1,0x5f4,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4, -0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4,0x5fa, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5fa, -0x5fa,0x5fa,0x5fa,0x5fa,0x5fa,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7,0x5f7, -0x5fd,0x5fd,0x5fd,0x5fd,0xff6,0xff6,0xff6,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1713,0x1713, -0x85e,0x864,0x864,0x870,0x870,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861,0x858,0x861, -0x60c,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x60c, -0x606,0x609,0x60f,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609, -0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x60f,0x60c,0x606,0x609,0x6f9,0x6f9,0x6f9,0x6f9, -0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9, -0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, -0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, -0x6f6,0x6f6,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x702,0x6ff, -0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705, -0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x705,0x72f,0x72f,0x72f,0x72f, -0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, -0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0xc51,0x8c4,0x8be,0x8bb, -0x8c1,0x8b8,0x744,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x8ca,0x744,0x744,0x744, -0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744, -0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x8c7,0x8c7, -0x74a,0x8d9,0x8dc,0x8e2,0x804,0x810,0x8f7,0x80d,0x8d0,0x8cd,0x8d0,0x8cd,0x8d6,0x8d3,0x8d6,0x8d3, -0x8d0,0x8cd,0x80a,0x8e2,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8d0,0x8cd,0x8e5,0x8ee,0x8eb,0x8eb, -0x750,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786, -0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x786,0x753,0x76e,0x74d,0x774,0x777, -0x771,0x789,0x789,0x789,0x789,0x789,0x789,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, -0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x753,0x76e,0x74d,0x76e,0xc54, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x12b4,0x12b4,0x12b4,0x12b4,0x12b4,0x7f5,0x80a,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0x80d,0x92d,0x92d,0x92d,0x92d,0x813,0x813,0x8e8,0x8f4,0x8f4,0x8f4,0x8f4,0x8f1,0x807,0x8df, -0xb19,0xb19,0xb19,0xc66,0xc84,0xc81,0xb34,0x8b5,0x819,0x816,0x819,0x81c,0x816,0x819,0x816,0x819, -0x816,0x819,0x816,0x816,0x816,0x816,0x816,0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x819,0x819, -0x816,0x819,0x819,0x816,0x819,0x819,0x816,0x816,0xc87,0x82b,0x825,0x82b,0x825,0x82b,0x825,0x82b, -0x825,0x82b,0x825,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825, -0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x825,0x828,0x82b,0x825,0x828,0x825,0x828, -0x825,0x828,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x828,0x828, -0x825,0x828,0x828,0x825,0x828,0x828,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x82b,0x825,0x82b, -0x825,0x825,0x825,0x825,0x825,0x825,0x82b,0x825,0x825,0x825,0x825,0x825,0x828,0x82b,0x82b,0x828, -0x828,0x828,0x828,0x8fd,0x900,0x82e,0x831,0xc6f,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837,0x837, -0x837,0x837,0x837,0x837,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843, -0xd74,0xd74,0xea6,0x83d,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0xd6e,0xd6e,0xd6e,0xd6e,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x846,0x846,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0xd77,0xd77,0x915, -0x915,0x915,0x915,0x915,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849,0x849, -0x849,0x849,0x849,0x849,0x849,0x849,0xd77,0xd77,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c, -0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x84c,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f,0x84f, -0x84f,0x84f,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9, -0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0xea9,0x1119,0x1119,0x1119,0x1119,0x852,0x852,0x852,0x852, +0x19d1,0x19d1,0x19d1,0x19d4,0x19dd,0x19d1,0x19d1,0x279,0x279,0x279,0x279,0x279,0x19e0,0x19e0,0x19e0,0x19e0, +0x19e0,0x19e0,0x19e0,0x19e3,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x19ec,0x19ec,0x19ec,0x19ec, +0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19e6,0x19e6, +0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e9,0x19e9,0x19e9,0x19e9,0x19ef,0x19ef,0x19ef, +0x19ef,0x19ef,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46, +0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x285, +0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x288,0x288,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a52,0x1a52,0x1a52,0x1a49,0x1a49,0x1a49,0x1a49, +0x288,0x288,0x1a49,0x1a49,0x1a52,0x1a52,0x1a52,0x1a52,0x1a4c,0x1a55,0x1a4f,0x1a55,0x1a52,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x28b,0x28b,0x28b,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a58,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a64,0x1a64,0x28b,0x28b,0x28e,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, +0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, +0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x28e,0x28e,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a94,0x1a94,0x1a94,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x1a97,0x1a97,0x1a97,0x1a97, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x1a9a,0x1a9a,0x1a9a,0x294,0x294,0x294,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x1a9a,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, +0x1a70,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1a6d, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a73,0x1a73,0x1a73,0x1a73, +0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x1a79,0x29a,0x29a,0x29a,0x29a,0x29a,0x1a76, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x1926,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x972,0x972, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x19f5,0x19f5,0x19f5,0x19f5,0x19f5, +0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x12d8,0x12d8,0x12d8,0x2a6,0x2a6, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0x2ac,0x2ac,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x2b2,0x2b2,0x17d0,0x17d0,0x2b5,0x2b5, +0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x3c0,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3c0,0x3c0,0x3c0,0x3c0,0x3ba,0x114c,0x1332,0x3c3,0x93c,0x93f,0x3b1, +0x3b1,0x1149,0x132f,0x132f,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x1149,0x3b4,0x3b4,0x3c0, +0xcd8,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3b4,0x3b4, +0x8c7,0x8ca,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3bd,0xfae,0xfab,0x1335, +0x1335,0x1335,0x1335,0x1335,0x14fa,0x114f,0x114f,0xf00,0xf00,0xdd1,0xf00,0xf00,0x3c3,0x3c3,0x3c3,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c6,0x3c3,0x3c3, +0x3c6,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x132f,0x1332,0x3b7,0x3c3,0x3c0,0x3c0,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x133b,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x462,0x133b,0x18a2,0x18a2,0xfcc,0x453,0x45c,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e,0x49e, +0x49e,0x49e,0x49e,0xbbe,0xbbe,0xddd,0xddd,0x8cd,0xde0,0x141c,0x141c,0x141c,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1, +0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a1,0x4a7,0x4a7,0x4a7,0x1164, +0x1164,0x1164,0x1164,0x1164,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, +0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4, +0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x4aa,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4b0,0x9b4,0xff9,0xff9,0xffc,0xff9,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad, +0x4b3,0x4ad,0x4b3,0x4ad,0x4b3,0x4ad,0xffc,0xff9,0xffc,0xff9,0xffc,0xff9,0x4bf,0x4bf,0x4bf,0x4bf, +0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4bf,0x4bf,0x4bf,0x4bf, +0x4bf,0x4bf,0x4bf,0x4bf,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x4c2,0x6a2,0x6a2,0x6a5,0x4dd, +0x6b1,0x6ae,0x6ae,0x6ab,0x507,0x507,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xb4f,0x6b4,0x4e9,0x6cc,0x6cf, +0x4fe,0x6b4,0x4ec,0x4ec,0x4dd,0x4f8,0x4f8,0x6a2,0x504,0x501,0x6a8,0x4d7,0x4ce,0x4ce,0x4d1,0x4d1, +0x4d1,0x4d1,0x4d1,0x4d4,0x4d1,0x4d1,0x4d1,0x4c8,0x510,0x50d,0x50a,0x50a,0x6c0,0x4f2,0x4ef,0x6bd, +0x6ba,0x6b7,0x6c9,0x4e0,0x6c6,0x6c6,0x4f5,0x4f8,0x6c3,0x6c3,0x4f5,0x4f8,0x4da,0x4dd,0x4dd,0x4dd, +0x4fb,0x4e6,0x4e3,0xbd3,0xae9,0xaec,0xae6,0xae6,0xae6,0xae6,0xbca,0xbca,0xbca,0xbca,0xbd0,0xd05, +0xd02,0xdec,0xdef,0xbcd,0xdef,0xdef,0xdef,0xdef,0xdec,0xdef,0xdef,0xbc7,0x534,0x534,0x534,0x534, +0x534,0x534,0x534,0x531,0x537,0x750,0x534,0x9b7,0x9d8,0xaef,0xaef,0xaef,0xbd9,0xbd9,0xdf5,0xdf5, +0xdf5,0xdf5,0x116d,0x1170,0x1170,0x1350,0x14e8,0x1512,0x1515,0x1515,0x1728,0x18a5,0x543,0x543,0x55b,0x6de, +0x540,0x6db,0x543,0x558,0x540,0x6de,0x552,0x55b,0x55b,0x55b,0x552,0x552,0x55b,0x55b,0x55b,0x6e7, +0x540,0x55b,0x6e1,0x540,0x54f,0x55b,0x55b,0x55b,0x55b,0x55b,0x540,0x540,0x546,0x6db,0x6e4,0x540, +0x55b,0x540,0x6ea,0x540,0x55b,0x549,0x561,0x6ed,0x55b,0x55b,0x54c,0x552,0x55b,0x55b,0x55e,0x55b, +0x552,0x555,0x555,0x555,0x555,0xafb,0xaf8,0xd08,0xdfe,0xbee,0xbf1,0xbf1,0xbeb,0xbe8,0xbe8,0xbe8, +0xbe8,0xbf1,0xbee,0xbee,0xbee,0xbee,0xbe5,0xbe8,0xdfb,0xf0c,0xf0f,0x1002,0x1173,0x1173,0x1173,0x6f3, +0x6f0,0x564,0x567,0x567,0x567,0x567,0x567,0x6f0,0x6f3,0x6f3,0x6f0,0x567,0x6f9,0x6f9,0x6f9,0x6f9, +0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9,0x570,0x570,0x570,0x570,0x6f6,0x6f6,0x6f6,0x6f6, +0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x576,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x573,0x57c,0x57c,0x576,0x576,0x576,0x579,0x573,0x576,0x576,0x573,0x573, +0x573,0x573,0x576,0x576,0x6fc,0x6fc,0x573,0x573,0x576,0x576,0x576,0x576,0x576,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x576,0x579,0x579,0x579,0x576,0x576,0x6ff,0x576,0x6ff,0x576,0x576,0x576, +0x576,0x576,0x576,0x576,0x573,0x576,0x573,0x573,0x573,0x573,0x573,0x573,0x576,0x576,0x573,0x6fc, +0x573,0x573,0x573,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x705,0x57f,0x705,0x705,0x582,0x57f,0x57f,0x705, +0x705,0x582,0x57f,0x705,0x582,0x57f,0x57f,0x705,0x57f,0x705,0x58e,0x58b,0x57f,0x705,0x57f,0x57f, +0x57f,0x57f,0x705,0x57f,0x57f,0x705,0x705,0x705,0x705,0x57f,0x57f,0x705,0x582,0x705,0x582,0x705, +0x705,0x705,0x705,0x705,0x70b,0x585,0x705,0x585,0x585,0x57f,0x57f,0x57f,0x705,0x705,0x705,0x705, +0x57f,0x57f,0x57f,0x57f,0x705,0x705,0x57f,0x57f,0x57f,0x582,0x57f,0x57f,0x582,0x57f,0x57f,0x582, +0x705,0x582,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x708,0x705,0x582,0x57f,0x705,0x705,0x705,0x705, +0x57f,0x57f,0x705,0x705,0x57f,0x582,0x708,0x708,0x582,0x582,0x57f,0x57f,0x582,0x582,0x57f,0x57f, +0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x705,0x705,0x582,0x582,0x705,0x705, +0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f, +0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x582,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582, +0x582,0x582,0x57f,0x588,0x57f,0x57f,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0x591,0xb04,0x591,0x591,0x591,0x591,0x591,0x591,0x59d,0x59a,0x59d,0x59a, +0x591,0x591,0x591,0x591,0x591,0x591,0x70e,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x813,0x813, +0x591,0x591,0x591,0x591,0x597,0x597,0x591,0x591,0x591,0x591,0x591,0x591,0x594,0x819,0x816,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, +0x591,0x591,0x591,0xb04,0xbfd,0xb04,0xb04,0xb04,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, +0x717,0x717,0x5a6,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66, +0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xd80,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x5a9,0x5ac,0x5ac,0x5ac, +0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x5ac,0x5ac,0x5ac,0x5ac,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x5af,0x5af,0x723,0x723,0x723,0x723,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0x729,0x729,0x5b2,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x5b5,0x5b5,0x5b2,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x729,0x729,0x5b8,0x5b8,0x72c,0x729, +0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729,0x5b8,0x5b8,0x72c,0x729,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x729, +0x726,0x5b2,0x5b8,0x729,0x5b2,0x5b2,0x726,0x729,0x729,0x729,0x5b8,0x5b8,0x5b2,0x5b2,0x5b2,0x5b2, +0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x729,0x726,0x729,0x726,0x5b2,0x5b8, +0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b2,0x5b2,0x726,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d,0xb0d, +0xc03,0xc03,0xc03,0xc06,0xc06,0xc81,0xc81,0xc03,0x5c7,0x5c7,0x5c7,0x5c7,0x5c4,0x73e,0x73b,0x5be, +0x5be,0x72f,0x5be,0x5be,0x5be,0x5be,0x735,0x72f,0x5be,0x5c4,0x5be,0x5bb,0xd89,0xd89,0xc0c,0xc0c, +0xe0a,0xb10,0x5c1,0x5c1,0x732,0x5ca,0x732,0x5c1,0x5c4,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5c4,0x5be, +0x5be,0x5be,0x5c4,0x5be,0x5be,0x5be,0x5c4,0x5c4,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, +0x5c4,0x5c7,0x5c7,0x5c1,0x5be,0x5be,0x5be,0x5be,0x741,0x5be,0x741,0x5be,0x5be,0x5be,0x5be,0x5be, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x5be,0x5be,0x5be,0x5be, +0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5c4,0x741,0x73e,0x5cd,0x741,0x72f,0x735,0x5c4,0x72f, +0x738,0x72f,0x72f,0x5be,0x72f,0x73e,0x5cd,0x73e,0xb10,0xb10,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc12,0xc0f,0xc0f,0xe07,0xebe,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x13da,0x13da,0x13da, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x151e,0x5df,0x5e8,0x5df,0x5df,0x13da,0x5d3,0x5d3, +0x5e8,0x5e8,0x13dd,0x13dd,0x5eb,0x5eb,0x5dc,0x5e2,0x5dc,0x5dc,0x5e2,0x5d3,0x5e2,0x5d3,0x5e2,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x747,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3, +0x13da,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x13da,0x13da,0x5d3,0x12d2,0x5d3,0x5d3,0x5d3,0x5d9, +0x5d9,0x5d9,0x5d9,0x135c,0x135c,0x5d3,0x5d6,0x5e5,0x5e8,0x5dc,0x5dc,0x5dc,0xc18,0xc15,0xc18,0xc15, +0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0xc18,0xc15,0x744,0x744,0x744,0x744,0x744,0x744, +0x744,0x744,0x744,0x744,0x5d3,0x5e2,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x13da,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x13da,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, +0x60c,0x612,0x603,0x606,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x609,0x609,0x609,0x609,0x609,0x609,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c, +0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x612,0x60c,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x612,0x60c,0x60f,0x615,0x612,0x60c, +0x612,0x60c,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, +0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x615,0x60f,0x615,0x612,0x60c,0x612,0x60c,0x612,0x60c, +0x612,0x60c,0x612,0x60c,0x612,0x60c,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x612,0x60c,0x60f,0x615, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60f,0x60f,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c, +0x60f,0x60c,0x60f,0x60f,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c,0x60f,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60c,0x60c,0x60c,0x60c,0x60f,0x60f,0x60c,0x60c,0x60f,0x60c,0x60f,0x60c,0x60c,0x60c,0x60c,0x60c, +0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f, +0x60f,0x60f,0x60f,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, +0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x618,0x618,0x618,0x618,0x100e,0x100e,0x100e,0x1521,0x1521,0x1521,0x1521,0x1521, +0x1521,0x1521,0x172e,0x172e,0x879,0x87f,0x87f,0x88b,0x88b,0x87c,0x873,0x87c,0x873,0x87c,0x873,0x87c, +0x873,0x87c,0x873,0x87c,0x627,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624, +0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624,0x62a,0x627,0x621,0x624, +0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714, +0x714,0x714,0x714,0x714,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, +0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, +0x711,0x711,0x711,0x711,0x711,0x711,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, +0x71a,0x71a,0x71d,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, +0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a, +0xc6f,0x8df,0x8d9,0x8d6,0x8dc,0x8d3,0x75f,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x8e5,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x8e2,0x8e2,0x765,0x8f4,0x8f7,0x8fd,0x81f,0x82b,0x912,0x828,0x8eb,0x8e8,0x8eb,0x8e8, +0x8f1,0x8ee,0x8f1,0x8ee,0x8eb,0x8e8,0x825,0x8fd,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8,0x8eb,0x8e8, +0x900,0x909,0x906,0x906,0x76b,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x76e, +0x789,0x768,0x78f,0x792,0x78c,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x79e,0x79e,0x79e,0x79e,0x79e, +0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x76e, +0x789,0x768,0x789,0xc72,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, +0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x810,0x825,0x828,0x828,0x828, +0x828,0x828,0x828,0x828,0x828,0x828,0x948,0x948,0x948,0x948,0x82e,0x82e,0x903,0x90f,0x90f,0x90f, +0x90f,0x90c,0x822,0x8fa,0xb34,0xb34,0xb34,0xc84,0xca2,0xc9f,0xb52,0x8d0,0x834,0x831,0x834,0x837, +0x831,0x834,0x831,0x834,0x831,0x834,0x831,0x831,0x831,0x831,0x831,0x831,0x834,0x834,0x831,0x834, +0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x834,0x834,0x831,0x831,0xca5,0x846,0x840,0x846, +0x840,0x846,0x840,0x846,0x840,0x846,0x840,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840, +0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x843,0x846, +0x840,0x843,0x840,0x843,0x840,0x843,0x840,0x840,0x840,0x840,0x840,0x840,0x843,0x843,0x840,0x843, +0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x843,0x843,0x840,0x840,0x840,0x840,0x840,0x846, +0x840,0x846,0x840,0x846,0x840,0x840,0x840,0x840,0x840,0x840,0x846,0x840,0x840,0x840,0x840,0x840, +0x843,0x846,0x846,0x843,0x843,0x843,0x843,0x918,0x91b,0x849,0x84c,0xc8d,0x852,0x852,0x852,0x852, 0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, -0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x855, -0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855, -0x852,0x855,0x852,0x855,0x855,0x852,0x852,0x855,0x855,0x855,0x852,0x852,0x852,0x852,0x14be,0x14be, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909, -0x12f6,0x12f6,0x12f6,0x12f6,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0xd6e,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90f,0x90c,0x90f,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72, -0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0xc72,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0xd77,0x990,0x972,0x972,0x972,0x972,0x96c,0x972,0x972, -0x984,0x972,0x972,0x96f,0x97b,0x981,0x981,0x981,0x981,0x981,0x984,0x96c,0x978,0x96c,0x96c,0x96c, -0x963,0x963,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x987,0x987,0x987,0x987,0x987,0x987,0x987,0x987, -0x987,0x987,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96f,0x963,0x96c,0x963, -0x96c,0x963,0x97e,0x975,0x97e,0x975,0x98d,0x98d,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9a2,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9a5,0x9a5,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9a8,0x9a8,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab, -0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ab,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b1,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0xa41,0xa41,0xfdb,0xa41,0xa41,0xa41,0xa44,0xa41,0xfdb,0xa41,0xa41,0xfd2,0xa3b,0xa2f,0xa2f,0xa2f, -0xa2f,0xa3e,0xa2f,0xfc0,0xfc0,0xfc0,0xa2f,0xa32,0xa3b,0xa35,0xfc6,0xfd5,0xfd5,0xfc0,0xfc0,0xfdb, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa47,0xa47,0xa38,0xa38,0xa38,0xa38, -0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa3e,0xa2f,0xa2f,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0, -0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, -0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xdcb,0xa56,0xa56,0xa56,0xa56, -0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa65,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x1152,0x114f,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa9b,0xa9b,0xa9b,0xa9e,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, -0xa9b,0xa9b,0xa9b,0xa9b,0xa83,0xa83,0xa98,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa98,0xa98, -0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, -0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, -0xabc,0xabc,0xabc,0xabc,0xabc,0xaa7,0xaa7,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabf,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xaec,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, -0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, -0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb25,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb28,0xb28,0xc75,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xc75,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x1509, -0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xcff,0xcff,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, -0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, -0xb4f,0xb4f,0xcfc,0xcfc,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd4d,0xd4d,0xd4d,0xd4d,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, -0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, -0xb52,0xb52,0xb52,0xb52,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xb55,0xb55,0xb64,0xb64,0xb64,0xb64,0xb64,0xb5b,0xb67,0xb6d,0xb6d,0xb6d,0xb61,0xb61, -0xb61,0xb6a,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb6d,0xb6d,0xb6d,0xb6d,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61, -0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0x1716,0x1716, -0xb79,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb70,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb70,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x855,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852, +0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x852,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0x85e,0xd92,0xd92,0xec1,0x858,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0xd8c,0xd8c,0xd8c,0xd8c,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x1aa3,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x864,0x864,0x864,0x864,0x864,0x864,0xd95, +0xd95,0xd95,0xd95,0x930,0x930,0x930,0x930,0x930,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864, +0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864, +0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0xd95,0xd95,0x867,0x867,0x867,0x867, +0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, +0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a, +0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a, +0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4, +0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0xec4,0x1131,0x1131,0x1131,0x1131, +0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x870,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x86d,0x870,0x86d,0x870,0x86d,0x870,0x870,0x86d,0x86d,0x870,0x870,0x870,0x86d,0x86d, +0x86d,0x86d,0x14d9,0x14d9,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x1311,0x1311,0x1311,0x1311,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, +0xd8c,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x92a,0x927,0x92a,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xc90,0xc90,0xc90, +0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0xd95,0x9ae,0x990,0x990,0x990, +0x990,0x98a,0x990,0x990,0x9a2,0x990,0x990,0x98d,0x999,0x99f,0x99f,0x99f,0x99f,0x99f,0x9a2,0x98a, +0x996,0x98a,0x98a,0x98a,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x9a5,0x9a5,0x9a5,0x9a5, +0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98d,0x981,0x98a,0x981,0x98a,0x981,0x99c,0x993,0x99c,0x993,0x9ab,0x9ab,0x9ba,0x9ba,0x9ba,0x9ba, +0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, +0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c3,0x9c3,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c6,0x9c6,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9, +0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9c9,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cf,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9cf,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2, +0x9d2,0x9d2,0x9d2,0x9d2,0xa5f,0xa5f,0xff3,0xa5f,0xa5f,0xa5f,0xa62,0xa5f,0xff3,0xa5f,0xa5f,0xfea, +0xa59,0xa4d,0xa4d,0xa4d,0xa4d,0xa5c,0xa4d,0xfdb,0xfdb,0xfdb,0xa4d,0xa50,0xa59,0xa53,0xfe1,0xfed, +0xfed,0xfdb,0xfdb,0xff3,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xa65,0xa65, +0xa56,0xa56,0xa56,0xa56,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5c,0xa5c,0xa4d,0xa4d,0xff3,0xff3, +0xff3,0xff3,0xfdb,0xfdb,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, +0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, +0xa5f,0xa5f,0xa5f,0xa5f,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xde9, +0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7d,0xa83,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a, +0x1167,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80, +0xa80,0xa80,0xa80,0xa80,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xab9,0xab9,0xab9,0xabc,0xabc,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xaa1,0xaa1,0xab6,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0xab6,0xab6,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, +0xab9,0xab9,0xab9,0xab9,0xada,0xada,0xada,0xada,0xada,0xac5,0xac5,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xadd, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb07,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb43,0xb43,0xc93,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc93,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, +0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, +0xb67,0xb67,0xb67,0x1524,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd1d,0xd1d,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xd1a,0xd1a,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, 0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb79,0xb79,0xb79,0xb79,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82, -0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb82,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, -0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, -0xbdf,0xbdf,0xbdc,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, -0xbdc,0xbdc,0xbdc,0xced,0xcf0,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde3, -0xefd,0xefd,0xefd,0xefd,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbeb,0xbeb,0xbeb,0xbeb,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf6,0xcf6,0xde9,0xea0,0xde9,0xde9,0xde9,0xde9,0xde6,0xde9,0xde6,0xde9, -0xde9,0xff0,0x128a,0x128a,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf8,0xdf5,0xf0f,0xf0f,0xf0f,0xf0f,0x1407, -0x1002,0x1407,0x134d,0x134d,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc5a,0xc57,0xc5a,0xc57,0xc5a,0xc57,0x1113,0x1110,0x1008,0x1005, -0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a,0xc2a, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc30,0xc30,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc33,0xc33,0xc33,0xc39, -0xc36,0xc60,0xc5d,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39,0xc36,0xc39, -0xc36,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc39,0xc36,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc39,0xc36,0xc33,0xc33,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc42,0xc42,0xc42,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3f,0xc3c,0xc3c,0xc3c, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0xc78, -0xcf9,0xd68,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xea0,0xea0,0xde6,0xde6,0xde6,0xde6, -0xde9,0xde9,0xf00,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0x12b7,0x12b7,0x128d, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd23,0xd23,0xd23,0xd23,0xd23,0xd20,0xd35,0xd35,0xd35,0xd2f, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35,0xd35,0xd35,0xd35, -0xd29,0xd29,0xd32,0xd32,0xd32,0xd32,0xd26,0xd26,0xd26,0xd26,0xd26,0xd2c,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfb,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd2f,0xd35, -0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd29,0xd29,0xd29, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xd38,0xd38,0xd38,0xd38,0xd38,0xd3b,0xd3b,0xd3b,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xe01,0xe01, -0xe01,0xe01,0xe01,0xe01,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0x111c,0x111c,0x100b,0x100b,0x100b, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44, -0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d,0xd4d, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59, -0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59,0xd59, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xecd,0xecd,0xe1f,0xe1f,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0xf15,0x1017,0x1017,0x1017,0x1017,0x1017, -0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014, -0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b, -0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b,0xe2e,0xe2b, -0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, -0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, -0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, -0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb82,0xb82,0xb82,0xb82,0xb82,0xb79,0xb85,0xb8b, +0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb76,0xb76,0xb76,0xb76,0xb76, +0xb76,0xb76,0xb76,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82,0xb82,0xb8b,0xb8b,0xb8b,0xb7f, +0xb7f,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb8b,0xb8b, +0xb8b,0xb8b,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb82, +0xb82,0xb82,0xb82,0xb82,0xb82,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0x1731,0x1731,0xb97,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb8e, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb8e,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97, +0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a, +0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a,0xb9a, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfa,0xbfd,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xd0b,0xd0e,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe01,0xe01,0xf18,0xf18,0xf18,0xf18,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc09,0xc09, +0xc09,0xc09,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd14,0xd14,0xe07,0xebb,0xe07,0xe07,0xe07,0xe07, +0xe04,0xe07,0xe04,0xe07,0xe07,0x1008,0x12a2,0x12a2,0xe10,0xe10,0xe10,0xe10,0xe10,0xe16,0xe13,0xf2a, +0xf2a,0xf2a,0xf2a,0x1422,0x101a,0x1422,0x1368,0x1368,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc78,0xc75,0xc78,0xc75,0xc78,0xc75, +0x112b,0x1128,0x1020,0x101d,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48,0xc48, +0xc48,0xc48,0xc48,0xc48,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4e,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc51,0xc51,0xc51,0xc57,0xc54,0xc7e,0xc7b,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57, +0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc57,0xc54,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc57,0xc54, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51, +0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc51,0xc57,0xc54,0xc51,0xc51, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc60,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc60,0xc60,0xc60,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a, +0xc5d,0xc5a,0xc5a,0xc5a,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0xd17,0xd86,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xebb,0xebb, +0xe04,0xe04,0xe04,0xe04,0xe07,0xe07,0xf1b,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008, +0x1008,0x12cf,0x12cf,0x12a5,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, +0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b,0xd3b, +0xd3b,0xd3b,0xd3b,0xd3b,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd41,0xd41,0xd41,0xd41,0xd41,0xd3e, +0xd53,0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd4d, +0xd53,0xd53,0xd53,0xd53,0xd47,0xd47,0xd50,0xd50,0xd50,0xd50,0xd44,0xd44,0xd44,0xd44,0xd44,0xd4a, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe19,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd4d,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd47,0xd47,0xd47,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, +0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a, +0xd4a,0xd4a,0xd4a,0xd4a,0xd56,0xd56,0xd56,0xd56,0xd56,0xd59,0xd59,0xd59,0xd56,0xd56,0xd56,0xd56, +0xd56,0xd56,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0x1134, +0x1134,0x1023,0x1023,0x1023,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c, +0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c, +0xd5c,0xd5c,0xd5c,0xd5c,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83,0xd83, +0xd83,0xd83,0xd83,0xd83,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, +0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, +0xe25,0xe25,0xe25,0xe25,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, +0xe2b,0xe2b,0xe2b,0xe2b,0xee8,0xee8,0xe3d,0xe3d,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0xf30,0x102f, +0x102f,0x102f,0x102f,0x102f,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c, +0x102c,0x102c,0x102c,0x102c,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49, +0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49,0xe4c,0xe49, +0xe4c,0xe49,0xe4c,0xe49,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, 0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xf18,0xf18,0xf18,0xf18,0x101a,0x101a,0x101a,0x101a,0x101a, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe6d, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe79,0xe79, -0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe76,0xe7f,0x1026,0x1020,0x102f,0x101d,0xe7c,0xe7c,0x101d,0x101d, -0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe88,0xe91,0xe91,0xe91,0xe91,0xe82,0xe91,0xe91,0xe91,0xe91, +0xe58,0xe58,0xe58,0xe58,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e, +0xe5e,0xe5e,0xe5e,0xe5e,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76, +0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xe76,0xf33,0xf33,0xf33,0xf33,0x1032, +0x1032,0x1032,0x1032,0x1032,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f,0xe7f, +0xe7f,0xe7f,0xe7f,0xe7f,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88,0xe88, +0xe88,0xe88,0xe88,0xe88,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91, 0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91,0xe91, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94,0xe94, -0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, +0xe91,0xe91,0xe91,0xe8b,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e, +0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe91, +0xe91,0xe91,0xe91,0xe91,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a, +0xe9a,0xe9a,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe97,0xe94,0xe9d,0x103e,0x1038,0x1047,0x1035, +0xe9a,0xe9a,0x1035,0x1035,0xeac,0xeac,0xea0,0xeac,0xeac,0xeac,0xea3,0xeac,0xeac,0xeac,0xeac,0xea0, 0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac,0xeac, -0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca,0xeca, +0xeac,0xeac,0xeac,0xeac,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, +0xeaf,0xeaf,0xeaf,0xeaf,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0xec7,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5, +0xee5,0xee5,0xee5,0xee5,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d, +0x113d,0x113d,0x113d,0x113d,0xf18,0xf18,0xf18,0xf15,0xf15,0xf15,0xf15,0xf15,0x1176,0x13d1,0x13d1,0x13d1, +0x13d1,0x1353,0x1353,0x1353,0x13d4,0x1356,0x1356,0x13d4,0x1518,0x1518,0x1518,0x1518,0x151b,0x151b,0x151b,0x17e2, +0x17e2,0x17e2,0x17e2,0x18a8,0xf2d,0xf2d,0xf2d,0xf2d,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, +0x1023,0x1023,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, +0x1026,0x1026,0x1026,0x1026,0xf4e,0xf4e,0xf4e,0xf4e,0xf60,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69, +0xf6c,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf6c,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69, +0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf51,0xf4e,0xf4e,0xf4e, +0xf4e,0xf4e,0xf4e,0xf63,0xf4e,0xf63,0xf60,0xf60,0xf75,0xf72,0xf75,0xf75,0xf75,0xf72,0xf72,0xf75, +0xf72,0xf75,0xf72,0xf75,0xf72,0x1059,0x1059,0x1059,0x1194,0x1050,0x1059,0x1050,0xf72,0xf75,0xf72,0xf72, +0x1050,0x1050,0x1050,0x1050,0x1053,0x1056,0x1194,0x1194,0xf78,0xf78,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d, +0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d, +0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xfdb,0xff3,0xfea,0xff0, +0xff0,0xff3,0xff3,0xfea,0xfea,0xff0,0xff0,0xff0,0xff0,0xff0,0xff3,0xff3,0xff3,0xfdb,0xfdb,0xfdb, +0xfdb,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xfdb,0xfea, +0xfed,0xfdb,0xfdb,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xfde,0xff3,0xff0,0xfe7,0xfe7,0xfe7,0xfe7, +0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0x115e,0x115e,0x115b,0x1158,0xfe4,0xfe4,0x100b,0x100b,0x100b,0x100b, +0x12cf,0x12cf,0x12a5,0x12a5,0x12ab,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x13d7,0x12ab,0x12a5,0x12ab,0x12a2,0x12ab, +0x12cf,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a2,0x12a2,0x12a5,0x12a2,0x12a2,0x12a5,0x1026,0x1026,0x1026,0x1026, +0x1026,0x1023,0x1023,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1530,0x1530,0x1530,0x1134,0x1023,0x1023,0x1023, +0x1023,0x12db,0x12b4,0x12b4,0x12b4,0x12b4,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1044,0x1044,0x1041,0x103b, +0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1038,0x1038,0x1038,0x1038,0x104d,0x104a,0x1038,0x1191,0x142e,0x1431, +0x1431,0x142e,0x142e,0x142e,0x142e,0x142e,0x1434,0x1434,0x154b,0x153f,0x153f,0x153c,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x105f,0x105c,0x105c,0x106b,0x1062,0x1377,0x1374,0x173a,0x1377,0x1374,0x143d,0x143a, +0x154e,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x1554,0x154e,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062, +0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x1062,0x1065,0x1062,0x1062,0x1062, +0x1062,0x1062,0x1062,0x1062,0x1062,0x106b,0x1062,0x106b,0x1062,0x106b,0x106b,0x1062,0x106e,0x106e,0x1074,0x107a, +0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, +0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1074,0x106e,0x106e, +0x106e,0x106e,0x1074,0x1074,0x106e,0x106e,0x1077,0x1446,0x1443,0x1443,0x107a,0x107a,0x1071,0x1071,0x1071,0x1071, +0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1098,0x1098,0x1098,0x1098, +0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098, +0x1098,0x1098,0x1098,0x1098,0x109b,0x109b,0x109b,0x109e,0x109b,0x109b,0x10a1,0x10a1,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10b0,0x10a7,0x10b6,0x10b3,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad, +0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x10ad,0x137d,0x137a,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c5,0x1146,0x10b9,0x10b9,0x10b9,0x10bf, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x10bc,0x10bc,0x10bf,0x10cb,0x10c8,0x10c2,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2, +0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x10c8,0x10c2,0x1563,0x1560,0x1563,0x1560, +0x1566,0x1566,0x1743,0x144c,0x10d4,0x10d4,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4,0x10d4, +0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0,0x10e0,0x113a,0x10e9, +0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8, +0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e3,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6, +0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, +0x1122,0x1122,0x1122,0x1122,0x1137,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, 0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0xefd,0xefd,0xefd,0xefa,0xefa,0xefa,0xefa,0xefa,0x115e,0x13b6,0x13b6,0x13b6,0x13b6,0x1338,0x1338,0x1338, -0x13b9,0x133b,0x133b,0x13b9,0x14fd,0x14fd,0x14fd,0x14fd,0x1500,0x1500,0x1500,0x17c7,0x17c7,0x17c7,0x17c7,0x188d, -0xf12,0xf12,0xf12,0xf12,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b,0x100b, -0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e, -0xf33,0xf33,0xf33,0xf33,0xf45,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e,0xf51,0xf4e, -0xf4e,0xf4e,0xf51,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e, -0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf36,0xf45,0xf33,0xf33,0xf33,0xf33,0xf33,0xf48, -0xf33,0xf48,0xf45,0xf45,0xf5a,0xf57,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xf5a,0xf57,0xf5a,0xf57,0xf5a, -0xf57,0x1041,0x1041,0x1041,0x117c,0x1038,0x1041,0x1038,0xf57,0xf5a,0xf57,0xf57,0x1038,0x1038,0x1038,0x1038, -0x103b,0x103e,0x117c,0x117c,0xf5d,0xf5d,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x104a,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72, -0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72, -0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, -0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78, -0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78, -0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xf78,0xfc0,0xfdb,0xfd2,0xfcf,0xfcf,0xfdb,0xfdb,0xfd2, -0xfd2,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfdb,0xfdb,0xfdb,0xfc0,0xfc0,0xfc0,0xfc0,0xfdb,0xfdb,0xfdb, -0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfc0,0xfd2,0xfd5,0xfc0,0xfc0,0xfd8, -0xfd8,0xfd8,0xfd8,0xfd8,0xfd8,0xfc3,0xfdb,0xfd8,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, -0xfcc,0xfcc,0x1146,0x1146,0x1143,0x1140,0xfc9,0xfc9,0xff3,0xff3,0xff3,0xff3,0x12b7,0x12b7,0x128d,0x128d, -0x1293,0x128a,0x128a,0x128a,0x128a,0x128d,0x13bc,0x1293,0x128d,0x1293,0x128a,0x1293,0x12b7,0x128a,0x128a,0x128a, -0x128d,0x128d,0x128a,0x128a,0x128d,0x128a,0x128a,0x128d,0x100e,0x100e,0x100e,0x100e,0x100e,0x100b,0x100b,0x100e, -0x100e,0x100e,0x100e,0x100e,0x100e,0x1515,0x1515,0x1515,0x111c,0x100b,0x100b,0x100b,0x100b,0x12c3,0x129c,0x129c, -0x129c,0x129c,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x102c,0x102c,0x1029,0x1023,0x1029,0x1023,0x1029,0x1023, -0x1029,0x1023,0x1020,0x1020,0x1020,0x1020,0x1035,0x1032,0x1020,0x1179,0x1413,0x1416,0x1416,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1419,0x1419,0x1530,0x1524,0x1524,0x1521,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1047,0x1044,0x1044,0x1053,0x104a,0x135c,0x1359,0x171f,0x135c,0x1359,0x1422,0x141f,0x1533,0x1533,0x1539,0x1533, -0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1539,0x1533,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a, -0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x104a,0x104d,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a, -0x104a,0x1053,0x104a,0x1053,0x104a,0x1053,0x1053,0x104a,0x1056,0x1056,0x105c,0x1062,0x1062,0x1062,0x1062,0x1062, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062, -0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x105c,0x1056,0x1056,0x1056,0x1056,0x105c,0x105c, -0x1056,0x1056,0x105f,0x142b,0x1428,0x1428,0x1062,0x1062,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059,0x1059, -0x1059,0x1059,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1083,0x1083,0x1083,0x1086,0x1083,0x1083,0x1089,0x1089,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c, -0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c, -0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1098,0x108f,0x109e,0x109b,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095, -0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1095,0x1362,0x135f,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10ad,0x112e,0x10a1,0x10a1,0x10a1,0x10a7,0x1431,0x1431,0x1431,0x1431, -0x1431,0x1431,0x1431,0x1431,0x10a4,0x10a4,0x10a7,0x10b3,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa, -0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x10b0,0x10aa,0x1548,0x1545,0x1548,0x1545,0x154b,0x154b,0x1728,0x1431, -0x10bc,0x10bc,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, -0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x1122,0x10d1,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10cb,0x10cb,0x10cb,0x10cb, -0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef, -0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x10ef,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x110a,0x110a,0x110a,0x110a, -0x111f,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110d,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x1119,0x1119,0x1119,0x1119, -0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x12bd,0x14bb,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x18f6,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x1185,0x1185,0x1188,0x1188,0x118e,0x1185,0x1185,0x1185,0x1185,0x1185,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194, -0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x1194,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af, -0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11af,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11b8,0x11be,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11d0,0x11d0,0x11d0,0x11d0, -0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x1308,0x11d6,0x130b, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d3,0x11d3,0x11d3,0x11d6,0x172b,0x172e,0x1950,0x194d,0x11d9,0x11d9,0x11d9,0x11e8, -0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee, -0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11dc, -0x11e8,0x11e8,0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11d9,0x11e8,0x11e8,0x11e8,0x11fa,0x11fa,0x11fa,0x11fa, -0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fd,0x11fa,0x11fa,0x11fa, -0x11fa,0x11fa,0x11fa,0x11f4,0x11f4,0x11f4,0x11fa,0x11f7,0x1551,0x1554,0x1557,0x1557,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x1200,0x120c,0x1200,0x1200, -0x1200,0x1215,0x1215,0x1200,0x1200,0x1215,0x120c,0x1215,0x1215,0x120c,0x1200,0x1203,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x1227,0x1227,0x1227,0x1227, -0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227, -0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x123f,0x123f,0x123f,0x123f, +0x1131,0x1131,0x1131,0x1131,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x14d6,0x17c1,0x17c1,0x17c1, +0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x119d,0x119d,0x11a0,0x11a0,0x11a6,0x119d,0x119d,0x119d,0x119d,0x119d, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d0,0x11d6, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2, +0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, +0x11e8,0x1323,0x11ee,0x1326,0x11ee,0x11ee,0x11ee,0x11ee,0x11eb,0x11eb,0x11eb,0x11ee,0x1746,0x1749,0x196b,0x1968, +0x11f1,0x11f1,0x11f1,0x1200,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x11f4,0x1200,0x1200,0x11f1,0x11f1,0x11f1,0x11f1,0x1200,0x1200,0x11f1,0x11f1,0x1200,0x1200, +0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x1215,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x120c,0x120c,0x120c,0x1212,0x120f,0x156c,0x156f,0x1572,0x1572, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1218,0x1224,0x1218,0x1218,0x1218,0x122d,0x122d,0x1218,0x1218,0x122d,0x1224,0x122d,0x122d,0x1224,0x1218,0x121b, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, 0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123c,0x123c,0x123c,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1257,0x1257,0x1257,0x1257, 0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x125d,0x126c,0x126f, +0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1254,0x1254,0x1254, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260, 0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, -0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, -0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x1272,0x126f,0x126f,0x126f,0x126f,0x126c,0x126c,0x126c,0x1260, -0x1260,0x1260,0x1260,0x126c,0x126c,0x1266,0x1263,0x1269,0x1269,0x1278,0x1275,0x1275,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x1281,0x1281,0x127e, -0x127e,0x127e,0x127b,0x127b,0x127b,0x127b,0x127e,0x127b,0x127b,0x127b,0x1281,0x127e,0x1281,0x127e,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b, -0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x127b,0x1281,0x127e,0x127e,0x127b,0x127b,0x127b,0x127b, -0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a5,0x12a5,0x12a5,0x1284,0x1956, -0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x12ae, -0x128d,0x128d,0x133e,0x128a,0x133e,0x133e,0x133e,0x133e,0x128a,0x1290,0x12b7,0x128a,0x128a,0x128a,0x128a,0x128a, -0x1290,0x1293,0x12b7,0x12b7,0x1293,0x12b7,0x128a,0x1293,0x1293,0x1296,0x12b7,0x128a,0x128a,0x12b7,0x128d,0x128d, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x129f,0x129f,0x129f,0x129f,0x13c8,0x13a7, -0x12a8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x1854,0x1854,0x1854,0x1854,0x1854, -0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12ae,0x13b0,0x13b0,0x13b0,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x13aa, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x12ab, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, -0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380,0x1380, -0x1395,0x1386,0x1395,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13d4,0x13d1,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13da,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13dd,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da, -0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, -0x13da,0x13da,0x1563,0x1563,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f, -0x156f,0x17a9,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x17a9,0x17a9,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x1569,0x1569,0x156f,0x156f,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x156f,0x156f,0x13dd,0x13dd,0x13e0,0x13e0, -0x13e0,0x16da,0x13dd,0x13e0,0x13dd,0x13dd,0x13e0,0x1572,0x1572,0x156f,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x156f,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x1569,0x1569,0x156f, -0x16da,0x156f,0x1569,0x156f,0x17a9,0x17a9,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x13dd,0x156f,0x13e0,0x13e0, -0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0, -0x13e0,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, -0x13e0,0x13dd,0x13dd,0x13dd,0x13e0,0x13dd,0x13dd,0x13dd,0x13dd,0x13e0,0x13e0,0x13e0,0x13dd,0x13e0,0x13e0,0x13e0, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x16da,0x13dd,0x13dd,0x13dd,0x13dd,0x156f,0x1569,0x17a9, -0x1437,0x1437,0x1437,0x1437,0x1563,0x1563,0x1566,0x1566,0x1566,0x156c,0x156f,0x17a9,0x17a9,0x17a9,0x17a9,0x1731, -0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x156f,0x1572,0x1572,0x156f,0x156f, -0x156f,0x156f,0x185d,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x156f,0x1569,0x1569,0x1569,0x1569, -0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569,0x156f,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x156f,0x13dd,0x13dd,0x13dd,0x13dd,0x13dd,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1, -0x13e3,0x14c1,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x14c1, -0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x14c1,0x14c1,0x13e3,0x13e3,0x13e3,0x13e3,0x14c1,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16e0,0x16e0,0x17af,0x17af,0x13e6,0x13e6,0x13e6, -0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f, -0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ec,0x13ec,0x13ec,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x17dc,0x17dc,0x17d9,0x1734,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x157b,0x1449,0x1449,0x1449,0x145b,0x145b,0x145b,0x145b,0x145b, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x1275,0x1275,0x1284,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287, +0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x128a,0x1287,0x1287,0x1287, +0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x1287,0x128a,0x1287,0x1287,0x1287,0x1287, +0x1284,0x1284,0x1284,0x1278,0x1278,0x1278,0x1278,0x1284,0x1284,0x127e,0x127b,0x1281,0x1281,0x1290,0x128d,0x128d, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1299,0x1299,0x1299,0x1296,0x1296,0x1296,0x1293,0x1293,0x1293,0x1293,0x1296,0x1293,0x1293,0x1293,0x1299,0x1296, +0x1299,0x1296,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1299,0x1296,0x1296, +0x1293,0x1293,0x1293,0x1293,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12bd, +0x12bd,0x12bd,0x129c,0x1971,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb, +0x13cb,0x12c6,0x13cb,0x12c6,0x12a5,0x12a5,0x1359,0x12a2,0x1359,0x1359,0x1359,0x1359,0x12a2,0x12a8,0x12cf,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a8,0x12ab,0x12cf,0x12cf,0x12ab,0x12cf,0x12a2,0x12ab,0x12ab,0x12ae,0x12cf,0x12a2, +0x12a2,0x12cf,0x12a5,0x12a5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12b7,0x12b7, +0x12b7,0x12b7,0x13e3,0x13c2,0x12c0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x186f, +0x186f,0x186f,0x186f,0x186f,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c6,0x13cb,0x13cb,0x13cb,0x12c0,0x12c0, +0x12c0,0x12c0,0x12c0,0x13c5,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x12c3,0x13c8,0x13c8,0x13c8,0x13c8, +0x13c8,0x13c8,0x13c8,0x12c3,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, +0x12ed,0x12ed,0x12ed,0x12ed,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x1377,0x1374,0x143d,0x1554, +0x1554,0x1554,0x17ee,0x195f,0x1554,0x1554,0x173d,0x173d,0x173d,0x1737,0x173d,0x1737,0x1962,0x195f,0x1a1c,0x1a19, +0x1a1c,0x1a19,0x1a1c,0x1a19,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x13b0,0x13a1,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9, +0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, +0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13ef,0x13ec,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f8, +0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f8,0x13f5,0x13f5,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x157e,0x157e,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x1584,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x158a,0x158a,0x158a,0x17c4,0x17c4,0x17c4,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x17c4,0x17c4, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x1584,0x1584,0x158a,0x158a,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x158a,0x158a, +0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x16f5,0x13f8,0x13fb,0x13f8,0x13f8,0x13fb,0x158d,0x158d,0x158a,0x158a,0x17c4, +0x17c4,0x17c4,0x17c4,0x17c4,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x1584,0x1584,0x158a,0x16f5,0x158a,0x1584,0x158a,0x17c4,0x17c4,0x17c4,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x158a, +0x13f8,0x158a,0x13fb,0x13fb,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, +0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13fb,0x13fb, +0x13f8,0x13fb,0x13fb,0x13fb,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13fb,0x13f8,0x13fb,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x16f5,0x13f8,0x13f8,0x13f8,0x13f8,0x158a,0x1584,0x17c4, +0x1452,0x1452,0x1452,0x1452,0x157e,0x157e,0x1581,0x1581,0x1581,0x1587,0x158a,0x17c4,0x17c4,0x17c4,0x17c4,0x174c, +0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x158a,0x158d,0x158d,0x158a,0x158a, +0x158a,0x158a,0x1878,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x158a,0x1584,0x1584,0x1584,0x1584, +0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584,0x158a,0x1581,0x1581,0x1581,0x1581, +0x1581,0x1581,0x158a,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc, +0x13fe,0x14dc,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x14dc, +0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x14dc,0x14dc,0x13fe,0x13fe,0x13fe,0x13fe,0x14dc,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x16fb,0x16fb,0x17ca,0x17ca,0x1401,0x1401,0x1401, +0x13fe,0x13fe,0x13fe,0x1401,0x1401,0x1401,0x1401,0x1401,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1404,0x1404,0x1404,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1407,0x1407,0x1407,0x1404, +0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x17f7,0x17f7,0x17f4,0x174f,0x1458,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1596,0x1464,0x1464,0x1464,0x1476,0x1476,0x1476,0x1476,0x1476, 0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476, -0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, -0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, -0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x1485,0x1485,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497, +0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, 0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497, -0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1491,0x1491,0x1491,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1491,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x192c,0x192c,0x192c,0x1515,0x1515,0x1515,0x1569,0x1569,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x156f,0x1566,0x1566,0x1566,0x1566, -0x1566,0x1566,0x1566,0x1566,0x156f,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x156f, -0x1569,0x1569,0x156f,0x156f,0x156f,0x156f,0x1569,0x1569,0x1572,0x1569,0x1569,0x1569,0x1569,0x16dd,0x16dd,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x185a,0x156f,0x1569,0x1569,0x156f,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x156f,0x156f,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x156f,0x1569,0x1569,0x1569,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593, -0x1593,0x1593,0x1593,0x1593,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, +0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1a25,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a, +0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x149a,0x14a0,0x14a0,0x14ac,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14ac,0x14ac,0x14ac,0x14a0,0x14a0, +0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14ac,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3, +0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1947,0x1947,0x1947,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1a13,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x18ae,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1584,0x1584,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x158a,0x1581,0x1581,0x1581,0x1581, +0x1581,0x1581,0x1581,0x1581,0x158a,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x158a, +0x1584,0x1584,0x158a,0x158a,0x158a,0x158a,0x1584,0x1584,0x158d,0x1584,0x1584,0x1584,0x1584,0x16f8,0x16f8,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1875,0x158a,0x1584,0x1584,0x158a,0x1584,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x158a,0x158a,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584, +0x158a,0x1584,0x1584,0x1584,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, 0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae, -0x15ae,0x15ae,0x15ae,0x15ae,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed, -0x15ed,0x15ed,0x15ed,0x15de,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f0, -0x15f9,0x15f9,0x15f9,0x15f9,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc, -0x15fc,0x15fc,0x15fc,0x15fc,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x160e,0x1617,0x1617,0x1617, +0x15ae,0x15ae,0x15ae,0x15ae,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, +0x15c9,0x15c9,0x15c9,0x15c9,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x15f9,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611, +0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x160b, +0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, 0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617, -0x1617,0x1617,0x1617,0x1617,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, -0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, -0x1620,0x1620,0x1620,0x1620,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x162f, -0x162f,0x1623,0x162f,0x1626,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1617,0x1617,0x1617,0x1617,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1629,0x1632,0x1632,0x1632, 0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, -0x1656,0x1653,0x1653,0x1653,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f, -0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1665,0x1665,0x1665,0x1662,0x1662,0x1662, -0x165f,0x165f,0x165f,0x165f,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x167a,0x167a,0x166e,0x166b,0x166b, -0x166b,0x166b,0x166b,0x166b,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674, -0x1674,0x1674,0x1674,0x1674,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, -0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d, -0x167d,0x167d,0x167d,0x167d,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x16a7,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0,0x16b0, -0x16b0,0x16b0,0x16b0,0x16b0,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16b3,0x16c2,0x16c2,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16c2,0x16b3,0x16c5, -0x16c5,0x16b3,0x16c5,0x16b3,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8, -0x16c8,0x16c8,0x16c8,0x16c8,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, -0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, -0x16d7,0x16d7,0x16d7,0x16d7,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x177c,0x1779,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776, -0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782, -0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782, -0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794, -0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1794,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x1632,0x1632,0x1632,0x1632,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, +0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b, +0x163b,0x163b,0x163b,0x163b,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x164d,0x164a,0x164a,0x164a,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x164a, +0x164a,0x163e,0x164a,0x1641,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x164d,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x166e,0x166e,0x166e,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1680,0x1680,0x1680,0x167d,0x167d,0x167d, +0x167a,0x167a,0x167a,0x167a,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1695,0x1695,0x1689,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x168f,0x168f,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b, +0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x1698,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16cb,0x16cb,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16ce,0x16dd,0x16dd,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16ce,0x16dd,0x16ce,0x16e0, +0x16e0,0x16ce,0x16e0,0x16ce,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2, +0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2, +0x16f2,0x16f2,0x16f2,0x16f2,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1734,0x1734,0x1734,0x1734,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1947,0x1947,0x1947,0x1a13,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, +0x1755,0x1755,0x1755,0x1755,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1797,0x1794,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, 0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d, -0x179d,0x179d,0x179d,0x179d,0x179d,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, 0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, -0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, +0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, 0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x1866,0x1866,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x17fa,0x17fa,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7, -0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7, -0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17f7,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, -0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1845,0x1845,0x1845, -0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1830,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848, -0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1848,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1863,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1902,0x19e0,0x19e0,0x19e0,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866, -0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1866,0x1902,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f, -0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, -0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9, -0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18d5,0x18db,0x18d8,0x18d8,0x18d8, -0x18d8,0x18e7,0x18ed,0x18d8,0x18d8,0x18d8,0x18d8,0x18e4,0x18ea,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8, -0x18d8,0x18d8,0x18d8,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea, -0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18ea,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc, -0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x19e0, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0, -0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x19e0,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b, -0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911, -0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1911,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980, -0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x1980,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5, +0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b5,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0, +0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0, +0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1815,0x1815,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, +0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1860,0x1860,0x1860, +0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x184b,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1884,0x1881, +0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x1884,0x1920,0x1920,0x1884,0x1884,0x1884,0x1884,0x1884, +0x1884,0x1884,0x1881,0x187e,0x1884,0x1884,0x1884,0x1a85,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x187e,0x1881, +0x1881,0x1881,0x1881,0x1881,0x191d,0x19fb,0x19fb,0x19fb,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x191d,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, +0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x18e4,0x18e4,0x18e4,0x18e4,0x1a37,0x1a37,0x18e7,0x18e7, +0x18e7,0x18e7,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18e1, +0x18d2,0x18d5,0x18d8,0x18ea,0x18ea,0x1986,0x18db,0x18db,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, +0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4, +0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, +0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x18f0,0x18f6,0x18f3,0x18f3,0x18f3, +0x18f3,0x1902,0x1908,0x18f3,0x18f3,0x18f3,0x18f3,0x18ff,0x1905,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3, +0x18f3,0x18f3,0x18f3,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905, +0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb, +0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926, +0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x1926,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c, +0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x192c,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, 0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, +0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, +0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6, +0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, 0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc, -0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf, -0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf, -0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19bf,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, -0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c8, -0x19c8,0x19c8,0x19c8,0x19c8,0x19c8,0x19c5,0x19c5,0x19c5,0,0,0,0 +0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19bc,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7, +0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19d7,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, +0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3, +0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3, +0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e0,0x19e0,0x19e0,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a, +0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1aa0,0x1aa0,0x1a6a,0x1aa0,0x1a6a,0x1a6a,0x1a6a,0x1a6a, +0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a70,0x1a70,0x1a70,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c, +0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0x1a7c,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4948, + propsVectorsTrie_index+4952, NULL, - 4948, - 25064, + 4952, + 25636, 0xa40, - 0x13d4, + 0x13d8, 0x0, 0x0, 0x110000, - 0x7538, + 0x7778, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6639]={ +static const uint32_t propsVectors[6822]={ 0x67,0,0,0x67,0,0x4e00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, 0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0, 0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0, @@ -3307,401 +3375,414 @@ static const uint32_t propsVectors[6639]={ 0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0,0,0x11867,0, 0,0x11967,0,0x4e00000,0x11a67,0,0,0x11b67,0,0,0x11c67,0,0,0x11d67,0,0, 0x11e67,0,0,0x11f67,0,0,0x12067,0,0,0x12167,0,0,0x12267,0,0,0x12367, -0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000,0xa5e67,0, -0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000, -0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001,0x116a8a0,0x11000200, -0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x14200000,0x11000200,0x24000008,0x1710000,0x11000200,0x40000001, -0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319,0x7c00100,0x250400, -0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100,0x230400,0x11000419, -0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400,0x11000600,0x4000400, -0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400, -0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800, -0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500, -0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401, -0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908, -0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100, -0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000, -0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00, -0x80000000,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000, -0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402, -0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a, -0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460,0x11001004,0x2802400, -0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004,0x6800100,0x962541, -0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400,0x962460,0x11001110, -0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400, -0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f,0x2806400,0x962460, -0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f, -0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541,0x11001423,0x7c00100, -0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524,0x6800000,0x1329800, -0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800000,0x1329800,0x11001615, -0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460,0x1100171a,0x6800000, -0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926,0x2802100,0x1862460, -0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000,0x1329800,0x11001926, -0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460,0x11001a18,0x2802400, -0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18,0x7c00900,0x1830000, -0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x220400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100,0x2330520,0x11001e12, -0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001,0x1100270e,0x4000400, -0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800,0x80000,0x1c18020, -0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000,0x201c00,0x11002800, -0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000,0x11002800,0x24000000, -0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800,0x24000008,0x1710000, -0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800, -0x40080000,0x918820,0x11002801,0x80000,0xaa65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f,0x11002900,0x4000020, -0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900,0x4000020,0x141000f, -0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000,0x1600002,0x11002b01, -0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f,0x11002c00,0x4000020, -0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00,0x7c00120,0x250402, -0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000,0x200006,0x11002d19, -0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000,0x11002e00,0x24000020, -0x200001,0x11002e00,0x24000020,0x14200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000, -0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,0x11003000,0x24000020,0x200000,0x11003000, -0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000, -0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x14200000,0x11003600,0x24000020,0x200000, -0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700, -0x24000000,0x96800000,0x11003700,0x24000020,0x4200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0x1710000,0x11003800,0x24000000,0x4200000,0x11003800,0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000, -0x11003800,0x24000000,0x96800000,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013, -0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100, -0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460, -0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502, -0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400, -0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000, -0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x14200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219, -0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100, -0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400, -0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701, -0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100, -0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002, -0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800, -0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020, -0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f, -0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1410000f,0x11022c00,0x7c00120,0x120405,0x11022c0e, -0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100, -0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x14100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001, -0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300, -0x4000100,0x150403,0x11023300,0x4000100,0x14150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020, -0x100000,0x11023600,0x24000020,0x14100000,0x11023700,0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000, -0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x4100000,0x11023700,0x24000020,0x14100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67, -0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100, -0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011, -0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700, -0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020, -0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11, -0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100, -0x6800000,0x201c00,0x11080100,0x68000c0,0x19329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000, -0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000, -0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100, -0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010, -0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400, -0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200, -0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000, -0x1410001,0x110a3700,0x24000000,0x34200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000, -0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14, -0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900, -0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000, -0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711, -0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000, -0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02, -0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400, -0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010, -0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400, -0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f54, -0xc000010,0x448000,0x11401d83,0x4000000,0x200000,0x11403dab,0x4000000,0xe00000,0x114457a0,0x4000004,0x120000a,0x114457a0,0x4000008,0x81000a,0x114457a0,0x4000008, -0x141000a,0x114457a0,0x4000010,0x87000a,0x114457a0,0xc000010,0x84800a,0x114457a9,0x3802500,0x126246a,0x114457a9,0x7c00d00,0x2530c0a,0x114a3da0,0x24000000,0x810000, -0x114a3da0,0x24000000,0x1410000,0x114a3da0,0x24000008,0x810000,0x114a3da0,0x24000008,0x1410000,0x114a3da0,0x24000010,0x870000,0x114a3da0,0x2c000010,0x848000,0x114a3da6, -0x4000000,0xe00000,0x114a3da6,0x24000000,0xe00000,0x114a3da6,0x24000002,0x1200000,0x114a3da6,0x24000002,0x14e00000,0x114a3da6,0x24000008,0x810000,0x114a3da6,0x24000008, -0x1410000,0x114a3da9,0x7c00900,0x930c00,0x114a3da9,0x7c00900,0xe30c00,0x114a3dab,0x7c00300,0xe30000,0x114a3ea9,0x7000400,0x1200c02,0x114a3fa0,0x4000004,0x1200000, -0x114a3fa9,0x7c00d00,0x2530c00,0x114a42ab,0x4000000,0xe00000,0x114a42ab,0x4000000,0xe0000f,0x114a44ab,0x4000000,0xe00002,0x114a44ab,0x4000000,0xe00003,0x114a44ab, -0x4000000,0x14e00003,0x114a45ab,0x4000000,0xe00002,0x114a45ab,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500, -0x962460,0x11800f29,0x2802400,0x962460,0x11800f36,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dac,0x2802400,0x962460, -0x118a3ea9,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6b, -0x6800000,0x1329800,0x11c01070,0x6800000,0x1329800,0x11c01174,0x6800000,0x1329800,0x11c01278,0x6800000,0x1329800,0x11c0147c,0x4000000,0x200000,0x11c0147c,0x6800000, -0x1329800,0x11c05123,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460, -0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27, -0x4000000,0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000, -0x1410000,0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540, -0x20001b27,0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67, -0,0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0, -0,0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400, -0x30000419,0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600, -0x7c00500,0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100, -0x220401,0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400, -0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22, -0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100, -0x962460,0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400, -0x30001b27,0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c, -0x2802100,0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100, -0x1862540,0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000, -0x30001f0b,0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128, -0x4000010,0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001, -0x445800,0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460, -0x30002417,0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417, -0x4000010,0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100, -0x1830000,0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000, -0x3000251b,0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b, -0x7c00900,0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010, -0x1248002,0x30002800,0x2c000010,0x15248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000, -0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100, -0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x4200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0, -0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002, -0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611, -0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402589,0x4000010,0x400000,0x30402589,0x4000010, -0xb70000,0x30402589,0xc000010,0xb48000,0x304a3dab,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c81,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402, -0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09, -0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400, -0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460, -0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x8962460,0x31006000, -0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100, -0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400, -0x32001d0c,0x7c00100,0x220400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800, -0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000, -0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005, -0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000, -0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000, -0x4100000,0x32003700,0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008, -0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a, -0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100, -0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000, -0x32006800,0x24000020,0x14200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00, -0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32026c01,0x12882000, -0x8962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000, -0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16, -0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406385,0xc000010, -0x448000,0x324a3dae,0x4000000,0x14e00000,0x324a3dae,0x7c00100,0x1230400,0x324a3fa9,0x4000002,0x1200c00,0x324a53a6,0x24000000,0xe00000,0x32820701,0x2802000,0x962460, -0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e, -0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000, -0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400, -0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f, -0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400, -0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x14200000, -0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,0x40005a09,0x7c00100,0x220400,0x40005a09, -0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000, -0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000, -0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219, -0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x14200000,0x40007400,0x4000000, -0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400, -0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701, -0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000, -0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010, -0x404077e0,0x4000000,0x200000,0x404077e3,0x4000000,0x200000,0x404077e3,0x4000000,0x400000,0x40c0147c,0x4000000,0x200000,0x40c05123,0x4000000,0x200000,0x41000419, -0x7c00100,0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100, -0x250400,0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0x1500000, -0x41000c02,0xc000010,0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c, -0x7c00100,0x220400,0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000, -0x200000,0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000, -0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,0x41005d00, -0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100, -0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400, -0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301, -0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100, -0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400, -0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939, -0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000, -0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f, -0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00, -0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100, -0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460, -0x410a3700,0x24000000,0x34200000,0x410a3700,0x24000000,0x34e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100, -0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000, -0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a82ab,0x4000000,0xe00000,0x41808300,0x2802000,0x962460, -0x41c0147c,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908, -0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020, -0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000, -0x50003700,0x24000000,0x4200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600, -0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000, -0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400, -0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e, -0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100, -0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400, -0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b, -0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409aab,0x4000000,0x200000,0x5100080e,0x7c00100, -0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400, -0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524, -0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000, -0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400, -0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c, -0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100, -0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400, -0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108, -0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020, -0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000, -0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00, -0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100, -0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f, -0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71, -0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010, -0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800, -0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63, -0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010, -0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400, -0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f, -0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100, -0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540, -0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442, -0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100, -0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0x4e00000,0x5100ab00,0x4000000,0x4e00000, -0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00, -0x4000000,0x34e00000,0x5140a2db,0x4000400,0x400000,0x514a82ab,0x4000000,0xe00000,0x51802b9d,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400, -0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000, -0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128, -0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000, -0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400, -0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b, -0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100, -0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460, -0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a, -0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010, -0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000, -0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e, -0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100, -0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000, -0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f, -0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000, -0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500, -0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85, -0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100, -0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460, -0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178, -0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100, -0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x4100000,0x52023700,0x24000000,0x4e00000, -0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000,0x96800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300, -0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100, -0x15040d,0x5202c300,0x4000100,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000, -0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400, -0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af8b,0x7c00100,0x230400,0x5240af90,0x4000400,0x200000,0x5240af90,0x6800100, -0x962540,0x5240af92,0x6800400,0x962540,0x5240af92,0x7c00100,0x230400,0x5240b2b1,0x4000000,0x200000,0x5240b2b1,0x4000000,0x1500000,0x5240b2bc,0x4000000,0x200000, -0x5240b2c9,0x4000000,0x200000,0x5240b5de,0x7c00900,0x230400,0x524a44ab,0x4000000,0xe00003,0x5280af8b,0x2802400,0x962460,0x5280af8c,0x2802400,0x962460,0x5280af92, -0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af96,0x2802400,0x962460,0x52c0b3d5,0x2802400,0x962460,0x52c0b3d9,0x7c00100,0x230400,0x60000c02,0x2802100, -0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000, -0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b, -0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000, -0x4200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000, -0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008, -0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100, -0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540, -0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941, -0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100, -0x230400,0x6000cc00,0x4000000,0x4e00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400, -0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800, -0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000, -0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000, -0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000,0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111, -0x7c40300,0xe30000,0x604ac4ab,0x4000000,0x34e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100, -0x1830000,0x61001d0c,0x7c00100,0x220400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400, -0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519, -0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100, -0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460, -0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476, -0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010, -0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400, -0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c, -0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000, -0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000, -0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99, -0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300, -0xe30001,0x610ace00,0x4000000,0x34e00000,0x6140af90,0x6800100,0x962540,0x6140af92,0x7c00100,0x230400,0x6180af8d,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000, -0x63002800,0x80000,0x918820,0x63c00c15,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a, -0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100, -0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000, -0x70003000,0x24000000,0x14200000,0x70003800,0x24000000,0x4e00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108, -0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400, -0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000, -0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965, -0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000, -0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460, -0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00, -0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000,0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100, -0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000, -0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187, -0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000, -0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540, -0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d, -0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100, -0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400, -0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0, -0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000, -0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000, -0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3, -0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010, -0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000, -0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200, -0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010, -0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000, -0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6, -0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800, -0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000, -0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e, -0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000, -0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x34e00000,0x700acd00,0x4000000,0xb6800000, -0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000,0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dfe5,0x4000000,0x200000,0x7040f7e9,0x80000,0x918820,0x7080af90, -0x2802400,0x962460,0x7080dfe5,0x2802400,0x962460,0x70c0e4e7,0x2802100,0x962460,0x70c0e4e7,0x2802400,0x962460,0x70c0e4e7,0x6800100,0x962540,0x8000120f,0x7c00100, -0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000, -0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519, -0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100, -0x230400,0x8000cd00,0x4000000,0x4e00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460, -0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489, -0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010, -0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540, -0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06, -0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010, -0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000, -0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00, -0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,0x90001615,0x7c00100, -0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460, -0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202, -0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00, -0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460, -0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8, -0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100, -0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000, -0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa, -0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100, -0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x34e00000,0x900acd00,0x4000000,0xb6800000, -0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a, -0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100, -0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000, -0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0x4e00000,0xa0010500, -0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100, -0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000, -0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0, -0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000, -0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560, -0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00, -0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000,0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100, -0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af9c,0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460, -0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000,0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939, -0x4000000,0x200000,0xb0008939,0x7c00100,0x230400,0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000, -0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519,0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802000,0x962460, -0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000,0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476, -0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000,0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000, -0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2,0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540, -0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100,0x250400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3, -0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400,0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500, -0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00,0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400, -0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000,0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5, -0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000,0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000, -0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7,0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000, -0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47a,0x2802000,0x962460}; +0,0,0x12467,0,0,0x12567,0,0,0x12667,0,0,0x12767,0,0,0x12867,0, +0,0x12967,0,0,0x12a67,0,0x4e00000,0x12b67,0,0,0x12c67,0,0,0xa0067,0,0xe00000, +0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567, +0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001, +0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b, +0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x14200000,0x11000200,0x24000008,0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219, +0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100, +0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401, +0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600, +0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500, +0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400, +0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e, +0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120, +0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401, +0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x200400,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03, +0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000, +0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,0x80000000,0x218960,0x11000c02,0x2802100,0x962460, +0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02, +0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100, +0x230400,0x11000f01,0x2802400,0x962460,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000, +0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004, +0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100, +0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540, +0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f, +0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000, +0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401, +0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423, +0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100, +0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541, +0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a, +0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100, +0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000, +0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18, +0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100, +0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401, +0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e, +0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001, +0x445801,0x11002800,0x4000001,0x445802,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000, +0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800, +0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020, +0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x15248002,0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0xaa65620, +0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900, +0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022, +0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460, +0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00, +0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100, +0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400, +0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x14200000,0x11002f00, +0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022, +0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x14200000,0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000, +0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500, +0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x14200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000, +0x4200000,0x11003700,0x24000000,0x4e00000,0x11003700,0x24000000,0x14200000,0x11003700,0x24000000,0x14e00000,0x11003700,0x24000000,0x96800000,0x11003700,0x24000020,0x4200000, +0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x4200000,0x11003800, +0x24000000,0x4e00000,0x11003800,0x24000000,0x14200000,0x11003800,0x24000000,0x14b00000,0x11003800,0x24000000,0x14e00000,0x11003800,0x24000000,0x96800000,0x11005003,0x7c00100, +0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805, +0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,0x230408,0x11005102,0x7c00100,0x230404,0x11005102, +0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500,0x80000,0x1e18820,0x11005502,0x7000100, +0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100,0x230409,0x11005667,0x1000,0, +0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002,0x11020200,0x4000400,0x500002,0x11020200, +0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000000, +0x14200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100,0x220400,0x11020219,0x7c00100,0x220401, +0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402,0x11020319,0x7c00100,0x250400,0x11020319, +0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600,0x4000400,0x100002,0x11020600,0x4000400, +0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400,0x962461,0x11020701,0x2802400,0xc62460, +0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401,0x11020908,0x7c00100,0x250400,0x11020908, +0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800,0x24000000,0x401000,0x11022800,0x24000000, +0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002,0x370000,0x11022800,0x24000002,0x470000, +0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000,0x11022800,0x24000020,0x1500000,0x11022800, +0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000, +0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1410000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401, +0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402,0x11022e00,0x24000000,0x200000,0x11022e00, +0x24000020,0x100000,0x11022e00,0x24000020,0x14100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000, +0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100,0x150403,0x11023300,0x4000100,0x14150403, +0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023600,0x24000020,0x14100000,0x11023700, +0x24000000,0x4100000,0x11023700,0x24000000,0x4e00000,0x11023700,0x24000000,0x14100000,0x11023700,0x24000000,0x14e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020, +0x4100000,0x11023700,0x24000020,0x14100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600,0x4000000,0x100000, +0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716, +0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x445811,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000, +0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11, +0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700, +0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe29811,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100, +0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x19329800, +0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100, +0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008, +0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000, +0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100, +0x44000001,0x1a45800,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400, +0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480, +0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x34e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x34200000,0x110a3d00, +0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400, +0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001, +0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005, +0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000, +0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001, +0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300, +0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000, +0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c, +0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400, +0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010, +0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c17,0x7c00900,0x230400,0x11400f42,0xc000010,0x448000,0x11400f56,0xc000010,0x448000,0x11401d8b,0x4000000,0x200000, +0x11403dbf,0x4000000,0xe00000,0x114457b4,0x4000004,0x120000a,0x114457b4,0x4000008,0x81000a,0x114457b4,0x4000008,0x141000a,0x114457b4,0x4000010,0x87000a,0x114457b4, +0xc000010,0x84800a,0x114457bd,0x3802500,0x126246a,0x114457bd,0x7c00d00,0x2530c0a,0x114a3db4,0x24000000,0x810000,0x114a3db4,0x24000000,0x1410000,0x114a3db4,0x24000008, +0x810000,0x114a3db4,0x24000008,0x1410000,0x114a3db4,0x24000010,0x870000,0x114a3db4,0x2c000010,0x848000,0x114a3dba,0x4000000,0xe00000,0x114a3dba,0x24000000,0xe00000, +0x114a3dba,0x24000002,0x1200000,0x114a3dba,0x24000002,0x14e00000,0x114a3dba,0x24000008,0x810000,0x114a3dba,0x24000008,0x1410000,0x114a3dbd,0x7c00900,0x930c00,0x114a3dbd, +0x7c00900,0xe30c00,0x114a3dbf,0x7c00300,0xe30000,0x114a3ebd,0x7000400,0x1200c02,0x114a3fb4,0x4000004,0x1200000,0x114a3fbd,0x7c00d00,0x2530c00,0x114a42bf,0x4000000, +0xe00000,0x114a42bf,0x4000000,0xe0000f,0x114a44bf,0x4000000,0xe00002,0x114a44bf,0x4000000,0xe00003,0x114a44bf,0x4000000,0x14e00003,0x114a45bf,0x4000000,0xe00002, +0x114a45bf,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c1f,0x2802100,0x962460,0x11800c1f,0x2802500,0x962460,0x11800f29,0x2802400,0x962460,0x11800f36, +0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3dc0,0x2802400,0x962460,0x118a3ebd,0x2802400,0x962460,0x11c00904,0x2802400, +0x962460,0x11c00908,0x2802400,0x962460,0x11c00c23,0x6800000,0x1329800,0x11c00c27,0xc000010,0xb48000,0x11c00f6f,0x6800000,0x1329800,0x11c01074,0x6800000,0x1329800, +0x11c01178,0x6800000,0x1329800,0x11c0127c,0x6800000,0x1329800,0x11c01480,0x4000000,0x200000,0x11c01480,0x6800000,0x1329800,0x11c01684,0x6800000,0x1329800,0x11c05123, +0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100, +0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000, +0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27, +0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100, +0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900000,0x20004c67,0,0x1900000, +0x20004d67,0,0x1900000,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12, +0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100, +0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500,0x230400, +0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908, +0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0x2802100, +0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400, +0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821, +0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100, +0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460, +0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c, +0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010, +0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000000,0x200000, +0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x445800,0x3000221d, +0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400, +0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000, +0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x3000251b, +0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b,0x4000010, +0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900,0x230400, +0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010,0x15248002,0x30002a00, +0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002b01,0x2000,0x8962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x14220405,0x30002d19,0x7c00100, +0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003000,0x24000000,0x4200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000, +0x30003700,0x24000000,0x4200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701, +0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000, +0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400, +0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402591,0x4000010,0x400000,0x30402591,0x4000010,0xb70000,0x30402591,0xc000010,0xb48000,0x304028af, +0x4000001,0xc41c0b,0x304a3dbf,0x4000000,0xe00000,0x30800c1f,0x2802100,0x962460,0x30c01c89,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120, +0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400, +0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00, +0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020, +0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x8962460,0x31006000,0x180000,0x918820, +0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e, +0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100, +0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x445802,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002, +0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01, +0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120, +0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000, +0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x14200000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x4100000,0x32003700, +0x24000000,0x4200000,0x32003700,0x24000000,0x14200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100, +0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400, +0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d, +0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020, +0x14200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001, +0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32026c01,0x12882000,0x8962460,0x32065700, +0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020, +0x1410000,0x320a3600,0x24000020,0x34200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10, +0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x3240638d,0xc000010,0x448000,0x324a3dc2, +0x4000000,0x14e00000,0x324a3dc2,0x7c00100,0x1230400,0x324a3fbd,0x4000002,0x1200c00,0x324a53ba,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100, +0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402, +0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02, +0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100, +0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400, +0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417, +0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000,0x14200000,0x40003000,0x24000020, +0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x4200000,0x40003700,0x24000000,0x14200000,0x40005a09,0x7c00100,0x220400,0x40005a09,0x7c00100,0x250400, +0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000,0x1329800,0x40006f30, +0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000,0x40007208,0x7c00100, +0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219,0x7c00500,0x220400, +0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x14200000,0x40007400,0x4000000,0x200000,0x40007531, +0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000, +0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460, +0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x34200000,0x400a3700,0x24000000,0x34e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, +0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077f6,0x4000000, +0x200000,0x404077f9,0x4000000,0x200000,0x404077f9,0x4000000,0x400000,0x40c01480,0x4000000,0x200000,0x40c05123,0x4000000,0x200000,0x41000419,0x7c00100,0x220400, +0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13, +0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0x1500000,0x41000c02,0xc000010, +0xb48000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400, +0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802400,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800, +0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120, +0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x4200000,0x41003700,0x24000000,0x14200000,0x41003700,0x24000000,0x14e00000,0x41005d00,0x7c00120,0x220405, +0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300, +0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100, +0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460, +0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b, +0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100, +0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000, +0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000400,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b, +0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100, +0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000, +0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c, +0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x34200000,0x410a3700,0x24000000, +0x34e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010, +0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100, +0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a82bf,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01480,0x6800000,0x1329800,0x50000419,0x7c00100, +0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460, +0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19, +0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000,0x4200000,0x50005d00,0x7c00120, +0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000, +0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257, +0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100, +0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800, +0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e, +0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100, +0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400, +0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409abf,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02, +0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500, +0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000, +0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27, +0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802500, +0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540, +0x51001c1c,0x6800500,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800, +0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x4200000,0x51003700,0x24000000,0x4e00000,0x51005201,0x2802400, +0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000, +0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301, +0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000, +0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000, +0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000400,0x200400,0x51009500, +0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100, +0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460, +0x51009c52,0x2802400,0x962460,0x51009c52,0x2802d00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52, +0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00, +0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400, +0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008, +0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400, +0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460, +0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e, +0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000, +0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000, +0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c, +0x7c00100,0x230400,0x5100aa00,0x4000000,0x4e00000,0x5100ab00,0x4000000,0x4e00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100, +0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x34200000,0x510aaa00,0x4000000,0x34e00000,0x5140a2f1,0x4000400,0x400000,0x514a82bf,0x4000000,0xe00000, +0x51802bb1,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a, +0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800500, +0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000, +0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301, +0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100, +0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460, +0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100,0x230400,0x5200ac7e,0xc000010,0x248000,0x5200ad28,0x7c00100,0x230400,0x5200ae6a, +0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000, +0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000, +0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182, +0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100, +0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800, +0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c, +0x6800500,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000, +0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000, +0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873, +0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010, +0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000, +0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58, +0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400, +0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000, +0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00, +0x4000000,0x100006,0x52023700,0x24000000,0x4100000,0x52023700,0x24000000,0x4e00000,0x52023700,0x24000000,0x14100000,0x52023700,0x24000000,0x14e00000,0x52023700,0x24000000, +0x96800000,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003, +0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100,0x14150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700, +0x24000000,0x34e00000,0x520a3800,0x24000000,0x34100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x34100000,0x520ab412,0x7c00100, +0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x34e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000, +0x5240af93,0x7c00100,0x230400,0x5240af98,0x4000400,0x200000,0x5240af9a,0x6800400,0x962540,0x5240af9a,0x7c00100,0x230400,0x5240afa4,0x7c00100,0x230400,0x5240afa6, +0x7c00100,0x230400,0x5240b2c5,0x4000000,0x200000,0x5240b2c5,0x4000000,0x1500000,0x5240b2d0,0x4000000,0x200000,0x5240b2de,0x4000000,0x200000,0x5240b5f4,0x7c00900, +0x230400,0x524a44bf,0x4000000,0xe00003,0x5280af93,0x2802400,0x962460,0x5280af94,0x2802400,0x962460,0x5280af9a,0x2802400,0x962460,0x5280af9c,0x2802400,0x962460, +0x5280af9e,0x2802400,0x962460,0x52c0b3eb,0x2802400,0x962460,0x52c0b3ef,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a, +0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100, +0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802400,0x962460,0x60002919,0x7c00100,0x22040e, +0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x14200000,0x60003000,0x24000000,0x14e00000,0x60003700,0x24000000,0x4200000,0x60003800,0x24000000,0x1710000,0x60005102, +0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000, +0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400, +0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f, +0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100, +0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800, +0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0x4e00000,0x6000d000, +0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100, +0x14150400,0x600a3000,0x24000000,0x34200000,0x600a3000,0x24000000,0x34e00000,0x600a3700,0x24000000,0x34200000,0x600a3800,0x24000000,0x34200000,0x600a3800,0x24000000,0xb6800000, +0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x34100000,0x600ac400,0x4000000,0x14e0000d,0x600ac400,0x4000000,0x34e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16, +0x7c00100,0xe30c00,0x600acc00,0x4000000,0x34e00000,0x600acd00,0x4000000,0x34200000,0x600acd00,0x4000000,0x34e00000,0x600acd00,0x4000000,0xb6800000,0x600ace00,0x4000000, +0x34e00000,0x600ace00,0x4000000,0xb6800000,0x600acf00,0x4000000,0x34e00000,0x600acf00,0x4000000,0xb6800000,0x600ad111,0x7c40300,0xe30000,0x604ac4bf,0x4000000,0x34e00003, +0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c, +0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000, +0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400, +0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300, +0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020, +0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000, +0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573, +0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100, +0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802500,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400, +0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997, +0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100, +0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540, +0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0x34e00000,0x6140af98, +0x7c00100,0x230400,0x6140af9a,0x7c00100,0x230400,0x6180af95,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63002800,0x80000,0x918820,0x63c00c15,0x80000, +0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400, +0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320, +0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000,0x70003000,0x24000000,0x14200000,0x70003800,0x24000000, +0x4e00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400, +0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00, +0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100, +0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400, +0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802500,0x1862460,0x7000b61c, +0x6800500,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,0x7000cc00,0x4000000,0x4e00000,0x7000cd00,0x4000000, +0x200000,0x7000cd00,0x4000000,0x4200000,0x7000cd00,0x4000000,0x4e00000,0x7000cd00,0x4000000,0x14200000,0x7000cd00,0x4000000,0x14e00000,0x7000cd00,0x4000000,0x96800000, +0x7000cf00,0x4000000,0x4e00000,0x7000cf00,0x4000000,0x14e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997, +0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100, +0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000, +0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489, +0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540,0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900, +0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540, +0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691, +0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100, +0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000, +0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79, +0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100, +0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400, +0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802500,0x1862460,0x7000ee1c, +0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000, +0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000, +0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802400,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b, +0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100, +0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460, +0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6, +0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100, +0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540, +0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92, +0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x34e00000,0x700acd00,0x4000000,0xb6800000,0x700ace00,0x4000000,0x34e00000,0x700acf00,0x4000000, +0x34e00000,0x700acf00,0x4000000,0xb6800000,0x7040dffb,0x4000000,0x200000,0x7040f7ff,0x80000,0x918820,0x7080af98,0x2802400,0x962460,0x7080dffb,0x2802400,0x962460, +0x70c0e4fd,0x2802100,0x962460,0x70c0e4fd,0x2802400,0x962460,0x70c0e4fd,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400,0x8000171a, +0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208,0x2802400, +0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100,0x250400, +0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0x4e00000,0x8000d202, +0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802000,0x962460,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000, +0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100,0x230400, +0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1, +0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010, +0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100,0x220400,0x80010165,0x7c00100,0x230400, +0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000,0x8001044c,0x4000000,0x200000,0x8001044c, +0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670,0x4000010,0x400000,0x80010670,0xc000010, +0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x34e00000,0x800acd00,0x4000000,0x7a902460,0x800ace00,0x4000000,0x34e00000,0x800acf00,0x4000000,0x34e00000, +0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x34e00000,0x800b0500,0x4000000,0xb6800000,0x90001615,0x7c00100,0x230400,0x9000171a,0x4000000,0x200000,0x9000171a, +0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100, +0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100,0x962460,0x9000d202,0x7c00100,0x230400, +0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7, +0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000, +0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400, +0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9, +0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400, +0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800, +0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300, +0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x34e00000,0x900acd00,0x4000000,0xb6800000,0x900acf00,0x4000000,0x34e00000,0x900b0500,0x4000000, +0xe00000,0x900b0500,0x4000000,0x34e00000,0x900b0500,0x4000000,0xb6800000,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000, +0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100,0x962460,0xa000120f,0x2802400,0x962460,0xa000171a, +0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000,0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000, +0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0x4e00000,0xa0010500,0x4000000,0x200000,0xa00114af,0x2802100,0x962460, +0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100,0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0, +0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000,0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010, +0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0,0xc000010,0x448000,0xa0011722,0x7c00100,0x230400, +0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000,0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1, +0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560,0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100, +0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0x4e00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00,0x4000000,0x34e00000,0xa00b0500,0x4000000,0x34e00000, +0xa00b0500,0x4000000,0xb6800000,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100,0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040afae, +0x6800400,0x962540,0xb0000a03,0x7c00100,0x220400,0xb0000b13,0x7c00100,0x2633800,0xb0001004,0x2802000,0x962460,0xb0001110,0x4000000,0x200000,0xb0001524,0x2802000, +0x962460,0xb0001615,0x4000000,0x500000,0xb000251b,0x7c00100,0x230400,0xb0007300,0x24000000,0x200000,0xb0008939,0x4000000,0x200000,0xb0008939,0x7c00100,0x230400, +0xb0008e00,0x24000000,0x200000,0xb0008e00,0x24000000,0x400000,0xb0008e00,0x24000010,0x400000,0xb0009257,0x2802000,0x962460,0xb0009257,0x4000000,0x1600000,0xb0009519, +0x7c00100,0x220400,0xb0009519,0x7c00100,0x250400,0xb0009a00,0x4000000,0x200000,0xb000b30a,0x2802100,0x962460,0xb000b30a,0x7c00100,0x230400,0xb000c178,0x80000000, +0x218960,0xb000c300,0x4000000,0x4200000,0xb000d202,0x2802000,0x962460,0xb000d476,0x6800100,0x962540,0xb000d476,0x7c00100,0x230400,0xb000e300,0x4000000,0x4e00000, +0xb000fda1,0x7c00100,0x1830000,0xb0010eaa,0x2802000,0x962460,0xb00116b0,0x7c00100,0x230400,0xb0011900,0x4000000,0x4e00000,0xb0011ab2,0x2802100,0x962460,0xb0011ab2, +0x2802400,0x962460,0xb0011ab2,0x2806400,0x962460,0xb0011ab2,0x4000000,0x200000,0xb0011ab2,0x6800100,0x962540,0xb0011ab2,0x7c00100,0x230400,0xb0011b0c,0x7c00100, +0x230400,0xb0011cb3,0x2802100,0x962460,0xb0011cb3,0x2806400,0x962460,0xb0011cb3,0x6800000,0x1329800,0xb0011cb3,0x6800100,0x962540,0xb0011cb3,0x7c00100,0x230400, +0xb0011db6,0x2802500,0x962460,0xb0011db6,0x6800000,0x1329800,0xb0011db6,0x7c00100,0x230400,0xb0011db6,0x7c00500,0x230400,0xb0011e00,0x4000000,0x200000,0xb0011e00, +0x4000000,0x1500000,0xb0011fb4,0x2802100,0x962460,0xb0011fb4,0x6800100,0x962540,0xb0011fb4,0x7c00100,0x230400,0xb0011fb4,0xc000010,0x248000,0xb0012000,0x4000000, +0x200000,0xb00121b5,0x4000000,0x200000,0xb00121b5,0x4000010,0x400000,0xb00121b5,0x7c00100,0x220400,0xb00121b5,0x7c00100,0x250400,0xb00121b5,0xc000010,0x448000, +0xb00122b8,0x4000000,0x200000,0xb00122b8,0x7c00100,0x230400,0xb00123b7,0x2802400,0x962460,0xb00123b7,0x4000000,0x200000,0xb00123b7,0x7c00100,0x230400,0xb00123b7, +0xc000010,0x248000,0xb00a4005,0x7c00100,0xe30400,0xb00a4711,0x7c40300,0xe30000,0xb00acf00,0x4000000,0x34e00000,0xb00b0500,0x4000000,0x34e00000,0xb00b0500,0x4000000, +0x3ce00000,0xb00b0500,0x4000000,0xb6800000,0xb00b109a,0x7c00300,0xe30000,0xb080e47e,0x2802000,0x962460,0xc0001524,0x4000000,0x500000,0xc0001a18,0x2806400,0x1862460, +0xc0001a18,0x7c00100,0x1830000,0xc0007300,0x24000000,0x200000,0xc0008e00,0x24000010,0x400000,0xc0009519,0x7c00100,0x220400,0xc0009519,0x7c00100,0x250400,0xc000c300, +0x4000000,0x420000f,0xc000d85c,0x2802100,0x962460,0xc000d85c,0x6800100,0x962540,0xc000d85c,0x7c00100,0x230400,0xc000dc99,0x7c00100,0x230400,0xc000e719,0x7c00100, +0x220400,0xc00107a7,0x7c00100,0x230400,0xc0010eaa,0x7c00100,0x230400,0xc00116b0,0x7c00100,0x230560,0xc0011900,0x4000000,0x4200000,0xc0012447,0,0x818820, +0xc0012447,0,0xc18820,0xc0012447,0,0x1418820,0xc00125b9,0x7c00100,0x230400,0xc00126bb,0x2802100,0x962460,0xc00126bb,0x2806400,0x962460,0xc00126bb, +0x4000000,0x500000,0xc00126bb,0x6800100,0x962540,0xc00126bb,0x7c00100,0x230400,0xc00127ba,0x2802400,0x962460,0xc00127ba,0x4000000,0x200000,0xc00127ba,0x6800000, +0x1329800,0xc00127ba,0x7c00100,0x230400,0xc00127ba,0x7c00900,0x230400,0xc0012800,0x4000000,0x200000,0xc0012b23,0x4000000,0x200000,0xc0012b23,0x4000000,0x400000, +0xc0012b23,0x4000000,0x1500000,0xc0012cbc,0x2802400,0x962460,0xc0012cbc,0x4000000,0x1600000,0xc0012cbc,0x6800000,0x1329800,0xc0012cbc,0x7c00100,0x230400,0xc00acf00, +0x4000000,0x34e00000,0xc00ae300,0x4000000,0x34e00000,0xc00b0500,0x4000000,0x34e00000,0xc00b0500,0x4000000,0xb6800000,0xc00b0b00,0x4000000,0x1200000,0xc00b0b00,0x7c00900, +0x1230400,0xc00b109a,0x7c00300,0xe30000,0xc00b2914,0x7c00100,0x2530000,0xc00b2916,0x7c00100,0x2530c00,0xc00b2a00,0x4000000,0x34e00000,0xc040af55,0x7c00100,0x230400, +0xc0c12b80,0x4000000,0x200000,0xc14a44bf,0x4000000,0xe0000d}; -static const int32_t countPropsVectors=6639; +static const int32_t countPropsVectors=6822; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[234]={ +static const uint16_t scriptExtensions[256]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, 0x25,0x80b6,2,0x22,0x8025,2,0x12,2,0x22,0x54,0x79,0x7b,0xa7,0xb6,0x80b7,2, 0x8022,2,0x8025,2,0x21,2,0x80b6,2,0x25,4,0xa,0xf,0x10,0x15,0x19,0x1a, 0x1f,0x23,0x24,0x89,0x97,0x809e,4,0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24, 0x89,0x809e,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89,0x91,0x99, -0x9e,0xa0,0xb2,0x80b3,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, -0x89,0x91,0x99,0x9e,0xa0,0xb2,0x80b3,0xa,0x78,0xa0,0x80b2,0xa,0x67,4,0x3a,0x8076, -4,0x6d,0x10,0x80a4,0x10,0x72,0xf,0x809d,0xf,0x76,0x23,0x8089,0x23,0x7a,0x1c,0x34, -0x8076,0x1c,0x7e,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089, -0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,0x8004,0xa,0x19,0x8089, -5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14, -0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15, -0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x15,0x78,0x91,0x99, -0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0x92,0xa,0x8023,0xa,0xd7,0x19,0x1c,0x804f,0x37,0x804e, -0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7a,0x8087}; +0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0x80bb,0xa,0x78,0xa0,0x80b2,0xa, +0x6b,4,0x3a,0x8076,4,0x71,0x10,0x80a4,0x10,0x76,0xf,0x809d,0xf,0x7a,0x23,0x8089, +0x23,0x7e,0x15,0x80bb,0x15,0x82,0x1c,0x34,0x8076,0x1c,0x86,0xc,0x8019,0x2a,0x2b,0x2c, +0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089,0xa,0x8089,4,0x800a,0xa,0x8097,0xa,0x15, +0x1a,0x1f,0x23,0x8024,0xa,0x80bb,4,0xa,0x15,0x1f,0x24,0x89,0x9e,0x80bb,0x8004,0x19, +0x801b,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x8011, +5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2, +0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0xf, +0x10,0x15,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0x80bb,0xa,0x9a,0xa,0x8023,0xa, +0xed,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89,0x7e,0x8087}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x29fa,0x29fa,0x29fa,0x29fa,0x649c,3,0x7e8b,0x7f00,0x7f00,0x7f00,0xb23b8,0x2a75a31,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2afc,0x2afc,0x2afc,0x2afc,0x66be,3,0x8164,0x81e4,0x81e4,0x81e4,0xb2cbc,0x2a75a31,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucln_cmn.cpp b/deps/icu-small/source/common/ucln_cmn.cpp index 7e541a1a5f0f3b..d78491df419fb0 100644 --- a/deps/icu-small/source/common/ucln_cmn.cpp +++ b/deps/icu-small/source/common/ucln_cmn.cpp @@ -40,8 +40,8 @@ U_CAPI void U_EXPORT2 u_cleanup(void) { UTRACE_ENTRY_OC(UTRACE_U_CLEANUP); - umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ - umtx_unlock(NULL); /* all state left around by any other threads. */ + icu::umtx_lock(NULL); /* Force a memory barrier, so that we are sure to see */ + icu::umtx_unlock(NULL); /* all state left around by any other threads. */ ucln_lib_cleanup(); diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index 1a1625d69c8c79..e6ef833f4e4317 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -194,9 +194,12 @@ static struct { /*initializes some global variables */ static UHashtable *SHARED_DATA_HASHTABLE = NULL; -static UMutex cnvCacheMutex = U_MUTEX_INITIALIZER; /* Mutex for synchronizing cnv cache access. */ - /* Note: the global mutex is used for */ - /* reference count updates. */ +static icu::UMutex *cnvCacheMutex() { /* Mutex for synchronizing cnv cache access. */ + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} +/* Note: the global mutex is used for */ +/* reference count updates. */ static const char **gAvailableConverters = NULL; static uint16_t gAvailableConverterCount = 0; @@ -599,9 +602,9 @@ U_CFUNC void ucnv_unloadSharedDataIfReady(UConverterSharedData *sharedData) { if(sharedData != NULL && sharedData->isReferenceCounted) { - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); ucnv_unload(sharedData); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } } @@ -609,9 +612,9 @@ U_CFUNC void ucnv_incrementRefCount(UConverterSharedData *sharedData) { if(sharedData != NULL && sharedData->isReferenceCounted) { - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); sharedData->referenceCounter++; - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } } @@ -812,9 +815,9 @@ ucnv_loadSharedData(const char *converterName, pArgs->nestedLoads=1; pArgs->pkg=NULL; - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); mySharedConverterData = ucnv_load(pArgs, err); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); if (U_FAILURE (*err) || (mySharedConverterData == NULL)) { return NULL; @@ -1061,7 +1064,7 @@ ucnv_flushCache () * because the sequence of looking up in the cache + incrementing * is protected by cnvCacheMutex. */ - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); /* * double loop: A delta/extension-only converter has a pointer to its base table's * shared data; the first iteration of the outer loop may see the delta converter @@ -1090,7 +1093,7 @@ ucnv_flushCache () } } } while(++i == 1 && remaining > 0); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); UTRACE_DATA1(UTRACE_INFO, "ucnv_flushCache() exits with %d converters remaining", remaining); @@ -1196,7 +1199,7 @@ internalSetName(const char *name, UErrorCode *status) { } algorithmicSharedData = getAlgorithmicTypeFromName(stackArgs.name); - umtx_lock(&cnvCacheMutex); + umtx_lock(cnvCacheMutex()); gDefaultAlgorithmicSharedData = algorithmicSharedData; gDefaultConverterContainsOption = containsOption; @@ -1212,7 +1215,7 @@ internalSetName(const char *name, UErrorCode *status) { ucnv_enableCleanup(); - umtx_unlock(&cnvCacheMutex); + umtx_unlock(cnvCacheMutex()); } #endif @@ -1237,7 +1240,7 @@ ucnv_getDefaultName() { but ucnv_setDefaultName is not thread safe. */ { - icu::Mutex lock(&cnvCacheMutex); + icu::Mutex lock(cnvCacheMutex()); name = gDefaultConverterName; } if(name==NULL) { diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index e1248a7bd36035..2fec6b4b1510d6 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -1383,7 +1383,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { uprv_strcat(name, UCNV_SWAP_LFNL_OPTION_STRING); /* set the pointers */ - umtx_lock(NULL); + icu::umtx_lock(NULL); if(mbcsTable->swapLFNLStateTable==NULL) { mbcsTable->swapLFNLStateTable=newStateTable; mbcsTable->swapLFNLFromUnicodeBytes=(uint8_t *)newResults; @@ -1391,7 +1391,7 @@ _EBCDICSwapLFNL(UConverterSharedData *sharedData, UErrorCode *pErrorCode) { newStateTable=NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); /* release the allocated memory if another thread beat us to it */ if(newStateTable!=NULL) { @@ -1919,9 +1919,9 @@ ucnv_MBCSOpen(UConverter *cnv, /* do this because double-checked locking is broken */ UBool isCached; - umtx_lock(NULL); + icu::umtx_lock(NULL); isCached=mbcsTable->swapLFNLStateTable!=NULL; - umtx_unlock(NULL); + icu::umtx_unlock(NULL); if(!isCached) { if(!_EBCDICSwapLFNL(cnv->sharedData, pErrorCode)) { diff --git a/deps/icu-small/source/common/ucptrie.cpp b/deps/icu-small/source/common/ucptrie.cpp index 13496ad56c5e58..b72e318387a186 100644 --- a/deps/icu-small/source/common/ucptrie.cpp +++ b/deps/icu-small/source/common/ucptrie.cpp @@ -280,7 +280,7 @@ UChar32 getRange(const void *t, UChar32 start, int32_t prevI3Block = -1; int32_t prevBlock = -1; UChar32 c = start; - uint32_t value; + uint32_t trieValue, value; bool haveValue = false; do { int32_t i3Block; @@ -319,6 +319,7 @@ UChar32 getRange(const void *t, UChar32 start, return c - 1; } } else { + trieValue = trie->nullValue; value = nullValue; if (pValue != nullptr) { *pValue = nullValue; } haveValue = true; @@ -357,6 +358,7 @@ UChar32 getRange(const void *t, UChar32 start, return c - 1; } } else { + trieValue = trie->nullValue; value = nullValue; if (pValue != nullptr) { *pValue = nullValue; } haveValue = true; @@ -364,23 +366,32 @@ UChar32 getRange(const void *t, UChar32 start, c = (c + dataBlockLength) & ~dataMask; } else { int32_t di = block + (c & dataMask); - uint32_t value2 = getValue(trie->data, valueWidth, di); - value2 = maybeFilterValue(value2, trie->nullValue, nullValue, - filter, context); + uint32_t trieValue2 = getValue(trie->data, valueWidth, di); if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } while ((++c & dataMask) != 0) { - if (maybeFilterValue(getValue(trie->data, valueWidth, ++di), - trie->nullValue, nullValue, - filter, context) != value) { - return c - 1; + trieValue2 = getValue(trie->data, valueWidth, ++di); + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, trie->nullValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } } diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 5c9bbef70097e7..dba3247fef2c98 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -85,30 +85,14 @@ static const char CURRENCY_MAP[] = "CurrencyMap"; // Tag for default meta-data, in CURRENCY_META static const char DEFAULT_META[] = "DEFAULT"; -// Variant for legacy pre-euro mapping in CurrencyMap -static const char VAR_PRE_EURO[] = "PREEURO"; - -// Variant for legacy euro mapping in CurrencyMap -static const char VAR_EURO[] = "EURO"; - // Variant delimiter static const char VAR_DELIM = '_'; -static const char VAR_DELIM_STR[] = "_"; - -// Variant for legacy euro mapping in CurrencyMap -//static const char VAR_DELIM_EURO[] = "_EURO"; - -#define VARIANT_IS_EMPTY 0 -#define VARIANT_IS_EURO 0x1 -#define VARIANT_IS_PREEURO 0x2 // Tag for localized display names (symbols) of currencies static const char CURRENCIES[] = "Currencies"; static const char CURRENCIES_NARROW[] = "Currencies%narrow"; static const char CURRENCYPLURALS[] = "CurrencyPlurals"; -static const UChar EUR_STR[] = {0x0045,0x0055,0x0052,0}; - // ISO codes mapping table static const UHashtable* gIsoCodes = NULL; static icu::UInitOnce gIsoCodesInitOnce = U_INITONCE_INITIALIZER; @@ -360,30 +344,10 @@ _findMetaData(const UChar* currency, UErrorCode& ec) { // ------------------------------------- -/** - * @see VARIANT_IS_EURO - * @see VARIANT_IS_PREEURO - */ -static uint32_t +static void idForLocale(const char* locale, char* countryAndVariant, int capacity, UErrorCode* ec) { - uint32_t variantType = 0; - // !!! this is internal only, assumes buffer is not null and capacity is sufficient - // Extract the country name and variant name. We only - // recognize two variant names, EURO and PREEURO. - char variant[ULOC_FULLNAME_CAPACITY]; ulocimp_getRegionForSupplementalData(locale, FALSE, countryAndVariant, capacity, ec); - uloc_getVariant(locale, variant, sizeof(variant), ec); - if (variant[0] != 0) { - variantType = (uint32_t)(0 == uprv_strcmp(variant, VAR_EURO)) - | ((uint32_t)(0 == uprv_strcmp(variant, VAR_PRE_EURO)) << 1); - if (variantType) - { - uprv_strcat(countryAndVariant, VAR_DELIM_STR); - uprv_strcat(countryAndVariant, variant); - } - } - return variantType; } // ------------------------------------------ @@ -401,7 +365,10 @@ U_CDECL_END #if !UCONFIG_NO_SERVICE struct CReg; -static UMutex gCRegLock = U_MUTEX_INITIALIZER; +static UMutex *gCRegLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static CReg* gCRegHead = 0; struct CReg : public icu::UMemory { @@ -427,14 +394,14 @@ struct CReg : public icu::UMemory { if (status && U_SUCCESS(*status) && _iso && _id) { CReg* n = new CReg(_iso, _id); if (n) { - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); if (!gCRegHead) { /* register for the first time */ ucln_common_registerCleanup(UCLN_COMMON_CURRENCY, currency_cleanup); } n->next = gCRegHead; gCRegHead = n; - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return n; } *status = U_MEMORY_ALLOCATION_ERROR; @@ -444,7 +411,7 @@ struct CReg : public icu::UMemory { static UBool unreg(UCurrRegistryKey key) { UBool found = FALSE; - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); CReg** p = &gCRegHead; while (*p) { @@ -457,13 +424,13 @@ struct CReg : public icu::UMemory { p = &((*p)->next); } - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return found; } static const UChar* get(const char* id) { const UChar* result = NULL; - umtx_lock(&gCRegLock); + umtx_lock(gCRegLock()); CReg* p = gCRegHead; /* register cleanup of the mutex */ @@ -475,7 +442,7 @@ struct CReg : public icu::UMemory { } p = p->next; } - umtx_unlock(&gCRegLock); + umtx_unlock(gCRegLock()); return result; } @@ -568,7 +535,7 @@ ucurr_forLocale(const char* locale, // get country or country_variant in `id' char id[ULOC_FULLNAME_CAPACITY]; - uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + idForLocale(locale, id, UPRV_LENGTHOF(id), ec); if (U_FAILURE(*ec)) { return 0; } @@ -602,20 +569,6 @@ ucurr_forLocale(const char* locale, UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - - // Get the second item when PREEURO is requested, and this is a known Euro country. - // If the requested variant is PREEURO, and this isn't a Euro country, - // assume that the country changed over to the Euro in the future. - // This is probably an old version of ICU that hasn't been updated yet. - // The latest currency is probably correct. - if (U_SUCCESS(localStatus)) { - if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { - currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); - s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - } else if ((variantType & VARIANT_IS_EURO)) { - s = EUR_STR; - } - } ures_close(currencyReq); ures_close(countryArray); } @@ -740,7 +693,13 @@ ucurr_getName(const UChar* currency, key.append("/", ec2); key.append(buf, ec2); s = ures_getStringByKeyWithFallback(rb.getAlias(), key.data(), len, &ec2); - } else { + if (ec2 == U_MISSING_RESOURCE_ERROR) { + *ec = U_USING_FALLBACK_WARNING; + ec2 = U_ZERO_ERROR; + choice = UCURR_SYMBOL_NAME; + } + } + if (s == NULL) { ures_getByKey(rb.getAlias(), CURRENCIES, rb.getAlias(), &ec2); ures_getByKeyWithFallback(rb.getAlias(), buf, rb.getAlias(), &ec2); s = ures_getStringByIndex(rb.getAlias(), choice, len, &ec2); @@ -1397,7 +1356,10 @@ static CurrencyNameCacheEntry* currCache[CURRENCY_NAME_CACHE_NUM] = {NULL}; // It is a simple round-robin replacement strategy. static int8_t currentCacheEntryIndex = 0; -static UMutex gCurrencyCacheMutex = U_MUTEX_INITIALIZER; +static UMutex *gCurrencyCacheMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} // Cache deletion static void @@ -1446,7 +1408,7 @@ getCacheEntry(const char* locale, UErrorCode& ec) { CurrencyNameStruct* currencySymbols = NULL; CurrencyNameCacheEntry* cacheEntry = NULL; - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); // in order to handle racing correctly, // not putting 'search' in a separate function. int8_t found = -1; @@ -1461,13 +1423,13 @@ getCacheEntry(const char* locale, UErrorCode& ec) { cacheEntry = currCache[found]; ++(cacheEntry->refCount); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); if (found == -1) { collectCurrencyNames(locale, ¤cyNames, &total_currency_name_count, ¤cySymbols, &total_currency_symbol_count, ec); if (U_FAILURE(ec)) { return NULL; } - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); // check again. for (int8_t i = 0; i < CURRENCY_NAME_CACHE_NUM; ++i) { if (currCache[i]!= NULL && @@ -1506,19 +1468,19 @@ getCacheEntry(const char* locale, UErrorCode& ec) { cacheEntry = currCache[found]; ++(cacheEntry->refCount); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); } return cacheEntry; } static void releaseCacheEntry(CurrencyNameCacheEntry* cacheEntry) { - umtx_lock(&gCurrencyCacheMutex); + umtx_lock(gCurrencyCacheMutex()); --(cacheEntry->refCount); if (cacheEntry->refCount == 0) { // remove deleteCacheEntry(cacheEntry); } - umtx_unlock(&gCurrencyCacheMutex); + umtx_unlock(gCurrencyCacheMutex()); } U_CAPI void @@ -2305,7 +2267,7 @@ ucurr_countCurrencies(const char* locale, uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); // get country or country_variant in `id' - /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); + idForLocale(locale, id, sizeof(id), ec); if (U_FAILURE(*ec)) { @@ -2421,7 +2383,7 @@ ucurr_forLocaleAndDate(const char* locale, resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); // get country or country_variant in `id' - /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); + idForLocale(locale, id, sizeof(id), ec); if (U_FAILURE(*ec)) { return 0; diff --git a/deps/icu-small/source/common/uhash.cpp b/deps/icu-small/source/common/uhash.cpp index 239997d05d7e38..79241a282913ed 100644 --- a/deps/icu-small/source/common/uhash.cpp +++ b/deps/icu-small/source/common/uhash.cpp @@ -376,8 +376,7 @@ _uhash_find(const UHashtable *hash, UHashTok key, * WILL NEVER HAPPEN as long as uhash_put() makes sure that * count is always < length. */ - U_ASSERT(FALSE); - return NULL; /* Never happens if uhash_put() behaves */ + UPRV_UNREACHABLE; } return &(elements[theIndex]); } diff --git a/deps/icu-small/source/common/uinvchar.cpp b/deps/icu-small/source/common/uinvchar.cpp index eafb951e38a67c..2e0f42d9274d2a 100644 --- a/deps/icu-small/source/common/uinvchar.cpp +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -207,8 +207,7 @@ u_UCharsToChars(const UChar *us, char *cs, int32_t length) { while(length>0) { u=*us++; if(!UCHAR_IS_INVARIANT(u)) { - U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */ - u=0; + UPRV_UNREACHABLE; /* Variant characters were used. These are not portable in ICU. */ } *cs++=(char)UCHAR_TO_CHAR(u); --length; diff --git a/deps/icu-small/source/common/ulayout_props.h b/deps/icu-small/source/common/ulayout_props.h new file mode 100644 index 00000000000000..c0f028c7132609 --- /dev/null +++ b/deps/icu-small/source/common/ulayout_props.h @@ -0,0 +1,46 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// ulayout_props.h +// created: 2019feb12 Markus W. Scherer + +#ifndef __ULAYOUT_PROPS_H__ +#define __ULAYOUT_PROPS_H__ + +#include "unicode/utypes.h" + +// file definitions ------------------------------------------------------------ + +#define ULAYOUT_DATA_NAME "ulayout" +#define ULAYOUT_DATA_TYPE "icu" + +// data format "Layo" +#define ULAYOUT_FMT_0 0x4c +#define ULAYOUT_FMT_1 0x61 +#define ULAYOUT_FMT_2 0x79 +#define ULAYOUT_FMT_3 0x6f + +// indexes into indexes[] +enum { + // Element 0 stores the length of the indexes[] array. + ULAYOUT_IX_INDEXES_LENGTH, + // Elements 1..7 store the tops of consecutive code point tries. + // No trie is stored if the difference between two of these is less than 16. + ULAYOUT_IX_INPC_TRIE_TOP, + ULAYOUT_IX_INSC_TRIE_TOP, + ULAYOUT_IX_VO_TRIE_TOP, + ULAYOUT_IX_RESERVED_TOP, + + ULAYOUT_IX_TRIES_TOP = 7, + + ULAYOUT_IX_MAX_VALUES = 9, + + // Length of indexes[]. Multiple of 4 to 16-align the tries. + ULAYOUT_IX_COUNT = 12 +}; + +constexpr int32_t ULAYOUT_MAX_INPC_SHIFT = 24; +constexpr int32_t ULAYOUT_MAX_INSC_SHIFT = 16; +constexpr int32_t ULAYOUT_MAX_VO_SHIFT = 8; + +#endif // __ULAYOUT_PROPS_H__ diff --git a/deps/icu-small/source/common/ulayout_props_data.h b/deps/icu-small/source/common/ulayout_props_data.h deleted file mode 100644 index f42d15fc830afd..00000000000000 --- a/deps/icu-small/source/common/ulayout_props_data.h +++ /dev/null @@ -1,722 +0,0 @@ -// © 2018 and later: Unicode, Inc. and others. -// License & terms of use: http://www.unicode.org/copyright.html -// -// file name: ulayout_props_data.h -// -// machine-generated by: icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp - - -#ifdef INCLUDED_FROM_UPROPS_CPP - -static const int32_t maxInPCValue = 14; - -static const uint16_t inpc_trieIndex[765]={ -0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x80,0xc0,0xff,0x13f,0x17e,0x1be,0x17e,0x1fe,0x23e,0x27e,0x2bc,0x2fc, -0x33c,0x37b,0x23e,0x3bb,0x3fb,0x439,0x477,0x4ad,0x4e1,0x521,0x531,0x571,0x599,0x5d9,0x619,0x656, -0x2b7,0x2c6,0x2d2,0x2c6,0x2ed,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0,0x10,0x20, -0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20, -0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0x80,0x90,0xa0, -0xb0,0xc0,0xd0,0xe0,0xf0,0xff,0x10f,0x11f,0x12f,0x13f,0x14f,0x15f,0x16f,0x17e,0x18e,0x19e, -0x1ae,0x1be,0x1ce,0x1de,0x1ee,0x17e,0x18e,0x19e,0x1ae,0x1fe,0x20e,0x21e,0x22e,0x23e,0x24e,0x25e, -0x26e,0x27e,0x28e,0x29e,0x2ae,0x2bc,0x2cc,0x2dc,0x2ec,0x2fc,0x30c,0x31c,0x32c,0x33c,0x34c,0x35c, -0x36c,0x37b,0x38b,0x39b,0x3ab,0x23e,0x24e,0x25e,0x26e,0x3bb,0x3cb,0x3db,0x3eb,0x3fb,0x40b,0x41b, -0x42b,0x439,0x449,0x459,0x469,0x477,0x487,0x497,0x4a7,0x4ad,0x4bd,0x4cd,0x4dd,0x4e1,0x4f1,0x501, -0x511,0x521,0x531,0x541,0x551,0x531,0x541,0x551,0x561,0x571,0x581,0x591,0x5a1,0x599,0x5a9,0x5b9, -0x5c9,0x5d9,0x5e9,0x5f9,0x609,0x619,0x629,0x639,0x649,0x656,0x666,0x676,0x686,0,0,0x68b, -0x69a,0,0x6a9,0x6b8,0x6c7,0x6d5,0x6e5,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x6f3,0,0x6f3, -0,0x701,0,0x701,0,0,0,0x70b,0x71b,0x729,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x739,0x749,0,0, -0,0,0,0,0,0x759,0x768,0,0,0,0x772,0,0,0,0x77e,0x78d, -0x79b,0,0,0,0,0,0,0,0,0x7ab,0,0,0x7b7,0x7c7,0,0x7cc, -0x52c,0x81,0,0x7dc,0,0,0,0x7ea,0x3fb,0,0,0x7fa,0x807,0,0,0, -0,0,0,0,0,0,0x817,0x827,0x835,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x2b3,0x83f,0,0x84c,0,0,0,0, -0,0x101,0,0,0x858,0x864,0,0x874,0x882,0,0,0x892,0,0x8a0,0x3fb,0, -0,0x80,0,0,0x8b0,0x8c0,0,0x2b9,0,0,0x8c7,0x8d6,0x8e3,0,0,0x8f1, -0,0,0,0x901,0x2bd,0,0x911,0x151,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x921,0,0x930,0,0,0x940,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x950,0,0,0x958,0x966,0,0,0, -0x81,0,0,0x976,0,0,0,0,0x52d,0,0x981,0x991,0x3cb,0,0,0x659, -0x81,0,0,0x99e,0x9ae,0,0,0,0x9bb,0x9cb,0,0,0,0,0,0, -0,0,0,0x71,0x9db,0,0xff,0,0,0x9e6,0x9f6,0x14f,0xa04,0x52b,0,0, -0,0,0,0,0,0,0x99c,0xa14,0x16f,0,0,0,0,0,0xa24,0xa33, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,0xa43,0xe3, -0x214,0,0,0,0xa53,0x2be,0,0,0,0,0,0xa63,0xa73,0,0,0, -0,0,0xa7b,0xa8b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa97,0xaa6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xab5, -0,0,0xac2,0,0xad1,0,0,0xadd,0xae7,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb, -0xaf7,0,0,0,0,0,0xb07,0xb0f,0xb1e,0,0,0,0,0,0,0, -0xb2d,0xb3c,0,0,0,0xb44,0xb54,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb61,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x45,0x4d,0x4d,0x4d,0x5d,0x7d,0x9d,0xbd,0xdd, -2,2,0xec,0x10a,0x129,0x149,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,0x169,0x188,2,2,2,2,2,2,2,2, -2,2,0x1a8,2,2,0x1c8,0x1e6,0x203,0x221,0x23f,0x25f,0x27d,0x297 -}; - -static const uint8_t inpc_trieData[2930]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8,7,1,0,7,4, -7,1,1,1,1,8,8,8,8,7,7,7,7,1,4,7, -0,8,1,8,8,8,1,1,0,0,0,0,0,0,0,0, -0,0,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, -8,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,7,4,7, -1,1,1,1,0,0,4,4,0,0,5,5,1,0,0,0, -0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0, -0,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,8,0,8, -8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,1, -1,0,0,0,0,8,8,0,0,8,8,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,8,8, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,7,1, -1,1,1,8,0,8,8,0xd,0,7,7,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8,8,8,8,8,8,0,8, -7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,7,8,7,1, -1,1,1,0,0,4,0xb,0,0,5,0xc,1,0,0,0,0, -0,0,0,0,8,0xd,0,0,0,0,0,0,0,0,0,0, -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,8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7,7,8,7,7,0, -0,0,4,4,4,0,5,5,5,8,0,0,0,0,0,0, -0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8,7,7,7, -8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8,8,7,7,7,7, -0,8,8,9,0,8,8,8,8,0,0,0,0,0,0,0, -8,1,0,0,0,0,0,0,0,0,0,0,0,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,0xd,7,7,7,7, -0,8,0xd,0xd,0,0xd,0xd,8,8,0,0,0,0,0,0,0, -7,7,0,0,0,0,0,0,0,0,0,0,0,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,8,8,7,7,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,8,0,7,7,7,1,1,0,4, -4,4,0,5,5,5,8,0,0,0,0,0,0,0,0,0, -7,0,0,0,0,0,0,0,0,0,0,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,7,7,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8,0,0,0,0,7,7,7,8, -8,1,0,1,0,7,4,0xb,4,5,0xc,5,7,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, -7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,7,7,8,8,8,8,1,1,1,0,0,0,0, -0,0xe,0xe,0xe,0xe,0xe,7,0,8,8,8,8,8,8,8,8, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,7,7,8,8,8,8,1,1,0,8,1,0,0, -0,0xe,0xe,0xe,0xe,0xe,0,0,0,8,8,8,8,8,8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -1,0,8,0,0,0,0,7,4,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,8,9,1,1,9, -9,9,9,8,8,8,8,8,7,8,9,8,8,1,0,8, -8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, -1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,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,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,7,7,8,8,1,4,8,8,8,8, -8,1,7,0,8,7,0,1,1,0,0,0,0,0,0,7, -7,1,1,0,0,0,0,1,1,0,7,7,7,0,0,7, -7,7,7,7,7,7,0,0,8,8,8,8,0,0,0,0, -0,0,0,0,0,0,0,1,7,4,8,8,7,7,7,7, -7,7,1,0,7,0,0,0,0,0,0,0,0,0,0,7, -7,7,8,0,0,8,1,1,0,0,0,0,0,0,0,0, -0,0,0,8,1,0,0,0,0,0,0,0,0,0,0,0, -0,7,8,8,8,8,1,1,1,0xb,0xc,5,4,4,4,5, -5,8,7,7,8,8,8,8,8,8,8,0,8,0,0,0, -0,0,0,0,0,0,8,0,0,8,8,1,7,7,0xd,0xd, -8,8,7,7,7,0,0,0,0,7,7,1,7,7,7,7, -7,7,1,8,1,0,0,0,0,7,7,7,7,7,0xe,0xe, -0xe,7,7,0xe,7,7,7,7,7,0,0,0,0,0,0,0, -7,7,0,0,0,0,0,0,0,8,1,4,7,8,0,0, -0,0,0,4,1,7,8,8,8,1,1,1,1,0,7,8, -7,7,8,8,8,8,1,1,8,1,7,4,4,4,8,8, -8,8,8,8,8,8,8,8,0,0,1,8,8,8,8,7, -0,0,0,0,0,0,0,0,0,0,0,8,7,8,8,1, -1,1,3,9,0xa,4,4,5,5,8,0xd,7,0,0,0,0, -0,0,0,0,0,0,0,8,1,8,8,8,0,7,1,1, -8,1,4,7,8,8,7,0,1,1,0,0,0,0,0,0, -8,7,8,8,7,7,7,8,7,8,0,0,0,0,7,7, -7,4,4,0xb,7,7,1,8,8,8,8,4,4,8,1,0, -0,0,0,0,0,0,0,8,8,8,0,6,1,1,1,1, -1,8,8,1,1,1,1,8,7,6,6,6,6,6,6,6, -0,0,0,0,1,0,0,0,0,8,0,0,7,0,0,0, -0,0,0,0,0,8,0,0,0,0,8,0,0,0,0,7, -7,1,8,7,0,0,0,0,0,0,0,0,7,7,7,7, -7,7,7,7,7,7,7,7,1,8,0,0,0,0,0,0, -0,0,0,0,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,0,0,0,0,0,0,0,0,0,0,0,0, -0,8,0,0,0,0,0,0,0,0,0,0,0,1,1,1, -0,0,0,0,0,0,0,1,1,1,8,1,1,1,1,8, -0,0,0,8,7,7,8,8,1,1,4,4,8,7,7,2, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,8,1,8,4,8,1,7,4,1,1,0,0,0, -0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,8, -7,0,0,0,0,0,0,0,0,0,0,0,7,8,7,0, -0,8,7,8,8,1,0xe,0xe,8,8,0xe,7,0xe,0xe,7,8, -8,0,0,0,0,0,0,0,0,0,0,0,4,1,8,4, -7,0,0,0,7,7,8,7,7,1,7,7,0,7,1,0, -0,6,1,1,0,8,6,0,0,0,0,0,1,1,1,8, -0,0,0,0,0,0,0,0,8,1,1,0,0,0,0,0, -7,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0, -8,8,8,8,1,1,1,1,8,8,8,8,8,0,0,0, -0,0,0,0,0,0,7,4,7,1,1,8,8,7,7,1, -1,0,0,0,0,0,0,0,8,8,8,1,1,4,8,9, -9,8,1,1,0,8,0,0,0,0,0,0,0,0,0,0, -0,7,4,7,1,1,1,1,1,1,8,8,8,0xd,7,0, -0,0,0,0,0,0,0,1,0,8,1,0,0,0,0,0, -0,0,0,0,0,0,0,7,7,7,1,8,8,0xd,0xd,8, -7,8,8,0,0,0,0,0,0,8,0,7,4,7,1,1, -8,8,8,8,1,1,0,0,0,0,0,0,0,0,0,0, -0,1,1,0,7,7,8,7,7,7,7,0,0,4,4,0, -0,5,5,7,0,0,7,7,0,0,8,8,8,8,8,8, -8,0,0,0,7,7,1,8,8,7,1,0,0,0,0,0, -0,0,0,0,7,4,7,1,1,1,1,1,1,4,8,0xb, -5,7,5,8,7,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,4,7,1,1,1,1,0,0,4,0xb,5,0xc,8, -8,7,1,7,7,7,1,1,1,1,1,1,8,8,7,7, -8,7,1,0,0,0,0,0,0,0,0,0,0,0,8,7, -8,4,7,1,1,8,8,8,8,7,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,8,7,7,8,8,1, -1,4,8,1,8,8,8,0,0,0,0,0,0,0,0,0, -0,0,0,7,4,7,1,1,1,8,8,8,8,8,7,1, -1,0,0,0,0,0,8,1,1,8,8,8,8,8,8,1, -0,0,0,0,0,1,1,8,8,8,8,7,0,1,1,1, -1,0,8,1,1,8,8,8,7,7,1,1,1,0,0,0, -0,0,0,0,0,0,0,1,1,1,1,1,1,8,7,8, -0,0,0,0,0,0,0,8,8,1,1,1,1,1,0,8, -8,8,8,8,8,7,1,0,0,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0,7,1,1,1,1,1,1,4, -1,8,7,8,8,0,0,0,0,0,0,0,0,0,8,8, -8,8,8,1,0,0,0,8,0,8,8,0,8,8,1,8, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,7,7, -7,7,7,0,8,8,0,7,7,8,7,0,0,0,0,0, -0,0,0,0,8,1,4,7,0,0,0,0,0,0,0,0, -0,0 -}; - -static const UCPTrie inpc_trie={ - inpc_trieIndex, - { inpc_trieData }, - 765, 2930, - 0x12000, 0x12, - 1, 2, - 0, 0, - 0x2, 0x0, - 0x0, -}; - -static const int32_t maxInSCValue = 35; - -static const uint16_t insc_trieIndex[834]={ -0,0x40,0x60,0x94,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0xd4,0x112,0x152,0x190,0x1cf,0x20d,0x24c,0x28a,0x2ca,0x308,0x346,0x384, -0x3c4,0x402,0x441,0x47f,0x4bf,0x4fd,0x53d,0x57d,0x5bc,0x5fc,0x63b,0x67b,0x69b,0x6db,0x71b,0x758, -0x2f8,0x30b,0x317,0x30b,0x332,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x60,0x70,0x80, -0x90,0x94,0xa4,0xb4,0xc4,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60, -0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60, -0x70,0x40,0x50,0x60,0x70,0xd4,0xe4,0xf4,0x104,0x112,0x122,0x132,0x142,0x152,0x162,0x172, -0x182,0x190,0x1a0,0x1b0,0x1c0,0x1cf,0x1df,0x1ef,0x1ff,0x20d,0x21d,0x22d,0x23d,0x24c,0x25c,0x26c, -0x27c,0x28a,0x29a,0x2aa,0x2ba,0x2ca,0x2da,0x2ea,0x2fa,0x308,0x318,0x328,0x338,0x346,0x356,0x366, -0x376,0x384,0x394,0x3a4,0x3b4,0x3c4,0x3d4,0x3e4,0x3f4,0x402,0x412,0x422,0x432,0x441,0x451,0x461, -0x471,0x47f,0x48f,0x49f,0x4af,0x4bf,0x4cf,0x4df,0x4ef,0x4fd,0x50d,0x51d,0x52d,0x53d,0x54d,0x55d, -0x56d,0x57d,0x58d,0x59d,0x5ad,0x5bc,0x5cc,0x5dc,0x5ec,0x5fc,0x60c,0x61c,0x62c,0x63b,0x64b,0x65b, -0x66b,0x67b,0x68b,0x69b,0x6ab,0x69b,0x6ab,0x6bb,0x6cb,0x6db,0x6eb,0x6fb,0x70b,0x71b,0x72b,0x73b, -0x74b,0x758,0x768,0x778,0x788,0xe9,0xe9,0x798,0x7a3,0x7b3,0x7c3,0x7d2,0x7e1,0x7ef,0x7ff,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x80f,0x81d,0xe6,0x81d,0xe6,0x82d,0x80f,0x83d,0xe9,0xe9,0x84d, -0x859,0x863,0x872,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x882,0x16c,0x892,0x8a2,0x22d,0xe9,0x8b2,0x8c2,0xe9,0xe9,0x374,0x8d2, -0x8e1,0x30,0x40,0x40,0xe9,0x8f1,0xe9,0xe9,0x901,0x90e,0x91e,0x92a,0x30,0x30,0x40,0x40, -0x40,0x40,0x40,0x40,0x93a,0xe6,0xe9,0x94a,0x956,0x30,0x40,0x40,0x966,0xe9,0x975,0x985, -0xe9,0xe9,0x995,0x9a5,0xe9,0xe9,0x9b5,0x9c2,0x9d2,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x9e2,0x9f0,0x9fe,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0xa08,0xa14,0xa24,0x40,0x40,0x40,0x40,0x40,0x75a,0xa32,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x74,0x40,0x40,0x40,0xa42,0xe9,0xa4f, -0x40,0xe9,0xa5f,0xa6d,0xa7c,0xd6,0xe7,0xe9,0xa8c,0xa98,0x30,0xaa8,0xab6,0xac6,0xe9,0xad4, -0xe9,0xae4,0xaf3,0x40,0x40,0xb03,0xe9,0xe9,0xb12,0x297,0x30,0xb22,0xb32,0xe3,0xe9,0x889, -0xb42,0xb52,0x30,0xe9,0xb61,0xe9,0xe9,0xe9,0xb71,0xb81,0x40,0xb91,0xba1,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xbb1,0xbc1,0xbce,0x30,0xbde,0xbee,0xe9, -0xbf8,0x31,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc08,0xe6,0xe9, -0x88a,0xc18,0xc26,0xc30,0xc40,0xc50,0xe9,0xe9,0xc60,0x40,0x40,0x40,0x40,0xc70,0xe9,0x88b, -0xc80,0xc90,0xca0,0xe9,0xcad,0xd5,0xe8,0xe9,0xcbd,0xccd,0x30,0x6ba,0x35,0xe1,0x3eb,0x886, -0xcdd,0x40,0x40,0x40,0x40,0xced,0x16d,0xcfc,0xdf,0xe9,0xd0c,0xd1c,0x30,0xd2c,0x162,0x172, -0xd3c,0x308,0xd4c,0xd5c,0x9ed,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xe9, -0xd6c,0xd7a,0xd8a,0x40,0x40,0xd99,0xe9,0xe9,0x91f,0xda9,0x30,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xff,0xdb9,0xdc9,0xdd1,0x40,0x40,0xdb,0xe9,0xe9, -0xde1,0xdf1,0x30,0x40,0x40,0xdf,0xe9,0xe01,0xe0e,0x30,0x40,0x40,0x40,0xe9,0xe1e,0xe2e, -0xe3e,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdf,0xe9,0x886, -0xe4e,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xe5e,0xe9,0xe9, -0xe6b,0xe7b,0xe8b,0xe9,0xe9,0xe97,0xea1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xeb1,0xe9,0xff, -0xec1,0xed1,0x6bb,0xee1,0x555,0xe9,0xeef,0x72b,0xeff,0x40,0x40,0x40,0x40,0xf0f,0xe9,0xe9, -0xf1e,0xf2e,0x30,0xf3e,0xe9,0xf4a,0xf57,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0xe9,0xf67,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x45,0x55,0x55,0x55,0x65,0x85,0xa5,0xc5, -0xe5,4,4,0xf5,0x114,0x134,0x154,4,0x174,4,0x17d,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,0x19d,0x1bd,4,4,4, -4,4,4,4,4,4,4,0x1dd,4,4,0x1fd,0x21d,0x23d,0x25d,0x27d,0x29d, -0x2bd,0x2d8 -}; - -static const uint8_t insc_trieData[3960]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1c,0x1c,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x22,0x22, -0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f, -0x22,0x22,0,4,4,0,0,0x22,0x22,0x22,5,5,5,5,5,5, -5,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0,0,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5, -5,5,0xc,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0, -0,0x23,0x23,0,0,0x23,0x23,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,0,0,0,5,5,5,5,0,0,0x17,1, -0x22,0x22,0x22,0x22,0x22,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,6,0, -0,0,0,0,0,0,0,0x22,0,0,0,0,5,5,0,5, -0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -5,5,0,0,0,0,0,0,0,0,0,0,2,0,0x1c,0, -2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0,0,0x23,0x23, -0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5, -0,5,5,0,5,5,0,5,5,0,0,0x17,0,0x22,0x22,0x22, -0,0,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,0,0,0,4,0, -0,0,0,0,0,0,5,5,5,5,0,5,0,0,0,0, -0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,2,0x12,0xc, -0xc,0,0xb,0,0,0,0,0,0,0,0,0,0,2,2,0x20, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0,0x23, -0x23,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5, -0,5,5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0x22, -0,0x22,0x22,0x22,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x23,0x23,0x22,0x22,0,0, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0, -0,0,0,5,4,4,4,0x17,0x17,0x17,0,2,2,0x20,0,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,0x23,0,0,0x23,0x23,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,0,5,5,0,5, -5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0,0,0x22, -0x22,0,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,0x22,0x22, -0,0,0,0,5,5,0,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,5,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0x15,0,0x23,0x23,0x23,0x23,0x23, -0x23,0,0,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,0,0,0,5, -5,0,5,0,5,5,0,0,0,5,5,0,0,0,5,5, -5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0x22,0x22,0x22,0,0,0,0x22,0x22,0x22,0,0x22,0x22, -0x22,0x1f,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,0x20,2,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,1,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f, -0,0,0,0,0,0,0,0x22,0x22,0,5,5,5,0,0,0, -0,0,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23, -0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,0,0,0x17,1,0x22, -0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0,0,0, -0,0,0,0,0x22,0x22,0,0,0,0,0,0,0,5,0,0x23, -0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0, -0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23, -0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,1,0x22,0x22,0x22, -0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0xd,0,0,0,0, -0,6,6,6,0x22,0,0,0,0,0,0,0,0x23,0x23,0x23,0x22, -0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0, -0,0,0,0,0,0,0,6,6,6,6,6,6,0,0,2, -0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,5,5,0,5,0,0,5,5,5, -5,5,5,5,0,0,0,0x1f,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0,0x22,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0,0, -0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0x22, -0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0,0x22,0x1e,0x1e,0x1e,0x1e,0xa,2,0x1a,0,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,5, -0,0,5,5,0,5,0,0,5,0,0,0,0,0,0,5, -5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,0, -5,0,5,0,0,5,5,0,5,5,0,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0,0x22,0xb,0xb,0,0,0x22,0x22,0x22,0x22,0x22, -0,0,0,0x1e,0x1e,0x1e,0x1e,0,2,0,0,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0,0,5,5,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0, -0x1c,0,0x1c,0,0x17,0,0,0,0,0,0,5,5,5,5,5, -5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x22,2,2,0x1a, -1,0,0,8,8,8,8,8,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0,0,0,0,0,0,0x1c,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e,0x20,0x13,0x1a,0xb,0xb, -0xb,0xb,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0xc,0, -0,0xc,0,5,5,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,5,5,5, -5,0xb,0xb,5,0x22,0x1e,0x1e,5,5,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e, -5,5,0x22,0x22,0x22,0x22,5,5,5,5,5,5,5,5,5,5, -5,0xb,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,5,0x1e,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1e,0x1e,0x22,0x22,0,0,0x23, -0x23,0x23,5,5,5,5,5,5,5,5,5,5,0,5,5,0x22, -0x22,0x1a,0,0,0,0,0,0,0,0,0,0,0,5,5,0x22, -0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0x22, -0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x1b,0x1b,0x1c,0x10, -0xa,0x1c,0x1c,0x1a,0x13,0x1c,0,0,0,0,0,0,0,0,1,0x1c, -0,0,0xc,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf,0xf,0xf,0,0, -0,0,7,7,2,7,7,7,7,7,7,7,0x22,0x1c,0,0, -0,0,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0,0,0x1d,0x1d,0x1d,0x1d,0x1d,0,0,0,0,0,0,0,0,0, -0,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,7,7,7,7,7,7,7,0x1e,0x1e,0,0,0,0,0, -0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23,0x23, -0x23,5,5,0xb,0xb,0xf,7,7,9,0xf,0xf,0xf,0xf,0,0x13,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1a,0x1c,0x1c,0,0,0x1c,2,2,2,0x10,0x20,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,0x17,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,5,5,5,5,5, -5,5,0,0,0,0,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23, -5,5,5,5,5,5,0xf,0xf,0xf,0x22,0x22,0x22,0x22,0x22,0x22,0x1a, -0x13,0xf,0xf,5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,1, -5,5,5,7,7,5,5,5,5,0x23,0x23,0x17,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,7,7,0x1a,0x1a,0,0,0,0,0,0,0, -0,0,0,0,0,5,5,5,5,0xf,0xf,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,7,7,7,7,2,2,0x1c,0x17,0,0,0,0,0,0, -0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,5, -5,5,4,4,4,0,4,4,4,4,4,4,4,4,4,4, -4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x20,0x20,4,0x11,0x11,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0x1c,0,0,0,0,0,0,0,0,0,0,0,0, -0x16,0x14,0,0,0xc,0xc,0xc,0xc,0xc,0,0,0,0,0,0,0, -0,0,0,0,0x1c,0x1c,0x1c,0,0,0,0,0,0,0,0,0, -0,0,0x23,0x23,0,0x23,0x23,0x23,0x1a,5,5,5,5,2,5,5, -5,5,0x22,0x22,0x22,0x22,0x22,0,0,0,0,0,0,0,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x21,0x21,5, -5,5,5,0x21,0xf,0xf,5,5,5,5,5,5,5,0xf,5,2, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -0xb,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,2,2,0,0,0,0,0,0, -0,0,0,0,0x23,0x22,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -5,5,5,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e, -0x1e,0x1e,0,0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,7,7,7,0x1a,0,0,0,0,0,0,0,0,0, -0,0,0,2,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,5,5,5,0x23, -0x23,0x23,5,5,5,0x17,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf, -0xb,0xb,5,5,5,5,5,0x22,0,5,5,5,5,5,5,5, -5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,5,5,5,5, -5,0,0x22,0x22,0x22,0xb,0xb,0xb,0xb,0,0,0,0,0,0,0, -0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -0,0,5,5,5,0xc,0xc,0xc,0,0,0,5,0x1e,0x1e,0x1e,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, -0x1e,0x1d,0x1e,0x1d,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x23,0x23,5,5,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22, -0x22,0,0,0,0,0,0x20,0x13,0,0,0,0,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23, -0x23,5,0x23,5,5,5,5,5,5,5,5,5,7,7,7,7, -7,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x1e,0x1a,0,0,5,0x22, -0x22,0x22,0,0x22,0x22,0,0,0,0,0,0x22,0x22,2,0x20,5,5, -5,5,0,5,5,5,0,5,5,5,5,5,5,5,0,0, -0x17,0x17,0x17,0,0,0,0,0x13,2,2,0x20,0x11,0x11,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0, -0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x19, -2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0, -2,2,0x20,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5, -0x22,0x22,0x22,0x13,0x1a,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0,0,0,0,5,0x22,0x22,0,0,0,0,0,0,0,0,0, -0x21,0x21,0x21,0x21,0x21,5,5,5,5,5,5,5,5,5,5,5, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,1,0xe, -0xe,0,0,0,0,0,0x1c,0x17,0x22,0x22,0,0,0,0x22,0x22,0x22, -0x22,2,0x1f,0x17,0x12,0,0,0,0,0,0,4,0,0x23,0x23,0x23, -0x23,5,5,5,0,5,0,5,5,5,5,0,5,5,5,5, -5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,2,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x17,0x1a,0,0,0,0,0,2,2,2,0x20, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,5,0,5,5, -0,5,5,5,5,5,0,0x17,0x17,1,0x22,0x22,0,0,0,0, -0,0,0,0x22,0,0,0,0,0,0,2,2,0x23,0x23,0x22,0x22, -0,0,4,4,4,4,4,4,4,0,0,0,5,5,5,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,2,0x20, -0x17,1,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0,0,0,0,0x1c,0,0x23,0x23,0x23,0x23,0x23,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,2,0x20,0x1f,0x17,1,0,0, -0,0,0,0,0,0,0,0,0,0x22,0x22,0x22,0x22,0x22,0x22,0, -0,0x22,0x22,0x22,0x22,2,2,0x20,0x1f,0x17,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x23,0x23,0x23,0x23,0x22,0x22,0, -0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20, -0x1f,0x22,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,2,0x20,0x22,0x22, -0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,0,0,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,0,0,0xb,0xb,0xb,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,2,0x20,0x1f,0x17,0,0,0,0,0,0x23,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,5,0x1c,0x1a, -2,2,2,2,0x20,0xe,0xb,0xb,0xb,0xb,0xc,0,0,0,0,0, -0xc,0,0x13,0,0,0,0,0,0,0,0,0x23,0x22,0x22,0x22,0x22, -0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,0,0,0xe,0xe,0xe, -0xe,7,7,7,7,7,7,2,0x20,0x12,0x13,0,0,0,1,0, -0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0x23,5, -5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0x22,2,2,0x20, -0x1f,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0, -0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x22, -0x22,0x22,0x22,0x22,2,2,0,0,0,0,0,0,0,0,0,0x23, -0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,5,5,5,5,0x22, -0x22,0x22,0x22,0x22,0x22,0,0,0,0x22,0,0x22,0x22,0,0x22,2,0x20, -0x17,0x22,0x1a,0x13,0xd,0xb,0,0,0,0,0,0,0,0,0x23,0x23, -0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,0x23,5,5,5,5,5,5, -5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,2,0x20,0x13,0, -0,0,0,0,0,0,0,5,5,0xc,0x22,0x22,0x22,0x22,0,0, -0,0,0,0,0,0,0,0 -}; - -static const UCPTrie insc_trie={ - insc_trieIndex, - { insc_trieData }, - 834, 3960, - 0x12000, 0x12, - 1, 2, - 0, 0, - 0x4, 0x40, - 0x0, -}; - -static const int32_t maxVoValue = 3; - -static const uint16_t vo_trieIndex[1100]={ -0,0x40,0x59,0x98,0,0,0,0,0,0,0,0xd0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x33b,0x355,0x363,0x379,0x399,0x3b7,0x3d2,0x3ec,0x355,0x355,0x355,0x40c,0x355,0x355,0x355,0x40c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c, -0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x355,0x355,0x355,0x40c, -0x355,0x355,0x355,0x40c,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x59,0x69,0x79,0x89, -0x98,0xa8,0xb8,0xc8,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0xd0,0xe0,0xf0,0x100,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, -0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x10f,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa9,0x96,0x11e,0x12c,0xae,0xaa,0,0,0,0,0, -0,0x103,0x13c,0,0x14c,0x158,0x166,0x10b,0x175,0x110,0x110,0x110,0x184,0,0,0, -0,0,0,0,0x72,0,0xf6,0,0,0,0,0,0,0,0,0, -0,0,0,0x190,0x110,0x198,0,0,0,0,0x103,0x110,0x115,0,0xec,0x1a8, -0x1b6,0x10e,0x110,0x110,0x1c6,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110, -0x110,0x110,0x116,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x118,0x10a,0x110,0x1d2,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x10e,0x110,0,0, -0x116,0,0,0,0,0,0x108,0x110,0x1e2,0x114,0x110,0,0,0,0,0, -0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x1f1,0x1ff,0x110,0x20e,0x21d, -0x110,0x22a,0x110,0x237,0x246,0x256,0x110,0x22a,0x110,0x237,0x261,0x110,0x110,0x26e,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x27e,0x27e,0x27e,0x27e, -0x286,0x110,0x28e,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,0, -0,0,0,0x110,0,0x110,0x117,0x29b,0x2aa,0,0,0,0,0,0,0, -0,0,0x2ba,0x2c9,0x110,0x2d9,0x110,0x2e9,0x2f8,0,0,0,0,0,0,0, -0x308,0x318,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0, -0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0,0,0,0,0,0,0,0,0x328,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x112,0x84,0x98,0xa8,0xa8,0xa8, -0xa8,0xa8,0xa8,0xc8,0xc,0xe8,0x100,0x115,0xc,0xc,0xc,0x134,0x153,0x172,0x191,0xc, -0x1ab,0xc,0x1cb,0x1eb,0x20b,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0xfb,0xc,0x243,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0xc,0xc,0xc,0xc,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0x262,0xc,0xc,0xc,0xc,0x282,0xc,0xc, -0xc,0xc,0xc,0x29c,0xc,0xc,0xfd,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0x223,0x223,0x2b9,0xc,0xc,0xc,0xc,0xc,0x223,0x100,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2bc,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x2da,0xf8,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0x223,0x2fa,0xc,0xc,0x223,0xfd,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0x223,0x31a,0x223,0x223,0xc8,0x2b5,0xc,0xc,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223, -0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x31b,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc -}; - -static const uint8_t vo_trieData[828]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,0,0,0,3,0,0,3,0,0,0,0,0, -0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -0,0,0,0,0,0,0,0,0,3,3,0,0,0,3,0, -0,0,0,3,3,3,0,0,0,0,0,0,3,0,3,3, -3,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3, -3,3,3,3,3,3,0,0,0,0,0,3,3,0,3,3, -0,0,0,0,0,0,3,3,3,3,0,3,0,3,0,3, -0,0,0,0,3,0,0,0,0,0,3,3,3,3,3,3, -0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,0, -3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3, -3,1,1,3,0,0,0,0,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3, -3,3,0,0,0,0,3,3,3,0,3,3,3,3,3,3, -3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3, -3,3,2,2,3,3,3,3,3,1,1,1,1,1,1,1, -1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3, -2,3,2,3,2,3,2,3,3,3,3,3,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,3, -3,3,3,3,3,2,3,3,3,3,3,2,2,3,3,3, -3,2,2,3,3,3,1,2,3,2,3,2,3,2,3,2, -3,3,3,3,3,3,2,2,3,3,3,3,3,1,3,3, -3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3, -3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3, -3,3,3,0,1,1,1,1,1,1,3,3,3,0,0,0, -0,3,3,3,3,3,3,3,3,3,0,2,3,3,3,3, -3,3,1,1,3,3,2,0,2,3,3,3,3,3,3,3, -3,3,3,1,1,0,0,0,2,3,3,3,3,3,3,3, -3,3,3,3,1,3,1,3,1,3,3,3,3,3,3,3, -3,3,3,3,1,1,1,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,3,3,3,1,3,3,3,3, -0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3, -3,0,0,0,3,3,0,0,2,2,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,0,0,0,0 -}; - -static const UCPTrie vo_trie={ - vo_trieIndex, - { vo_trieData }, - 1100, 828, - 0x110000, 0x110, - 1, 2, - 0, 0, - 0xc, 0x0, - 0x0, -}; - -#endif // INCLUDED_FROM_UPROPS_CPP diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 81b6e0f68ab88b..73b43204b814b9 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -457,8 +457,6 @@ NULL typedef struct CanonicalizationMap { const char *id; /* input ID */ const char *canonicalID; /* canonicalized output ID */ - const char *keyword; /* keyword, or NULL if none */ - const char *value; /* keyword value, or NULL if kw==NULL */ } CanonicalizationMap; /** @@ -466,64 +464,16 @@ typedef struct CanonicalizationMap { * different semantic kinds of transformations. */ static const CanonicalizationMap CANONICALIZE_MAP[] = { - { "", "en_US_POSIX", NULL, NULL }, /* .NET name */ - { "c", "en_US_POSIX", NULL, NULL }, /* POSIX name */ - { "posix", "en_US_POSIX", NULL, NULL }, /* POSIX name (alias of C) */ - { "art_LOJBAN", "jbo", NULL, NULL }, /* registered name */ - { "az_AZ_CYRL", "az_Cyrl_AZ", NULL, NULL }, /* .NET name */ - { "az_AZ_LATN", "az_Latn_AZ", NULL, NULL }, /* .NET name */ - { "ca_ES_PREEURO", "ca_ES", "currency", "ESP" }, - { "de__PHONEBOOK", "de", "collation", "phonebook" }, /* Old ICU name */ - { "de_AT_PREEURO", "de_AT", "currency", "ATS" }, - { "de_DE_PREEURO", "de_DE", "currency", "DEM" }, - { "de_LU_PREEURO", "de_LU", "currency", "LUF" }, - { "el_GR_PREEURO", "el_GR", "currency", "GRD" }, - { "en_BE_PREEURO", "en_BE", "currency", "BEF" }, - { "en_IE_PREEURO", "en_IE", "currency", "IEP" }, - { "es__TRADITIONAL", "es", "collation", "traditional" }, /* Old ICU name */ - { "es_ES_PREEURO", "es_ES", "currency", "ESP" }, - { "eu_ES_PREEURO", "eu_ES", "currency", "ESP" }, - { "fi_FI_PREEURO", "fi_FI", "currency", "FIM" }, - { "fr_BE_PREEURO", "fr_BE", "currency", "BEF" }, - { "fr_FR_PREEURO", "fr_FR", "currency", "FRF" }, - { "fr_LU_PREEURO", "fr_LU", "currency", "LUF" }, - { "ga_IE_PREEURO", "ga_IE", "currency", "IEP" }, - { "gl_ES_PREEURO", "gl_ES", "currency", "ESP" }, - { "hi__DIRECT", "hi", "collation", "direct" }, /* Old ICU name */ - { "it_IT_PREEURO", "it_IT", "currency", "ITL" }, - { "ja_JP_TRADITIONAL", "ja_JP", "calendar", "japanese" }, /* Old ICU name */ - { "nb_NO_NY", "nn_NO", NULL, NULL }, /* "markus said this was ok" :-) */ - { "nl_BE_PREEURO", "nl_BE", "currency", "BEF" }, - { "nl_NL_PREEURO", "nl_NL", "currency", "NLG" }, - { "pt_PT_PREEURO", "pt_PT", "currency", "PTE" }, - { "sr_SP_CYRL", "sr_Cyrl_RS", NULL, NULL }, /* .NET name */ - { "sr_SP_LATN", "sr_Latn_RS", NULL, NULL }, /* .NET name */ - { "sr_YU_CYRILLIC", "sr_Cyrl_RS", NULL, NULL }, /* Linux name */ - { "th_TH_TRADITIONAL", "th_TH", "calendar", "buddhist" }, /* Old ICU name */ - { "uz_UZ_CYRILLIC", "uz_Cyrl_UZ", NULL, NULL }, /* Linux name */ - { "uz_UZ_CYRL", "uz_Cyrl_UZ", NULL, NULL }, /* .NET name */ - { "uz_UZ_LATN", "uz_Latn_UZ", NULL, NULL }, /* .NET name */ - { "zh_CHS", "zh_Hans", NULL, NULL }, /* .NET name */ - { "zh_CHT", "zh_Hant", NULL, NULL }, /* .NET name */ - { "zh_GAN", "gan", NULL, NULL }, /* registered name */ - { "zh_GUOYU", "zh", NULL, NULL }, /* registered name */ - { "zh_HAKKA", "hak", NULL, NULL }, /* registered name */ - { "zh_MIN_NAN", "nan", NULL, NULL }, /* registered name */ - { "zh_WUU", "wuu", NULL, NULL }, /* registered name */ - { "zh_XIANG", "hsn", NULL, NULL }, /* registered name */ - { "zh_YUE", "yue", NULL, NULL }, /* registered name */ -}; - -typedef struct VariantMap { - const char *variant; /* input ID */ - const char *keyword; /* keyword, or NULL if none */ - const char *value; /* keyword value, or NULL if kw==NULL */ -} VariantMap; - -static const VariantMap VARIANT_MAP[] = { - { "EURO", "currency", "EUR" }, - { "PINYIN", "collation", "pinyin" }, /* Solaris variant */ - { "STROKE", "collation", "stroke" } /* Solaris variant */ + { "art_LOJBAN", "jbo" }, /* registered name */ + { "hy__AREVELA", "hy" }, /* Registered IANA variant */ + { "hy__AREVMDA", "hyw" }, /* Registered IANA variant */ + { "zh_GAN", "gan" }, /* registered name */ + { "zh_GUOYU", "zh" }, /* registered name */ + { "zh_HAKKA", "hak" }, /* registered name */ + { "zh_MIN_NAN", "nan" }, /* registered name */ + { "zh_WUU", "wuu" }, /* registered name */ + { "zh_XIANG", "hsn" }, /* registered name */ + { "zh_YUE", "yue" }, /* registered name */ }; /* ### BCP47 Conversion *******************************************/ @@ -643,20 +593,12 @@ compareKeywordStructs(const void * /*context*/, const void *left, const void *ri return uprv_strcmp(leftString, rightString); } -/** - * Both addKeyword and addValue must already be in canonical form. - * Either both addKeyword and addValue are NULL, or neither is NULL. - * If they are not NULL they must be zero terminated. - * If addKeyword is not NULL is must have length small enough to fit in KeywordStruct.keyword. - */ static int32_t _getKeywords(const char *localeID, char prev, char *keywords, int32_t keywordCapacity, char *values, int32_t valuesCapacity, int32_t *valLen, UBool valuesToo, - const char* addKeyword, - const char* addValue, UErrorCode *status) { KeywordStruct keywordList[ULOC_MAX_NO_KEYWORDS]; @@ -755,33 +697,6 @@ _getKeywords(const char *localeID, } } while(pos); - /* Handle addKeyword/addValue. */ - if (addKeyword != NULL) { - UBool duplicate = FALSE; - U_ASSERT(addValue != NULL); - /* Search for duplicate; if found, do nothing. Explicit keyword - overrides addKeyword. */ - for (j=0; j= 0); - while (len-- != 0) { - char d = *str; - if (d == c) { - return (char*) str; - } else if (d == 0) { - break; - } - ++str; - } - return NULL; -} - /** * Lookup 'key' in the array 'list'. The array 'list' should contain * a NULL entry, followed by more entries, and a second NULL entry. @@ -1279,6 +1180,16 @@ ulocimp_getLanguage(const char *localeID, int32_t offset; char lang[4]={ 0, 0, 0, 0 }; /* temporary buffer to hold language code for searching */ + if (uprv_stricmp(localeID, "root") == 0) { + localeID += 4; + } else if (uprv_strnicmp(localeID, "und", 3) == 0 && + (localeID[3] == '\0' || + localeID[3] == '-' || + localeID[3] == '_' || + localeID[3] == '@')) { + localeID += 3; + } + /* if it starts with i- or x- then copy that prefix */ if(_isIDPrefix(localeID)) { if(i "FOO_BAR". - * @param variants the source string of one or more variants, - * separated by '_'. This will be MODIFIED IN PLACE. Not zero - * terminated; if it is, trailing zero will NOT be maintained. - * @param variantsLen length of variants - * @param toDelete variant to delete, without separators, e.g. "EURO" - * or "PREEURO"; not zero terminated - * @param toDeleteLen length of toDelete - * @return number of characters deleted from variants - */ -static int32_t -_deleteVariant(char* variants, int32_t variantsLen, - const char* toDelete, int32_t toDeleteLen) -{ - int32_t delta = 0; /* number of chars deleted */ - for (;;) { - UBool flag = FALSE; - if (variantsLen < toDeleteLen) { - return delta; - } - if (uprv_strncmp(variants, toDelete, toDeleteLen) == 0 && - (variantsLen == toDeleteLen || - (flag=(variants[toDeleteLen] == '_')) != 0)) - { - int32_t d = toDeleteLen + (flag?1:0); - variantsLen -= d; - delta += d; - if (variantsLen > 0) { - uprv_memmove(variants, variants+d, variantsLen); - } - } else { - char* p = _strnchr(variants, variantsLen, '_'); - if (p == NULL) { - return delta; - } - ++p; - variantsLen -= (int32_t)(p - variants); - variants = p; - } - } -} - /* Keyword enumeration */ typedef struct UKeywordsContext { @@ -1698,8 +1565,6 @@ _canonicalize(const char* localeID, const char* tmpLocaleID; const char* keywordAssign = NULL; const char* separatorIndicator = NULL; - const char* addKeyword = NULL; - const char* addValue = NULL; char* name; char* variant = NULL; /* pointer into name, or NULL */ @@ -1738,7 +1603,7 @@ _canonicalize(const char* localeID, len = (int32_t)uprv_strlen(d); if (name != NULL) { - uprv_strncpy(name, d, len); + uprv_memcpy(name, d, len); } } else if(_isIDSeparator(*tmpLocaleID)) { const char *scriptID; @@ -1864,27 +1729,6 @@ _canonicalize(const char* localeID, } } - /* Handle generic variants first */ - if (variant) { - for (j=0; j 0) { - if (len > 0 && name[len-1] == '_') { /* delete trailing '_' */ - --len; - } - addKeyword = VARIANT_MAP[j].keyword; - addValue = VARIANT_MAP[j].value; - break; - } - } - if (len > 0 && len <= nameCapacity && name[len-1] == '_') { /* delete trailing '_' */ - --len; - } - } - /* Look up the ID in the canonicalization map */ for (j=0; j 0) - { + // First, attempt Windows platform lookup if available, but fall + // through to catch any special cases (ICU vs Windows name differences). + lcid = uprv_convertToLCIDPlatform(localeID, &status); + if (U_FAILURE(status)) { + return 0; + } + if (lcid > 0) { // Windows found an LCID, return that return lcid; } uloc_getLanguage(localeID, langID, sizeof(langID), &status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return 0; } diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index 17ad91da01586d..25f35b5ced42d5 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -6,8 +6,14 @@ * Corporation and others. All Rights Reserved. ********************************************************************** */ +#include + #include "unicode/utypes.h" +#include "unicode/unistr.h" +#include "unicode/uobject.h" +#include "charstr.h" +#include "cmemory.h" #include "cstring.h" #include "uassert.h" #include "ucln_cmn.h" @@ -19,9 +25,6 @@ static UHashtable* gLocExtKeyMap = NULL; static icu::UInitOnce gLocExtKeyMapInitOnce = U_INITONCE_INITIALIZER; -static icu::UVector* gKeyTypeStringPool = NULL; -static icu::UVector* gLocExtKeyDataEntries = NULL; -static icu::UVector* gLocExtTypeEntries = NULL; // bit flags for special types typedef enum { @@ -31,17 +34,21 @@ typedef enum { SPECIALTYPE_RG_KEY_VALUE = 4 } SpecialType; -typedef struct LocExtKeyData { +struct LocExtKeyData : public icu::UMemory { const char* legacyId; const char* bcpId; - UHashtable* typeMap; + icu::LocalUHashtablePointer typeMap; uint32_t specialTypes; -} LocExtKeyData; +}; -typedef struct LocExtType { +struct LocExtType : public icu::UMemory { const char* legacyId; const char* bcpId; -} LocExtType; +}; + +static icu::MemoryPool* gKeyTypeStringPool = NULL; +static icu::MemoryPool* gLocExtKeyDataEntries = NULL; +static icu::MemoryPool* gLocExtTypeEntries = NULL; U_CDECL_BEGIN @@ -65,25 +72,6 @@ uloc_key_type_cleanup(void) { return TRUE; } -static void U_CALLCONV -uloc_deleteKeyTypeStringPoolEntry(void* obj) { - uprv_free(obj); -} - -static void U_CALLCONV -uloc_deleteKeyDataEntry(void* obj) { - LocExtKeyData* keyData = (LocExtKeyData*)obj; - if (keyData->typeMap != NULL) { - uhash_close(keyData->typeMap); - } - uprv_free(keyData); -} - -static void U_CALLCONV -uloc_deleteTypeEntry(void* obj) { - uprv_free(obj); -} - U_CDECL_END @@ -107,32 +95,20 @@ initFromResourceBundle(UErrorCode& sts) { tmpSts = U_ZERO_ERROR; LocalUResourceBundlePointer bcpTypeAliasRes(ures_getByKey(keyTypeDataRes.getAlias(), "bcpTypeAlias", NULL, &tmpSts)); - // initialize vectors storing dynamically allocated objects - gKeyTypeStringPool = new UVector(uloc_deleteKeyTypeStringPoolEntry, NULL, sts); + // initialize pools storing dynamically allocated objects + gKeyTypeStringPool = new icu::MemoryPool; if (gKeyTypeStringPool == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } - gLocExtKeyDataEntries = new UVector(uloc_deleteKeyDataEntry, NULL, sts); + gLocExtKeyDataEntries = new icu::MemoryPool; if (gLocExtKeyDataEntries == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } - gLocExtTypeEntries = new UVector(uloc_deleteTypeEntry, NULL, sts); + gLocExtTypeEntries = new icu::MemoryPool; if (gLocExtTypeEntries == NULL) { - if (U_SUCCESS(sts)) { - sts = U_MEMORY_ALLOCATION_ERROR; - } - } - if (U_FAILURE(sts)) { + sts = U_MEMORY_ALLOCATION_ERROR; return; } @@ -145,27 +121,24 @@ initFromResourceBundle(UErrorCode& sts) { break; } const char* legacyKeyId = ures_getKey(keyMapEntry.getAlias()); - int32_t bcpKeyIdLen = 0; - const UChar* uBcpKeyId = ures_getString(keyMapEntry.getAlias(), &bcpKeyIdLen, &sts); + UnicodeString uBcpKeyId = ures_getUnicodeString(keyMapEntry.getAlias(), &sts); if (U_FAILURE(sts)) { break; } // empty value indicates that BCP key is same with the legacy key. const char* bcpKeyId = legacyKeyId; - if (bcpKeyIdLen > 0) { - char* bcpKeyIdBuf = (char*)uprv_malloc(bcpKeyIdLen + 1); + if (!uBcpKeyId.isEmpty()) { + icu::CharString* bcpKeyIdBuf = gKeyTypeStringPool->create(); if (bcpKeyIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - u_UCharsToChars(uBcpKeyId, bcpKeyIdBuf, bcpKeyIdLen); - bcpKeyIdBuf[bcpKeyIdLen] = 0; - gKeyTypeStringPool->addElement(bcpKeyIdBuf, sts); + bcpKeyIdBuf->appendInvariantChars(uBcpKeyId, sts); if (U_FAILURE(sts)) { break; } - bcpKeyId = bcpKeyIdBuf; + bcpKeyId = bcpKeyIdBuf->data(); } UBool isTZ = uprv_strcmp(legacyKeyId, "timezone") == 0; @@ -199,7 +172,7 @@ initFromResourceBundle(UErrorCode& sts) { LocalUResourceBundlePointer typeMapResByKey(ures_getByKey(typeMapRes.getAlias(), legacyKeyId, NULL, &tmpSts)); if (U_FAILURE(tmpSts)) { // type map for each key must exist - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } else { LocalUResourceBundlePointer typeMapEntry; @@ -228,70 +201,54 @@ initFromResourceBundle(UErrorCode& sts) { // a timezone key uses a colon instead of a slash in the resource. // e.g. America:Los_Angeles if (uprv_strchr(legacyTypeId, ':') != NULL) { - int32_t legacyTypeIdLen = static_cast(uprv_strlen(legacyTypeId)); - char* legacyTypeIdBuf = (char*)uprv_malloc(legacyTypeIdLen + 1); + icu::CharString* legacyTypeIdBuf = + gKeyTypeStringPool->create(legacyTypeId, sts); if (legacyTypeIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - const char* p = legacyTypeId; - char* q = legacyTypeIdBuf; - while (*p) { - if (*p == ':') { - *q++ = '/'; - } else { - *q++ = *p; - } - p++; - } - *q = 0; - - gKeyTypeStringPool->addElement(legacyTypeIdBuf, sts); if (U_FAILURE(sts)) { break; } - legacyTypeId = legacyTypeIdBuf; + std::replace( + legacyTypeIdBuf->data(), + legacyTypeIdBuf->data() + legacyTypeIdBuf->length(), + ':', '/'); + legacyTypeId = legacyTypeIdBuf->data(); } } - int32_t bcpTypeIdLen = 0; - const UChar* uBcpTypeId = ures_getString(typeMapEntry.getAlias(), &bcpTypeIdLen, &sts); + UnicodeString uBcpTypeId = ures_getUnicodeString(typeMapEntry.getAlias(), &sts); if (U_FAILURE(sts)) { break; } // empty value indicates that BCP type is same with the legacy type. const char* bcpTypeId = legacyTypeId; - if (bcpTypeIdLen > 0) { - char* bcpTypeIdBuf = (char*)uprv_malloc(bcpTypeIdLen + 1); + if (!uBcpTypeId.isEmpty()) { + icu::CharString* bcpTypeIdBuf = gKeyTypeStringPool->create(); if (bcpTypeIdBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - u_UCharsToChars(uBcpTypeId, bcpTypeIdBuf, bcpTypeIdLen); - bcpTypeIdBuf[bcpTypeIdLen] = 0; - gKeyTypeStringPool->addElement(bcpTypeIdBuf, sts); + bcpTypeIdBuf->appendInvariantChars(uBcpTypeId, sts); if (U_FAILURE(sts)) { break; } - bcpTypeId = bcpTypeIdBuf; + bcpTypeId = bcpTypeIdBuf->data(); } // Note: legacy type value should never be // equivalent to bcp type value of a different // type under the same key. So we use a single // map for lookup. - LocExtType* t = (LocExtType*)uprv_malloc(sizeof(LocExtType)); + LocExtType* t = gLocExtTypeEntries->create(); if (t == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } t->bcpId = bcpTypeId; t->legacyId = legacyTypeId; - gLocExtTypeEntries->addElement((void*)t, sts); - if (U_FAILURE(sts)) { - break; - } uhash_put(typeDataMap, (void*)legacyTypeId, t, &sts); if (bcpTypeId != legacyTypeId) { @@ -320,29 +277,20 @@ initFromResourceBundle(UErrorCode& sts) { if (isTZ) { // replace colon with slash if necessary if (uprv_strchr(from, ':') != NULL) { - int32_t fromLen = static_cast(uprv_strlen(from)); - char* fromBuf = (char*)uprv_malloc(fromLen + 1); + icu::CharString* fromBuf = + gKeyTypeStringPool->create(from, sts); if (fromBuf == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; } - const char* p = from; - char* q = fromBuf; - while (*p) { - if (*p == ':') { - *q++ = '/'; - } else { - *q++ = *p; - } - p++; - } - *q = 0; - - gKeyTypeStringPool->addElement(fromBuf, sts); if (U_FAILURE(sts)) { break; } - from = fromBuf; + std::replace( + fromBuf->data(), + fromBuf->data() + fromBuf->length(), + ':', '/'); + from = fromBuf->data(); } } uhash_put(typeDataMap, (void*)from, t, &sts); @@ -380,7 +328,7 @@ initFromResourceBundle(UErrorCode& sts) { break; } - LocExtKeyData* keyData = (LocExtKeyData*)uprv_malloc(sizeof(LocExtKeyData)); + LocExtKeyData* keyData = gLocExtKeyDataEntries->create(); if (keyData == NULL) { sts = U_MEMORY_ALLOCATION_ERROR; break; @@ -388,12 +336,7 @@ initFromResourceBundle(UErrorCode& sts) { keyData->bcpId = bcpKeyId; keyData->legacyId = legacyKeyId; keyData->specialTypes = specialTypes; - keyData->typeMap = typeDataMap; - - gLocExtKeyDataEntries->addElement((void*)keyData, sts); - if (U_FAILURE(sts)) { - break; - } + keyData->typeMap.adoptInstead(typeDataMap); uhash_put(gLocExtKeyMap, (void*)legacyKeyId, keyData, &sts); if (legacyKeyId != bcpKeyId) { @@ -518,7 +461,7 @@ ulocimp_toBcpType(const char* key, const char* type, UBool* isKnownKey, UBool* i if (isKnownKey != NULL) { *isKnownKey = TRUE; } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type); + LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); if (t != NULL) { return t->bcpId; } @@ -563,7 +506,7 @@ ulocimp_toLegacyType(const char* key, const char* type, UBool* isKnownKey, UBool if (isKnownKey != NULL) { *isKnownKey = TRUE; } - LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap, type); + LocExtType* t = (LocExtType*)uhash_get(keyData->typeMap.getAlias(), type); if (t != NULL) { return t->legacyId; } diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index 8120331c4b91ff..c732170cb62b9c 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -7,9 +7,12 @@ ********************************************************************** */ +#include "unicode/bytestream.h" #include "unicode/utypes.h" #include "unicode/ures.h" +#include "unicode/localpointer.h" #include "unicode/putil.h" +#include "unicode/uenum.h" #include "unicode/uloc.h" #include "ustr_imp.h" #include "charstr.h" @@ -18,7 +21,6 @@ #include "putilimp.h" #include "uinvchar.h" #include "ulocimp.h" -#include "uvector.h" #include "uassert.h" @@ -29,17 +31,17 @@ typedef struct VariantListEntry { } VariantListEntry; /* struct holding a single attribute value */ -typedef struct AttributeListEntry { +struct AttributeListEntry : public icu::UMemory { const char *attribute; struct AttributeListEntry *next; -} AttributeListEntry; +}; /* struct holding a single extension */ -typedef struct ExtensionListEntry { +struct ExtensionListEntry : public icu::UMemory { const char *key; const char *value; struct ExtensionListEntry *next; -} ExtensionListEntry; +}; #define MAXEXTLANG 3 typedef struct ULanguageTag { @@ -347,45 +349,20 @@ static const char* ultag_getGrandfathered(const ULanguageTag* langtag); #endif -namespace { - -// Helper class to memory manage CharString objects. -// Only ever stack-allocated, does not need to inherit UMemory. -class CharStringPool { -public: - CharStringPool() : status(U_ZERO_ERROR), pool(&deleter, nullptr, status) {} - ~CharStringPool() = default; - - CharStringPool(const CharStringPool&) = delete; - CharStringPool& operator=(const CharStringPool&) = delete; +U_NAMESPACE_BEGIN - icu::CharString* create() { - if (U_FAILURE(status)) { - return nullptr; - } - icu::CharString* const obj = new icu::CharString; - if (obj == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - pool.addElement(obj, status); - if (U_FAILURE(status)) { - delete obj; - return nullptr; - } - return obj; - } - -private: - static void U_CALLCONV deleter(void* obj) { - delete static_cast(obj); - } - - UErrorCode status; - icu::UVector pool; -}; +/** + * \class LocalULanguageTagPointer + * "Smart pointer" class, closes a ULanguageTag via ultag_close(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @internal + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalULanguageTagPointer, ULanguageTag, ultag_close); -} // namespace +U_NAMESPACE_END /* * ------------------------------------------------- @@ -429,13 +406,22 @@ _isAlphaNumericString(const char* s, int32_t len) { } static UBool -_isLanguageSubtag(const char* s, int32_t len) { +_isAlphaNumericStringLimitedLength(const char* s, int32_t len, int32_t min, int32_t max) { + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + if (len >= min && len <= max && _isAlphaNumericString(s, len)) { + return TRUE; + } + return FALSE; +} + +U_CFUNC UBool +ultag_isLanguageSubtag(const char* s, int32_t len) { /* - * language = 2*3ALPHA ; shortest ISO 639 code - * ["-" extlang] ; sometimes followed by - * ; extended language subtags - * / 4ALPHA ; or reserved for future use - * / 5*8ALPHA ; or registered language subtag + * unicode_language_subtag = alpha{2,3} | alpha{5,8}; + * NOTE: Per ICUTC 2019/01/23- accepting alpha 4 + * See ICU-20372 */ if (len < 0) { len = (int32_t)uprv_strlen(s); @@ -461,8 +447,8 @@ _isExtlangSubtag(const char* s, int32_t len) { return FALSE; } -static UBool -_isScriptSubtag(const char* s, int32_t len) { +U_CFUNC UBool +ultag_isScriptSubtag(const char* s, int32_t len) { /* * script = 4ALPHA ; ISO 15924 code */ @@ -475,8 +461,8 @@ _isScriptSubtag(const char* s, int32_t len) { return FALSE; } -static UBool -_isRegionSubtag(const char* s, int32_t len) { +U_CFUNC UBool +ultag_isRegionSubtag(const char* s, int32_t len) { /* * region = 2ALPHA ; ISO 3166-1 code * / 3DIGIT ; UN M.49 code @@ -502,7 +488,7 @@ _isVariantSubtag(const char* s, int32_t len) { if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 5 && len <= 8 && _isAlphaNumericString(s, len)) { + if (_isAlphaNumericStringLimitedLength(s, len, 5, 8)) { return TRUE; } if (len == 4 && ISNUMERIC(*s) && _isAlphaNumericString(s + 1, 3)) { @@ -511,30 +497,65 @@ _isVariantSubtag(const char* s, int32_t len) { return FALSE; } +static UBool +_isSepListOf(UBool (*test)(const char*, int32_t), const char* s, int32_t len) { + const char *p = s; + const char *pSubtag = NULL; + + if (len < 0) { + len = (int32_t)uprv_strlen(s); + } + + while ((p - s) < len) { + if (*p == SEP) { + if (pSubtag == NULL) { + return FALSE; + } + if (!test(pSubtag, (int32_t)(p - pSubtag))) { + return FALSE; + } + pSubtag = NULL; + } else if (pSubtag == NULL) { + pSubtag = p; + } + p++; + } + if (pSubtag == NULL) { + return FALSE; + } + return test(pSubtag, (int32_t)(p - pSubtag)); +} + +U_CFUNC UBool +ultag_isVariantSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isVariantSubtag, s, len); +} + +// This is for the ICU-specific "lvariant" handling. static UBool _isPrivateuseVariantSubtag(const char* s, int32_t len) { /* * variant = 1*8alphanum ; registered variants * / (DIGIT 3alphanum) */ - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { - return TRUE; - } - return FALSE; + return _isAlphaNumericStringLimitedLength(s, len , 1, 8); } static UBool _isExtensionSingleton(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) + * + * singleton = DIGIT ; 0 - 9 + * / %x41-57 ; A - W + * / %x59-5A ; Y - Z + * / %x61-77 ; a - w + * / %x79-7A ; y - z */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len == 1 && ISALPHA(*s) && (uprv_tolower(*s) != PRIVATEUSE)) { + if (len == 1 && (ISALPHA(*s) || ISNUMERIC(*s)) && (uprv_tolower(*s) != PRIVATEUSE)) { return TRUE; } return FALSE; @@ -545,101 +566,208 @@ _isExtensionSubtag(const char* s, int32_t len) { /* * extension = singleton 1*("-" (2*8alphanum)) */ + return _isAlphaNumericStringLimitedLength(s, len, 2, 8); +} + +U_CFUNC UBool +ultag_isExtensionSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isExtensionSubtag, s, len); +} + +static UBool +_isPrivateuseValueSubtag(const char* s, int32_t len) { + /* + * privateuse = "x" 1*("-" (1*8alphanum)) + */ + return _isAlphaNumericStringLimitedLength(s, len, 1, 8); +} + +U_CFUNC UBool +ultag_isPrivateuseValueSubtags(const char* s, int32_t len) { + return _isSepListOf(&_isPrivateuseValueSubtag, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleAttribute(const char* s, int32_t len) { + /* + * attribute = alphanum{3,8} ; + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleAttributes(const char* s, int32_t len) { + return _isSepListOf(&ultag_isUnicodeLocaleAttribute, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeLocaleKey(const char* s, int32_t len) { + /* + * key = alphanum alpha ; + */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 2 && len <= 8 && _isAlphaNumericString(s, len)) { + if (len == 2 && (ISALPHA(*s) || ISNUMERIC(*s)) && ISALPHA(s[1])) { return TRUE; } return FALSE; } -static UBool -_isExtensionSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } +U_CFUNC UBool +_isUnicodeLocaleTypeSubtag(const char*s, int32_t len) { + /* + * alphanum{3,8} + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; - } - if (!_isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; - } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; - } - return _isExtensionSubtag(pSubtag, (int32_t)(p - pSubtag)); +U_CFUNC UBool +ultag_isUnicodeLocaleType(const char*s, int32_t len) { + /* + * type = alphanum{3,8} (sep alphanum{3,8})* ; + */ + return _isSepListOf(&_isUnicodeLocaleTypeSubtag, s, len); } static UBool -_isPrivateuseValueSubtag(const char* s, int32_t len) { +_isTKey(const char* s, int32_t len) +{ /* - * privateuse = "x" 1*("-" (1*8alphanum)) + * tkey = alpha digit ; */ if (len < 0) { len = (int32_t)uprv_strlen(s); } - if (len >= 1 && len <= 8 && _isAlphaNumericString(s, len)) { + if (len == 2 && ISALPHA(*s) && ISNUMERIC(*(s + 1))) { return TRUE; } return FALSE; } static UBool -_isPrivateuseValueSubtags(const char* s, int32_t len) { - const char *p = s; - const char *pSubtag = NULL; - - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } +_isTValue(const char* s, int32_t len) +{ + /* + * tvalue = (sep alphanum{3,8})+ ; + */ + return _isAlphaNumericStringLimitedLength(s, len , 3, 8); +} - while ((p - s) < len) { - if (*p == SEP) { - if (pSubtag == NULL) { - return FALSE; +static UBool +_isTransformedExtensionSubtag(int32_t& state, const char* s, int32_t len) +{ + const int32_t kStart = 0; // Start, wait for unicode_language_subtag, tkey or end + const int32_t kGotLanguage = 1; // Got unicode_language_subtag, wait for unicode_script_subtag, + // unicode_region_subtag, unicode_variant_subtag, tkey or end + const int32_t kGotScript = 2; // Got unicode_script_subtag, wait for unicode_region_subtag, + // unicode_variant_subtag, tkey, or end + const int32_t kGotRegion = 3; // Got unicode_region_subtag, wait for unicode_variant_subtag, + // tkey, or end. + const int32_t kGotVariant = 4; // Got unicode_variant_subtag, wait for unicode_variant_subtag + // tkey or end. + const int32_t kGotTKey = -1; // Got tkey, wait for tvalue. ERROR if stop here. + const int32_t kGotTValue = 6; // Got tvalue, wait for tkey, tvalue or end + + switch (state) { + case kStart: + if (ultag_isLanguageSubtag(s, len)) { + state = kGotLanguage; + return TRUE; + } + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; } - if (!_isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag))) { - return FALSE; + return FALSE; + case kGotLanguage: + if (ultag_isScriptSubtag(s, len)) { + state = kGotScript; + return TRUE; + } + U_FALLTHROUGH; + case kGotScript: + if (ultag_isRegionSubtag(s, len)) { + state = kGotRegion; + return TRUE; + } + U_FALLTHROUGH; + case kGotRegion: + U_FALLTHROUGH; + case kGotVariant: + if (_isVariantSubtag(s, len)) { + state = kGotVariant; + return TRUE; + } + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; } - pSubtag = NULL; - } else if (pSubtag == NULL) { - pSubtag = p; - } - p++; - } - if (pSubtag == NULL) { - return FALSE; + return FALSE; + case kGotTKey: + if (_isTValue(s, len)) { + state = kGotTValue; + return TRUE; + } + return FALSE; + case kGotTValue: + if (_isTKey(s, len)) { + state = kGotTKey; + return TRUE; + } + if (_isTValue(s, len)) { + return TRUE; + } + return FALSE; } - return _isPrivateuseValueSubtag(pSubtag, (int32_t)(p - pSubtag)); + return FALSE; } -U_CFUNC UBool -ultag_isUnicodeLocaleKey(const char* s, int32_t len) { - if (len < 0) { - len = (int32_t)uprv_strlen(s); - } - if (len == 2 && _isAlphaNumericString(s, len)) { - return TRUE; +static UBool +_isUnicodeExtensionSubtag(int32_t& state, const char* s, int32_t len) +{ + const int32_t kStart = 0; // Start, wait for a key or attribute or end + const int32_t kGotKey = 1; // Got a key, wait for type or key or end + const int32_t kGotType = 2; // Got a type, wait for key or end + + switch (state) { + case kStart: + if (ultag_isUnicodeLocaleKey(s, len)) { + state = kGotKey; + return TRUE; + } + if (ultag_isUnicodeLocaleAttribute(s, len)) { + return TRUE; + } + return FALSE; + case kGotKey: + if (ultag_isUnicodeLocaleKey(s, len)) { + return TRUE; + } + if (_isUnicodeLocaleTypeSubtag(s, len)) { + state = kGotType; + return TRUE; + } + return FALSE; + case kGotType: + if (ultag_isUnicodeLocaleKey(s, len)) { + state = kGotKey; + return TRUE; + } + if (_isUnicodeLocaleTypeSubtag(s, len)) { + return TRUE; + } + return FALSE; } return FALSE; } -U_CFUNC UBool -ultag_isUnicodeLocaleType(const char*s, int32_t len) { +static UBool +_isStatefulSepListOf(UBool (*test)(int32_t&, const char*, int32_t), const char* s, int32_t len) +{ + int32_t state = 0; const char* p; + const char* start = s; int32_t subtagLen = 0; if (len < 0) { @@ -648,22 +776,34 @@ ultag_isUnicodeLocaleType(const char*s, int32_t len) { for (p = s; len > 0; p++, len--) { if (*p == SEP) { - if (subtagLen < 3) { + if (!test(state, start, subtagLen)) { return FALSE; } subtagLen = 0; - } else if (ISALPHA(*p) || ISNUMERIC(*p)) { - subtagLen++; - if (subtagLen > 8) { - return FALSE; - } + start = p + 1; } else { - return FALSE; + subtagLen++; } } - return (subtagLen >= 3); + if (test(state, start, subtagLen) && state >= 0) { + return TRUE; + } + return FALSE; } + +U_CFUNC UBool +ultag_isTransformedExtensionSubtags(const char* s, int32_t len) +{ + return _isStatefulSepListOf(&_isTransformedExtensionSubtag, s, len); +} + +U_CFUNC UBool +ultag_isUnicodeExtensionSubtags(const char* s, int32_t len) { + return _isStatefulSepListOf(&_isUnicodeExtensionSubtag, s, len); +} + + /* * ------------------------------------------------- * @@ -850,22 +990,21 @@ _initializeULanguageTag(ULanguageTag* langtag) { langtag->privateuse = EMPTY; } -static int32_t -_appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendLanguageToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_LANG_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getLanguage(localeID, buf, sizeof(buf), &tmpStatus); if (U_FAILURE(tmpStatus) || tmpStatus == U_STRING_NOT_TERMINATED_WARNING) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } len = 0; } @@ -873,20 +1012,14 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* Note: returned language code is in lower case letters */ if (len == 0) { - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; - } else if (!_isLanguageSubtag(buf, len)) { + sink.Append(LANG_UND, LANG_UND_LEN); + } else if (!ultag_isLanguageSubtag(buf, len)) { /* invalid language code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, LANG_UND, uprv_min(LANG_UND_LEN, capacity - reslen)); - } - reslen += LANG_UND_LEN; + sink.Append(LANG_UND, LANG_UND_LEN); } else { /* resolve deprecated */ for (i = 0; i < UPRV_LENGTHOF(DEPRECATEDLANGS); i += 2) { @@ -901,24 +1034,18 @@ _appendLanguageToLanguageTag(const char* localeID, char* appendAt, int32_t capac break; } } - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(buf, len); } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendScriptToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_SCRIPT_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getScript(localeID, buf, sizeof(buf), &tmpStatus); @@ -926,40 +1053,31 @@ _appendScriptToLanguageTag(const char* localeID, char* appendAt, int32_t capacit if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { - if (!_isScriptSubtag(buf, len)) { + if (!ultag_isScriptSubtag(buf, len)) { /* invalid script code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append(buf, len); } } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UErrorCode* status) { +static void +_appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UErrorCode* status) { char buf[ULOC_COUNTRY_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getCountry(localeID, buf, sizeof(buf), &tmpStatus); @@ -967,22 +1085,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { - if (!_isRegionSubtag(buf, len)) { + if (!ultag_isRegionSubtag(buf, len)) { /* invalid region code */ if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - /* resolve deprecated */ + sink.Append("-", 1); + /* resolve deprecated */ for (int i = 0; i < UPRV_LENGTHOF(DEPRECATEDREGIONS); i += 2) { if (uprv_compareInvCharsAsAscii(buf, DEPRECATEDREGIONS[i]) == 0) { uprv_strcpy(buf, DEPRECATEDREGIONS[i + 1]); @@ -990,26 +1105,19 @@ _appendRegionToLanguageTag(const char* localeID, char* appendAt, int32_t capacit break; } } - - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, buf, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(buf, len); } } - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool *hadPosix, UErrorCode* status) { +static void +_appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) { char buf[ULOC_FULLNAME_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; - int32_t reslen = 0; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); @@ -1017,7 +1125,7 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { @@ -1094,15 +1202,9 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* write out validated/normalized variants to the target */ var = varFirst; while (var != NULL) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; + sink.Append("-", 1); varLen = (int32_t)uprv_strlen(var->variant); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, var->variant, uprv_min(varLen, capacity - reslen)); - } - reslen += varLen; + sink.Append(var->variant, varLen); var = var->next; } } @@ -1117,27 +1219,25 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } if (U_FAILURE(*status)) { - return 0; + return; } } - - u_terminateChars(appendAt, capacity, reslen, status); - return reslen; } -static int32_t -_appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { +static void +_appendKeywordsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; int32_t attrBufLength = 0; - UEnumeration *keywordEnum = NULL; - int32_t reslen = 0; - keywordEnum = uloc_openKeywords(localeID, status); + icu::MemoryPool attrPool; + icu::MemoryPool extPool; + icu::MemoryPool strPool; + + icu::LocalUEnumerationPointer keywordEnum(uloc_openKeywords(localeID, status)); if (U_FAILURE(*status) && !hadPosix) { - uenum_close(keywordEnum); - return 0; + return; } - if (keywordEnum != NULL || hadPosix) { + if (keywordEnum.isValid() || hadPosix) { /* reorder extensions */ int32_t len; const char *key; @@ -1145,8 +1245,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac ExtensionListEntry *ext; AttributeListEntry *firstAttr = NULL; AttributeListEntry *attr; - char *attrValue; - CharStringPool extBufPool; + icu::MemoryPool extBufPool; const char *bcpKey=nullptr, *bcpValue=nullptr; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t keylen; @@ -1154,7 +1253,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac while (TRUE) { icu::CharString buf; - key = uenum_next(keywordEnum, NULL, status); + key = uenum_next(keywordEnum.getAlias(), NULL, status); if (key == NULL) { break; } @@ -1227,22 +1326,23 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } /* create AttributeListEntry */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); + attr = attrPool.create(); if (attr == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - attrValue = (char*)uprv_malloc(attrBufLength + 1); + icu::CharString* attrValue = + strPool.create(attrBuf, attrBufLength, *status); if (attrValue == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - uprv_strcpy(attrValue, attrBuf); - attr->attribute = attrValue; + if (U_FAILURE(*status)) { + break; + } + attr->attribute = attrValue->data(); if (!_addAttributeToList(&firstAttr, attr)) { - uprv_free(attr); - uprv_free(attrValue); if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1309,7 +1409,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } else { if (*key == PRIVATEUSE) { - if (!_isPrivateuseValueSubtags(buf.data(), len)) { + if (!ultag_isPrivateuseValueSubtags(buf.data(), len)) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1317,7 +1417,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac continue; } } else { - if (!_isExtensionSingleton(key, keylen) || !_isExtensionSubtags(buf.data(), len)) { + if (!_isExtensionSingleton(key, keylen) || !ultag_isExtensionSubtags(buf.data(), len)) { if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1326,12 +1426,12 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } bcpKey = key; - icu::CharString* extBuf = extBufPool.create(); + icu::CharString* extBuf = + extBufPool.create(buf.data(), len, tmpStatus); if (extBuf == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; break; } - extBuf->append(buf.data(), len, tmpStatus); if (U_FAILURE(tmpStatus)) { *status = tmpStatus; break; @@ -1340,7 +1440,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } /* create ExtensionListEntry */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + ext = extPool.create(); if (ext == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; @@ -1349,7 +1449,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac ext->value = bcpValue; if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -1360,16 +1459,16 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* Special handling for POSIX variant - add the keywords for POSIX */ if (hadPosix) { /* create ExtensionListEntry for POSIX */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + ext = extPool.create(); if (ext == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + return; } ext->key = POSIX_KEY; ext->value = POSIX_VALUE; if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); + // Silently ignore errors. } } @@ -1378,15 +1477,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac for (ext = firstExt; ext; ext = ext->next) { if (!startLDMLExtension && uprv_strlen(ext->key) > 1) { /* first LDML u singlton extension */ - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - if (reslen < capacity) { - *(appendAt + reslen) = LDMLEXT; - } - reslen++; - + sink.Append("-u", 2); startLDMLExtension = TRUE; } @@ -1394,64 +1485,19 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { /* write the value for the attributes */ for (attr = firstAttr; attr; attr = attr->next) { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(attr->attribute); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, attr->attribute, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append( + attr->attribute, static_cast(uprv_strlen(attr->attribute))); } } else { - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - if (reslen < capacity) { - *(appendAt + reslen) = SEP; - } - reslen++; - len = (int32_t)uprv_strlen(ext->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append("-", 1); + sink.Append(ext->key, static_cast(uprv_strlen(ext->key))); + sink.Append("-", 1); + sink.Append(ext->value, static_cast(uprv_strlen(ext->value))); } } } -cleanup: - /* clean up */ - ext = firstExt; - while (ext != NULL) { - ExtensionListEntry *tmpExt = ext->next; - uprv_free(ext); - ext = tmpExt; - } - - attr = firstAttr; - while (attr != NULL) { - AttributeListEntry *tmpAttr = attr->next; - char *pValue = (char *)attr->attribute; - uprv_free(pValue); - uprv_free(attr); - attr = tmpAttr; - } - - uenum_close(keywordEnum); - - if (U_FAILURE(*status)) { - return 0; - } } - - return u_terminateChars(appendAt, capacity, reslen, status); } /** @@ -1460,7 +1506,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac * Note: char* buf is used for storing keywords */ static void -_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, char* buf, int32_t bufSize, UBool *posixVariant, UErrorCode *status) { +_appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendTo, icu::MemoryPool& extPool, icu::MemoryPool& kwdBuf, UBool *posixVariant, UErrorCode *status) { const char *pTag; /* beginning of current subtag */ const char *pKwds; /* beginning of key-type pairs */ UBool variantExists = *posixVariant; @@ -1468,14 +1514,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT ExtensionListEntry *kwdFirst = NULL; /* first LDML keyword */ ExtensionListEntry *kwd, *nextKwd; - AttributeListEntry *attrFirst = NULL; /* first attribute */ - AttributeListEntry *attr, *nextAttr; - int32_t len; - int32_t bufIdx = 0; - - char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; - int32_t attrBufIdx = 0; /* Reset the posixVariant value */ *posixVariant = FALSE; @@ -1483,100 +1522,92 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pTag = ldmlext; pKwds = NULL; - /* Iterate through u extension attributes */ - while (*pTag) { - /* locate next separator char */ - for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); + { + AttributeListEntry *attrFirst = NULL; /* first attribute */ + AttributeListEntry *attr, *nextAttr; - if (ultag_isUnicodeLocaleKey(pTag, len)) { - pKwds = pTag; - break; - } + char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; + int32_t attrBufIdx = 0; - /* add this attribute to the list */ - attr = (AttributeListEntry*)uprv_malloc(sizeof(AttributeListEntry)); - if (attr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } + icu::MemoryPool attrPool; - if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { - uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); - attrBuf[attrBufIdx + len] = 0; - attr->attribute = &attrBuf[attrBufIdx]; - attrBufIdx += (len + 1); - } else { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(attr); - goto cleanup; - } + /* Iterate through u extension attributes */ + while (*pTag) { + /* locate next separator char */ + for (len = 0; *(pTag + len) && *(pTag + len) != SEP; len++); - if (!_addAttributeToList(&attrFirst, attr)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(attr); - goto cleanup; - } + if (ultag_isUnicodeLocaleKey(pTag, len)) { + pKwds = pTag; + break; + } - /* next tag */ - pTag += len; - if (*pTag) { - /* next to the separator */ - pTag++; - } - } + /* add this attribute to the list */ + attr = attrPool.create(); + if (attr == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } - if (attrFirst) { - /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ + if (len < (int32_t)sizeof(attrBuf) - attrBufIdx) { + uprv_memcpy(&attrBuf[attrBufIdx], pTag, len); + attrBuf[attrBufIdx + len] = 0; + attr->attribute = &attrBuf[attrBufIdx]; + attrBufIdx += (len + 1); + } else { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - if (attrBufIdx > bufSize) { - /* attrBufIdx == + 1 */ - *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; - } + if (!_addAttributeToList(&attrFirst, attr)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (kwd == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + /* next tag */ + pTag += len; + if (*pTag) { + /* next to the separator */ + pTag++; + } } - kwd->key = LOCALE_ATTRIBUTE_KEY; - kwd->value = buf; - - /* attribute subtags sorted in alphabetical order as type */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; + if (attrFirst) { + /* emit attributes as an LDML keyword, e.g. attribute=attr1-attr2 */ - /* buffer size check is done above */ - if (attr != attrFirst) { - *(buf + bufIdx) = SEP; - bufIdx++; + kwd = extPool.create(); + if (kwd == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; } - len = static_cast(uprv_strlen(attr->attribute)); - uprv_memcpy(buf + bufIdx, attr->attribute, len); - bufIdx += len; + icu::CharString* value = kwdBuf.create(); + if (value == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } - attr = nextAttr; - } - *(buf + bufIdx) = 0; - bufIdx++; + /* attribute subtags sorted in alphabetical order as type */ + attr = attrFirst; + while (attr != NULL) { + nextAttr = attr->next; + if (attr != attrFirst) { + value->append('-', *status); + } + value->append(attr->attribute, *status); + attr = nextAttr; + } + if (U_FAILURE(*status)) { + return; + } - if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - uprv_free(kwd); - goto cleanup; - } + kwd->key = LOCALE_ATTRIBUTE_KEY; + kwd->value = value->data(); - /* once keyword entry is created, delete the attribute list */ - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; + if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } } - attrFirst = NULL; } if (pKwds) { @@ -1640,7 +1671,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { /* the BCP key is invalid */ *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } uprv_strncpy(bcpKeyBuf, pBcpKey, bcpKeyLen); @@ -1650,7 +1681,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pKey = uloc_toLegacyKey(bcpKeyBuf); if (pKey == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } if (pKey == bcpKeyBuf) { /* @@ -1658,16 +1689,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT We normalize the result key to lower case. */ T_CString_toLowerCase(bcpKeyBuf); - if (bufSize - bufIdx - 1 >= bcpKeyLen) { - uprv_memcpy(buf + bufIdx, bcpKeyBuf, bcpKeyLen); - pKey = buf + bufIdx; - bufIdx += bcpKeyLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; + icu::CharString* key = kwdBuf.create(bcpKeyBuf, bcpKeyLen, *status); + if (key == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (U_FAILURE(*status)) { + return; } + pKey = key->data(); } if (pBcpType) { @@ -1675,7 +1705,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { /* the BCP type is too long */ *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } uprv_strncpy(bcpTypeBuf, pBcpType, bcpTypeLen); @@ -1685,7 +1715,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT pType = uloc_toLegacyType(pKey, bcpTypeBuf); if (pType == NULL) { *status = U_ILLEGAL_ARGUMENT_ERROR; - goto cleanup; + return; } if (pType == bcpTypeBuf) { /* @@ -1694,16 +1724,15 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT */ /* normalize to lower case */ T_CString_toLowerCase(bcpTypeBuf); - if (bufSize - bufIdx - 1 >= bcpTypeLen) { - uprv_memcpy(buf + bufIdx, bcpTypeBuf, bcpTypeLen); - pType = buf + bufIdx; - bufIdx += bcpTypeLen; - *(buf + bufIdx) = 0; - bufIdx++; - } else { - *status = U_BUFFER_OVERFLOW_ERROR; - goto cleanup; + icu::CharString* type = kwdBuf.create(bcpTypeBuf, bcpTypeLen, *status); + if (type == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return; + } + if (U_FAILURE(*status)) { + return; } + pType = type->data(); } } else { /* typeless - default type value is "yes" */ @@ -1716,10 +1745,10 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT *posixVariant = TRUE; } else { /* create an ExtensionListEntry for this keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + return; } kwd->key = pKey; @@ -1728,7 +1757,6 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { // duplicate keyword is allowed, Only the first // is honored. - uprv_free(kwd); } } @@ -1746,46 +1774,22 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT _addExtensionToList(appendTo, kwd, FALSE); kwd = nextKwd; } - - return; - -cleanup: - attr = attrFirst; - while (attr != NULL) { - nextAttr = attr->next; - uprv_free(attr); - attr = nextAttr; - } - - kwd = kwdFirst; - while (kwd != NULL) { - nextKwd = kwd->next; - uprv_free(kwd); - kwd = nextKwd; - } } -static int32_t -_appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorCode* status) { - int32_t reslen = 0; +static void +_appendKeywords(ULanguageTag* langtag, icu::ByteSink& sink, UErrorCode* status) { int32_t i, n; int32_t len; ExtensionListEntry *kwdFirst = NULL; ExtensionListEntry *kwd; const char *key, *type; - char *kwdBuf = NULL; - int32_t kwdBufLength = capacity; + icu::MemoryPool extPool; + icu::MemoryPool kwdBuf; UBool posixVariant = FALSE; if (U_FAILURE(*status)) { - return 0; - } - - kwdBuf = (char*)uprv_malloc(kwdBufLength); - if (kwdBuf == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return 0; + return; } /* Determine if variants already exists */ @@ -1800,12 +1804,12 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC key = ultag_getExtensionKey(langtag, i); type = ultag_getExtensionValue(langtag, i); if (*key == LDMLEXT) { - _appendLDMLExtensionAsKeywords(type, &kwdFirst, kwdBuf, kwdBufLength, &posixVariant, status); + _appendLDMLExtensionAsKeywords(type, &kwdFirst, extPool, kwdBuf, &posixVariant, status); if (U_FAILURE(*status)) { break; } } else { - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; break; @@ -1813,7 +1817,6 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC kwd->key = key; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); *status = U_ILLEGAL_ARGUMENT_ERROR; break; } @@ -1824,14 +1827,13 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC type = ultag_getPrivateUse(langtag); if ((int32_t)uprv_strlen(type) > 0) { /* add private use as a keyword */ - kwd = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + kwd = extPool.create(); if (kwd == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } else { kwd->key = PRIVATEUSE_KEY; kwd->value = type; if (!_addExtensionToList(&kwdFirst, kwd, FALSE)) { - uprv_free(kwd); *status = U_ILLEGAL_ARGUMENT_ERROR; } } @@ -1842,10 +1844,7 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC if (U_SUCCESS(*status) && posixVariant) { len = (int32_t) uprv_strlen(_POSIX); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, _POSIX, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(_POSIX, len); } if (U_SUCCESS(*status) && kwdFirst != NULL) { @@ -1853,70 +1852,39 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC UBool firstValue = TRUE; kwd = kwdFirst; do { - if (reslen < capacity) { - if (firstValue) { - /* '@' */ - *(appendAt + reslen) = LOCALE_EXT_SEP; - firstValue = FALSE; - } else { - /* ';' */ - *(appendAt + reslen) = LOCALE_KEYWORD_SEP; - } + if (firstValue) { + sink.Append("@", 1); + firstValue = FALSE; + } else { + sink.Append(";", 1); } - reslen++; /* key */ len = (int32_t)uprv_strlen(kwd->key); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->key, uprv_min(len, capacity - reslen)); - } - reslen += len; - - /* '=' */ - if (reslen < capacity) { - *(appendAt + reslen) = LOCALE_KEY_TYPE_SEP; - } - reslen++; + sink.Append(kwd->key, len); + sink.Append("=", 1); /* type */ len = (int32_t)uprv_strlen(kwd->value); - if (reslen < capacity) { - uprv_memcpy(appendAt + reslen, kwd->value, uprv_min(len, capacity - reslen)); - } - reslen += len; + sink.Append(kwd->value, len); kwd = kwd->next; } while (kwd); } - - /* clean up */ - kwd = kwdFirst; - while (kwd != NULL) { - ExtensionListEntry *tmpKwd = kwd->next; - uprv_free(kwd); - kwd = tmpKwd; - } - - uprv_free(kwdBuf); - - if (U_FAILURE(*status)) { - return 0; - } - - return u_terminateChars(appendAt, capacity, reslen, status); } -static int32_t -_appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { +static void +_appendPrivateuseToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool hadPosix, UErrorCode* status) { (void)hadPosix; char buf[ULOC_FULLNAME_CAPACITY]; char tmpAppend[ULOC_FULLNAME_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t len, i; int32_t reslen = 0; + int32_t capacity = sizeof tmpAppend; if (U_FAILURE(*status)) { - return 0; + return; } len = uloc_getVariant(localeID, buf, sizeof(buf), &tmpStatus); @@ -1924,7 +1892,7 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; } - return 0; + return; } if (len > 0) { @@ -2008,20 +1976,14 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap } if (U_FAILURE(*status)) { - return 0; + return; } } if (U_SUCCESS(*status)) { len = reslen; - if (reslen < capacity) { - uprv_memcpy(appendAt, tmpAppend, uprv_min(len, capacity - reslen)); - } + sink.Append(tmpAppend, len); } - - u_terminateChars(appendAt, capacity, reslen, status); - - return reslen; } /* @@ -2053,7 +2015,6 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap static ULanguageTag* ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { - ULanguageTag *t; char *tagBuf; int16_t next; char *pSubtag, *pNext, *pLastGoodPosition; @@ -2087,44 +2048,60 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta *(tagBuf + tagLen) = 0; /* create a ULanguageTag */ - t = (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag)); - if (t == NULL) { + icu::LocalULanguageTagPointer t( + (ULanguageTag*)uprv_malloc(sizeof(ULanguageTag))); + if (t.isNull()) { uprv_free(tagBuf); *status = U_MEMORY_ALLOCATION_ERROR; return NULL; } - _initializeULanguageTag(t); + _initializeULanguageTag(t.getAlias()); t->buf = tagBuf; if (tagLen < MINLEN) { /* the input tag is too short - return empty ULanguageTag */ - return t; + return t.orphan(); } + size_t parsedLenDelta = 0; + // Grandfathered tag will be consider together. Grandfathered tag with intervening + // script and region such as art-DE-lojban or art-Latn-lojban won't be + // matched. /* check if the tag is grandfathered */ for (i = 0; i < UPRV_LENGTHOF(GRANDFATHERED); i += 2) { - if (uprv_stricmp(GRANDFATHERED[i], tagBuf) == 0) { + int32_t checkGrandfatheredLen = static_cast(uprv_strlen(GRANDFATHERED[i])); + if (tagLen < checkGrandfatheredLen) { + continue; + } + if (tagLen > checkGrandfatheredLen && tagBuf[checkGrandfatheredLen] != '-') { + // make sure next char is '-'. + continue; + } + if (uprv_strnicmp(GRANDFATHERED[i], tagBuf, checkGrandfatheredLen) == 0) { int32_t newTagLength; - grandfatheredLen = tagLen; /* back up for output parsedLen */ - newTagLength = static_cast(uprv_strlen(GRANDFATHERED[i+1])); + grandfatheredLen = checkGrandfatheredLen; /* back up for output parsedLen */ + int32_t replacementLen = static_cast(uprv_strlen(GRANDFATHERED[i+1])); + newTagLength = replacementLen + tagLen - checkGrandfatheredLen; if (tagLen < newTagLength) { uprv_free(tagBuf); tagBuf = (char*)uprv_malloc(newTagLength + 1); if (tagBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - ultag_close(t); return NULL; } t->buf = tagBuf; tagLen = newTagLength; } + parsedLenDelta = checkGrandfatheredLen - replacementLen; uprv_strcpy(t->buf, GRANDFATHERED[i + 1]); + if (checkGrandfatheredLen != tagLen) { + uprv_strcpy(t->buf + replacementLen, tag + checkGrandfatheredLen); + } break; } } - size_t parsedLenDelta = 0; if (grandfatheredLen == 0) { for (i = 0; i < UPRV_LENGTHOF(REDUNDANT); i += 2) { const char* redundantTag = REDUNDANT[i]; @@ -2193,7 +2170,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta subtagLen = (int32_t)(pSep - pSubtag); if (next & LANG) { - if (_isLanguageSubtag(pSubtag, subtagLen)) { + if (ultag_isLanguageSubtag(pSubtag, subtagLen)) { *pSep = 0; /* terminate */ // TODO: move deprecated language code handling here. t->language = T_CString_toLowerCase(pSubtag); @@ -2220,7 +2197,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } } if (next & SCRT) { - if (_isScriptSubtag(pSubtag, subtagLen)) { + if (ultag_isScriptSubtag(pSubtag, subtagLen)) { char *p = pSubtag; *pSep = 0; @@ -2240,7 +2217,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } } if (next & REGN) { - if (_isRegionSubtag(pSubtag, subtagLen)) { + if (ultag_isRegionSubtag(pSubtag, subtagLen)) { *pSep = 0; // TODO: move deprecated region code handling here. t->region = T_CString_toUpperCase(pSubtag); @@ -2259,7 +2236,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); if (var == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto error; + return NULL; } *pSep = 0; var->variant = T_CString_toUpperCase(pSubtag); @@ -2303,7 +2280,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta pExtension = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); if (pExtension == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; - goto error; + return NULL; } *pSep = 0; pExtension->key = T_CString_toLowerCase(pSubtag); @@ -2439,15 +2416,10 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta } if (parsedLen != NULL) { - *parsedLen = (grandfatheredLen > 0) ? grandfatheredLen : - (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta); + *parsedLen = (int32_t)(pLastGoodPosition - t->buf + parsedLenDelta); } - return t; - -error: - ultag_close(t); - return NULL; + return t.orphan(); } /** @@ -2637,6 +2609,34 @@ uloc_toLanguageTag(const char* localeID, int32_t langtagCapacity, UBool strict, UErrorCode* status) { + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink(langtag, langtagCapacity); + ulocimp_toLanguageTag(localeID, sink, strict, status); + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return reslen; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars(langtag, langtagCapacity, reslen, status); + } + + return reslen; +} + + +U_CAPI void U_EXPORT2 +ulocimp_toLanguageTag(const char* localeID, + icu::ByteSink& sink, + UBool strict, + UErrorCode* status) { icu::CharString canonical; int32_t reslen; UErrorCode tmpStatus = U_ZERO_ERROR; @@ -2657,7 +2657,7 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = tmpStatus; - return 0; + return; } reslen = @@ -2673,7 +2673,7 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + return; } canonical.append(buffer, reslen, tmpStatus); @@ -2683,38 +2683,33 @@ uloc_toLanguageTag(const char* localeID, if (U_FAILURE(tmpStatus)) { *status = tmpStatus; - return 0; + return; } } - reslen = 0; - /* For handling special case - private use only tag */ pKeywordStart = locale_getKeywordsStart(canonical.data()); if (pKeywordStart == canonical.data()) { - UEnumeration *kwdEnum; int kwdCnt = 0; UBool done = FALSE; - kwdEnum = uloc_openKeywords(canonical.data(), &tmpStatus); - if (kwdEnum != NULL) { - kwdCnt = uenum_count(kwdEnum, &tmpStatus); + icu::LocalUEnumerationPointer kwdEnum(uloc_openKeywords(canonical.data(), &tmpStatus)); + if (U_SUCCESS(tmpStatus)) { + kwdCnt = uenum_count(kwdEnum.getAlias(), &tmpStatus); if (kwdCnt == 1) { const char *key; int32_t len = 0; - key = uenum_next(kwdEnum, &len, &tmpStatus); + key = uenum_next(kwdEnum.getAlias(), &len, &tmpStatus); if (len == 1 && *key == PRIVATEUSE) { char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; buf[0] = PRIVATEUSE; buf[1] = SEP; len = uloc_getKeywordValue(localeID, key, &buf[2], sizeof(buf) - 2, &tmpStatus); if (U_SUCCESS(tmpStatus)) { - if (_isPrivateuseValueSubtags(&buf[2], len)) { + if (ultag_isPrivateuseValueSubtags(&buf[2], len)) { /* return private use only tag */ - reslen = len + 2; - uprv_memcpy(langtag, buf, uprv_min(reslen, langtagCapacity)); - u_terminateChars(langtag, langtagCapacity, reslen, status); + sink.Append(buf, len + 2); done = TRUE; } else if (strict) { *status = U_ILLEGAL_ARGUMENT_ERROR; @@ -2727,21 +2722,18 @@ uloc_toLanguageTag(const char* localeID, } } } - uenum_close(kwdEnum); if (done) { - return reslen; + return; } } } - reslen += _appendLanguageToLanguageTag(canonical.data(), langtag, langtagCapacity, strict, status); - reslen += _appendScriptToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendRegionToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, status); - reslen += _appendVariantsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, &hadPosix, status); - reslen += _appendKeywordsToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - reslen += _appendPrivateuseToLanguageTag(canonical.data(), langtag + reslen, langtagCapacity - reslen, strict, hadPosix, status); - - return reslen; + _appendLanguageToLanguageTag(canonical.data(), sink, strict, status); + _appendScriptToLanguageTag(canonical.data(), sink, strict, status); + _appendRegionToLanguageTag(canonical.data(), sink, strict, status); + _appendVariantsToLanguageTag(canonical.data(), sink, strict, &hadPosix, status); + _appendKeywordsToLanguageTag(canonical.data(), sink, strict, hadPosix, status); + _appendPrivateuseToLanguageTag(canonical.data(), sink, strict, hadPosix, status); } @@ -2751,134 +2743,116 @@ uloc_forLanguageTag(const char* langtag, int32_t localeIDCapacity, int32_t* parsedLength, UErrorCode* status) { - return ulocimp_forLanguageTag( - langtag, - -1, - localeID, - localeIDCapacity, - parsedLength, - status); + if (U_FAILURE(*status)) { + return 0; + } + + icu::CheckedArrayByteSink sink(localeID, localeIDCapacity); + ulocimp_forLanguageTag(langtag, -1, sink, parsedLength, status); + + int32_t reslen = sink.NumberOfBytesAppended(); + + if (U_FAILURE(*status)) { + return reslen; + } + + if (sink.Overflowed()) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + u_terminateChars(localeID, localeIDCapacity, reslen, status); + } + + return reslen; } -U_CAPI int32_t U_EXPORT2 +U_CAPI void U_EXPORT2 ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, - char* localeID, - int32_t localeIDCapacity, + icu::ByteSink& sink, int32_t* parsedLength, UErrorCode* status) { - ULanguageTag *lt; - int32_t reslen = 0; + UBool isEmpty = TRUE; const char *subtag, *p; int32_t len; int32_t i, n; UBool noRegion = TRUE; - lt = ultag_parse(langtag, tagLen, parsedLength, status); + icu::LocalULanguageTagPointer lt(ultag_parse(langtag, tagLen, parsedLength, status)); if (U_FAILURE(*status)) { - return 0; + return; } /* language */ - subtag = ultag_getExtlangSize(lt) > 0 ? ultag_getExtlang(lt, 0) : ultag_getLanguage(lt); + subtag = ultag_getExtlangSize(lt.getAlias()) > 0 ? ultag_getExtlang(lt.getAlias(), 0) : ultag_getLanguage(lt.getAlias()); if (uprv_compareInvCharsAsAscii(subtag, LANG_UND) != 0) { len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID, subtag, uprv_min(len, localeIDCapacity - reslen)); - } - reslen += len; + sink.Append(subtag, len); + isEmpty = FALSE; } } /* script */ - subtag = ultag_getScript(lt); + subtag = ultag_getScript(lt.getAlias()); len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + sink.Append("_", 1); + isEmpty = FALSE; /* write out the script in title case */ - p = subtag; - while (*p) { - if (reslen < localeIDCapacity) { - if (p == subtag) { - *(localeID + reslen) = uprv_toupper(*p); - } else { - *(localeID + reslen) = *p; - } - } - reslen++; - p++; - } + char c = uprv_toupper(*subtag); + sink.Append(&c, 1); + sink.Append(subtag + 1, len - 1); } /* region */ - subtag = ultag_getRegion(lt); + subtag = ultag_getRegion(lt.getAlias()); len = (int32_t)uprv_strlen(subtag); if (len > 0) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; - /* write out the retion in upper case */ + sink.Append("_", 1); + isEmpty = FALSE; + + /* write out the region in upper case */ p = subtag; while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; + char c = uprv_toupper(*p); + sink.Append(&c, 1); p++; } noRegion = FALSE; } /* variants */ - n = ultag_getVariantsSize(lt); + n = ultag_getVariantsSize(lt.getAlias()); if (n > 0) { if (noRegion) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + sink.Append("_", 1); + isEmpty = FALSE; } for (i = 0; i < n; i++) { - subtag = ultag_getVariant(lt, i); - if (reslen < localeIDCapacity) { - *(localeID + reslen) = LOCALE_SEP; - } - reslen++; + subtag = ultag_getVariant(lt.getAlias(), i); + sink.Append("_", 1); + /* write out the variant in upper case */ p = subtag; while (*p) { - if (reslen < localeIDCapacity) { - *(localeID + reslen) = uprv_toupper(*p); - } - reslen++; + char c = uprv_toupper(*p); + sink.Append(&c, 1); p++; } } } /* keywords */ - n = ultag_getExtensionsSize(lt); - subtag = ultag_getPrivateUse(lt); + n = ultag_getExtensionsSize(lt.getAlias()); + subtag = ultag_getPrivateUse(lt.getAlias()); if (n > 0 || uprv_strlen(subtag) > 0) { - if (reslen == 0 && n > 0) { + if (isEmpty && n > 0) { /* need a language */ - if (reslen < localeIDCapacity) { - uprv_memcpy(localeID + reslen, LANG_UND, uprv_min(LANG_UND_LEN, localeIDCapacity - reslen)); - } - reslen += LANG_UND_LEN; + sink.Append(LANG_UND, LANG_UND_LEN); } - len = _appendKeywords(lt, localeID + reslen, localeIDCapacity - reslen, status); - reslen += len; + _appendKeywords(lt.getAlias(), sink, status); } - - ultag_close(lt); - return u_terminateChars(localeID, localeIDCapacity, reslen, status); } diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index 6dd8e33e09c88c..dac82872e6ed40 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -10,6 +10,7 @@ #ifndef ULOCIMP_H #define ULOCIMP_H +#include "unicode/bytestream.h" #include "unicode/uloc.h" /** @@ -61,6 +62,31 @@ ulocimp_getCountry(const char *localeID, char *country, int32_t countryCapacity, const char **pEnd); +/** + * Writes a well-formed language tag for this locale ID. + * + * **Note**: When `strict` is FALSE, any locale fields which do not satisfy the + * BCP47 syntax requirement will be omitted from the result. When `strict` is + * TRUE, this function sets U_ILLEGAL_ARGUMENT_ERROR to the `err` if any locale + * fields do not satisfy the BCP47 syntax requirement. + * + * @param localeID the input locale ID + * @param sink the output sink receiving the BCP47 language + * tag for this Locale. + * @param strict boolean value indicating if the function returns + * an error for an ill-formed input locale ID. + * @param err error information if receiving the language + * tag failed. + * @return The length of the BCP47 language tag. + * + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_toLanguageTag(const char* localeID, + icu::ByteSink& sink, + UBool strict, + UErrorCode* err); + /** * Returns a locale ID for the specified BCP47 language tag string. * If the specified language tag contains any ill-formed subtags, @@ -75,21 +101,18 @@ ulocimp_getCountry(const char *localeID, * the first paragraph, so some information might be lost. * @param langtag the input BCP47 language tag. * @param tagLen the length of langtag, or -1 to call uprv_strlen(). - * @param localeID the output buffer receiving a locale ID for the + * @param sink the output sink receiving a locale ID for the * specified BCP47 language tag. - * @param localeIDCapacity the size of the locale ID output buffer. * @param parsedLength if not NULL, successfully parsed length * for the input language tag is set. * @param err error information if receiving the locald ID * failed. - * @return the length of the locale ID. * @internal ICU 63 */ -U_CAPI int32_t U_EXPORT2 +U_CAPI void U_EXPORT2 ulocimp_forLanguageTag(const char* langtag, int32_t tagLen, - char* localeID, - int32_t localeIDCapacity, + icu::ByteSink& sink, int32_t* parsedLength, UErrorCode* err); @@ -122,9 +145,103 @@ U_CAPI int32_t U_EXPORT2 ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, char *region, int32_t regionCapacity, UErrorCode* status); +/** + * Add the likely subtags for a provided locale ID, per the algorithm described + * in the following CLDR technical report: + * + * http://www.unicode.org/reports/tr35/#Likely_Subtags + * + * If localeID is already in the maximal form, or there is no data available + * for maximization, it will be copied to the output buffer. For example, + * "und-Zzzz" cannot be maximized, since there is no reasonable maximization. + * + * Examples: + * + * "en" maximizes to "en_Latn_US" + * + * "de" maximizes to "de_Latn_US" + * + * "sr" maximizes to "sr_Cyrl_RS" + * + * "sh" maximizes to "sr_Latn_RS" (Note this will not reverse.) + * + * "zh_Hani" maximizes to "zh_Hans_CN" (Note this will not reverse.) + * + * @param localeID The locale to maximize + * @param sink The output sink receiving the maximized locale + * @param err Error information if maximizing the locale failed. If the length + * of the localeID and the null-terminator is greater than the maximum allowed size, + * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_addLikelySubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err); + +/** + * Minimize the subtags for a provided locale ID, per the algorithm described + * in the following CLDR technical report: + * + * http://www.unicode.org/reports/tr35/#Likely_Subtags + * + * If localeID is already in the minimal form, or there is no data available + * for minimization, it will be copied to the output buffer. Since the + * minimization algorithm relies on proper maximization, see the comments + * for ulocimp_addLikelySubtags for reasons why there might not be any data. + * + * Examples: + * + * "en_Latn_US" minimizes to "en" + * + * "de_Latn_US" minimizes to "de" + * + * "sr_Cyrl_RS" minimizes to "sr" + * + * "zh_Hant_TW" minimizes to "zh_TW" (The region is preferred to the + * script, and minimizing to "zh" would imply "zh_Hans_CN".) + * + * @param localeID The locale to minimize + * @param sink The output sink receiving the maximized locale + * @param err Error information if minimizing the locale failed. If the length + * of the localeID and the null-terminator is greater than the maximum allowed size, + * or the localeId is not well-formed, the error code is U_ILLEGAL_ARGUMENT_ERROR. + * @internal ICU 64 + */ +U_STABLE void U_EXPORT2 +ulocimp_minimizeSubtags(const char* localeID, + icu::ByteSink& sink, + UErrorCode* err); + U_CAPI const char * U_EXPORT2 locale_getKeywordsStart(const char *localeID); +U_CFUNC UBool +ultag_isExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isLanguageSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isPrivateuseValueSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isRegionSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isScriptSubtag(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isTransformedExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeExtensionSubtags(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeLocaleAttribute(const char* s, int32_t len); + +U_CFUNC UBool +ultag_isUnicodeLocaleAttributes(const char* s, int32_t len); U_CFUNC UBool ultag_isUnicodeLocaleKey(const char* s, int32_t len); @@ -132,6 +249,9 @@ ultag_isUnicodeLocaleKey(const char* s, int32_t len); U_CFUNC UBool ultag_isUnicodeLocaleType(const char* s, int32_t len); +U_CFUNC UBool +ultag_isVariantSubtags(const char* s, int32_t len); + U_CFUNC const char* ulocimp_toBcpKey(const char* key); diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index a32573bbf70c95..40b543fb2219bc 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -37,12 +37,32 @@ # define NOSERVICE # define NOIME # define NOMCX + +# if U_PLATFORM_HAS_WINUWP_API == 1 + // Some previous versions of the Windows 10 SDK don't expose various APIs for UWP applications + // to use, even though UWP apps are allowed to call and use them. Temporarily change the + // WINAPI family partition below to Desktop, so that function declarations are visible for UWP. +# include +# if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)) +# pragma push_macro("WINAPI_PARTITION_DESKTOP") +# undef WINAPI_PARTITION_DESKTOP +# define WINAPI_PARTITION_DESKTOP 1 +# define CHANGED_WINAPI_PARTITION_DESKTOP_VALUE +# endif +# endif + # include + +# if U_PLATFORM_HAS_WINUWP_API == 1 && defined(CHANGED_WINAPI_PARTITION_DESKTOP_VALUE) +# pragma pop_macro("WINAPI_PARTITION_DESKTOP") +# endif + # include "cmemory.h" - typedef HANDLE MemoryMap; +typedef HANDLE MemoryMap; + +# define IS_MAP(map) ((map)!=nullptr) -# define IS_MAP(map) ((map)!=NULL) #elif MAP_IMPLEMENTATION==MAP_POSIX || MAP_IMPLEMENTATION==MAP_390DLL typedef size_t MemoryMap; @@ -74,7 +94,7 @@ typedef void *MemoryMap; -# define IS_MAP(map) ((map)!=NULL) +# define IS_MAP(map) ((map)!=nullptr) #endif /*----------------------------------------------------------------------------* @@ -105,20 +125,24 @@ UErrorCode *status /* Error status, used to report out-of-memory errors. */ ) { - HANDLE map; - HANDLE file; - if (U_FAILURE(*status)) { return FALSE; } + HANDLE map = nullptr; + HANDLE file = INVALID_HANDLE_VALUE; + UDataMemory_init(pData); /* Clear the output struct. */ /* open the input file */ #if U_PLATFORM_HAS_WINUWP_API == 0 - file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, + // Note: In the non-UWP code-path (ie: Win32), the value of the path variable might have come from + // the CRT 'getenv' function, and would be therefore be encoded in the default ANSI code page. + // This means that we can't call the *W version of API below, whereas in the UWP code-path + // there is no 'getenv' call, and thus the string will be only UTF-8/Invariant characters. + file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL); + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, nullptr); #else // Convert from UTF-8 string to UTF-16 string. wchar_t utf16Path[MAX_PATH]; @@ -134,8 +158,9 @@ return FALSE; } - // TODO: Is it worth setting extended parameters to specify random access? - file = CreateFile2(utf16Path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); + file = CreateFileW(utf16Path, GENERIC_READ, FILE_SHARE_READ, nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, nullptr); #endif if (file == INVALID_HANDLE_VALUE) { // If we failed to open the file due to an out-of-memory error, then we want @@ -146,36 +171,13 @@ return FALSE; } - /* Declare and initialize a security descriptor. - This is required for multiuser systems on Windows 2000 SP4 and beyond */ - // TODO: UWP does not have this function and I do not think it is required? -#if U_PLATFORM_HAS_WINUWP_API == 0 - - SECURITY_ATTRIBUTES mappingAttributes; - SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; - SECURITY_DESCRIPTOR securityDesc; - - if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { - /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ - if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { - /* Make the security attributes point to the security descriptor */ - uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); - mappingAttributes.nLength = sizeof(mappingAttributes); - mappingAttributes.lpSecurityDescriptor = &securityDesc; - mappingAttributes.bInheritHandle = FALSE; /* object uninheritable */ - mappingAttributesPtr = &mappingAttributes; - } - } - /* else creating security descriptors can fail when we are on Windows 98, - and mappingAttributesPtr == NULL for that case. */ - + // Note: We use NULL/nullptr for lpAttributes parameter below. + // This means our handle cannot be inherited and we will get the default security descriptor. /* create an unnamed Windows file-mapping object for the specified file */ - map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); -#else - map = CreateFileMappingFromApp(file, NULL, PAGE_READONLY, 0, NULL); -#endif + map = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr); + CloseHandle(file); - if (map == NULL) { + if (map == nullptr) { // If we failed to create the mapping due to an out-of-memory error, then // we want to report that error back to the caller. if (HRESULT_FROM_WIN32(GetLastError()) == E_OUTOFMEMORY) { @@ -185,22 +187,22 @@ } /* map a view of the file into our address space */ - pData->pHeader=(const DataHeader *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); - if(pData->pHeader==NULL) { + pData->pHeader = reinterpret_cast(MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0)); + if (pData->pHeader == nullptr) { CloseHandle(map); return FALSE; } - pData->map=map; + pData->map = map; return TRUE; } U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if (pData != nullptr && pData->map != nullptr) { UnmapViewOfFile(pData->pHeader); CloseHandle(pData->map); - pData->pHeader=NULL; - pData->map=NULL; + pData->pHeader = nullptr; + pData->map = nullptr; } } @@ -255,13 +257,13 @@ U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { size_t dataLen = (char *)pData->map - (char *)pData->mapAddr; if(munmap(pData->mapAddr, dataLen)==-1) { } - pData->pHeader=NULL; + pData->pHeader=nullptr; pData->map=0; - pData->mapAddr=NULL; + pData->mapAddr=nullptr; } } @@ -295,7 +297,7 @@ UDataMemory_init(pData); /* Clear the output struct. */ /* open the input file */ file=fopen(path, "rb"); - if(file==NULL) { + if(file==nullptr) { return FALSE; } @@ -308,7 +310,7 @@ /* allocate the memory to hold the file data */ p=uprv_malloc(fileLength); - if(p==NULL) { + if(p==nullptr) { fclose(file); *status = U_MEMORY_ALLOCATION_ERROR; return FALSE; @@ -330,11 +332,11 @@ U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; + pData->map = nullptr; + pData->mapAddr = nullptr; + pData->pHeader = nullptr; } } @@ -397,7 +399,7 @@ * Copy the ICU_DATA path to the path buffer and return that*/ const char *icuDataDir; icuDataDir=u_getDataDirectory(); - if(icuDataDir!=NULL && *icuDataDir!=0) { + if(icuDataDir!=nullptr && *icuDataDir!=0) { return strcpy_returnEnd(pathBuffer, icuDataDir); } else { /* there is no icuDataDir either. Just return the empty pathBuffer. */ @@ -429,7 +431,7 @@ } inBasename=uprv_strrchr(path, U_FILE_SEP_CHAR); - if(inBasename==NULL) { + if(inBasename==nullptr) { inBasename = path; } else { inBasename++; @@ -494,7 +496,7 @@ fprintf(stderr, " -> %08X\n", handle ); # endif - if(handle != NULL) { + if(handle != nullptr) { /* we have a data DLL - what kind of lookup do we need here? */ /* try to find the Table of Contents */ UDataMemory_init(pData); /* Clear the output struct. */ @@ -515,11 +517,11 @@ } U_CFUNC void uprv_unmapFile(UDataMemory *pData) { - if(pData!=NULL && pData->map!=NULL) { + if(pData!=nullptr && pData->map!=nullptr) { uprv_free(pData->map); - pData->map = NULL; - pData->mapAddr = NULL; - pData->pHeader = NULL; + pData->map = nullptr; + pData->mapAddr = nullptr; + pData->pHeader = nullptr; } } diff --git a/deps/icu-small/source/common/umutablecptrie.cpp b/deps/icu-small/source/common/umutablecptrie.cpp index 40af4b6c16a163..cdbe27080b491c 100644 --- a/deps/icu-small/source/common/umutablecptrie.cpp +++ b/deps/icu-small/source/common/umutablecptrie.cpp @@ -18,6 +18,11 @@ #include "uassert.h" #include "ucptrie_impl.h" +// ICU-20235 In case Microsoft math.h has defined this, undefine it. +#ifdef OVERFLOW +#undef OVERFLOW +#endif + U_NAMESPACE_BEGIN namespace { @@ -60,6 +65,7 @@ constexpr uint8_t I3_18 = 3; constexpr int32_t INDEX_3_18BIT_BLOCK_LENGTH = UCPTRIE_INDEX_3_BLOCK_LENGTH + UCPTRIE_INDEX_3_BLOCK_LENGTH / 8; class AllSameBlocks; +class MixedBlocks; class MutableCodePointTrie : public UMemory { public: @@ -92,8 +98,10 @@ class MutableCodePointTrie : public UMemory { void maskValues(uint32_t mask); UChar32 findHighStart() const; int32_t compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks); - int32_t compactData(int32_t fastILimit, uint32_t *newData, int32_t dataNullIndex); - int32_t compactIndex(int32_t fastILimit, UErrorCode &errorCode); + int32_t compactData( + int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity, + int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode); + int32_t compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks, UErrorCode &errorCode); int32_t compactTrie(int32_t fastILimit, UErrorCode &errorCode); uint32_t *index = nullptr; @@ -301,41 +309,56 @@ UChar32 MutableCodePointTrie::getRange( uint32_t nullValue = initialValue; if (filter != nullptr) { nullValue = filter(context, nullValue); } UChar32 c = start; - uint32_t value; + uint32_t trieValue, value; bool haveValue = false; int32_t i = c >> UCPTRIE_SHIFT_3; do { if (flags[i] == ALL_SAME) { - uint32_t value2 = maybeFilterValue(index[i], initialValue, nullValue, - filter, context); + uint32_t trieValue2 = index[i]; if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } c = (c + UCPTRIE_SMALL_DATA_BLOCK_LENGTH) & ~UCPTRIE_SMALL_DATA_MASK; } else /* MIXED */ { int32_t di = index[i] + (c & UCPTRIE_SMALL_DATA_MASK); - uint32_t value2 = maybeFilterValue(data[di], initialValue, nullValue, - filter, context); + uint32_t trieValue2 = data[di]; if (haveValue) { - if (value2 != value) { - return c - 1; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } + trieValue = trieValue2; // may or may not help } } else { - value = value2; + trieValue = trieValue2; + value = maybeFilterValue(trieValue2, initialValue, nullValue, filter, context); if (pValue != nullptr) { *pValue = value; } haveValue = true; } while ((++c & UCPTRIE_SMALL_DATA_MASK) != 0) { - if (maybeFilterValue(data[++di], initialValue, nullValue, - filter, context) != value) { - return c - 1; + trieValue2 = data[++di]; + if (trieValue2 != trieValue) { + if (filter == nullptr || + maybeFilterValue(trieValue2, initialValue, nullValue, + filter, context) != value) { + return c - 1; + } } + trieValue = trieValue2; // may or may not help } } ++i; @@ -548,28 +571,8 @@ void MutableCodePointTrie::maskValues(uint32_t mask) { } } -inline bool -equalBlocks(const uint32_t *s, const uint32_t *t, int32_t length) { - while (length > 0 && *s == *t) { - ++s; - ++t; - --length; - } - return length == 0; -} - -inline bool -equalBlocks(const uint16_t *s, const uint32_t *t, int32_t length) { - while (length > 0 && *s == *t) { - ++s; - ++t; - --length; - } - return length == 0; -} - -inline bool -equalBlocks(const uint16_t *s, const uint16_t *t, int32_t length) { +template +bool equalBlocks(const UIntA *s, const UIntB *t, int32_t length) { while (length > 0 && *s == *t) { ++s; ++t; @@ -585,36 +588,6 @@ bool allValuesSameAs(const uint32_t *p, int32_t length, uint32_t value) { } /** Search for an identical block. */ -int32_t findSameBlock(const uint32_t *p, int32_t pStart, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - // Ensure that we do not even partially get past length. - length -= blockLength; - - q += qStart; - while (pStart <= length) { - if (equalBlocks(p + pStart, q, blockLength)) { - return pStart; - } - ++pStart; - } - return -1; -} - -int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - // Ensure that we do not even partially get past length. - length -= blockLength; - - q += qStart; - while (pStart <= length) { - if (equalBlocks(p + pStart, q, blockLength)) { - return pStart; - } - ++pStart; - } - return -1; -} - int32_t findSameBlock(const uint16_t *p, int32_t pStart, int32_t length, const uint16_t *q, int32_t qStart, int32_t blockLength) { // Ensure that we do not even partially get past length. @@ -655,30 +628,9 @@ int32_t findAllSameBlock(const uint32_t *p, int32_t start, int32_t limit, * Look for maximum overlap of the beginning of the other block * with the previous, adjacent block. */ -int32_t getOverlap(const uint32_t *p, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - int32_t overlap = blockLength - 1; - U_ASSERT(overlap <= length); - q += qStart; - while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) { - --overlap; - } - return overlap; -} - -int32_t getOverlap(const uint16_t *p, int32_t length, - const uint32_t *q, int32_t qStart, int32_t blockLength) { - int32_t overlap = blockLength - 1; - U_ASSERT(overlap <= length); - q += qStart; - while (overlap > 0 && !equalBlocks(p + (length - overlap), q, overlap)) { - --overlap; - } - return overlap; -} - -int32_t getOverlap(const uint16_t *p, int32_t length, - const uint16_t *q, int32_t qStart, int32_t blockLength) { +template +int32_t getOverlap(const UIntA *p, int32_t length, + const UIntB *q, int32_t qStart, int32_t blockLength) { int32_t overlap = blockLength - 1; U_ASSERT(overlap <= length); q += qStart; @@ -807,6 +759,171 @@ class AllSameBlocks { int32_t refCounts[CAPACITY]; }; +// Custom hash table for mixed-value blocks to be found anywhere in the +// compacted data or index so far. +class MixedBlocks { +public: + MixedBlocks() {} + ~MixedBlocks() { + uprv_free(table); + } + + bool init(int32_t maxLength, int32_t newBlockLength) { + // We store actual data indexes + 1 to reserve 0 for empty entries. + int32_t maxDataIndex = maxLength - newBlockLength + 1; + int32_t newLength; + if (maxDataIndex <= 0xfff) { // 4k + newLength = 6007; + shift = 12; + mask = 0xfff; + } else if (maxDataIndex <= 0x7fff) { // 32k + newLength = 50021; + shift = 15; + mask = 0x7fff; + } else if (maxDataIndex <= 0x1ffff) { // 128k + newLength = 200003; + shift = 17; + mask = 0x1ffff; + } else { + // maxDataIndex up to around MAX_DATA_LENGTH, ca. 1.1M + newLength = 1500007; + shift = 21; + mask = 0x1fffff; + } + if (newLength > capacity) { + uprv_free(table); + table = (uint32_t *)uprv_malloc(newLength * 4); + if (table == nullptr) { + return false; + } + capacity = newLength; + } + length = newLength; + uprv_memset(table, 0, length * 4); + + blockLength = newBlockLength; + return true; + } + + template + void extend(const UInt *data, int32_t minStart, int32_t prevDataLength, int32_t newDataLength) { + int32_t start = prevDataLength - blockLength; + if (start >= minStart) { + ++start; // Skip the last block that we added last time. + } else { + start = minStart; // Begin with the first full block. + } + for (int32_t end = newDataLength - blockLength; start <= end; ++start) { + uint32_t hashCode = makeHashCode(data, start); + addEntry(data, start, hashCode, start); + } + } + + template + int32_t findBlock(const UIntA *data, const UIntB *blockData, int32_t blockStart) const { + uint32_t hashCode = makeHashCode(blockData, blockStart); + int32_t entryIndex = findEntry(data, blockData, blockStart, hashCode); + if (entryIndex >= 0) { + return (table[entryIndex] & mask) - 1; + } else { + return -1; + } + } + + int32_t findAllSameBlock(const uint32_t *data, uint32_t blockValue) const { + uint32_t hashCode = makeHashCode(blockValue); + int32_t entryIndex = findEntry(data, blockValue, hashCode); + if (entryIndex >= 0) { + return (table[entryIndex] & mask) - 1; + } else { + return -1; + } + } + +private: + template + uint32_t makeHashCode(const UInt *blockData, int32_t blockStart) const { + int32_t blockLimit = blockStart + blockLength; + uint32_t hashCode = blockData[blockStart++]; + do { + hashCode = 37 * hashCode + blockData[blockStart++]; + } while (blockStart < blockLimit); + return hashCode; + } + + uint32_t makeHashCode(uint32_t blockValue) const { + uint32_t hashCode = blockValue; + for (int32_t i = 1; i < blockLength; ++i) { + hashCode = 37 * hashCode + blockValue; + } + return hashCode; + } + + template + void addEntry(const UInt *data, int32_t blockStart, uint32_t hashCode, int32_t dataIndex) { + U_ASSERT(0 <= dataIndex && dataIndex < (int32_t)mask); + int32_t entryIndex = findEntry(data, data, blockStart, hashCode); + if (entryIndex < 0) { + table[~entryIndex] = (hashCode << shift) | (dataIndex + 1); + } + } + + template + int32_t findEntry(const UIntA *data, const UIntB *blockData, int32_t blockStart, + uint32_t hashCode) const { + uint32_t shiftedHashCode = hashCode << shift; + int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1 + for (int32_t entryIndex = initialEntryIndex;;) { + uint32_t entry = table[entryIndex]; + if (entry == 0) { + return ~entryIndex; + } + if ((entry & ~mask) == shiftedHashCode) { + int32_t dataIndex = (entry & mask) - 1; + if (equalBlocks(data + dataIndex, blockData + blockStart, blockLength)) { + return entryIndex; + } + } + entryIndex = nextIndex(initialEntryIndex, entryIndex); + } + } + + int32_t findEntry(const uint32_t *data, uint32_t blockValue, uint32_t hashCode) const { + uint32_t shiftedHashCode = hashCode << shift; + int32_t initialEntryIndex = (hashCode % (length - 1)) + 1; // 1..length-1 + for (int32_t entryIndex = initialEntryIndex;;) { + uint32_t entry = table[entryIndex]; + if (entry == 0) { + return ~entryIndex; + } + if ((entry & ~mask) == shiftedHashCode) { + int32_t dataIndex = (entry & mask) - 1; + if (allValuesSameAs(data + dataIndex, blockLength, blockValue)) { + return entryIndex; + } + } + entryIndex = nextIndex(initialEntryIndex, entryIndex); + } + } + + inline int32_t nextIndex(int32_t initialEntryIndex, int32_t entryIndex) const { + // U_ASSERT(0 < initialEntryIndex && initialEntryIndex < length); + return (entryIndex + initialEntryIndex) % length; + } + + // Hash table. + // The length is a prime number, larger than the maximum data length. + // The "shift" lower bits store a data index + 1. + // The remaining upper bits store a partial hashCode of the block data values. + uint32_t *table = nullptr; + int32_t capacity = 0; + int32_t length = 0; + int32_t shift = 0; + uint32_t mask = 0; + + int32_t blockLength = 0; +}; + int32_t MutableCodePointTrie::compactWholeDataBlocks(int32_t fastILimit, AllSameBlocks &allSameBlocks) { #ifdef UCPTRIE_DEBUG bool overflow = false; @@ -962,8 +1079,9 @@ void printBlock(const uint32_t *block, int32_t blockLength, uint32_t value, * * It does not try to find an optimal order of writing, deduplicating, and overlapping blocks. */ -int32_t MutableCodePointTrie::compactData(int32_t fastILimit, - uint32_t *newData, int32_t dataNullIndex) { +int32_t MutableCodePointTrie::compactData( + int32_t fastILimit, uint32_t *newData, int32_t newDataCapacity, + int32_t dataNullIndex, MixedBlocks &mixedBlocks, UErrorCode &errorCode) { #ifdef UCPTRIE_DEBUG int32_t countSame=0, sumOverlaps=0; bool printData = dataLength == 29088 /* line.brk */ || @@ -983,8 +1101,14 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, #endif } - int32_t iLimit = highStart >> UCPTRIE_SHIFT_3; int32_t blockLength = UCPTRIE_FAST_DATA_BLOCK_LENGTH; + if (!mixedBlocks.init(newDataCapacity, blockLength)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(newData, 0, 0, newDataLength); + + int32_t iLimit = highStart >> UCPTRIE_SHIFT_3; int32_t inc = SMALL_DATA_BLOCKS_PER_BMP_BLOCK; int32_t fastLength = 0; for (int32_t i = ASCII_I_LIMIT; i < iLimit; i += inc) { @@ -992,12 +1116,17 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, blockLength = UCPTRIE_SMALL_DATA_BLOCK_LENGTH; inc = 1; fastLength = newDataLength; + if (!mixedBlocks.init(newDataCapacity, blockLength)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(newData, 0, 0, newDataLength); } if (flags[i] == ALL_SAME) { uint32_t value = index[i]; - int32_t n; // Find an earlier part of the data array of length blockLength // that is filled with this value. + int32_t n = mixedBlocks.findAllSameBlock(newData, value); // If we find a match, and the current block is the data null block, // and it is not a fast block but matches the start of a fast block, // then we need to continue looking. @@ -1005,12 +1134,10 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, // and not all of the rest of the fast block is filled with this value. // Otherwise trie.getRange() would detect that the fast block starts at // dataNullOffset and assume incorrectly that it is filled with the null value. - for (int32_t start = 0; - (n = findAllSameBlock(newData, start, newDataLength, - value, blockLength)) >= 0 && - i == dataNullIndex && i >= fastILimit && n < fastLength && - isStartOfSomeFastBlock(n, index, fastILimit); - start = n + 1) {} + while (n >= 0 && i == dataNullIndex && i >= fastILimit && n < fastLength && + isStartOfSomeFastBlock(n, index, fastILimit)) { + n = findAllSameBlock(newData, n + 1, newDataLength, value, blockLength); + } if (n >= 0) { DEBUG_DO(++countSame); index[i] = n; @@ -1023,14 +1150,16 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, } #endif index[i] = newDataLength - n; + int32_t prevDataLength = newDataLength; while (n < blockLength) { newData[newDataLength++] = value; ++n; } + mixedBlocks.extend(newData, 0, prevDataLength, newDataLength); } } else if (flags[i] == MIXED) { const uint32_t *block = data + index[i]; - int32_t n = findSameBlock(newData, 0, newDataLength, block, 0, blockLength); + int32_t n = mixedBlocks.findBlock(newData, block, 0); if (n >= 0) { DEBUG_DO(++countSame); index[i] = n; @@ -1043,9 +1172,11 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, } #endif index[i] = newDataLength - n; + int32_t prevDataLength = newDataLength; while (n < blockLength) { newData[newDataLength++] = block[n++]; } + mixedBlocks.extend(newData, 0, prevDataLength, newDataLength); } } else /* SAME_AS */ { uint32_t j = index[i]; @@ -1061,7 +1192,8 @@ int32_t MutableCodePointTrie::compactData(int32_t fastILimit, return newDataLength; } -int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &errorCode) { +int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, MixedBlocks &mixedBlocks, + UErrorCode &errorCode) { int32_t fastIndexLength = fastILimit >> (UCPTRIE_FAST_SHIFT - UCPTRIE_SHIFT_3); if ((highStart >> UCPTRIE_FAST_SHIFT) <= fastIndexLength) { // Only the linear fast index, no multi-stage index tables. @@ -1095,6 +1227,12 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } } + if (!mixedBlocks.init(fastIndexLength, UCPTRIE_INDEX_3_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + mixedBlocks.extend(fastIndex, 0, 0, fastIndexLength); + // Examine index-3 blocks. For each determine one of: // - same as the index-3 null block // - same as a fast-index block @@ -1105,6 +1243,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error // Also determine an upper limit for the index-3 table length. int32_t index3Capacity = 0; i3FirstNull = index3NullOffset; + bool hasLongI3Blocks = false; // If the fast index covers the whole BMP, then // the multi-stage index is only for supplementary code points. // Otherwise, the multi-stage index covers all of Unicode. @@ -1129,13 +1268,13 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index3Capacity += UCPTRIE_INDEX_3_BLOCK_LENGTH; } else { index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH; + hasLongI3Blocks = true; } i3FirstNull = 0; } } else { if (oredI3 <= 0xffff) { - int32_t n = findSameBlock(fastIndex, 0, fastIndexLength, - index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); + int32_t n = mixedBlocks.findBlock(fastIndex, index, i); if (n >= 0) { flags[i] = I3_BMP; index[i] = n; @@ -1146,6 +1285,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else { flags[i] = I3_18; index3Capacity += INDEX_3_18BIT_BLOCK_LENGTH; + hasLongI3Blocks = true; } } i = j; @@ -1166,6 +1306,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } uprv_memcpy(index16, fastIndex, fastIndexLength * 2); + if (!mixedBlocks.init(index16Capacity, UCPTRIE_INDEX_3_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + MixedBlocks longI3Blocks; + if (hasLongI3Blocks) { + if (!longI3Blocks.init(index16Capacity, INDEX_3_18BIT_BLOCK_LENGTH)) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return 0; + } + } + // Compact the index-3 table and write an uncompacted version of the index-2 table. uint16_t index2[UNICODE_LIMIT >> UCPTRIE_SHIFT_2]; // index2Capacity int32_t i2Length = 0; @@ -1185,8 +1337,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else if (f == I3_BMP) { i3 = index[i]; } else if (f == I3_16) { - int32_t n = findSameBlock(index16, index3Start, indexLength, - index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); + int32_t n = mixedBlocks.findBlock(index16, index, i); if (n >= 0) { i3 = n; } else { @@ -1198,12 +1349,18 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index, i, UCPTRIE_INDEX_3_BLOCK_LENGTH); } i3 = indexLength - n; + int32_t prevIndexLength = indexLength; while (n < UCPTRIE_INDEX_3_BLOCK_LENGTH) { index16[indexLength++] = index[i + n++]; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); + if (hasLongI3Blocks) { + longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength); + } } } else { U_ASSERT(f == I3_18); + U_ASSERT(hasLongI3Blocks); // Encode an index-3 block that contains one or more data indexes exceeding 16 bits. int32_t j = i; int32_t jLimit = i + UCPTRIE_INDEX_3_BLOCK_LENGTH; @@ -1236,8 +1393,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index16[k++] = v; index16[k - 9] = upperBits; } while (j < jLimit); - int32_t n = findSameBlock(index16, index3Start, indexLength, - index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH); + int32_t n = longI3Blocks.findBlock(index16, index16, indexLength); if (n >= 0) { i3 = n | 0x8000; } else { @@ -1249,6 +1405,7 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error index16, indexLength, INDEX_3_18BIT_BLOCK_LENGTH); } i3 = (indexLength - n) | 0x8000; + int32_t prevIndexLength = indexLength; if (n > 0) { int32_t start = indexLength; while (n < INDEX_3_18BIT_BLOCK_LENGTH) { @@ -1257,6 +1414,10 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } else { indexLength += INDEX_3_18BIT_BLOCK_LENGTH; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); + if (hasLongI3Blocks) { + longI3Blocks.extend(index16, index3Start, prevIndexLength, indexLength); + } } } if (index3NullOffset < 0 && i3FirstNull >= 0) { @@ -1279,16 +1440,23 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error } // Compact the index-2 table and write the index-1 table. + static_assert(UCPTRIE_INDEX_2_BLOCK_LENGTH == UCPTRIE_INDEX_3_BLOCK_LENGTH, + "must re-init mixedBlocks"); int32_t blockLength = UCPTRIE_INDEX_2_BLOCK_LENGTH; int32_t i1 = fastIndexLength; for (int32_t i = 0; i < i2Length; i += blockLength) { - if ((i2Length - i) < blockLength) { + int32_t n; + if ((i2Length - i) >= blockLength) { + // normal block + U_ASSERT(blockLength == UCPTRIE_INDEX_2_BLOCK_LENGTH); + n = mixedBlocks.findBlock(index16, index2, i); + } else { // highStart is inside the last index-2 block. Shorten it. blockLength = i2Length - i; + n = findSameBlock(index16, index3Start, indexLength, + index2, i, blockLength); } int32_t i2; - int32_t n = findSameBlock(index16, index3Start, indexLength, - index2, i, blockLength); if (n >= 0) { i2 = n; } else { @@ -1299,9 +1467,11 @@ int32_t MutableCodePointTrie::compactIndex(int32_t fastILimit, UErrorCode &error n = getOverlap(index16, indexLength, index2, i, blockLength); } i2 = indexLength - n; + int32_t prevIndexLength = indexLength; while (n < blockLength) { index16[indexLength++] = index2[i + n++]; } + mixedBlocks.extend(index16, index3Start, prevIndexLength, indexLength); } // Set the index-1 table entry. index16[i1++] = i2; @@ -1369,7 +1539,11 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC uprv_memcpy(newData, asciiData, sizeof(asciiData)); int32_t dataNullIndex = allSameBlocks.findMostUsed(); - int32_t newDataLength = compactData(fastILimit, newData, dataNullIndex); + + MixedBlocks mixedBlocks; + int32_t newDataLength = compactData(fastILimit, newData, newDataCapacity, + dataNullIndex, mixedBlocks, errorCode); + if (U_FAILURE(errorCode)) { return 0; } U_ASSERT(newDataLength <= newDataCapacity); uprv_free(data); data = newData; @@ -1394,7 +1568,7 @@ int32_t MutableCodePointTrie::compactTrie(int32_t fastILimit, UErrorCode &errorC dataNullOffset = UCPTRIE_NO_DATA_NULL_OFFSET; } - int32_t indexLength = compactIndex(fastILimit, errorCode); + int32_t indexLength = compactIndex(fastILimit, mixedBlocks, errorCode); highStart = realHighStart; return indexLength; } diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index cbbd66cb5a8a65..20b03d6cd3e416 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -26,254 +26,116 @@ #include "uassert.h" #include "cmemory.h" +U_NAMESPACE_BEGIN -// The ICU global mutex. Used when ICU implementation code passes NULL for the mutex pointer. -static UMutex globalMutex = U_MUTEX_INITIALIZER; - -/* - * ICU Mutex wrappers. Wrap operating system mutexes, giving the rest of ICU a - * platform independent set of mutex operations. For internal ICU use only. - */ #if defined(U_USER_MUTEX_CPP) -// Build time user mutex hook: #include "U_USER_MUTEX_CPP" -#include U_MUTEX_XSTR(U_USER_MUTEX_CPP) - -#elif U_PLATFORM_USES_ONLY_WIN32_API - -#if defined U_NO_PLATFORM_ATOMICS -#error ICU on Win32 requires support for low level atomic operations. -// Visual Studio, gcc, clang are OK. Shouldn't get here. +// Support for including an alternate implementation of mutexes has been withdrawn. +// See issue ICU-20185. +#error U_USER_MUTEX_CPP not supported #endif +/************************************************************************************************* + * + * ICU Mutex wrappers. + * + *************************************************************************************************/ -// This function is called when a test of a UInitOnce::fState reveals that -// initialization has not completed, that we either need to call the -// function on this thread, or wait for some other thread to complete. -// -// The actual call to the init function is made inline by template code -// that knows the C++ types involved. This function returns TRUE if -// the caller needs to call the Init function. -// - -U_NAMESPACE_BEGIN - -U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) { - for (;;) { - int32_t previousState = InterlockedCompareExchange( - (LONG volatile *) // this is the type given in the API doc for this function. - &uio.fState, // Destination - 1, // Exchange Value - 0); // Compare value - - if (previousState == 0) { - return true; // Caller will next call the init function. - // Current state == 1. - } else if (previousState == 2) { - // Another thread already completed the initialization. - // We can simply return FALSE, indicating no - // further action is needed by the caller. - return FALSE; - } else { - // Another thread is currently running the initialization. - // Wait until it completes. - do { - Sleep(1); - previousState = umtx_loadAcquire(uio.fState); - } while (previousState == 1); - } - } -} - -// This function is called by the thread that ran an initialization function, -// just after completing the function. - -U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &uio) { - umtx_storeRelease(uio.fState, 2); -} - -U_NAMESPACE_END - -static void winMutexInit(CRITICAL_SECTION *cs) { - InitializeCriticalSection(cs); - return; +// The ICU global mutex. Used when ICU implementation code passes NULL for the mutex pointer. +static UMutex *globalMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; } U_CAPI void U_EXPORT2 umtx_lock(UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - CRITICAL_SECTION *cs = &mutex->fCS; - umtx_initOnce(mutex->fInitOnce, winMutexInit, cs); - EnterCriticalSection(cs); + mutex->fMutex.lock(); } + U_CAPI void U_EXPORT2 umtx_unlock(UMutex* mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - LeaveCriticalSection(&mutex->fCS); + mutex->fMutex.unlock(); } - -U_CAPI void U_EXPORT2 -umtx_condBroadcast(UConditionVar *condition) { - // We require that the associated mutex be held by the caller, - // so access to fWaitCount is protected and safe. No other thread can - // call condWait() while we are here. - if (condition->fWaitCount == 0) { - return; - } - ResetEvent(condition->fExitGate); - SetEvent(condition->fEntryGate); +UConditionVar::UConditionVar() : fCV() { } -U_CAPI void U_EXPORT2 -umtx_condSignal(UConditionVar * /* condition */) { - // Function not implemented. There is no immediate requirement from ICU to have it. - // Once ICU drops support for Windows XP and Server 2003, ICU Condition Variables will be - // changed to be thin wrappers on native Windows CONDITION_VARIABLEs, and this function - // becomes trivial to provide. - U_ASSERT(FALSE); +UConditionVar::~UConditionVar() { } -U_CAPI void U_EXPORT2 -umtx_condWait(UConditionVar *condition, UMutex *mutex) { - if (condition->fEntryGate == NULL) { - // Note: because the associated mutex must be locked when calling - // wait, we know that there can not be multiple threads - // running here with the same condition variable. - // Meaning that lazy initialization is safe. - U_ASSERT(condition->fExitGate == NULL); - condition->fEntryGate = CreateEvent(NULL, // Security Attributes - TRUE, // Manual Reset - FALSE, // Initially reset - NULL); // Name. - U_ASSERT(condition->fEntryGate != NULL); - condition->fExitGate = CreateEvent(NULL, TRUE, TRUE, NULL); - U_ASSERT(condition->fExitGate != NULL); - } - - condition->fWaitCount++; - umtx_unlock(mutex); - WaitForSingleObject(condition->fEntryGate, INFINITE); - umtx_lock(mutex); - condition->fWaitCount--; - if (condition->fWaitCount == 0) { - // All threads that were waiting at the entry gate have woken up - // and moved through. Shut the entry gate and open the exit gate. - ResetEvent(condition->fEntryGate); - SetEvent(condition->fExitGate); - } else { - umtx_unlock(mutex); - WaitForSingleObject(condition->fExitGate, INFINITE); - umtx_lock(mutex); - } -} - - -#elif U_PLATFORM_IMPLEMENTS_POSIX - -//------------------------------------------------------------------------------------------- -// -// POSIX specific definitions -// -//------------------------------------------------------------------------------------------- - -# include - -// Each UMutex consists of a pthread_mutex_t. -// All are statically initialized and ready for use. -// There is no runtime mutex initialization code needed. - -U_CAPI void U_EXPORT2 -umtx_lock(UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; - } - int sysErr = pthread_mutex_lock(&mutex->fMutex); - (void)sysErr; // Suppress unused variable warnings. - U_ASSERT(sysErr == 0); -} - - -U_CAPI void U_EXPORT2 -umtx_unlock(UMutex* mutex) -{ - if (mutex == NULL) { - mutex = &globalMutex; - } - int sysErr = pthread_mutex_unlock(&mutex->fMutex); - (void)sysErr; // Suppress unused variable warnings. - U_ASSERT(sysErr == 0); -} - - U_CAPI void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex) { - if (mutex == NULL) { - mutex = &globalMutex; + if (mutex == nullptr) { + mutex = globalMutex(); } - int sysErr = pthread_cond_wait(&cond->fCondition, &mutex->fMutex); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.wait(mutex->fMutex); } + U_CAPI void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond) { - int sysErr = pthread_cond_broadcast(&cond->fCondition); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.notify_all(); } + U_CAPI void U_EXPORT2 umtx_condSignal(UConditionVar *cond) { - int sysErr = pthread_cond_signal(&cond->fCondition); - (void)sysErr; - U_ASSERT(sysErr == 0); + cond->fCV.notify_one(); } +/************************************************************************************************* + * + * UInitOnce Implementation + * + *************************************************************************************************/ -U_NAMESPACE_BEGIN +static std::mutex &initMutex() { + static std::mutex m; + return m; +} -static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t initCondition = PTHREAD_COND_INITIALIZER; +static std::condition_variable &initCondition() { + static std::condition_variable cv; + return cv; +} // This function is called when a test of a UInitOnce::fState reveals that -// initialization has not completed, that we either need to call the +// initialization has not completed, that we either need to call the init // function on this thread, or wait for some other thread to complete. // // The actual call to the init function is made inline by template code -// that knows the C++ types involved. This function returns TRUE if +// that knows the C++ types involved. This function returns true if // the caller needs to call the Init function. // U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) { - pthread_mutex_lock(&initMutex); - int32_t state = uio.fState; - if (state == 0) { + std::unique_lock lock(initMutex()); + + if (umtx_loadAcquire(uio.fState) == 0) { umtx_storeRelease(uio.fState, 1); - pthread_mutex_unlock(&initMutex); - return TRUE; // Caller will next call the init function. + return true; // Caller will next call the init function. } else { - while (uio.fState == 1) { + while (umtx_loadAcquire(uio.fState) == 1) { // Another thread is currently running the initialization. // Wait until it completes. - pthread_cond_wait(&initCondition, &initMutex); + initCondition().wait(lock); } - pthread_mutex_unlock(&initMutex); U_ASSERT(uio.fState == 2); - return FALSE; + return false; } } - // This function is called by the thread that ran an initialization function, // just after completing the function. // Some threads may be waiting on the condition, requiring the broadcast wakeup. @@ -282,80 +144,20 @@ umtx_initImplPreInit(UInitOnce &uio) { U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &uio) { - pthread_mutex_lock(&initMutex); - umtx_storeRelease(uio.fState, 2); - pthread_cond_broadcast(&initCondition); - pthread_mutex_unlock(&initMutex); -} - -U_NAMESPACE_END - -// End of POSIX specific umutex implementation. - -#else // Platform #define chain. - -#error Unknown Platform - -#endif // Platform #define chain. - - -//------------------------------------------------------------------------------- -// -// Atomic Operations, out-of-line versions. -// These are conditional, only defined if better versions -// were not available for the platform. -// -// These versions are platform neutral. -// -//-------------------------------------------------------------------------------- - -#if defined U_NO_PLATFORM_ATOMICS -static UMutex gIncDecMutex = U_MUTEX_INITIALIZER; - -U_NAMESPACE_BEGIN - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_inc(u_atomic_int32_t *p) { - int32_t retVal; - umtx_lock(&gIncDecMutex); - retVal = ++(*p); - umtx_unlock(&gIncDecMutex); - return retVal; -} - - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_dec(u_atomic_int32_t *p) { - int32_t retVal; - umtx_lock(&gIncDecMutex); - retVal = --(*p); - umtx_unlock(&gIncDecMutex); - return retVal; -} - -U_COMMON_API int32_t U_EXPORT2 -umtx_loadAcquire(u_atomic_int32_t &var) { - umtx_lock(&gIncDecMutex); - int32_t val = var; - umtx_unlock(&gIncDecMutex); - return val; -} - -U_COMMON_API void U_EXPORT2 -umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - umtx_lock(&gIncDecMutex); - var = val; - umtx_unlock(&gIncDecMutex); + { + std::unique_lock lock(initMutex()); + umtx_storeRelease(uio.fState, 2); + } + initCondition().notify_all(); } U_NAMESPACE_END -#endif -//-------------------------------------------------------------------------- -// -// Deprecated functions for setting user mutexes. -// -//-------------------------------------------------------------------------- +/************************************************************************************************* + * + * Deprecated functions for setting user mutexes. + * + *************************************************************************************************/ U_DEPRECATED void U_EXPORT2 u_setMutexFunctions(const void * /*context */, UMtxInitFn *, UMtxFn *, diff --git a/deps/icu-small/source/common/umutex.h b/deps/icu-small/source/common/umutex.h old mode 100644 new mode 100755 index 37e49871049b93..1674d00bb2d59b --- a/deps/icu-small/source/common/umutex.h +++ b/deps/icu-small/source/common/umutex.h @@ -20,48 +20,51 @@ #ifndef UMUTEX_H #define UMUTEX_H +#include +#include +#include + #include "unicode/utypes.h" #include "unicode/uclean.h" +#include "unicode/uobject.h" + #include "putilimp.h" +#if defined(U_USER_ATOMICS_H) || defined(U_USER_MUTEX_H) +// Support for including an alternate implementation of atomic & mutex operations has been withdrawn. +// See issue ICU-20185. +#error U_USER_ATOMICS and U_USER_MUTEX_H are not supported +#endif -// Forward Declarations. UMutex is not in the ICU namespace (yet) because -// there are some remaining references from plain C. -struct UMutex; -struct UConditionVar; +// Export an explicit template instantiation of std::atomic. +// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class. +// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. +#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) +#if defined(__clang__) || defined(_MSC_VER) + #if defined(__clang__) + // Suppress the warning that the explicit instantiation after explicit specialization has no effect. + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Winstantiation-after-specialization" + #endif +template struct U_COMMON_API std::atomic; + #if defined(__clang__) + #pragma clang diagnostic pop + #endif +#elif defined(__GNUC__) +// For GCC this class is already exported/visible, so no need for U_COMMON_API. +template struct std::atomic; +#endif +#endif -U_NAMESPACE_BEGIN -struct UInitOnce; -U_NAMESPACE_END -// Stringify macros, to allow #include of user supplied atomic & mutex files. -#define U_MUTEX_STR(s) #s -#define U_MUTEX_XSTR(s) U_MUTEX_STR(s) +U_NAMESPACE_BEGIN /**************************************************************************** * - * Low Level Atomic Operations. - * Compiler dependent. Not operating system dependent. + * Low Level Atomic Operations, ICU wrappers for. * ****************************************************************************/ -#if defined (U_USER_ATOMICS_H) -#include U_MUTEX_XSTR(U_USER_ATOMICS_H) - -#elif U_HAVE_STD_ATOMICS - -// C++11 atomics are available. - -#include - -U_NAMESPACE_BEGIN - -// Export an explicit template instantiation of std::atomic. -// When building DLLs for Windows this is required as it is used as a data member of the exported SharedObject class. -// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN -template struct U_COMMON_API std::atomic; -#endif typedef std::atomic u_atomic_int32_t; #define ATOMIC_INT32_T_INITIALIZER(val) ATOMIC_VAR_INIT(val) @@ -81,155 +84,19 @@ inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { return var->fetch_sub(1) - 1; } -U_NAMESPACE_END - -#elif U_PLATFORM_HAS_WIN32_API - -// MSVC compiler. Reads and writes of volatile variables have -// acquire and release memory semantics, respectively. -// This is a Microsoft extension, not standard C++ behavior. -// -// Update: can't use this because of MinGW, built with gcc. -// Original plan was to use gcc atomics for MinGW, but they -// aren't supported, so we fold MinGW into this path. - -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -# ifndef NOMINMAX -# define NOMINMAX -# endif -# include - -U_NAMESPACE_BEGIN -typedef volatile LONG u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - return InterlockedCompareExchange(&var, 0, 0); -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - InterlockedExchange(&var, val); -} - - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { - return InterlockedIncrement(var); -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { - return InterlockedDecrement(var); -} -U_NAMESPACE_END - - -#elif U_HAVE_CLANG_ATOMICS -/* - * Clang __c11 atomic built-ins - */ - -U_NAMESPACE_BEGIN -typedef _Atomic(int32_t) u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - return __c11_atomic_load(&var, __ATOMIC_ACQUIRE); -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - return __c11_atomic_store(&var, val, __ATOMIC_RELEASE); -} - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *var) { - return __c11_atomic_fetch_add(var, 1, __ATOMIC_SEQ_CST) + 1; -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *var) { - return __c11_atomic_fetch_sub(var, 1, __ATOMIC_SEQ_CST) - 1; -} -U_NAMESPACE_END - - -#elif U_HAVE_GCC_ATOMICS -/* - * gcc atomic ops. These are available on several other compilers as well. - */ - -U_NAMESPACE_BEGIN -typedef int32_t u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -inline int32_t umtx_loadAcquire(u_atomic_int32_t &var) { - int32_t val = var; - __sync_synchronize(); - return val; -} - -inline void umtx_storeRelease(u_atomic_int32_t &var, int32_t val) { - __sync_synchronize(); - var = val; -} - -inline int32_t umtx_atomic_inc(u_atomic_int32_t *p) { - return __sync_add_and_fetch(p, 1); -} - -inline int32_t umtx_atomic_dec(u_atomic_int32_t *p) { - return __sync_sub_and_fetch(p, 1); -} -U_NAMESPACE_END - -#else - -/* - * Unknown Platform. Use out-of-line functions, which in turn use mutexes. - * Slow but correct. - */ - -#define U_NO_PLATFORM_ATOMICS - -U_NAMESPACE_BEGIN -typedef int32_t u_atomic_int32_t; -#define ATOMIC_INT32_T_INITIALIZER(val) val - -U_COMMON_API int32_t U_EXPORT2 -umtx_loadAcquire(u_atomic_int32_t &var); - -U_COMMON_API void U_EXPORT2 -umtx_storeRelease(u_atomic_int32_t &var, int32_t val); - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_inc(u_atomic_int32_t *p); - -U_COMMON_API int32_t U_EXPORT2 -umtx_atomic_dec(u_atomic_int32_t *p); - -U_NAMESPACE_END - -#endif /* Low Level Atomic Ops Platform Chain */ - /************************************************************************************************* * * UInitOnce Definitions. - * These are platform neutral. * *************************************************************************************************/ -U_NAMESPACE_BEGIN - struct UInitOnce { u_atomic_int32_t fState; UErrorCode fErrCode; - void reset() {fState = 0;}; - UBool isReset() {return umtx_loadAcquire(fState) == 0;}; + void reset() {fState = 0;} + UBool isReset() {return umtx_loadAcquire(fState) == 0;} // Note: isReset() is used by service registration code. // Thread safety of this usage needs review. }; @@ -313,106 +180,49 @@ template void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UE } } -U_NAMESPACE_END - - /************************************************************************************************* * - * Mutex Definitions. Platform Dependent, #if platform chain follows. - * TODO: Add a C++11 version. - * Need to convert all mutex using files to C++ first. + * ICU Mutex wrappers. Originally wrapped operating system mutexes, giving the rest of ICU a + * platform independent set of mutex operations. Now vestigial, wrapping std::mutex only. + * For internal ICU use only. * *************************************************************************************************/ -#if defined(U_USER_MUTEX_H) -// #include "U_USER_MUTEX_H" -#include U_MUTEX_XSTR(U_USER_MUTEX_H) - -#elif U_PLATFORM_USES_ONLY_WIN32_API +struct UMutex : public icu::UMemory { + UMutex() = default; + ~UMutex() = default; + UMutex(const UMutex &other) = delete; + UMutex &operator =(const UMutex &other) = delete; -/* For CRITICAL_SECTION */ - -/* - * Note: there is an earlier include of windows.h in this file, but it is in - * different conditionals. - * This one is needed if we are using C++11 for atomic ops, but - * win32 APIs for Critical Sections. - */ - -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -# define VC_EXTRALEAN -# define NOUSER -# define NOSERVICE -# define NOIME -# define NOMCX -# ifndef NOMINMAX -# define NOMINMAX -# endif -# include - - -typedef struct UMutex { - icu::UInitOnce fInitOnce; - CRITICAL_SECTION fCS; -} UMutex; - -/* Initializer for a static UMUTEX. Deliberately contains no value for the - * CRITICAL_SECTION. - */ -#define U_MUTEX_INITIALIZER {U_INITONCE_INITIALIZER} - -struct UConditionVar { - HANDLE fEntryGate; - HANDLE fExitGate; - int32_t fWaitCount; + std::mutex fMutex = {}; // Note: struct - pubic members - because most access is from + // // plain C style functions (umtx_lock(), etc.) }; -#define U_CONDITION_INITIALIZER {NULL, NULL, 0} - - - -#elif U_PLATFORM_IMPLEMENTS_POSIX -/* - * POSIX platform - */ +struct UConditionVar : public icu::UMemory { + U_COMMON_API UConditionVar(); + U_COMMON_API ~UConditionVar(); + UConditionVar(const UConditionVar &other) = delete; + UConditionVar &operator =(const UConditionVar &other) = delete; -#include - -struct UMutex { - pthread_mutex_t fMutex; + std::condition_variable_any fCV; }; -typedef struct UMutex UMutex; -#define U_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER} -struct UConditionVar { - pthread_cond_t fCondition; -}; -#define U_CONDITION_INITIALIZER {PTHREAD_COND_INITIALIZER} +#define U_MUTEX_INITIALIZER {} +#define U_CONDITION_INITIALIZER {} -#else - -/* - * Unknown platform type. - * This is an error condition. ICU requires mutexes. - */ - -#error Unknown Platform. - -#endif - - - -/************************************************************************************** - * - * Mutex Implementation function declarations. - * Declarations are platform neutral. - * Implementations, in umutex.cpp, are platform specific. - * - ************************************************************************************/ +// Implementation notes for UConditionVar: +// +// Use an out-of-line constructor to reduce problems with the ICU dependency checker. +// On Linux, the default constructor of std::condition_variable_any +// produces an in-line reference to global operator new(), which the +// dependency checker flags for any file that declares a UConditionVar. With +// an out-of-line constructor, the dependency is constrained to umutex.o +// +// Do not export (U_COMMON_API) the entire class, but only the constructor +// and destructor, to avoid Windows build problems with attempting to export the +// std::condition_variable_any. /* Lock a mutex. * @param mutex The given mutex to be locked. Pass NULL to specify @@ -441,8 +251,6 @@ U_INTERNAL void U_EXPORT2 umtx_condWait(UConditionVar *cond, UMutex *mutex); /* * Broadcast wakeup of all threads waiting on a Condition. - * The associated mutex must be locked by the calling thread when calling - * this function; this is a temporary ICU restriction. * * @param cond the condition variable. */ @@ -450,9 +258,11 @@ U_INTERNAL void U_EXPORT2 umtx_condBroadcast(UConditionVar *cond); /* * Signal a condition variable, waking up one waiting thread. - * CAUTION: Do not use. Place holder only. Not implemented for Windows. */ U_INTERNAL void U_EXPORT2 umtx_condSignal(UConditionVar *cond); + +U_NAMESPACE_END + #endif /* UMUTEX_H */ /*eof*/ diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index 5f752b0d1725cb..038743004ea589 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -1526,7 +1526,7 @@ u_charFromName(UCharNameChoice nameChoice, uint32_t i; UChar32 cp = 0; char c0; - UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ + static constexpr UChar32 error = 0xffff; /* Undefined, but use this for backwards compatibility. */ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return error; @@ -1560,39 +1560,45 @@ u_charFromName(UCharNameChoice nameChoice, /* try extended names first */ if (lower[0] == '<') { - if (nameChoice == U_EXTENDED_CHAR_NAME) { + if (nameChoice == U_EXTENDED_CHAR_NAME && lower[--i] == '>') { // Parse a string like "" where HHHH is a hex code point. - if (lower[--i] == '>' && i >= 3 && lower[--i] != '-') { - while (i >= 3 && lower[--i] != '-') {} - - if (i >= 2 && lower[i] == '-') { - uint32_t cIdx; - - lower[i] = 0; - - for (++i; lower[i] != '>'; ++i) { - if (lower[i] >= '0' && lower[i] <= '9') { - cp = (cp << 4) + lower[i] - '0'; - } else if (lower[i] >= 'a' && lower[i] <= 'f') { - cp = (cp << 4) + lower[i] - 'a' + 10; - } else { - *pErrorCode = U_ILLEGAL_CHAR_FOUND; - return error; - } - } + uint32_t limit = i; + while (i >= 3 && lower[--i] != '-') {} + + // There should be 1 to 8 hex digits. + int32_t hexLength = limit - (i + 1); + if (i >= 2 && lower[i] == '-' && 1 <= hexLength && hexLength <= 8) { + uint32_t cIdx; + + lower[i] = 0; - /* Now validate the category name. - We could use a binary search, or a trie, if - we really wanted to. */ + for (++i; i < limit; ++i) { + if (lower[i] >= '0' && lower[i] <= '9') { + cp = (cp << 4) + lower[i] - '0'; + } else if (lower[i] >= 'a' && lower[i] <= 'f') { + cp = (cp << 4) + lower[i] - 'a' + 10; + } else { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; + } + // Prevent signed-integer overflow and out-of-range code points. + if (cp > UCHAR_MAX_VALUE) { + *pErrorCode = U_ILLEGAL_CHAR_FOUND; + return error; + } + } - for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) { + /* Now validate the category name. + We could use a binary search, or a trie, if + we really wanted to. */ + uint8_t cat = getCharCat(cp); + for (lower[i] = 0, cIdx = 0; cIdx < UPRV_LENGTHOF(charCatNames); ++cIdx) { - if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { - if (getCharCat(cp) == cIdx) { - return cp; - } - break; + if (!uprv_strcmp(lower + 1, charCatNames[cIdx])) { + if (cat == cIdx) { + return cp; } + break; } } } diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 5faeedfa93ecb8..ac1bf1df29f214 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -431,12 +431,13 @@ class U_COMMON_API BreakIterator : public UObject { static BreakIterator* U_EXPORT2 createSentenceInstance(const Locale& where, UErrorCode& status); +#ifndef U_HIDE_DEPRECATED_API /** * Create BreakIterator for title-casing breaks using the specified locale * Returns an instance of a BreakIterator implementing title breaks. * The iterator returned locates title boundaries as described for * Unicode 3.2 only. For Unicode 4.0 and above title boundary iteration, - * please use Word Boundary iterator.{@link #createWordInstance } + * please use a word boundary iterator. See {@link #createWordInstance }. * * @param where the locale. * @param status The error code. @@ -451,10 +452,11 @@ class U_COMMON_API BreakIterator : public UObject { * used; neither the requested locale nor any of its fall back locales * could be found. * The caller owns the returned object and is responsible for deleting it. - * @stable ICU 2.1 + * @deprecated ICU 64 Use createWordInstance instead. */ static BreakIterator* U_EXPORT2 createTitleInstance(const Locale& where, UErrorCode& status); +#endif /* U_HIDE_DEPRECATED_API */ /** * Get the set of Locales for which TextBoundaries are installed. diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 243fa17b87917a..89906799877622 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -33,7 +33,7 @@ * then detailed member descriptions.

* *

C Programmers:

- *

Use Module List or File Members + *

Use Module List or File Members * to find a list of all the functions and constants. * For example, to find BreakIterator functions you would click on * File List, @@ -115,7 +115,7 @@ * * Locales * uloc.h - * icu::Locale + * icu::Locale, icu::LocaleBuilder * * * Resource Bundles @@ -143,11 +143,16 @@ * icu::MessageFormat * * - * Number Formatting + * Number Formatting
(includes currency and unit formatting) * unumberformatter.h, unum.h * icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) * * + * Number Range Formatting
(includes currency and unit ranges) + * (no C API) + * icu::number::NumberRangeFormatter + * + * * Number Spellout
(Rule Based Number Formatting) * unum.h
(use UNUM_SPELLOUT) * icu::RuleBasedNumberFormat diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index c99011e26c81dd..625456f0c868e9 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -53,14 +53,14 @@ class U_COMMON_API DateInterval : public UObject { * @return the from date in dateInterval. * @stable ICU 4.0 */ - UDate getFromDate() const; + inline UDate getFromDate() const; /** * Get the to date. * @return the to date in dateInterval. * @stable ICU 4.0 */ - UDate getToDate() const; + inline UDate getToDate() const; /** @@ -114,7 +114,7 @@ class U_COMMON_API DateInterval : public UObject { * @return TRUE if the two DateIntervals are not the same * @stable ICU 4.0 */ - UBool operator!=(const DateInterval& other) const; + inline UBool operator!=(const DateInterval& other) const; /** diff --git a/deps/icu-small/source/common/unicode/localebuilder.h b/deps/icu-small/source/common/unicode/localebuilder.h new file mode 100644 index 00000000000000..960e5980c03c2e --- /dev/null +++ b/deps/icu-small/source/common/unicode/localebuilder.h @@ -0,0 +1,292 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html#License +#ifndef __LOCALEBUILDER_H__ +#define __LOCALEBUILDER_H__ + +#include "unicode/locid.h" +#include "unicode/stringpiece.h" +#include "unicode/uobject.h" +#include "unicode/utypes.h" + + +#ifndef U_HIDE_DRAFT_API +/** + * \file + * \brief C++ API: Builder API for Locale + */ + +U_NAMESPACE_BEGIN +class CharString; + +/** + * LocaleBuilder is used to build instances of Locale + * from values configured by the setters. Unlike the Locale + * constructors, the LocaleBuilder checks if a value configured by a + * setter satisfies the syntax requirements defined by the Locale + * class. A Locale object created by a LocaleBuilder is + * well-formed and can be transformed to a well-formed IETF BCP 47 language tag + * without losing information. + * + *

The following example shows how to create a Locale object + * with the LocaleBuilder. + *

+ *
+ *     UErrorCode status = U_ZERO_ERROR;
+ *     Locale aLocale = LocaleBuilder()
+ *                          .setLanguage("sr")
+ *                          .setScript("Latn")
+ *                          .setRegion("RS")
+ *                          .build(status);
+ *     if (U_SUCCESS(status)) {
+ *       // ...
+ *     }
+ * 
+ *
+ * + *

LocaleBuilders can be reused; clear() resets all + * fields to their default values. + * + *

LocaleBuilder tracks errors in an internal UErrorCode. For all setters, + * except setLanguageTag and setLocale, LocaleBuilder will return immediately + * if the internal UErrorCode is in error state. + * To reset internal state and error code, call clear method. + * The setLanguageTag and setLocale method will first clear the internal + * UErrorCode, then track the error of the validation of the input parameter + * into the internal UErrorCode. + * + * @draft ICU 64 + */ +class U_COMMON_API LocaleBuilder : public UObject { +public: + /** + * Constructs an empty LocaleBuilder. The default value of all + * fields, extensions, and private use information is the + * empty string. + * + * @draft ICU 64 + */ + LocaleBuilder(); + + /** + * Destructor + * @draft ICU 64 + */ + virtual ~LocaleBuilder(); + + /** + * Resets the LocaleBuilder to match the provided + * locale. Existing state is discarded. + * + *

All fields of the locale must be well-formed. + *

This method clears the internal UErrorCode. + * + * @param locale the locale + * @return This builder. + * + * @draft ICU 64 + */ + LocaleBuilder& setLocale(const Locale& locale); + + /** + * Resets the LocaleBuilder to match the provided + * [Unicode Locale Identifier](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id) . + * Discards the existing state. the empty string cause the builder to be + * reset, like {@link #clear}. Grandfathered tags are converted to their + * canonical form before being processed. Otherwise, the language + * tag must be well-formed, or else the build() method will later + * report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

This method clears the internal UErrorCode. + * + * @param tag the language tag, defined as + * [unicode_locale_id](http://www.unicode.org/reports/tr35/tr35.html#unicode_locale_id). + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setLanguageTag(StringPiece tag); + + /** + * Sets the language. If language is the empty string, the + * language in this LocaleBuilder is removed. Otherwise, the + * language must be well-formed, or else the build() method will + * later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

The syntax of language value is defined as + * [unicode_language_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_language_subtag). + * + * @param language the language + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setLanguage(StringPiece language); + + /** + * Sets the script. If script is the empty string, the script in + * this LocaleBuilder is removed. + * Otherwise, the script must be well-formed, or else the build() + * method will later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

The script value is a four-letter script code as + * [unicode_script_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_script_subtag) + * defined by ISO 15924 + * + * @param script the script + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setScript(StringPiece script); + + /** + * Sets the region. If region is the empty string, the region in this + * LocaleBuilder is removed. Otherwise, the region + * must be well-formed, or else the build() method will later report an + * U_ILLEGAL_ARGUMENT_ERROR. + * + *

The region value is defined by + * [unicode_region_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_region_subtag) + * as a two-letter ISO 3166 code or a three-digit UN M.49 area code. + * + *

The region value in the Locale created by the + * LocaleBuilder is always normalized to upper case. + * + * @param region the region + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setRegion(StringPiece region); + + /** + * Sets the variant. If variant is the empty string, the variant in this + * LocaleBuilder is removed. Otherwise, the variant + * must be well-formed, or else the build() method will later report an + * U_ILLEGAL_ARGUMENT_ERROR. + * + *

Note: This method checks if variant + * satisfies the + * [unicode_variant_subtag](http://www.unicode.org/reports/tr35/tr35.html#unicode_variant_subtag) + * syntax requirements, and normalizes the value to lowercase letters. However, + * the Locale class does not impose any syntactic + * restriction on variant. To set an ill-formed variant, use a Locale constructor. + * If there are multiple unicode_variant_subtag, the caller must concatenate + * them with '-' as separator (ex: "foobar-fibar"). + * + * @param variant the variant + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setVariant(StringPiece variant); + + /** + * Sets the extension for the given key. If the value is the empty string, + * the extension is removed. Otherwise, the key and + * value must be well-formed, or else the build() method will + * later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

Note: The key ('u') is used for the Unicode locale extension. + * Setting a value for this key replaces any existing Unicode locale key/type + * pairs with those defined in the extension. + * + *

Note: The key ('x') is used for the private use code. To be + * well-formed, the value for this key needs only to have subtags of one to + * eight alphanumeric characters, not two to eight as in the general case. + * + * @param key the extension key + * @param value the extension value + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setExtension(char key, StringPiece value); + + /** + * Sets the Unicode locale keyword type for the given key. If the type + * StringPiece is constructed with a nullptr, the keyword is removed. + * If the type is the empty string, the keyword is set without type subtags. + * Otherwise, the key and type must be well-formed, or else the build() + * method will later report an U_ILLEGAL_ARGUMENT_ERROR. + * + *

Keys and types are converted to lower case. + * + *

Note:Setting the 'u' extension via {@link #setExtension} + * replaces all Unicode locale keywords with those defined in the + * extension. + * + * @param key the Unicode locale key + * @param type the Unicode locale type + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& setUnicodeLocaleKeyword( + StringPiece key, StringPiece type); + + /** + * Adds a unicode locale attribute, if not already present, otherwise + * has no effect. The attribute must not be empty string and must be + * well-formed or U_ILLEGAL_ARGUMENT_ERROR will be set to status + * during the build() call. + * + * @param attribute the attribute + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& addUnicodeLocaleAttribute(StringPiece attribute); + + /** + * Removes a unicode locale attribute, if present, otherwise has no + * effect. The attribute must not be empty string and must be well-formed + * or U_ILLEGAL_ARGUMENT_ERROR will be set to status during the build() call. + * + *

Attribute comparison for removal is case-insensitive. + * + * @param attribute the attribute + * @return This builder. + * @draft ICU 64 + */ + LocaleBuilder& removeUnicodeLocaleAttribute(StringPiece attribute); + + /** + * Resets the builder to its initial, empty state. + *

This method clears the internal UErrorCode. + * + * @return this builder + * @draft ICU 64 + */ + LocaleBuilder& clear(); + + /** + * Resets the extensions to their initial, empty state. + * Language, script, region and variant are unchanged. + * + * @return this builder + * @draft ICU 64 + */ + LocaleBuilder& clearExtensions(); + + /** + * Returns an instance of Locale created from the fields set + * on this builder. + * If any set methods or during the build() call require memory allocation + * but fail U_MEMORY_ALLOCATION_ERROR will be set to status. + * If any of the fields set by the setters are not well-formed, the status + * will be set to U_ILLEGAL_ARGUMENT_ERROR. The state of the builder will + * not change after the build() call and the caller is free to keep using + * the same builder to build more locales. + * + * @return a new Locale + * @draft ICU 64 + */ + Locale build(UErrorCode& status); + +private: + UErrorCode status_; + char language_[9]; + char script_[5]; + char region_[4]; + CharString *variant_; // Pointer not object so we need not #include internal charstr.h. + icu::Locale *extensions_; // Pointer not object. Storage for all other fields. + +}; + +U_NAMESPACE_END + +#endif // U_HIDE_DRAFT_API +#endif // __LOCALEBUILDER_H__ diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index e17ee3d886ef34..e011688b1a54df 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -42,6 +42,8 @@ #if U_SHOW_CPLUSPLUS_API +#include + U_NAMESPACE_BEGIN /** @@ -65,6 +67,13 @@ U_NAMESPACE_BEGIN template class LocalPointerBase { public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) = delete; + static void* U_EXPORT2 operator new[](size_t) = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) = delete; +#endif + /** * Constructor takes ownership. * @param p simple pointer to an object that is adopted @@ -158,12 +167,6 @@ class LocalPointerBase { // No ownership sharing: No copy constructor, no assignment operator. LocalPointerBase(const LocalPointerBase &other); void operator=(const LocalPointerBase &other); - // No heap allocation. Use only on the stack. - static void * U_EXPORT2 operator new(size_t size); - static void * U_EXPORT2 operator new[](size_t size); -#if U_HAVE_PLACEMENT_NEW - static void * U_EXPORT2 operator new(size_t, void *ptr); -#endif }; /** @@ -221,6 +224,22 @@ class LocalPointer : public LocalPointerBase { LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } + +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a LocalPointer from a C++11 std::unique_ptr. + * The LocalPointer steals the object owned by the std::unique_ptr. + * + * This constructor works via move semantics. If your std::unique_ptr is + * in a local variable, you must use std::move. + * + * @param p The std::unique_ptr from which the pointer will be stolen. + * @draft ICU 64 + */ + explicit LocalPointer(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} +#endif /* U_HIDE_DRAFT_API */ + /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -236,24 +255,27 @@ class LocalPointer : public LocalPointerBase { * @stable ICU 56 */ LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { - return moveFrom(src); + delete LocalPointerBase::ptr; + LocalPointerBase::ptr=src.ptr; + src.ptr=NULL; + return *this; } - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API + +#ifndef U_HIDE_DRAFT_API /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. + * Move-assign from an std::unique_ptr to this LocalPointer. + * Steals the pointer from the std::unique_ptr. * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer + * @param p The std::unique_ptr from which the pointer will be stolen. * @return *this - * @draft ICU 56 + * @draft ICU 64 */ - LocalPointer &moveFrom(LocalPointer &src) U_NOEXCEPT { - delete LocalPointerBase::ptr; - LocalPointerBase::ptr=src.ptr; - src.ptr=NULL; + LocalPointer &operator=(std::unique_ptr &&p) U_NOEXCEPT { + adoptInstead(p.release()); return *this; } +#endif /* U_HIDE_DRAFT_API */ + /** * Swap pointers. * @param other other smart pointer @@ -309,6 +331,23 @@ class LocalPointer : public LocalPointerBase { delete p; } } + +#ifndef U_HIDE_DRAFT_API + /** + * Conversion operator to a C++11 std::unique_ptr. + * Disowns the object and gives it to the returned std::unique_ptr. + * + * This operator works via move semantics. If your LocalPointer is + * in a local variable, you must use std::move. + * + * @return An std::unique_ptr owning the pointer previously owned by this + * icu::LocalPointer. + * @draft ICU 64 + */ + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan()); + } +#endif /* U_HIDE_DRAFT_API */ }; /** @@ -366,6 +405,22 @@ class LocalArray : public LocalPointerBase { LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } + +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a LocalArray from a C++11 std::unique_ptr of an array type. + * The LocalPointer steals the array owned by the std::unique_ptr. + * + * This constructor works via move semantics. If your std::unique_ptr is + * in a local variable, you must use std::move. + * + * @param p The std::unique_ptr from which the array will be stolen. + * @draft ICU 64 + */ + explicit LocalArray(std::unique_ptr &&p) + : LocalPointerBase(p.release()) {} +#endif /* U_HIDE_DRAFT_API */ + /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -381,24 +436,27 @@ class LocalArray : public LocalPointerBase { * @stable ICU 56 */ LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { - return moveFrom(src); + delete[] LocalPointerBase::ptr; + LocalPointerBase::ptr=src.ptr; + src.ptr=NULL; + return *this; } - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API + +#ifndef U_HIDE_DRAFT_API /** - * Move assignment, leaves src with isNull(). - * The behavior is undefined if *this and src are the same object. + * Move-assign from an std::unique_ptr to this LocalPointer. + * Steals the array from the std::unique_ptr. * - * Can be called explicitly, does not need C++11 support. - * @param src source smart pointer + * @param p The std::unique_ptr from which the array will be stolen. * @return *this - * @draft ICU 56 + * @draft ICU 64 */ - LocalArray &moveFrom(LocalArray &src) U_NOEXCEPT { - delete[] LocalPointerBase::ptr; - LocalPointerBase::ptr=src.ptr; - src.ptr=NULL; + LocalArray &operator=(std::unique_ptr &&p) U_NOEXCEPT { + adoptInstead(p.release()); return *this; } +#endif /* U_HIDE_DRAFT_API */ + /** * Swap pointers. * @param other other smart pointer @@ -462,6 +520,23 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ T &operator[](ptrdiff_t i) const { return LocalPointerBase::ptr[i]; } + +#ifndef U_HIDE_DRAFT_API + /** + * Conversion operator to a C++11 std::unique_ptr. + * Disowns the object and gives it to the returned std::unique_ptr. + * + * This operator works via move semantics. If your LocalPointer is + * in a local variable, you must use std::move. + * + * @return An std::unique_ptr owning the pointer previously owned by this + * icu::LocalPointer. + * @draft ICU 64 + */ + operator std::unique_ptr () && { + return std::unique_ptr(LocalPointerBase::orphan()); + } +#endif /* U_HIDE_DRAFT_API */ }; /** @@ -494,16 +569,21 @@ class LocalArray : public LocalPointerBase { : LocalPointerBase(src.ptr) { \ src.ptr=NULL; \ } \ + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ + explicit LocalPointerClassName(std::unique_ptr &&p) \ + : LocalPointerBase(p.release()) {} \ ~LocalPointerClassName() { if (ptr != NULL) { closeFunction(ptr); } } \ LocalPointerClassName &operator=(LocalPointerClassName &&src) U_NOEXCEPT { \ - return moveFrom(src); \ - } \ - LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ if (ptr != NULL) { closeFunction(ptr); } \ LocalPointerBase::ptr=src.ptr; \ src.ptr=NULL; \ return *this; \ } \ + /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ \ + LocalPointerClassName &operator=(std::unique_ptr &&p) { \ + adoptInstead(p.release()); \ + return *this; \ + } \ void swap(LocalPointerClassName &other) U_NOEXCEPT { \ Type *temp=LocalPointerBase::ptr; \ LocalPointerBase::ptr=other.ptr; \ @@ -516,6 +596,9 @@ class LocalArray : public LocalPointerBase { if (ptr != NULL) { closeFunction(ptr); } \ ptr=p; \ } \ + operator std::unique_ptr () && { \ + return std::unique_ptr(LocalPointerBase::orphan(), closeFunction); \ + } \ } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locdspnm.h b/deps/icu-small/source/common/unicode/locdspnm.h index 7f227829b4cc00..f6e778356feced 100644 --- a/deps/icu-small/source/common/unicode/locdspnm.h +++ b/deps/icu-small/source/common/unicode/locdspnm.h @@ -49,7 +49,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @return a LocaleDisplayNames instance * @stable ICU 4.4 */ - static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale); + inline static LocaleDisplayNames* U_EXPORT2 createInstance(const Locale& locale); /** * Returns an instance of LocaleDisplayNames that returns names diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index 415bced82299e3..7350e381ffa540 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -340,7 +340,7 @@ class U_COMMON_API Locale : public UObject { * otherwise. * @stable ICU 2.0 */ - UBool operator!=(const Locale& other) const; + inline UBool operator!=(const Locale& other) const; /** * Clone this object. @@ -962,7 +962,7 @@ class U_COMMON_API Locale : public UObject { * @return FALSE if it is a real locale, TRUE if it is a bogus locale * @stable ICU 2.1 */ - UBool isBogus(void) const; + inline UBool isBogus(void) const; /** * Returns a list of all installed locales. diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index 50cc56db590cf8..c02c8169565738 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -90,21 +90,21 @@ class U_COMMON_API ParsePosition : public UObject { * Assignment operator * @stable ICU 2.0 */ - ParsePosition& operator=(const ParsePosition& copy); + inline ParsePosition& operator=(const ParsePosition& copy); /** * Equality operator. * @return TRUE if the two parse positions are equal, FALSE otherwise. * @stable ICU 2.0 */ - UBool operator==(const ParsePosition& that) const; + inline UBool operator==(const ParsePosition& that) const; /** * Equality operator. * @return TRUE if the two parse positions are not equal, FALSE otherwise. * @stable ICU 2.0 */ - UBool operator!=(const ParsePosition& that) const; + inline UBool operator!=(const ParsePosition& that) const; /** * Clone this object. @@ -126,14 +126,14 @@ class U_COMMON_API ParsePosition : public UObject { * @return the current index. * @stable ICU 2.0 */ - int32_t getIndex(void) const; + inline int32_t getIndex(void) const; /** * Set the current parse position. * @param index the new index. * @stable ICU 2.0 */ - void setIndex(int32_t index); + inline void setIndex(int32_t index); /** * Set the index at which a parse error occurred. Formatters @@ -142,14 +142,14 @@ class U_COMMON_API ParsePosition : public UObject { * set. * @stable ICU 2.0 */ - void setErrorIndex(int32_t ei); + inline void setErrorIndex(int32_t ei); /** * Retrieve the index at which an error occurred, or -1 if the * error index has not been set. * @stable ICU 2.0 */ - int32_t getErrorIndex(void) const; + inline int32_t getErrorIndex(void) const; /** * ICU "poor man's RTTI", returns a UClassID for this class. diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 47abd554eaf0f1..365ae2d3d2ac75 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -107,7 +107,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * * If present, the special LanguageBreakEngine used for handling * characters that are in the dictionary set, but not handled by any - * LangugageBreakEngine. + * LanguageBreakEngine. * @internal (private) */ UnhandledEngine *fUnhandledBreakEngine; @@ -260,7 +260,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * @return TRUE if both BreakIterators are not same. * @stable ICU 2.0 */ - UBool operator!=(const BreakIterator& that) const; + inline UBool operator!=(const BreakIterator& that) const; /** * Returns a newly-constructed RuleBasedBreakIterator with the same diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 850949caaf5cda..3f7d93dc094a18 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -265,9 +265,38 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @stable ICU 57 */ UnicodeString getTextWithNoArguments() const { - return getTextWithNoArguments(compiledPattern.getBuffer(), compiledPattern.length()); + return getTextWithNoArguments( + compiledPattern.getBuffer(), + compiledPattern.length(), + nullptr, + 0); } +#ifndef U_HIDE_INTERNAL_API + /** + * Returns the pattern text with none of the arguments. + * Like formatting with all-empty string values. + * + * TODO(ICU-20406): Replace this with an Iterator interface. + * + * @param offsets offsets[i] receives the offset of where {i} was located + * before it was replaced by an empty string. + * For example, "a{0}b{1}" produces offset 1 for i=0 and 2 for i=1. + * Can be nullptr if offsetsLength==0. + * If there is no {i} in the pattern, then offsets[i] is set to -1. + * @param offsetsLength The length of the offsets array. + * + * @internal + */ + UnicodeString getTextWithNoArguments(int32_t *offsets, int32_t offsetsLength) const { + return getTextWithNoArguments( + compiledPattern.getBuffer(), + compiledPattern.length(), + offsets, + offsetsLength); + } +#endif // U_HIDE_INTERNAL_API + private: /** * Binary representation of the compiled pattern. @@ -285,7 +314,11 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { return compiledPatternLength == 0 ? 0 : compiledPattern[0]; } - static UnicodeString getTextWithNoArguments(const char16_t *compiledPattern, int32_t compiledPatternLength); + static UnicodeString getTextWithNoArguments( + const char16_t *compiledPattern, + int32_t compiledPatternLength, + int32_t *offsets, + int32_t offsetsLength); static UnicodeString &format( const char16_t *compiledPattern, int32_t compiledPatternLength, diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 9e180db53b665a..d70c964e38e5b8 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -60,7 +60,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "11.0" +#define U_UNICODE_VERSION "12.1" /** * \file @@ -1767,6 +1767,27 @@ enum UBlockCode { /** @stable ICU 62 */ UBLOCK_SOGDIAN = 291, /*[10F30]*/ + // New blocks in Unicode 12.0 + + /** @stable ICU 64 */ + UBLOCK_EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS = 292, /*[13430]*/ + /** @stable ICU 64 */ + UBLOCK_ELYMAIC = 293, /*[10FE0]*/ + /** @stable ICU 64 */ + UBLOCK_NANDINAGARI = 294, /*[119A0]*/ + /** @stable ICU 64 */ + UBLOCK_NYIAKENG_PUACHUE_HMONG = 295, /*[1E100]*/ + /** @stable ICU 64 */ + UBLOCK_OTTOMAN_SIYAQ_NUMBERS = 296, /*[1ED00]*/ + /** @stable ICU 64 */ + UBLOCK_SMALL_KANA_EXTENSION = 297, /*[1B130]*/ + /** @stable ICU 64 */ + UBLOCK_SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A = 298, /*[1FA70]*/ + /** @stable ICU 64 */ + UBLOCK_TAMIL_SUPPLEMENT = 299, /*[11FC0]*/ + /** @stable ICU 64 */ + UBLOCK_WANCHO = 300, /*[1E2C0]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1774,7 +1795,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 292, + UBLOCK_COUNT = 301, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 3a7d2db9aa07c8..9c82d828125603 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -369,6 +369,18 @@ # define UCONFIG_MSGPAT_DEFAULT_APOSTROPHE_MODE UMSGPAT_APOS_DOUBLE_OPTIONAL #endif +/** + * \def UCONFIG_USE_WINDOWS_LCID_MAPPING_API + * On platforms where U_PLATFORM_HAS_WIN32_API is true, this switch determines + * if the Windows platform APIs are used for LCID<->Locale Name conversions. + * Otherwise, only the built-in ICU tables are used. + * + * @internal ICU 64 + */ +#ifndef UCONFIG_USE_WINDOWS_LCID_MAPPING_API +# define UCONFIG_USE_WINDOWS_LCID_MAPPING_API 1 +#endif + /* i18n library switches ---------------------------------------------------- */ /** diff --git a/deps/icu-small/source/common/unicode/ucurr.h b/deps/icu-small/source/common/unicode/ucurr.h index 1021adc83e7ee2..a1c6de80b772f7 100644 --- a/deps/icu-small/source/common/unicode/ucurr.h +++ b/deps/icu-small/source/common/unicode/ucurr.h @@ -103,20 +103,17 @@ typedef enum UCurrNameStyle { * currency, such as "US Dollar" for USD. * @stable ICU 2.6 */ - UCURR_LONG_NAME + UCURR_LONG_NAME, -#ifndef U_HIDE_DRAFT_API - , /** * Selector for getName() indicating the narrow currency symbol. * The narrow currency symbol is similar to the regular currency * symbol, but it always takes the shortest form: for example, * "$" instead of "US$" for USD in en-CA. * - * @draft ICU 61 + * @stable ICU 61 */ UCURR_NARROW_SYMBOL_NAME -#endif // U_HIDE_DRAFT_API } UCurrNameStyle; #if !UCONFIG_NO_SERVICE @@ -208,6 +205,13 @@ ucurr_getPluralName(const UChar* currency, * Returns the number of the number of fraction digits that should * be displayed for the given currency. * This is equivalent to ucurr_getDefaultFractionDigitsForUsage(currency,UCURR_USAGE_STANDARD,ec); + * + * Important: The number of fraction digits for a given currency is NOT + * guaranteed to be constant across versions of ICU or CLDR. For example, + * do NOT use this value as a mechanism for deciding the magnitude used + * to store currency values in a database. You should use this value for + * display purposes only. + * * @param currency null-terminated 3-letter ISO 4217 code * @param ec input-output error code * @return a non-negative number of fraction digits to be @@ -221,6 +225,13 @@ ucurr_getDefaultFractionDigits(const UChar* currency, /** * Returns the number of the number of fraction digits that should * be displayed for the given currency with usage. + * + * Important: The number of fraction digits for a given currency is NOT + * guaranteed to be constant across versions of ICU or CLDR. For example, + * do NOT use this value as a mechanism for deciding the magnitude used + * to store currency values in a database. You should use this value for + * display purposes only. + * * @param currency null-terminated 3-letter ISO 4217 code * @param usage enum usage for the currency * @param ec input-output error code diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 2ab2695a8780d7..e5e7726d604a73 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -27,7 +27,6 @@ U_NAMESPACE_BEGIN // Forward Declarations. class BMPSet; -class CharacterProperties; class ParsePosition; class RBBIRuleScanner; class SymbolTable; @@ -276,14 +275,23 @@ class RuleCharacterIterator; * @stable ICU 2.0 */ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { +private: + /** + * Enough for sets with few ranges. + * For example, White_Space has 10 ranges, list length 21. + */ + static constexpr int32_t INITIAL_CAPACITY = 25; + // fFlags constant + static constexpr uint8_t kIsBogus = 1; // This set is bogus (i.e. not valid) + + UChar32* list = stackList; // MUST be terminated with HIGH + int32_t capacity = INITIAL_CAPACITY; // capacity of list + int32_t len = 1; // length of list used; 1 <= len <= capacity + uint8_t fFlags = 0; // Bit flag (see constants above) - int32_t len; // length of list used; 0 <= len <= capacity - int32_t capacity; // capacity of list - UChar32* list; // MUST be terminated with HIGH - BMPSet *bmpSet; // The set is frozen iff either bmpSet or stringSpan is not NULL. - UChar32* buffer; // internal buffer, may be NULL - int32_t bufferCapacity; // capacity of buffer - int32_t patLen; + BMPSet *bmpSet = nullptr; // The set is frozen iff either bmpSet or stringSpan is not NULL. + UChar32* buffer = nullptr; // internal buffer, may be NULL + int32_t bufferCapacity = 0; // capacity of buffer /** * The pattern representation of this set. This may not be the @@ -294,15 +302,19 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * indicating that toPattern() must generate a pattern * representation from the inversion list. */ - char16_t *pat; - UVector* strings; // maintained in sorted order - UnicodeSetStringSpan *stringSpan; + char16_t *pat = nullptr; + int32_t patLen = 0; + + UVector* strings = nullptr; // maintained in sorted order + UnicodeSetStringSpan *stringSpan = nullptr; + + /** + * Initial list array. + * Avoids some heap allocations, and list is never nullptr. + * Increases the object size a bit. + */ + UChar32 stackList[INITIAL_CAPACITY]; -private: - enum { // constants - kIsBogus = 1 // This set is bogus (i.e. not valid) - }; - uint8_t fFlags; // Bit flag (see constants above) public: /** * Determine if this object contains a valid set. @@ -478,7 +490,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * true if the specified set is not equal to this set. * @stable ICU 2.0 */ - UBool operator!=(const UnicodeSet& o) const; + inline UBool operator!=(const UnicodeSet& o) const; /** * Returns a copy of this object. All UnicodeFunctor objects have @@ -1480,8 +1492,6 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { friend class USetAccess; - int32_t getStringCount() const; - const UnicodeString* getString(int32_t index) const; //---------------------------------------------------------------- @@ -1528,13 +1538,18 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { // Implementation: Utility methods //---------------------------------------------------------------- - void ensureCapacity(int32_t newLen, UErrorCode& ec); + static int32_t nextCapacity(int32_t minCapacity); + + bool ensureCapacity(int32_t newLen); - void ensureBufferCapacity(int32_t newLen, UErrorCode& ec); + bool ensureBufferCapacity(int32_t newLen); void swapBuffers(void); UBool allocateStrings(UErrorCode &status); + UBool hasStrings() const; + int32_t stringsSize() const; + UBool stringsContains(const UnicodeString &s) const; UnicodeString& _toPattern(UnicodeString& result, UBool escapeUnprintable) const; @@ -1614,7 +1629,6 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { UnicodeString& rebuiltPat, UErrorCode& ec); - friend class CharacterProperties; static const UnicodeSet* getInclusions(int32_t src, UErrorCode &status); /** @@ -1646,7 +1660,10 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { /** * Set the new pattern to cache. */ - void setPattern(const UnicodeString& newPat); + void setPattern(const UnicodeString& newPat) { + setPattern(newPat.getBuffer(), newPat.length()); + } + void setPattern(const char16_t *newPat, int32_t newPatLen); /** * Release existing cached pattern. */ diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index bf954b5f1d8232..8fd144425e87c0 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -106,7 +106,7 @@ class UnicodeStringAppendable; // unicode/appendable.h * * The string parameter must be a C string literal. * The length of the string, not including the terminating - * NUL, must be specified as a constant. + * `NUL`, must be specified as a constant. * @stable ICU 2.0 */ #if !U_CHAR16_IS_TYPEDEF @@ -221,35 +221,35 @@ class UnicodeStringAppendable; // unicode/appendable.h * * The UnicodeString class is not suitable for subclassing. * - *

For an overview of Unicode strings in C and C++ see the - * User Guide Strings chapter.

+ * For an overview of Unicode strings in C and C++ see the + * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Strings-in-C-C-). * - *

In ICU, a Unicode string consists of 16-bit Unicode code units. + * In ICU, a Unicode string consists of 16-bit Unicode *code units*. * A Unicode character may be stored with either one code unit * (the most common case) or with a matched pair of special code units * ("surrogates"). The data type for code units is char16_t. - * For single-character handling, a Unicode character code point is a value - * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.

+ * For single-character handling, a Unicode character code *point* is a value + * in the range 0..0x10ffff. ICU uses the UChar32 type for code points. * - *

Indexes and offsets into and lengths of strings always count code units, not code points. + * Indexes and offsets into and lengths of strings always count code units, not code points. * This is the same as with multi-byte char* strings in traditional string handling. * Operations on partial strings typically do not test for code point boundaries. * If necessary, the user needs to take care of such boundaries by testing for the code unit * values or by using functions like * UnicodeString::getChar32Start() and UnicodeString::getChar32Limit() - * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h).

+ * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h). * * UnicodeString methods are more lenient with regard to input parameter values * than other ICU APIs. In particular: * - If indexes are out of bounds for a UnicodeString object - * (<0 or >length()) then they are "pinned" to the nearest boundary. + * (< 0 or > length()) then they are "pinned" to the nearest boundary. * - If the buffer passed to an insert/append/replace operation is owned by the * target object, e.g., calling str.append(str), an extra copy may take place * to ensure safety. * - If primitive string pointer values (e.g., const char16_t * or char *) * for input strings are NULL, then those input string parameters are treated * as if they pointed to an empty string. - * However, this is not the case for char * parameters for charset names + * However, this is *not* the case for char * parameters for charset names * or other IDs. * - Most UnicodeString methods do not take a UErrorCode parameter because * there are usually very few opportunities for failure other than a shortage @@ -273,14 +273,14 @@ class UnicodeStringAppendable; // unicode/appendable.h * This includes the const UnicodeString & parameters for * copy construction, assignment, and cloning. * - *

UnicodeString uses several storage methods. + * UnicodeString uses several storage methods. * String contents can be stored inside the UnicodeString object itself, * in an allocated and shared buffer, or in an outside buffer that is "aliased". * Most of this is done transparently, but careful aliasing in particular provides * significant performance improvements. * Also, the internal buffer is accessible via special functions. * For details see the - * User Guide Strings chapter.

+ * [User Guide Strings chapter](http://userguide.icu-project.org/strings#TOC-Maximizing-Performance-with-the-UnicodeString-Storage-Model). * * @see utf.h * @see CharacterIterator @@ -315,7 +315,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Equality operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return TRUE if text contains the same characters as this one, + * @return TRUE if `text` contains the same characters as this one, * FALSE otherwise. * @stable ICU 2.0 */ @@ -324,7 +324,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Inequality operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. - * @return FALSE if text contains the same characters as this one, + * @return FALSE if `text` contains the same characters as this one, * TRUE otherwise. * @stable ICU 2.0 */ @@ -334,7 +334,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Greater than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * greater than the characters in text, FALSE otherwise + * greater than the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator> (const UnicodeString& text) const; @@ -343,7 +343,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Less than operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * less than the characters in text, FALSE otherwise + * less than the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator< (const UnicodeString& text) const; @@ -352,7 +352,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Greater than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * greater than or equal to the characters in text, FALSE otherwise + * greater than or equal to the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator>= (const UnicodeString& text) const; @@ -361,37 +361,37 @@ class U_COMMON_API UnicodeString : public Replaceable * Less than or equal operator. Performs only bitwise comparison. * @param text The UnicodeString to compare to this one. * @return TRUE if the characters in this are bitwise - * less than or equal to the characters in text, FALSE otherwise + * less than or equal to the characters in `text`, FALSE otherwise * @stable ICU 2.0 */ inline UBool operator<= (const UnicodeString& text) const; /** * Compare the characters bitwise in this UnicodeString to - * the characters in text. + * the characters in `text`. * @param text The UnicodeString to compare to this one. * @return The result of bitwise character comparison: 0 if this - * contains the same characters as text, -1 if the characters in - * this are bitwise less than the characters in text, +1 if the + * contains the same characters as `text`, -1 if the characters in + * this are bitwise less than the characters in `text`, +1 if the * characters in this are bitwise greater than the characters - * in text. + * in `text`. * @stable ICU 2.0 */ inline int8_t compare(const UnicodeString& text) const; /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in the entire string text. + * [`start`, `start + length`) with the characters + * in the **entire string** `text`. * (The parameters "start" and "length" are not applied to the other text "text".) * @param start the offset at which the compare operation begins * @param length the number of characters of text to compare. * @param text the other text to be compared against this string. * @return The result of bitwise character comparison: 0 if this - * contains the same characters as text, -1 if the characters in - * this are bitwise less than the characters in text, +1 if the + * contains the same characters as `text`, -1 if the characters in + * this are bitwise less than the characters in `text`, +1 if the * characters in this are bitwise greater than the characters - * in text. + * in `text`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -400,19 +400,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcText in the range - * [srcStart, srcStart + srcLength). + * [`start`, `start + length`) with the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare. * @param srcText the text to be compared - * @param srcStart the offset into srcText to start comparison - * @param srcLength the number of characters in src to compare + * @param srcStart the offset into `srcText` to start comparison + * @param srcLength the number of characters in `src` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcText, -1 if the characters in - * this are bitwise less than the characters in srcText, +1 if the + * contains the same characters as `srcText`, -1 if the characters in + * this are bitwise less than the characters in `srcText`, +1 if the * characters in this are bitwise greater than the characters - * in srcText. + * in `srcText`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -423,14 +423,14 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in this UnicodeString with the first - * srcLength characters in srcChars. + * `srcLength` characters in `srcChars`. * @param srcChars The characters to compare to this UnicodeString. - * @param srcLength the number of characters in srcChars to compare + * @param srcLength the number of characters in `srcChars` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(ConstChar16Ptr srcChars, @@ -438,16 +438,16 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the first - * length characters in srcChars + * [`start`, `start + length`) with the first + * `length` characters in `srcChars` * @param start the offset at which the compare operation begins * @param length the number of characters to compare. * @param srcChars the characters to be compared * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -456,19 +456,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, start + length) with the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength). + * [`start`, `start + length`) with the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`). * @param start the offset at which the compare operation begins * @param length the number of characters in this to compare * @param srcChars the characters to be compared - * @param srcStart the offset into srcChars to start comparison - * @param srcLength the number of characters in srcChars to compare + * @param srcStart the offset into `srcChars` to start comparison + * @param srcLength the number of characters in `srcChars` to compare * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcChars, -1 if the characters in - * this are bitwise less than the characters in srcChars, +1 if the + * contains the same characters as `srcChars`, -1 if the characters in + * this are bitwise less than the characters in `srcChars`, +1 if the * characters in this are bitwise greater than the characters - * in srcChars. + * in `srcChars`. * @stable ICU 2.0 */ inline int8_t compare(int32_t start, @@ -479,19 +479,19 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Compare the characters bitwise in the range - * [start, limit) with the characters - * in srcText in the range - * [srcStart, srcLimit). + * [`start`, `limit`) with the characters + * in `srcText` in the range + * [`srcStart`, `srcLimit`). * @param start the offset at which the compare operation begins * @param limit the offset immediately following the compare operation * @param srcText the text to be compared - * @param srcStart the offset into srcText to start comparison - * @param srcLimit the offset into srcText to limit comparison + * @param srcStart the offset into `srcText` to start comparison + * @param srcLimit the offset into `srcText` to limit comparison * @return The result of bitwise character comparison: 0 if this - * contains the same characters as srcText, -1 if the characters in - * this are bitwise less than the characters in srcText, +1 if the + * contains the same characters as `srcText`, -1 if the characters in + * this are bitwise less than the characters in `srcText`, +1 if the * characters in this are bitwise greater than the characters - * in srcText. + * in `srcText`. * @stable ICU 2.0 */ inline int8_t compareBetween(int32_t start, @@ -848,21 +848,21 @@ class U_COMMON_API UnicodeString : public Replaceable uint32_t options) const; /** - * Determine if this starts with the characters in text + * Determine if this starts with the characters in `text` * @param text The text to match. - * @return TRUE if this starts with the characters in text, + * @return TRUE if this starts with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ inline UBool startsWith(const UnicodeString& text) const; /** - * Determine if this starts with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this starts with the characters in `srcText` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcText The text to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcText to match - * @return TRUE if this starts with the characters in text, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcText` to match + * @return TRUE if this starts with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ @@ -871,10 +871,10 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this starts with the characters in srcChars + * Determine if this starts with the characters in `srcChars` * @param srcChars The characters to match. - * @param srcLength the number of characters in srcChars - * @return TRUE if this starts with the characters in srcChars, + * @param srcLength the number of characters in `srcChars` + * @return TRUE if this starts with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -882,12 +882,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcChars` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcChars The characters to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcChars to match - * @return TRUE if this ends with the characters in srcChars, FALSE otherwise + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcChars` to match + * @return TRUE if this ends with the characters in `srcChars`, FALSE otherwise * @stable ICU 2.0 */ inline UBool startsWith(const char16_t *srcChars, @@ -895,21 +895,21 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in text + * Determine if this ends with the characters in `text` * @param text The text to match. - * @return TRUE if this ends with the characters in text, + * @return TRUE if this ends with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ inline UBool endsWith(const UnicodeString& text) const; /** - * Determine if this ends with the characters in srcText - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcText` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcText The text to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcText to match - * @return TRUE if this ends with the characters in text, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcText` to match + * @return TRUE if this ends with the characters in `text`, * FALSE otherwise * @stable ICU 2.0 */ @@ -918,10 +918,10 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars + * Determine if this ends with the characters in `srcChars` * @param srcChars The characters to match. - * @param srcLength the number of characters in srcChars - * @return TRUE if this ends with the characters in srcChars, + * @param srcLength the number of characters in `srcChars` + * @return TRUE if this ends with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -929,12 +929,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength) const; /** - * Determine if this ends with the characters in srcChars - * in the range [srcStart, srcStart + srcLength). + * Determine if this ends with the characters in `srcChars` + * in the range [`srcStart`, `srcStart + srcLength`). * @param srcChars The characters to match. - * @param srcStart the offset into srcText to start matching - * @param srcLength the number of characters in srcChars to match - * @return TRUE if this ends with the characters in srcChars, + * @param srcStart the offset into `srcText` to start matching + * @param srcLength the number of characters in `srcChars` to match + * @return TRUE if this ends with the characters in `srcChars`, * FALSE otherwise * @stable ICU 2.0 */ @@ -946,21 +946,21 @@ class U_COMMON_API UnicodeString : public Replaceable /* Searching - bitwise only */ /** - * Locate in this the first occurrence of the characters in text, + * Locate in this the first occurrence of the characters in `text`, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(const UnicodeString& text) const; /** - * Locate in this the first occurrence of the characters in text - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the characters in `text` + * starting at offset `start`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -969,12 +969,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in text, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `text`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -984,17 +984,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcText The text to search for. - * @param srcStart the offset into srcText at which + * @param srcStart the offset into `srcText` at which * to start matching - * @param srcLength the number of characters in srcText to match + * @param srcLength the number of characters in `srcText` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1006,12 +1006,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence of the characters in - * srcChars - * starting at offset start, using bitwise comparison. + * `srcChars` + * starting at offset `start`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1021,13 +1021,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcChars, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `srcChars`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of `srcChars`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1038,17 +1038,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the first occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcChars The text to search for. - * @param srcStart the offset into srcChars at which + * @param srcStart the offset into `srcChars` at which * to start matching - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1059,55 +1059,55 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the first occurrence of the BMP code point c, + * Locate in this the first occurrence of the BMP code point `c`, * using bitwise comparison. * @param c The code unit to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c) const; /** - * Locate in this the first occurrence of the code point c, + * Locate in this the first occurrence of the code point `c`, * using bitwise comparison. * * @param c The code point to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c) const; /** - * Locate in this the first occurrence of the BMP code point c, - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the BMP code point `c`, + * starting at offset `start`, using bitwise comparison. * @param c The code unit to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c, int32_t start) const; /** - * Locate in this the first occurrence of the code point c - * starting at offset start, using bitwise comparison. + * Locate in this the first occurrence of the code point `c` + * starting at offset `start`, using bitwise comparison. * * @param c The code point to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c, int32_t start) const; /** - * Locate in this the first occurrence of the BMP code point c - * in the range [start, start + length), + * Locate in this the first occurrence of the BMP code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(char16_t c, @@ -1115,14 +1115,14 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the first occurrence of the code point c - * in the range [start, start + length), + * Locate in this the first occurrence of the code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t indexOf(UChar32 c, @@ -1130,21 +1130,21 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the characters in text, + * Locate in this the last occurrence of the characters in `text`, * using bitwise comparison. * @param text The text to search for. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(const UnicodeString& text) const; /** - * Locate in this the last occurrence of the characters in text - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the characters in `text` + * starting at offset `start`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1153,12 +1153,12 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in text, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `text`, using bitwise comparison. * @param text The text to search for. * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1168,17 +1168,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcText in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcText The text to search for. - * @param srcStart the offset into srcText at which + * @param srcStart the offset into `srcText` at which * to start matching - * @param srcLength the number of characters in srcText to match + * @param srcLength the number of characters in `srcText` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1189,12 +1189,12 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the characters in srcChars - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the characters in `srcChars` + * starting at offset `start`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1204,13 +1204,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcChars, using bitwise comparison. + * [`start`, `start + length`) of the characters + * in `srcChars`, using bitwise comparison. * @param srcChars The text to search for. - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * @param start The offset at which searching will start. * @param length The number of characters to search - * @return The offset into this of the start of srcChars, + * @return The offset into this of the start of `srcChars`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1221,17 +1221,17 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Locate in this the last occurrence in the range - * [start, start + length) of the characters - * in srcChars in the range - * [srcStart, srcStart + srcLength), + * [`start`, `start + length`) of the characters + * in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`), * using bitwise comparison. * @param srcChars The text to search for. - * @param srcStart the offset into srcChars at which + * @param srcStart the offset into `srcChars` at which * to start matching - * @param srcLength the number of characters in srcChars to match + * @param srcLength the number of characters in `srcChars` to match * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of the start of text, + * @return The offset into this of the start of `text`, * or -1 if not found. * @stable ICU 2.0 */ @@ -1242,55 +1242,55 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the BMP code point c, + * Locate in this the last occurrence of the BMP code point `c`, * using bitwise comparison. * @param c The code unit to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c) const; /** - * Locate in this the last occurrence of the code point c, + * Locate in this the last occurrence of the code point `c`, * using bitwise comparison. * * @param c The code point to search for. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c) const; /** - * Locate in this the last occurrence of the BMP code point c - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the BMP code point `c` + * starting at offset `start`, using bitwise comparison. * @param c The code unit to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c, int32_t start) const; /** - * Locate in this the last occurrence of the code point c - * starting at offset start, using bitwise comparison. + * Locate in this the last occurrence of the code point `c` + * starting at offset `start`, using bitwise comparison. * * @param c The code point to search for. * @param start The offset at which searching will start. - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c, int32_t start) const; /** - * Locate in this the last occurrence of the BMP code point c - * in the range [start, start + length), + * Locate in this the last occurrence of the BMP code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * @param c The code unit to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(char16_t c, @@ -1298,14 +1298,14 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t length) const; /** - * Locate in this the last occurrence of the code point c - * in the range [start, start + length), + * Locate in this the last occurrence of the code point `c` + * in the range [`start`, `start + length`), * using bitwise comparison. * * @param c The code point to search for. * @param start the offset into this at which to start matching * @param length the number of characters in this to search - * @return The offset into this of c, or -1 if not found. + * @return The offset into this of `c`, or -1 if not found. * @stable ICU 2.0 */ inline int32_t lastIndexOf(UChar32 c, @@ -1316,32 +1316,32 @@ class U_COMMON_API UnicodeString : public Replaceable /* Character access */ /** - * Return the code unit at offset offset. + * Return the code unit at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text - * @return the code unit at offset offset + * @return the code unit at offset `offset` * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ inline char16_t charAt(int32_t offset) const; /** - * Return the code unit at offset offset. + * Return the code unit at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text - * @return the code unit at offset offset + * @return the code unit at offset `offset` * @stable ICU 2.0 */ inline char16_t operator[] (int32_t offset) const; /** * Return the code point that contains the code unit - * at offset offset. + * at offset `offset`. * If the offset is not valid (0..length()-1) then U+ffff is returned. * @param offset a valid offset into the text * that indicates the text offset of any of the code units * that will be assembled into a code point (21-bit value) and returned - * @return the code point of text at offset + * @return the code point of text at `offset` * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ @@ -1398,33 +1398,33 @@ class U_COMMON_API UnicodeString : public Replaceable * This behaves like CharacterIterator::move32(delta, kCurrent). * * Behavior for out-of-bounds indexes: - * moveIndex32 pins the input index to 0..length(), i.e., + * `moveIndex32` pins the input index to 0..length(), i.e., * if the input index<0 then it is pinned to 0; * if it is index>length() then it is pinned to length(). - * Afterwards, the index is moved by delta code points + * Afterwards, the index is moved by `delta` code points * forward or backward, * but no further backward than to 0 and no further forward than to length(). * The resulting index return value will be in between 0 and length(), inclusively. * * Examples: - *
-   * // s has code points 'a' U+10000 'b' U+10ffff U+2029
-   * UnicodeString s=UNICODE_STRING("a\\U00010000b\\U0010ffff\\u2029", 31).unescape();
+   * \code
+   *     // s has code points 'a' U+10000 'b' U+10ffff U+2029
+   *     UnicodeString s(u"a\U00010000b\U0010ffff\u2029");
    *
-   * // initial index: position of U+10000
-   * int32_t index=1;
+   *     // initial index: position of U+10000
+   *     int32_t index=1;
    *
-   * // the following examples will all result in index==4, position of U+10ffff
+   *     // the following examples will all result in index==4, position of U+10ffff
    *
-   * // skip 2 code points from some position in the string
-   * index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
+   *     // skip 2 code points from some position in the string
+   *     index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
    *
-   * // go to the 3rd code point from the start of s (0-based)
-   * index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
+   *     // go to the 3rd code point from the start of s (0-based)
+   *     index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
    *
-   * // go to the next-to-last code point of s
-   * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff
-   * 
+ * // go to the next-to-last code point of s + * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff + * \endcode * * @param index input code unit index * @param delta (signed) code point count to move the index forward or backward @@ -1438,16 +1438,16 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into the array dst, - * beginning at dstStart. - * If the string aliases to dst itself as an external buffer, + * [`start`, `start + length`) into the array `dst`, + * beginning at `dstStart`. + * If the string aliases to `dst` itself as an external buffer, * then extract() will not copy the contents. * * @param start offset of first character which will be copied into the array * @param length the number of characters to extract - * @param dst array in which to copy characters. The length of dst - * must be at least (dstStart + length). - * @param dstStart the offset in dst where the first character + * @param dst array in which to copy characters. The length of `dst` + * must be at least (`dstStart + length`). + * @param dstStart the offset in `dst` where the first character * will be extracted * @stable ICU 2.0 */ @@ -1468,7 +1468,7 @@ class U_COMMON_API UnicodeString : public Replaceable * If the string itself does not fit into dest * (length()>destCapacity) then the error code is set to U_BUFFER_OVERFLOW_ERROR. * - * If the string aliases to dest itself as an external buffer, + * If the string aliases to `dest` itself as an external buffer, * then extract() will not copy the contents. * * @param dest Destination string buffer. @@ -1483,12 +1483,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into the UnicodeString - * target. + * [`start`, `start + length`) into the UnicodeString + * `target`. * @param start offset of first character which will be copied * @param length the number of characters to extract * @param target UnicodeString into which to copy characters. - * @return A reference to target * @stable ICU 2.0 */ inline void extract(int32_t start, @@ -1496,13 +1495,13 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& target) const; /** - * Copy the characters in the range [start, limit) - * into the array dst, beginning at dstStart. + * Copy the characters in the range [`start`, `limit`) + * into the array `dst`, beginning at `dstStart`. * @param start offset of first character which will be copied into the array * @param limit offset immediately following the last character to be copied - * @param dst array in which to copy characters. The length of dst - * must be at least (dstStart + (limit - start)). - * @param dstStart the offset in dst where the first character + * @param dst array in which to copy characters. The length of `dst` + * must be at least (`dstStart + (limit - start)`). + * @param dstStart the offset in `dst` where the first character * will be extracted * @stable ICU 2.0 */ @@ -1512,12 +1511,11 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t dstStart = 0) const; /** - * Copy the characters in the range [start, limit) - * into the UnicodeString target. Replaceable API. + * Copy the characters in the range [`start`, `limit`) + * into the UnicodeString `target`. Replaceable API. * @param start offset of first character which will be copied * @param limit offset immediately following the last character to be copied * @param target UnicodeString into which to copy characters. - * @return A reference to target * @stable ICU 2.0 */ virtual void extractBetween(int32_t start, @@ -1526,11 +1524,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + startLength) into an array of characters. + * [`start`, `start + startLength`) into an array of characters. * All characters must be invariant (see utypes.h). * Use US_INV as the last, signature-distinguishing parameter. * - * This function does not write any more than targetCapacity + * This function does not write any more than `targetCapacity` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1555,9 +1553,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in the platform's default codepage. - * This function does not write any more than targetLength + * This function does not write any more than `targetLength` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1567,8 +1565,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @param startLength the number of characters to extract * @param target the target buffer for extraction * @param targetLength the length of the target buffer - * If target is NULL, then the number of bytes required for - * target is returned. + * If `target` is NULL, then the number of bytes required for + * `target` is returned. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 */ @@ -1583,7 +1581,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in a specified codepage. * The output string is NUL-terminated. * @@ -1597,11 +1595,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @param target the target buffer for extraction * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. - * If target is NULL, then the number of bytes required for - * target is returned. It is assumed that the target is big enough + * If `target` is NULL, then the number of bytes required for + * `target` is returned. It is assumed that the target is big enough * to fit all of the characters. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 @@ -1613,9 +1611,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Copy the characters in the range - * [start, start + length) into an array of characters + * [`start`, `start + length`) into an array of characters * in a specified codepage. - * This function does not write any more than targetLength + * This function does not write any more than `targetLength` * characters but returns the length of the entire output string * so that one can allocate a larger buffer and call the function again * if necessary. @@ -1632,11 +1630,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @param targetLength the length of the target buffer * @param codepage the desired codepage for the characters. 0 has * the special meaning of the default codepage - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. - * If target is NULL, then the number of bytes required for - * target is returned. + * If `target` is NULL, then the number of bytes required for + * `target` is returned. * @return the output string length, not including the terminating NUL * @stable ICU 2.0 */ @@ -1849,7 +1847,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Assignment operator. Replace the characters in this UnicodeString - * with the characters from srcText. + * with the characters from `srcText`. * * Starting with ICU 2.4, the assignment operator and the copy constructor * allocate a new buffer and copy the buffer contents even for readonly aliases. @@ -1870,7 +1868,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Almost the same as the assignment operator. * Replace the characters in this UnicodeString - * with the characters from srcText. + * with the characters from `srcText`. * * This function works the same as the assignment operator * for all strings except for ones that are readonly aliases. @@ -1902,22 +1900,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return *this * @stable ICU 56 */ - UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { - return moveFrom(src); - } - - // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API - /** - * Move assignment; might leave src in bogus state. - * This string will have the same contents and state that the source string had. - * The behavior is undefined if *this and src are the same object. - * - * Can be called explicitly, does not need C++11 support. - * @param src source string - * @return *this - * @draft ICU 56 - */ - UnicodeString &moveFrom(UnicodeString &src) U_NOEXCEPT; + UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT; /** * Swap strings. @@ -1932,14 +1915,14 @@ class U_COMMON_API UnicodeString : public Replaceable * @param s2 will get s1's contents and state * @stable ICU 56 */ - friend U_COMMON_API inline void U_EXPORT2 + friend inline void U_EXPORT2 swap(UnicodeString &s1, UnicodeString &s2) U_NOEXCEPT { s1.swap(s2); } /** * Assignment operator. Replace the characters in this UnicodeString - * with the code unit ch. + * with the code unit `ch`. * @param ch the code unit to replace * @return a reference to this * @stable ICU 2.0 @@ -1948,7 +1931,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Assignment operator. Replace the characters in this UnicodeString - * with the code point ch. + * with the code point `ch`. * @param ch the code point to replace * @return a reference to this * @stable ICU 2.0 @@ -1957,11 +1940,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters - * in srcText in the range - * [srcStart, srcText.length()). - * srcText is not modified. + * in `srcText` in the range + * [`srcStart`, `srcText.length()`). + * `srcText` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained * @return a reference to this * @stable ICU 2.2 @@ -1971,13 +1954,13 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters - * in srcText in the range - * [srcStart, srcStart + srcLength). - * srcText is not modified. + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). + * `srcText` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in the + * @param srcLength the number of characters in `srcText` in the * replace string. * @return a reference to this * @stable ICU 2.0 @@ -1988,8 +1971,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the text in the UnicodeString object to the characters in - * srcText. - * srcText is not modified. + * `srcText`. + * `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -1998,7 +1981,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the characters in the UnicodeString object to the characters - * in srcChars. srcChars is not modified. + * in `srcChars`. `srcChars` is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars. * @return a reference to this @@ -2009,23 +1992,23 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Set the characters in the UnicodeString object to the code unit - * srcChar. + * `srcChar`. * @param srcChar the code unit which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(char16_t srcChar); + inline UnicodeString& setTo(char16_t srcChar); /** * Set the characters in the UnicodeString object to the code point - * srcChar. + * `srcChar`. * @param srcChar the code point which becomes the UnicodeString's character * content * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(UChar32 srcChar); + inline UnicodeString& setTo(UChar32 srcChar); /** * Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor. @@ -2041,12 +2024,12 @@ class U_COMMON_API UnicodeString : public Replaceable * When using fastCopyFrom(), the text will be aliased again, * so that both strings then alias the same readonly-text. * - * @param isTerminated specifies if text is NUL-terminated. - * This must be true if textLength==-1. + * @param isTerminated specifies if `text` is `NUL`-terminated. + * This must be true if `textLength==-1`. * @param text The characters to alias for the UnicodeString. - * @param textLength The number of Unicode characters in text to alias. + * @param textLength The number of Unicode characters in `text` to alias. * If -1, then this constructor will determine the length - * by calling u_strlen(). + * by calling `u_strlen()`. * @return a reference to this * @stable ICU 2.0 */ @@ -2068,8 +2051,8 @@ class U_COMMON_API UnicodeString : public Replaceable * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. - * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in char16_ts. + * @param buffLength The number of Unicode characters in `buffer` to alias. + * @param buffCapacity The size of `buffer` in char16_ts. * @return a reference to this * @stable ICU 2.0 */ @@ -2133,7 +2116,7 @@ class U_COMMON_API UnicodeString : public Replaceable /* Append operations */ /** - * Append operator. Append the code unit ch to the UnicodeString + * Append operator. Append the code unit `ch` to the UnicodeString * object. * @param ch the code unit to be appended * @return a reference to this @@ -2142,7 +2125,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& operator+= (char16_t ch); /** - * Append operator. Append the code point ch to the UnicodeString + * Append operator. Append the code point `ch` to the UnicodeString * object. * @param ch the code point to be appended * @return a reference to this @@ -2151,8 +2134,8 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& operator+= (UChar32 ch); /** - * Append operator. Append the characters in srcText to the - * UnicodeString object. srcText is not modified. + * Append operator. Append the characters in `srcText` to the + * UnicodeString object. `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -2161,14 +2144,14 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Append the characters - * in srcText in the range - * [srcStart, srcStart + srcLength) to the - * UnicodeString object at offset start. srcText + * in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`) to the + * UnicodeString object at offset `start`. `srcText` * is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the append string * @return a reference to this * @stable ICU 2.0 @@ -2178,8 +2161,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the characters in srcText to the UnicodeString object. - * srcText is not modified. + * Append the characters in `srcText` to the UnicodeString object. + * `srcText` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 @@ -2187,15 +2170,15 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& append(const UnicodeString& srcText); /** - * Append the characters in srcChars in the range - * [srcStart, srcStart + srcLength) to the UnicodeString + * Append the characters in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`) to the UnicodeString * object at offset - * start. srcChars is not modified. + * `start`. `srcChars` is not modified. * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars in - * the append string; can be -1 if srcChars is NUL-terminated + * @param srcLength the number of characters in `srcChars` in + * the append string; can be -1 if `srcChars` is NUL-terminated * @return a reference to this * @stable ICU 2.0 */ @@ -2204,11 +2187,11 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the characters in srcChars to the UnicodeString object - * at offset start. srcChars is not modified. + * Append the characters in `srcChars` to the UnicodeString object + * at offset `start`. `srcChars` is not modified. * @param srcChars the source for the new characters - * @param srcLength the number of Unicode characters in srcChars; - * can be -1 if srcChars is NUL-terminated + * @param srcLength the number of Unicode characters in `srcChars`; + * can be -1 if `srcChars` is NUL-terminated * @return a reference to this * @stable ICU 2.0 */ @@ -2216,7 +2199,7 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Append the code unit srcChar to the UnicodeString object. + * Append the code unit `srcChar` to the UnicodeString object. * @param srcChar the code unit to append * @return a reference to this * @stable ICU 2.0 @@ -2224,7 +2207,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& append(char16_t srcChar); /** - * Append the code point srcChar to the UnicodeString object. + * Append the code point `srcChar` to the UnicodeString object. * @param srcChar the code point to append * @return a reference to this * @stable ICU 2.0 @@ -2235,14 +2218,14 @@ class U_COMMON_API UnicodeString : public Replaceable /* Insert operations */ /** - * Insert the characters in srcText in the range - * [srcStart, srcStart + srcLength) into the UnicodeString - * object at offset start. srcText is not modified. + * Insert the characters in `srcText` in the range + * [`srcStart`, `srcStart + srcLength`) into the UnicodeString + * object at offset `start`. `srcText` is not modified. * @param start the offset where the insertion begins * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the insert string * @return a reference to this * @stable ICU 2.0 @@ -2253,8 +2236,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the characters in srcText into the UnicodeString object - * at offset start. srcText is not modified. + * Insert the characters in `srcText` into the UnicodeString object + * at offset `start`. `srcText` is not modified. * @param start the offset where the insertion begins * @param srcText the source for the new characters * @return a reference to this @@ -2264,14 +2247,14 @@ class U_COMMON_API UnicodeString : public Replaceable const UnicodeString& srcText); /** - * Insert the characters in srcChars in the range - * [srcStart, srcStart + srcLength) into the UnicodeString - * object at offset start. srcChars is not modified. + * Insert the characters in `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`) into the UnicodeString + * object at offset `start`. `srcChars` is not modified. * @param start the offset at which the insertion begins * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * in the insert string * @return a reference to this * @stable ICU 2.0 @@ -2282,8 +2265,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the characters in srcChars into the UnicodeString object - * at offset start. srcChars is not modified. + * Insert the characters in `srcChars` into the UnicodeString object + * at offset `start`. `srcChars` is not modified. * @param start the offset where the insertion begins * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars. @@ -2295,8 +2278,8 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t srcLength); /** - * Insert the code unit srcChar into the UnicodeString object at - * offset start. + * Insert the code unit `srcChar` into the UnicodeString object at + * offset `start`. * @param start the offset at which the insertion occurs * @param srcChar the code unit to insert * @return a reference to this @@ -2306,8 +2289,8 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t srcChar); /** - * Insert the code point srcChar into the UnicodeString object at - * offset start. + * Insert the code point `srcChar` into the UnicodeString object at + * offset `start`. * @param start the offset at which the insertion occurs * @param srcChar the code point to insert * @return a reference to this @@ -2321,22 +2304,22 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcText in the range - * [srcStart, srcStart + srcLength). - * srcText is not modified. + * [`start`, `start + length`) with the characters in + * `srcText` in the range + * [`srcStart`, `srcStart + srcLength`). + * `srcText` is not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcText the source for the new characters - * @param srcStart the offset into srcText where new characters + * @param srcStart the offset into `srcText` where new characters * will be obtained - * @param srcLength the number of characters in srcText in + * @param srcLength the number of characters in `srcText` in * the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const UnicodeString& srcText, int32_t srcStart, @@ -2344,38 +2327,38 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) - * with the characters in srcText. srcText is + * [`start`, `start + length`) + * with the characters in `srcText`. `srcText` is * not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcText the source for the new characters * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const UnicodeString& srcText); /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcChars in the range - * [srcStart, srcStart + srcLength). srcChars + * [`start`, `start + length`) with the characters in + * `srcChars` in the range + * [`srcStart`, `srcStart + srcLength`). `srcChars` * is not modified. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChars the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained - * @param srcLength the number of characters in srcChars + * @param srcLength the number of characters in `srcChars` * in the replace string * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, + inline UnicodeString& replace(int32_t start, int32_t length, const char16_t *srcChars, int32_t srcStart, @@ -2383,11 +2366,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the characters in - * srcChars. srcChars is not modified. + * [`start`, `start + length`) with the characters in + * `srcChars`. `srcChars` is not modified. * @param start the offset at which the replace operation begins * @param length number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChars the source for the new characters * @param srcLength the number of Unicode characters in srcChars * @return a reference to this @@ -2400,11 +2383,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the code unit - * srcChar. + * [`start`, `start + length`) with the code unit + * `srcChar`. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChar the new code unit * @return a reference to this * @stable ICU 2.0 @@ -2415,11 +2398,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace the characters in the range - * [start, start + length) with the code point - * srcChar. + * [`start`, `start + length`) with the code point + * `srcChar`. * @param start the offset at which the replace operation begins * @param length the number of characters to replace. The character at - * start + length is not modified. + * `start + length` is not modified. * @param srcChar the new code point * @return a reference to this * @stable ICU 2.0 @@ -2427,8 +2410,8 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar); /** - * Replace the characters in the range [start, limit) - * with the characters in srcText. srcText is not modified. + * Replace the characters in the range [`start`, `limit`) + * with the characters in `srcText`. `srcText` is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range * @param srcText the source for the new characters @@ -2440,16 +2423,16 @@ class U_COMMON_API UnicodeString : public Replaceable const UnicodeString& srcText); /** - * Replace the characters in the range [start, limit) - * with the characters in srcText in the range - * [srcStart, srcLimit). srcText is not modified. + * Replace the characters in the range [`start`, `limit`) + * with the characters in `srcText` in the range + * [`srcStart`, `srcLimit`). `srcText` is not modified. * @param start the offset at which the replace operation begins * @param limit the offset immediately following the replace range * @param srcText the source for the new characters - * @param srcStart the offset into srcChars where new characters + * @param srcStart the offset into `srcChars` where new characters * will be obtained * @param srcLimit the offset immediately following the range to copy - * in srcText + * in `srcText` * @return a reference to this * @stable ICU 2.0 */ @@ -2461,12 +2444,9 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace a substring of this object with the given text. - * @param start the beginning index, inclusive; 0 <= start - * <= limit. - * @param limit the ending index, exclusive; start <= limit - * <= length(). - * @param text the text to replace characters start - * to limit - 1 + * @param start the beginning index, inclusive; `0 <= start <= limit`. + * @param limit the ending index, exclusive; `start <= limit <= length()`. + * @param text the text to replace characters `start` to `limit - 1` * @stable ICU 2.0 */ virtual void handleReplaceBetween(int32_t start, @@ -2485,14 +2465,12 @@ class U_COMMON_API UnicodeString : public Replaceable * information. This method is used to duplicate or reorder substrings. * The destination index must not overlap the source range. * - * @param start the beginning index, inclusive; 0 <= start <= - * limit. - * @param limit the ending index, exclusive; start <= limit <= - * length(). + * @param start the beginning index, inclusive; `0 <= start <= limit`. + * @param limit the ending index, exclusive; `start <= limit <= length()`. * @param dest the destination index. The characters from - * start..limit-1 will be copied to dest. - * Implementations of this method may assume that dest <= start || - * dest >= limit. + * `start..limit-1` will be copied to `dest`. + * Implementations of this method may assume that `dest <= start || + * dest >= limit`. * @stable ICU 2.0 */ virtual void copy(int32_t start, int32_t limit, int32_t dest); @@ -2513,7 +2491,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace all occurrences of characters in oldText with characters * in newText - * in the range [start, start + length). + * in the range [`start`, `start + length`). * @param start the start of the range in which replace will performed * @param length the length of the range in which replace will be performed * @param oldText the text containing the search text @@ -2528,18 +2506,18 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Replace all occurrences of characters in oldText in the range - * [oldStart, oldStart + oldLength) with the characters + * [`oldStart`, `oldStart + oldLength`) with the characters * in newText in the range - * [newStart, newStart + newLength) - * in the range [start, start + length). + * [`newStart`, `newStart + newLength`) + * in the range [`start`, `start + length`). * @param start the start of the range in which replace will performed * @param length the length of the range in which replace will be performed * @param oldText the text containing the search text - * @param oldStart the start of the search range in oldText - * @param oldLength the length of the search range in oldText + * @param oldStart the start of the search range in `oldText` + * @param oldLength the length of the search range in `oldText` * @param newText the text containing the replacement text - * @param newStart the start of the replacement range in newText - * @param newLength the length of the replacement range in newText + * @param newStart the start of the replacement range in `newText` + * @param newLength the length of the replacement range in `newText` * @return a reference to this * @stable ICU 2.0 */ @@ -2564,7 +2542,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Remove the characters in the range - * [start, start + length) from the UnicodeString object. + * [`start`, `start + length`) from the UnicodeString object. * @param start the offset of the first character to remove * @param length the number of characters to remove * @return a reference to this @@ -2575,7 +2553,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Remove the characters in the range - * [start, limit) from the UnicodeString object. + * [`start`, `limit`) from the UnicodeString object. * @param start the offset of the first character to remove * @param limit the offset immediately following the range to remove * @return a reference to this @@ -2586,8 +2564,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Retain only the characters in the range - * [start, limit) from the UnicodeString object. - * Removes characters before start and at and after limit. + * [`start`, `limit`) from the UnicodeString object. + * Removes characters before `start` and at and after `limit`. * @param start the offset of the first character to retain * @param limit the offset immediately following the range to retain * @return a reference to this @@ -2598,7 +2576,7 @@ class U_COMMON_API UnicodeString : public Replaceable /* Length operations */ /** - * Pad the start of this UnicodeString with the character padChar. + * Pad the start of this UnicodeString with the character `padChar`. * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * beginning of this UnicodeString. @@ -2612,7 +2590,7 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t padChar = 0x0020); /** - * Pad the end of this UnicodeString with the character padChar. + * Pad the end of this UnicodeString with the character `padChar`. * If the length of this UnicodeString is less than targetLength, * length() - targetLength copies of padChar will be added to the * end of this UnicodeString. @@ -2626,7 +2604,7 @@ class U_COMMON_API UnicodeString : public Replaceable char16_t padChar = 0x0020); /** - * Truncate this UnicodeString to the targetLength. + * Truncate this UnicodeString to the `targetLength`. * @param targetLength the desired length of this UnicodeString. * @return TRUE if the text was truncated, FALSE otherwise * @stable ICU 2.0 @@ -2651,7 +2629,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString& reverse(void); /** - * Reverse the range [start, start + length) in + * Reverse the range [`start`, `start + length`) in * this UnicodeString. * @param start the start of the range to reverse * @param length the number of characters to to reverse @@ -2836,7 +2814,7 @@ class U_COMMON_API UnicodeString : public Replaceable * If the length() was greater than minCapacity, then any contents after minCapacity * may be lost. * The buffer contents is not NUL-terminated by getBuffer(). - * If length()(s.length(). + * `(s.length() < s.getCapacity() && buffer[s.length()]==0)`. * (See getTerminatedBuffer().) * * The buffer may reside in read-only memory. Its contents must not @@ -2952,7 +2930,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString(); /** - * Construct a UnicodeString with capacity to hold capacity char16_ts + * Construct a UnicodeString with capacity to hold `capacity` char16_ts * @param capacity the number of char16_ts this UnicodeString should hold * before a resize is necessary; if count is greater than 0 and count * code points c take up more space than capacity, then capacity is adjusted @@ -2968,7 +2946,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Single char16_t (code unit) constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_CHAR_EXPLICIT=explicit + * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit` * on the compiler command line or similar. * @param ch the character to place in the UnicodeString * @stable ICU 2.0 @@ -2979,7 +2957,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Single UChar32 (code point) constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_CHAR_EXPLICIT=explicit + * `-DUNISTR_FROM_CHAR_EXPLICIT=explicit` * on the compiler command line or similar. * @param ch the character to place in the UnicodeString * @stable ICU 2.0 @@ -2990,9 +2968,9 @@ class U_COMMON_API UnicodeString : public Replaceable * char16_t* constructor. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. - * @param text The characters to place in the UnicodeString. text + * @param text The characters to place in the UnicodeString. `text` * must be NULL (U+0000) terminated. * @stable ICU 2.0 */ @@ -3004,7 +2982,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Delegates to UnicodeString(const char16_t *). * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text NUL-terminated UTF-16 string * @stable ICU 59 @@ -3020,7 +2998,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Delegates to UnicodeString(const char16_t *). * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text NUL-terminated UTF-16 string * @stable ICU 59 @@ -3034,7 +3012,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Effectively the same as the default constructor, makes an empty string object. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param text nullptr * @stable ICU 59 @@ -3044,7 +3022,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char16_t* constructor. * @param text The characters to place in the UnicodeString. - * @param textLength The number of Unicode characters in text + * @param textLength The number of Unicode characters in `text` * to copy. * @stable ICU 2.0 */ @@ -3099,12 +3077,12 @@ class U_COMMON_API UnicodeString : public Replaceable * When using fastCopyFrom(), the text will be aliased again, * so that both strings then alias the same readonly-text. * - * @param isTerminated specifies if text is NUL-terminated. - * This must be true if textLength==-1. + * @param isTerminated specifies if `text` is `NUL`-terminated. + * This must be true if `textLength==-1`. * @param text The characters to alias for the UnicodeString. - * @param textLength The number of Unicode characters in text to alias. + * @param textLength The number of Unicode characters in `text` to alias. * If -1, then this constructor will determine the length - * by calling u_strlen(). + * by calling `u_strlen()`. * @stable ICU 2.0 */ UnicodeString(UBool isTerminated, @@ -3125,8 +3103,8 @@ class U_COMMON_API UnicodeString : public Replaceable * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. - * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in char16_ts. + * @param buffLength The number of Unicode characters in `buffer` to alias. + * @param buffCapacity The size of `buffer` in char16_ts. * @stable ICU 2.0 */ UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); @@ -3181,7 +3159,7 @@ class U_COMMON_API UnicodeString : public Replaceable * UNICODE_STRING_SIMPLE. * * It is recommended to mark this constructor "explicit" by - * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * `-DUNISTR_FROM_STRING_EXPLICIT=explicit` * on the compiler command line or similar. * @param codepageData an array of bytes, null-terminated, * in the platform's default codepage. @@ -3196,7 +3174,7 @@ class U_COMMON_API UnicodeString : public Replaceable * Uses the default converter (and thus depends on the ICU conversion code) * unless U_CHARSET_IS_UTF8 is set to 1. * @param codepageData an array of bytes in the platform's default codepage. - * @param dataLength The number of bytes in codepageData. + * @param dataLength The number of bytes in `codepageData`. * @stable ICU 2.0 */ UnicodeString(const char *codepageData, int32_t dataLength); @@ -3208,11 +3186,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char* constructor. * @param codepageData an array of bytes, null-terminated - * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * @param codepage the encoding of `codepageData`. The special + * value 0 for `codepage` indicates that the text is in the * platform's default codepage. * - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. * Recommendation: For invariant-character strings use the constructor @@ -3227,11 +3205,11 @@ class U_COMMON_API UnicodeString : public Replaceable /** * char* constructor. * @param codepageData an array of bytes. - * @param dataLength The number of bytes in codepageData. - * @param codepage the encoding of codepageData. The special - * value 0 for codepage indicates that the text is in the + * @param dataLength The number of bytes in `codepageData`. + * @param codepage the encoding of `codepageData`. The special + * value 0 for `codepage` indicates that the text is in the * platform's default codepage. - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. * Recommendation: For invariant-character strings use the constructor @@ -3282,12 +3260,11 @@ class U_COMMON_API UnicodeString : public Replaceable * * For example: * \code - * void fn(const char *s) { - * UnicodeString ustr(s, -1, US_INV); - * // use ustr ... - * } + * void fn(const char *s) { + * UnicodeString ustr(s, -1, US_INV); + * // use ustr ... + * } * \endcode - * * @param src String using only invariant characters. * @param length Length of src, or -1 if NUL-terminated. * @param inv Signature-distinguishing paramater, use US_INV. @@ -3327,7 +3304,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * 'Substring' constructor from tail of source string. * @param src The UnicodeString object to copy. - * @param srcStart The offset into src at which to start copying. + * @param srcStart The offset into `src` at which to start copying. * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart); @@ -3335,8 +3312,8 @@ class U_COMMON_API UnicodeString : public Replaceable /** * 'Substring' constructor from subrange of source string. * @param src The UnicodeString object to copy. - * @param srcStart The offset into src at which to start copying. - * @param srcLength The number of characters from src to copy. + * @param srcStart The offset into `src` at which to start copying. + * @param srcLength The number of characters from `src` to copy. * @stable ICU 2.2 */ UnicodeString(const UnicodeString& src, int32_t srcStart, int32_t srcLength); @@ -3408,7 +3385,7 @@ class U_COMMON_API UnicodeString : public Replaceable * * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A, * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B, - * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C + * \\" => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C * * Anything else following a backslash is generically escaped. For * example, "[a\\-z]" returns "[a-z]". @@ -3656,9 +3633,9 @@ class U_COMMON_API UnicodeString : public Replaceable * Real constructor for converting from codepage data. * It assumes that it is called with !fRefCounted. * - * If codepage==0, then the default converter + * If `codepage==0`, then the default converter * is used for the platform encoding. - * If codepage is an empty string (""), + * If `codepage` is an empty string (`""`), * then a simple conversion is performed on the codepage-invariant * subset ("invariant characters") of the platform encoding. See utypes.h. */ diff --git a/deps/icu-small/source/common/unicode/uobject.h b/deps/icu-small/source/common/unicode/uobject.h index f7a7b6eddbc96b..53b8eb005f4cc0 100644 --- a/deps/icu-small/source/common/unicode/uobject.h +++ b/deps/icu-small/source/common/unicode/uobject.h @@ -20,6 +20,7 @@ #define __UOBJECT_H__ #include "unicode/utypes.h" +#include "unicode/platform.h" /** * \file @@ -28,7 +29,9 @@ /** * \def U_NO_THROW - * Define this to define the throw() specification so + * Since ICU 64, use U_NOEXCEPT instead. + * + * Previously, define this to define the throw() specification so * certain functions do not throw any exceptions * * UMemory operator new methods should have the throw() specification @@ -37,7 +40,7 @@ * constructor is still called, and if the constructor references member * data, (which it typically does), the result is a segmentation violation. * - * @stable ICU 4.2 + * @stable ICU 4.2. Since ICU 64, Use U_NOEXCEPT instead. See ICU-20422. */ #ifndef U_NO_THROW #define U_NO_THROW throw() @@ -125,14 +128,14 @@ class U_COMMON_API UMemory { * for ICU4C C++ classes * @stable ICU 2.4 */ - static void * U_EXPORT2 operator new(size_t size) U_NO_THROW; + static void * U_EXPORT2 operator new(size_t size) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. * See new(). * @stable ICU 2.4 */ - static void * U_EXPORT2 operator new[](size_t size) U_NO_THROW; + static void * U_EXPORT2 operator new[](size_t size) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. @@ -142,14 +145,14 @@ class U_COMMON_API UMemory { * for ICU4C C++ classes * @stable ICU 2.4 */ - static void U_EXPORT2 operator delete(void *p) U_NO_THROW; + static void U_EXPORT2 operator delete(void *p) U_NOEXCEPT; /** * Override for ICU4C C++ memory management. * See delete(). * @stable ICU 2.4 */ - static void U_EXPORT2 operator delete[](void *p) U_NO_THROW; + static void U_EXPORT2 operator delete[](void *p) U_NOEXCEPT; #if U_HAVE_PLACEMENT_NEW /** @@ -157,14 +160,14 @@ class U_COMMON_API UMemory { * See new(). * @stable ICU 2.6 */ - static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NO_THROW { return ptr; } + static inline void * U_EXPORT2 operator new(size_t, void *ptr) U_NOEXCEPT { return ptr; } /** * Override for ICU4C C++ memory management for STL. * See delete(). * @stable ICU 2.6 */ - static inline void U_EXPORT2 operator delete(void *, void *) U_NO_THROW {} + static inline void U_EXPORT2 operator delete(void *, void *) U_NOEXCEPT {} #endif /* U_HAVE_PLACEMENT_NEW */ #if U_HAVE_DEBUG_LOCATION_NEW /** @@ -174,7 +177,7 @@ class U_COMMON_API UMemory { * @param file The file where the allocation was requested * @param line The line where the allocation was requested */ - static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NO_THROW; + static void * U_EXPORT2 operator new(size_t size, const char* file, int line) U_NOEXCEPT; /** * This method provides a matching delete for the MFC debug new * @@ -182,7 +185,7 @@ class U_COMMON_API UMemory { * @param file The file where the allocation was requested * @param line The line where the allocation was requested */ - static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NO_THROW; + static void U_EXPORT2 operator delete(void* p, const char* file, int line) U_NOEXCEPT; #endif /* U_HAVE_DEBUG_LOCATION_NEW */ #endif /* U_OVERRIDE_CXX_ALLOCATION */ diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 5812173e39cfd2..eaf56c9614d7f2 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -109,12 +109,13 @@ #define _UTF32LEData U_ICU_ENTRY_POINT_RENAME(_UTF32LEData) #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) +#define _isUnicodeLocaleTypeSubtag U_ICU_ENTRY_POINT_RENAME(_isUnicodeLocaleTypeSubtag) #define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup) -#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl) #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup) #define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup) #define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats) #define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce) +#define initNumsysNames U_ICU_ENTRY_POINT_RENAME(initNumsysNames) #define izrule_clone U_ICU_ENTRY_POINT_RENAME(izrule_clone) #define izrule_close U_ICU_ENTRY_POINT_RENAME(izrule_close) #define izrule_equals U_ICU_ENTRY_POINT_RENAME(izrule_equals) @@ -133,6 +134,7 @@ #define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart) #define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default) #define locale_set_default U_ICU_ENTRY_POINT_RENAME(locale_set_default) +#define numSysCleanup U_ICU_ENTRY_POINT_RENAME(numSysCleanup) #define pl_addFontRun U_ICU_ENTRY_POINT_RENAME(pl_addFontRun) #define pl_addLocaleRun U_ICU_ENTRY_POINT_RENAME(pl_addLocaleRun) #define pl_addValueRun U_ICU_ENTRY_POINT_RENAME(pl_addValueRun) @@ -583,6 +585,18 @@ #define ucasemap_utf8ToLower U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToLower) #define ucasemap_utf8ToTitle U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToTitle) #define ucasemap_utf8ToUpper U_ICU_ENTRY_POINT_RENAME(ucasemap_utf8ToUpper) +#define ucfpos_close U_ICU_ENTRY_POINT_RENAME(ucfpos_close) +#define ucfpos_constrainCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainCategory) +#define ucfpos_constrainField U_ICU_ENTRY_POINT_RENAME(ucfpos_constrainField) +#define ucfpos_getCategory U_ICU_ENTRY_POINT_RENAME(ucfpos_getCategory) +#define ucfpos_getField U_ICU_ENTRY_POINT_RENAME(ucfpos_getField) +#define ucfpos_getIndexes U_ICU_ENTRY_POINT_RENAME(ucfpos_getIndexes) +#define ucfpos_getInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_getInt64IterationContext) +#define ucfpos_matchesField U_ICU_ENTRY_POINT_RENAME(ucfpos_matchesField) +#define ucfpos_open U_ICU_ENTRY_POINT_RENAME(ucfpos_open) +#define ucfpos_reset U_ICU_ENTRY_POINT_RENAME(ucfpos_reset) +#define ucfpos_setInt64IterationContext U_ICU_ENTRY_POINT_RENAME(ucfpos_setInt64IterationContext) +#define ucfpos_setState U_ICU_ENTRY_POINT_RENAME(ucfpos_setState) #define uchar_addPropertyStarts U_ICU_ENTRY_POINT_RENAME(uchar_addPropertyStarts) #define uchar_swapNames U_ICU_ENTRY_POINT_RENAME(uchar_swapNames) #define ucln_cleanupOne U_ICU_ENTRY_POINT_RENAME(ucln_cleanupOne) @@ -897,8 +911,12 @@ #define udatpg_setDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_setDecimal) #define udict_swap U_ICU_ENTRY_POINT_RENAME(udict_swap) #define udtitvfmt_close U_ICU_ENTRY_POINT_RENAME(udtitvfmt_close) +#define udtitvfmt_closeResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_closeResult) #define udtitvfmt_format U_ICU_ENTRY_POINT_RENAME(udtitvfmt_format) +#define udtitvfmt_formatToResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_formatToResult) #define udtitvfmt_open U_ICU_ENTRY_POINT_RENAME(udtitvfmt_open) +#define udtitvfmt_openResult U_ICU_ENTRY_POINT_RENAME(udtitvfmt_openResult) +#define udtitvfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(udtitvfmt_resultAsValue) #define uenum_close U_ICU_ENTRY_POINT_RENAME(uenum_close) #define uenum_count U_ICU_ENTRY_POINT_RENAME(uenum_count) #define uenum_next U_ICU_ENTRY_POINT_RENAME(uenum_next) @@ -938,6 +956,8 @@ #define ufmt_ptou U_ICU_ENTRY_POINT_RENAME(ufmt_ptou) #define ufmt_uto64 U_ICU_ENTRY_POINT_RENAME(ufmt_uto64) #define ufmt_utop U_ICU_ENTRY_POINT_RENAME(ufmt_utop) +#define ufmtval_getString U_ICU_ENTRY_POINT_RENAME(ufmtval_getString) +#define ufmtval_nextPosition U_ICU_ENTRY_POINT_RENAME(ufmtval_nextPosition) #define ugender_getInstance U_ICU_ENTRY_POINT_RENAME(ugender_getInstance) #define ugender_getListGender U_ICU_ENTRY_POINT_RENAME(ugender_getListGender) #define uhash_close U_ICU_ENTRY_POINT_RENAME(uhash_close) @@ -1040,8 +1060,12 @@ #define ulist_resetList U_ICU_ENTRY_POINT_RENAME(ulist_resetList) #define ulist_reset_keyword_values_iterator U_ICU_ENTRY_POINT_RENAME(ulist_reset_keyword_values_iterator) #define ulistfmt_close U_ICU_ENTRY_POINT_RENAME(ulistfmt_close) +#define ulistfmt_closeResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_closeResult) #define ulistfmt_format U_ICU_ENTRY_POINT_RENAME(ulistfmt_format) +#define ulistfmt_formatStringsToResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_formatStringsToResult) #define ulistfmt_open U_ICU_ENTRY_POINT_RENAME(ulistfmt_open) +#define ulistfmt_openResult U_ICU_ENTRY_POINT_RENAME(ulistfmt_openResult) +#define ulistfmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ulistfmt_resultAsValue) #define uloc_acceptLanguage U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguage) #define uloc_acceptLanguageFromHTTP U_ICU_ENTRY_POINT_RENAME(uloc_acceptLanguageFromHTTP) #define uloc_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(uloc_addLikelySubtags) @@ -1099,17 +1123,30 @@ #define ulocdata_getPaperSize U_ICU_ENTRY_POINT_RENAME(ulocdata_getPaperSize) #define ulocdata_open U_ICU_ENTRY_POINT_RENAME(ulocdata_open) #define ulocdata_setNoSubstitute U_ICU_ENTRY_POINT_RENAME(ulocdata_setNoSubstitute) +#define ulocimp_addLikelySubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_addLikelySubtags) #define ulocimp_forLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_forLanguageTag) #define ulocimp_getCountry U_ICU_ENTRY_POINT_RENAME(ulocimp_getCountry) #define ulocimp_getLanguage U_ICU_ENTRY_POINT_RENAME(ulocimp_getLanguage) #define ulocimp_getRegionForSupplementalData U_ICU_ENTRY_POINT_RENAME(ulocimp_getRegionForSupplementalData) #define ulocimp_getScript U_ICU_ENTRY_POINT_RENAME(ulocimp_getScript) +#define ulocimp_minimizeSubtags U_ICU_ENTRY_POINT_RENAME(ulocimp_minimizeSubtags) #define ulocimp_toBcpKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpKey) #define ulocimp_toBcpType U_ICU_ENTRY_POINT_RENAME(ulocimp_toBcpType) +#define ulocimp_toLanguageTag U_ICU_ENTRY_POINT_RENAME(ulocimp_toLanguageTag) #define ulocimp_toLegacyKey U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyKey) #define ulocimp_toLegacyType U_ICU_ENTRY_POINT_RENAME(ulocimp_toLegacyType) +#define ultag_isExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isExtensionSubtags) +#define ultag_isLanguageSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isLanguageSubtag) +#define ultag_isPrivateuseValueSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isPrivateuseValueSubtags) +#define ultag_isRegionSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isRegionSubtag) +#define ultag_isScriptSubtag U_ICU_ENTRY_POINT_RENAME(ultag_isScriptSubtag) +#define ultag_isTransformedExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isTransformedExtensionSubtags) +#define ultag_isUnicodeExtensionSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeExtensionSubtags) +#define ultag_isUnicodeLocaleAttribute U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttribute) +#define ultag_isUnicodeLocaleAttributes U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleAttributes) #define ultag_isUnicodeLocaleKey U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleKey) #define ultag_isUnicodeLocaleType U_ICU_ENTRY_POINT_RENAME(ultag_isUnicodeLocaleType) +#define ultag_isVariantSubtags U_ICU_ENTRY_POINT_RENAME(ultag_isVariantSubtags) #define umsg_applyPattern U_ICU_ENTRY_POINT_RENAME(umsg_applyPattern) #define umsg_autoQuoteApostrophe U_ICU_ENTRY_POINT_RENAME(umsg_autoQuoteApostrophe) #define umsg_clone U_ICU_ENTRY_POINT_RENAME(umsg_clone) @@ -1208,7 +1245,9 @@ #define unumf_formatDouble U_ICU_ENTRY_POINT_RENAME(unumf_formatDouble) #define unumf_formatInt U_ICU_ENTRY_POINT_RENAME(unumf_formatInt) #define unumf_openForSkeletonAndLocale U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocale) +#define unumf_openForSkeletonAndLocaleWithError U_ICU_ENTRY_POINT_RENAME(unumf_openForSkeletonAndLocaleWithError) #define unumf_openResult U_ICU_ENTRY_POINT_RENAME(unumf_openResult) +#define unumf_resultAsValue U_ICU_ENTRY_POINT_RENAME(unumf_resultAsValue) #define unumf_resultGetAllFieldPositions U_ICU_ENTRY_POINT_RENAME(unumf_resultGetAllFieldPositions) #define unumf_resultNextFieldPosition U_ICU_ENTRY_POINT_RENAME(unumf_resultNextFieldPosition) #define unumf_resultToString U_ICU_ENTRY_POINT_RENAME(unumf_resultToString) @@ -1225,6 +1264,7 @@ #define uplrules_open U_ICU_ENTRY_POINT_RENAME(uplrules_open) #define uplrules_openForType U_ICU_ENTRY_POINT_RENAME(uplrules_openForType) #define uplrules_select U_ICU_ENTRY_POINT_RENAME(uplrules_select) +#define uplrules_selectFormatted U_ICU_ENTRY_POINT_RENAME(uplrules_selectFormatted) #define uplrules_selectWithFormat U_ICU_ENTRY_POINT_RENAME(uplrules_selectWithFormat) #define uplug_closeLibrary U_ICU_ENTRY_POINT_RENAME(uplug_closeLibrary) #define uplug_findLibrary U_ICU_ENTRY_POINT_RENAME(uplug_findLibrary) @@ -1499,10 +1539,15 @@ #define uregion_getRegionFromNumericCode U_ICU_ENTRY_POINT_RENAME(uregion_getRegionFromNumericCode) #define uregion_getType U_ICU_ENTRY_POINT_RENAME(uregion_getType) #define ureldatefmt_close U_ICU_ENTRY_POINT_RENAME(ureldatefmt_close) +#define ureldatefmt_closeResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_closeResult) #define ureldatefmt_combineDateAndTime U_ICU_ENTRY_POINT_RENAME(ureldatefmt_combineDateAndTime) #define ureldatefmt_format U_ICU_ENTRY_POINT_RENAME(ureldatefmt_format) #define ureldatefmt_formatNumeric U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumeric) +#define ureldatefmt_formatNumericToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatNumericToResult) +#define ureldatefmt_formatToResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_formatToResult) #define ureldatefmt_open U_ICU_ENTRY_POINT_RENAME(ureldatefmt_open) +#define ureldatefmt_openResult U_ICU_ENTRY_POINT_RENAME(ureldatefmt_openResult) +#define ureldatefmt_resultAsValue U_ICU_ENTRY_POINT_RENAME(ureldatefmt_resultAsValue) #define ures_close U_ICU_ENTRY_POINT_RENAME(ures_close) #define ures_copyResb U_ICU_ENTRY_POINT_RENAME(ures_copyResb) #define ures_countArrayItems U_ICU_ENTRY_POINT_RENAME(ures_countArrayItems) @@ -1543,6 +1588,7 @@ #define ures_open U_ICU_ENTRY_POINT_RENAME(ures_open) #define ures_openAvailableLocales U_ICU_ENTRY_POINT_RENAME(ures_openAvailableLocales) #define ures_openDirect U_ICU_ENTRY_POINT_RENAME(ures_openDirect) +#define ures_openDirectFillIn U_ICU_ENTRY_POINT_RENAME(ures_openDirectFillIn) #define ures_openFillIn U_ICU_ENTRY_POINT_RENAME(ures_openFillIn) #define ures_openNoDefault U_ICU_ENTRY_POINT_RENAME(ures_openNoDefault) #define ures_openU U_ICU_ENTRY_POINT_RENAME(ures_openU) diff --git a/deps/icu-small/source/common/unicode/ures.h b/deps/icu-small/source/common/unicode/ures.h index af0ce76f25b1a2..839779fada804d 100644 --- a/deps/icu-small/source/common/unicode/ures.h +++ b/deps/icu-small/source/common/unicode/ures.h @@ -333,19 +333,19 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle, #ifndef U_HIDE_INTERNAL_API /** - * Same as ures_open() but uses the fill-in parameter instead of allocating - * a bundle, if r!=NULL. + * Same as ures_open() but uses the fill-in parameter instead of allocating a new bundle. + * * TODO need to revisit usefulness of this function * and usage model for fillIn parameters without knowing sizeof(UResourceBundle) - * @param r The resourcebundle to open + * @param r The existing UResourceBundle to fill in. If NULL then status will be + * set to U_ILLEGAL_ARGUMENT_ERROR. * @param packageName The packageName and locale together point to an ICU udata object, * as defined by udata_open( packageName, "res", locale, err) * or equivalent. Typically, packageName will refer to a (.dat) file, or to * a package registered with udata_setAppData(). Using a full file or directory * pathname for packageName is deprecated. If NULL, ICU data will be used. * @param localeID specifies the locale for which we want to open the resource - * @param status The error code - * @return a newly allocated resource bundle or NULL if it doesn't exist. + * @param status The error code. * @internal */ U_INTERNAL void U_EXPORT2 diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index faf9edf8ae2694..c8babdf03068a3 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -466,6 +466,15 @@ typedef enum UScriptCode { /** @stable ICU 62 */ USCRIPT_OLD_SOGDIAN = 184,/* Sogo */ + /** @stable ICU 64 */ + USCRIPT_ELYMAIC = 185,/* Elym */ + /** @stable ICU 64 */ + USCRIPT_NYIAKENG_PUACHUE_HMONG = 186,/* Hmnp */ + /** @stable ICU 64 */ + USCRIPT_NANDINAGARI = 187,/* Nand */ + /** @stable ICU 64 */ + USCRIPT_WANCHO = 188,/* Wcho */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -473,7 +482,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 185 + USCRIPT_CODE_LIMIT = 189 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 51d11a2e00efb4..ff78784c61ec54 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -1555,7 +1555,7 @@ struct UText { U_STABLE UText * U_EXPORT2 utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); -#ifndef U_HIDE_INTERNAL_API +// do not use #ifndef U_HIDE_INTERNAL_API around the following! /** * @internal * Value used to help identify correctly initialized UText structs. @@ -1564,7 +1564,6 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); enum { UTEXT_MAGIC = 0x345ad82c }; -#endif /* U_HIDE_INTERNAL_API */ /** * initializer to be used with local (stack) instances of a UText diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 1f076343590240..41155f119bbb86 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -609,7 +609,6 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); } \ } -#ifndef U_HIDE_DRAFT_API /** * If the string ends with a UTF-8 byte sequence that is valid so far * but incomplete, then reduce the length of the string to end before @@ -634,7 +633,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @param start int32_t starting string offset (usually 0) * @param length int32_t string length (usually start<=length) * @see U8_SET_CP_START - * @draft ICU 61 + * @stable ICU 61 */ #define U8_TRUNCATE_IF_INCOMPLETE(s, start, length) \ if((length)>(start)) { \ @@ -658,7 +657,6 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); } \ } \ } -#endif // U_HIDE_DRAFT_API /* definitions with backward iteration -------------------------------------- */ diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index f1814e06498da2..49eb12cd40022c 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -544,12 +544,8 @@ typedef enum UErrorCode { U_DEFAULT_KEYWORD_MISSING, /**< Missing DEFAULT rule in plural rules */ U_DECIMAL_NUMBER_SYNTAX_ERROR, /**< Decimal number syntax error */ U_FORMAT_INEXACT_ERROR, /**< Cannot format a number exactly and rounding mode is ROUND_UNNECESSARY @stable ICU 4.8 */ -#ifndef U_HIDE_DRAFT_API - U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @draft ICU 61 */ -#endif // U_HIDE_DRAFT_API -#ifndef U_HIDE_DRAFT_API - U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @draft ICU 62 */ -#endif // U_HIDE_DRAFT_API + U_NUMBER_ARG_OUTOFBOUNDS_ERROR, /**< The argument to a NumberFormatter helper method was out of bounds; the bounds are usually 0 to 999. @stable ICU 61 */ + U_NUMBER_SKELETON_SYNTAX_ERROR, /**< The number skeleton passed to C++ NumberFormatter or C UNumberFormatter was invalid or contained a syntax error. @stable ICU 62 */ #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal formatting API error code. diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 83d0b4ecd1c8a0..7c114be2cc87f1 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -60,13 +60,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 63 +#define U_ICU_VERSION_MAJOR_NUM 64 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 1 +#define U_ICU_VERSION_MINOR_NUM 2 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -86,7 +86,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _63 +#define U_ICU_VERSION_SUFFIX _64 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -103,16 +103,34 @@ * \def U_ICU_ENTRY_POINT_RENAME * @stable ICU 4.2 */ +/** + * Disable the version suffix. Use the custom suffix if exists. + * \def U_DISABLE_VERSION_SUFFIX + * @internal + */ +#ifndef U_DISABLE_VERSION_SUFFIX +#define U_DISABLE_VERSION_SUFFIX 0 +#endif #ifndef U_ICU_ENTRY_POINT_RENAME #ifdef U_HAVE_LIB_SUFFIX -#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z -#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) -#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME) +# if !U_DISABLE_VERSION_SUFFIX +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) x ## y ## z +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y,z) U_DEF_ICU_ENTRY_POINT_RENAME(x,y,z) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX,U_LIB_SUFFIX_C_NAME) +# else +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_LIB_SUFFIX_C_NAME) +# endif #else -#define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y -#define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) -#define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX) +# if !U_DISABLE_VERSION_SUFFIX +# define U_DEF_ICU_ENTRY_POINT_RENAME(x,y) x ## y +# define U_DEF2_ICU_ENTRY_POINT_RENAME(x,y) U_DEF_ICU_ENTRY_POINT_RENAME(x,y) +# define U_ICU_ENTRY_POINT_RENAME(x) U_DEF2_ICU_ENTRY_POINT_RENAME(x,U_ICU_VERSION_SUFFIX) +# else +# define U_ICU_ENTRY_POINT_RENAME(x) x +# endif #endif #endif @@ -121,7 +139,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "63.1" +#define U_ICU_VERSION "64.2" /** * The current ICU library major version number as a string, for library name suffixes. @@ -134,13 +152,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "63" +#define U_ICU_VERSION_SHORT "64" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "63.1" +#define U_ICU_DATA_VERSION "64.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index d33d8d2c01c0e5..641f4ec6594e12 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -21,8 +21,14 @@ #include "umutex.h" static icu::UnifiedCache *gCache = NULL; -static UMutex gCacheMutex = U_MUTEX_INITIALIZER; -static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER; +static icu::UMutex *gCacheMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} +static icu::UConditionVar *gInProgressValueAddedCond() { + static icu::UConditionVar cv = U_CONDITION_INITIALIZER; + return &cv; +} static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER; static const int32_t MAX_EVICT_ITERATIONS = 10; @@ -132,28 +138,28 @@ void UnifiedCache::setEvictionPolicy( status = U_ILLEGAL_ARGUMENT_ERROR; return; } - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); fMaxUnused = count; fMaxPercentageOfInUse = percentageOfInUseItems; } int32_t UnifiedCache::unusedCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return uhash_count(fHashtable) - fNumValuesInUse; } int64_t UnifiedCache::autoEvictedCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return fAutoEvictedCount; } int32_t UnifiedCache::keyCount() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); return uhash_count(fHashtable); } void UnifiedCache::flush() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); // Use a loop in case cache items that are flushed held hard references to // other cache items making those additional cache items eligible for @@ -162,7 +168,7 @@ void UnifiedCache::flush() const { } void UnifiedCache::handleUnreferencedObject() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); --fNumValuesInUse; _runEvictionSlice(); } @@ -181,7 +187,7 @@ void UnifiedCache::dump() { } void UnifiedCache::dumpContents() const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); _dumpContents(); } @@ -221,7 +227,7 @@ UnifiedCache::~UnifiedCache() { // Now all that should be left in the cache are entries that refer to // each other and entries with hard references from outside the cache. // Nothing we can do about these so proceed to wipe out the cache. - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); _flush(TRUE); } uhash_close(fHashtable); @@ -322,7 +328,7 @@ void UnifiedCache::_putIfAbsentAndGet( const CacheKeyBase &key, const SharedObject *&value, UErrorCode &status) const { - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); const UHashElement *element = uhash_find(fHashtable, &key); if (element != NULL && !_inProgress(element)) { _fetch(element, value, status); @@ -347,14 +353,14 @@ UBool UnifiedCache::_poll( UErrorCode &status) const { U_ASSERT(value == NULL); U_ASSERT(status == U_ZERO_ERROR); - Mutex lock(&gCacheMutex); + Mutex lock(gCacheMutex()); const UHashElement *element = uhash_find(fHashtable, &key); // If the hash table contains an inProgress placeholder entry for this key, // this means that another thread is currently constructing the value object. // Loop, waiting for that construction to complete. while (element != NULL && _inProgress(element)) { - umtx_condWait(&gInProgressValueAddedCond, &gCacheMutex); + umtx_condWait(gInProgressValueAddedCond(), gCacheMutex()); element = uhash_find(fHashtable, &key); } @@ -427,7 +433,7 @@ void UnifiedCache::_put( // Tell waiting threads that we replace in-progress status with // an error. - umtx_condBroadcast(&gInProgressValueAddedCond); + umtx_condBroadcast(gInProgressValueAddedCond()); } void UnifiedCache::_fetch( diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index b3ccd60d177ea1..5c0bd76f4a2b94 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -137,7 +137,7 @@ class LocaleCacheKey : public CacheKey { protected: Locale fLoc; public: - LocaleCacheKey(const Locale &loc) : fLoc(loc) {}; + LocaleCacheKey(const Locale &loc) : fLoc(loc) {} LocaleCacheKey(const LocaleCacheKey &other) : CacheKey(other), fLoc(other.fLoc) { } virtual ~LocaleCacheKey() { } diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index 7d2e3cd619fc1d..1db382afe6f6ba 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -14,6 +14,7 @@ #include "unicode/parsepos.h" #include "unicode/symtable.h" #include "unicode/uniset.h" +#include "unicode/ustring.h" #include "unicode/utf8.h" #include "unicode/utf16.h" #include "ruleiter.h" @@ -53,11 +54,8 @@ // LOW <= all valid values. ZERO for codepoints #define UNICODESET_LOW 0x000000 -// initial storage. Must be >= 0 -#define START_EXTRA 16 - -// extra amount for growth. Must be >= 0 -#define GROW_EXTRA START_EXTRA +/** Max list [0, 1, 2, ..., max code point, HIGH] */ +constexpr int32_t MAX_LENGTH = UNICODESET_HIGH + 1; U_NAMESPACE_BEGIN @@ -137,6 +135,18 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { return a.compare(b); } +UBool UnicodeSet::hasStrings() const { + return strings != nullptr && !strings->isEmpty(); +} + +int32_t UnicodeSet::stringsSize() const { + return strings == nullptr ? 0 : strings->size(); +} + +UBool UnicodeSet::stringsContains(const UnicodeString &s) const { + return strings != nullptr && strings->contains((void*) &s); +} + //---------------------------------------------------------------- // Constructors &c //---------------------------------------------------------------- @@ -144,24 +154,8 @@ static int8_t U_CALLCONV compareUnicodeString(UElement t1, UElement t2) { /** * Constructs an empty set. */ -UnicodeSet::UnicodeSet() : - len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - list[0] = UNICODESET_HIGH; - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet() { + list[0] = UNICODESET_HIGH; _dbgct(this); } @@ -172,89 +166,39 @@ UnicodeSet::UnicodeSet() : * @param start first character, inclusive, of range * @param end last character, inclusive, of range */ -UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) : - len(1), capacity(1 + START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - list[0] = UNICODESET_HIGH; - complement(start, end); - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet(UChar32 start, UChar32 end) { + list[0] = UNICODESET_HIGH; + add(start, end); _dbgct(this); } /** * Constructs a set that is identical to the given UnicodeSet. */ -UnicodeSet::UnicodeSet(const UnicodeSet& o) : - UnicodeFilter(o), - len(0), capacity(o.isFrozen() ? o.len : o.len + GROW_EXTRA), list(0), - bmpSet(0), - buffer(0), bufferCapacity(0), - patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ - *this = o; - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; - } +UnicodeSet::UnicodeSet(const UnicodeSet& o) : UnicodeFilter(o) { + *this = o; _dbgct(this); } // Copy-construct as thawed. -UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : - UnicodeFilter(o), - len(0), capacity(o.len + GROW_EXTRA), list(0), - bmpSet(0), - buffer(0), bufferCapacity(0), - patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - UErrorCode status = U_ZERO_ERROR; - allocateStrings(status); - if (U_FAILURE(status)) { - setToBogus(); // If memory allocation failed, set to bogus state. - return; - } - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(list!=NULL){ +UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : UnicodeFilter(o) { + if (ensureCapacity(o.len)) { // *this = o except for bmpSet and stringSpan len = o.len; uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32)); - if (strings != NULL && o.strings != NULL) { - strings->assign(*o.strings, cloneUnicodeString, status); - } else { // Invalid strings. - setToBogus(); - return; + if (o.hasStrings()) { + UErrorCode status = U_ZERO_ERROR; + if (!allocateStrings(status) || + (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + setToBogus(); + return; + } } if (o.pat) { - setPattern(UnicodeString(o.pat, o.patLen)); + setPattern(o.pat, o.patLen); } - } else { // If memory allocation failed, set to bogus state. - setToBogus(); - return; + _dbgct(this); } - _dbgct(this); } /** @@ -262,9 +206,11 @@ UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : */ UnicodeSet::~UnicodeSet() { _dbgdt(this); // first! - uprv_free(list); + if (list != stackList) { + uprv_free(list); + } delete bmpSet; - if (buffer) { + if (buffer != stackList) { uprv_free(buffer); } delete strings; @@ -290,32 +236,30 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { setToBogus(); return *this; } - UErrorCode ec = U_ZERO_ERROR; - ensureCapacity(o.len, ec); - if (U_FAILURE(ec)) { + if (!ensureCapacity(o.len)) { // ensureCapacity will mark the UnicodeSet as Bogus if OOM failure happens. return *this; } len = o.len; uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32)); - if (o.bmpSet == NULL || asThawed) { - bmpSet = NULL; - } else { + if (o.bmpSet != nullptr && !asThawed) { bmpSet = new BMPSet(*o.bmpSet, list, len); if (bmpSet == NULL) { // Check for memory allocation error. setToBogus(); return *this; } } - if (strings != NULL && o.strings != NULL) { - strings->assign(*o.strings, cloneUnicodeString, ec); - } else { // Invalid strings. - setToBogus(); - return *this; + if (o.hasStrings()) { + UErrorCode status = U_ZERO_ERROR; + if ((strings == nullptr && !allocateStrings(status)) || + (strings->assign(*o.strings, cloneUnicodeString, status), U_FAILURE(status))) { + setToBogus(); + return *this; + } + } else if (hasStrings()) { + strings->removeAllElements(); } - if (o.stringSpan == NULL || asThawed) { - stringSpan = NULL; - } else { + if (o.stringSpan != nullptr && !asThawed) { stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings); if (stringSpan == NULL) { // Check for memory allocation error. setToBogus(); @@ -324,7 +268,7 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { } releasePattern(); if (o.pat) { - setPattern(UnicodeString(o.pat, o.patLen)); + setPattern(o.pat, o.patLen); } return *this; } @@ -357,7 +301,8 @@ UBool UnicodeSet::operator==(const UnicodeSet& o) const { for (int32_t i = 0; i < len; ++i) { if (list[i] != o.list[i]) return FALSE; } - if (*strings != *o.strings) return FALSE; + if (hasStrings() != o.hasStrings()) { return FALSE; } + if (hasStrings() && *strings != *o.strings) return FALSE; return TRUE; } @@ -393,7 +338,7 @@ int32_t UnicodeSet::size(void) const { for (int32_t i = 0; i < count; ++i) { n += getRangeEnd(i) - getRangeStart(i) + 1; } - return n + strings->size(); + return n + stringsSize(); } /** @@ -402,7 +347,7 @@ int32_t UnicodeSet::size(void) const { * @return true if this set contains no elements. */ UBool UnicodeSet::isEmpty(void) const { - return len == 1 && strings->size() == 0; + return len == 1 && !hasStrings(); } /** @@ -502,7 +447,7 @@ UBool UnicodeSet::contains(const UnicodeString& s) const { if (s.length() == 0) return FALSE; int32_t cp = getSingleCP(s); if (cp < 0) { - return strings->contains((void*) &s); + return stringsContains(s); } else { return contains((UChar32) cp); } @@ -524,8 +469,7 @@ UBool UnicodeSet::containsAll(const UnicodeSet& c) const { return FALSE; } } - if (!strings->containsAll(*c.strings)) return FALSE; - return TRUE; + return !c.hasStrings() || (strings != nullptr && strings->containsAll(*c.strings)); } /** @@ -571,8 +515,7 @@ UBool UnicodeSet::containsNone(const UnicodeSet& c) const { return FALSE; } } - if (!strings->containsNone(*c.strings)) return FALSE; - return TRUE; + return strings == nullptr || !c.hasStrings() || strings->containsNone(*c.strings); } /** @@ -613,7 +556,7 @@ UBool UnicodeSet::matchesIndexValue(uint8_t v) const { return TRUE; } } - if (strings->size() != 0) { + if (hasStrings()) { for (i=0; isize(); ++i) { const UnicodeString& s = *(const UnicodeString*)strings->elementAt(i); //if (s.length() == 0) { @@ -648,7 +591,7 @@ UMatchDegree UnicodeSet::matches(const Replaceable& text, return U_MISMATCH; } } else { - if (strings->size() != 0) { // try strings first + if (hasStrings()) { // try strings first // might separate forward and backward loops later // for now they are combined @@ -849,7 +792,39 @@ UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) { */ UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) { if (pinCodePoint(start) < pinCodePoint(end)) { - UChar32 range[3] = { start, end+1, UNICODESET_HIGH }; + UChar32 limit = end + 1; + // Fast path for adding a new range after the last one. + // Odd list length: [..., lastStart, lastLimit, HIGH] + if ((len & 1) != 0) { + // If the list is empty, set lastLimit low enough to not be adjacent to 0. + UChar32 lastLimit = len == 1 ? -2 : list[len - 2]; + if (lastLimit <= start && !isFrozen() && !isBogus()) { + if (lastLimit == start) { + // Extend the last range. + list[len - 2] = limit; + if (limit == UNICODESET_HIGH) { + --len; + } + } else { + list[len - 1] = start; + if (limit < UNICODESET_HIGH) { + if (ensureCapacity(len + 2)) { + list[len++] = limit; + list[len++] = UNICODESET_HIGH; + } + } else { // limit == UNICODESET_HIGH + if (ensureCapacity(len + 1)) { + list[len++] = UNICODESET_HIGH; + } + } + } + releasePattern(); + return *this; + } + } + // This is slow. Could be much faster using findCodePoint(start) + // and modifying the list, dealing with adjacent & overlapping ranges. + UChar32 range[3] = { start, limit, UNICODESET_HIGH }; add(range, 2, 0); } else if (start == end) { add(start); @@ -918,9 +893,7 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { list[i] = c; // if we touched the HIGH mark, then add a new one if (c == (UNICODESET_HIGH - 1)) { - UErrorCode status = U_ZERO_ERROR; - ensureCapacity(len+1, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+1)) { // ensureCapacity will mark the object as Bogus if OOM failure happens. return *this; } @@ -964,21 +937,13 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { // ^ // list[i] - UErrorCode status = U_ZERO_ERROR; - ensureCapacity(len+2, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+2)) { // ensureCapacity will mark the object as Bogus if OOM failure happens. return *this; } - //for (int32_t k=len-1; k>=i; --k) { - // list[k+2] = list[k]; - //} - UChar32* src = list + len; - UChar32* dst = src + 2; - UChar32* srclimit = list + i; - while (src > srclimit) *(--dst) = *(--src); - + UChar32 *p = list + i; + uprv_memmove(p + 2, p, (len - i) * sizeof(*p)); list[i] = c; list[i+1] = c+1; len += 2; @@ -1014,7 +979,7 @@ UnicodeSet& UnicodeSet::add(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - if (!strings->contains((void*) &s)) { + if (!stringsContains(s)) { _add(s); releasePattern(); } @@ -1033,12 +998,16 @@ void UnicodeSet::_add(const UnicodeString& s) { if (isFrozen() || isBogus()) { return; } + UErrorCode ec = U_ZERO_ERROR; + if (strings == nullptr && !allocateStrings(ec)) { + setToBogus(); + return; + } UnicodeString* t = new UnicodeString(s); if (t == NULL) { // Check for memory allocation error. setToBogus(); return; } - UErrorCode ec = U_ZERO_ERROR; strings->sortedInsert(t, compareUnicodeString, ec); if (U_FAILURE(ec)) { setToBogus(); @@ -1121,7 +1090,10 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) { } UnicodeSet& UnicodeSet::removeAllStrings() { - strings->removeAllElements(); + if (!isFrozen() && hasStrings()) { + strings->removeAllElements(); + releasePattern(); + } return *this; } @@ -1217,8 +1189,9 @@ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - strings->removeElement((void*) &s); - releasePattern(); + if (strings != nullptr && strings->removeElement((void*) &s)) { + releasePattern(); + } } else { remove((UChar32)cp, (UChar32)cp); } @@ -1260,24 +1233,17 @@ UnicodeSet& UnicodeSet::complement(void) { if (isFrozen() || isBogus()) { return *this; } - UErrorCode status = U_ZERO_ERROR; if (list[0] == UNICODESET_LOW) { - ensureBufferCapacity(len-1, status); - if (U_FAILURE(status)) { - return *this; - } - uprv_memcpy(buffer, list + 1, (size_t)(len-1)*sizeof(UChar32)); + uprv_memmove(list, list + 1, (size_t)(len-1)*sizeof(UChar32)); --len; } else { - ensureBufferCapacity(len+1, status); - if (U_FAILURE(status)) { + if (!ensureCapacity(len+1)) { return *this; } - uprv_memcpy(buffer + 1, list, (size_t)len*sizeof(UChar32)); - buffer[0] = UNICODESET_LOW; + uprv_memmove(list + 1, list, (size_t)len*sizeof(UChar32)); + list[0] = UNICODESET_LOW; ++len; } - swapBuffers(); releasePattern(); return *this; } @@ -1294,7 +1260,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { if (s.length() == 0 || isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { - if (strings->contains((void*) &s)) { + if (stringsContains(s)) { strings->removeElement((void*) &s); } else { _add(s); @@ -1325,7 +1291,7 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { if ( c.strings!=NULL ) { for (int32_t i=0; isize(); ++i) { const UnicodeString* s = (const UnicodeString*)c.strings->elementAt(i); - if (!strings->contains((void*) s)) { + if (!stringsContains(*s)) { _add(*s); } } @@ -1347,7 +1313,13 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) { return *this; } retain(c.list, c.len, 0); - strings->retainAll(*c.strings); + if (hasStrings()) { + if (!c.hasStrings()) { + strings->removeAllElements(); + } else { + strings->retainAll(*c.strings); + } + } return *this; } @@ -1365,7 +1337,9 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) { return *this; } retain(c.list, c.len, 2); - strings->removeAll(*c.strings); + if (hasStrings() && c.hasStrings()) { + strings->removeAll(*c.strings); + } return *this; } @@ -1383,10 +1357,12 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) { } exclusiveOr(c.list, c.len, 0); - for (int32_t i=0; isize(); ++i) { - void* e = c.strings->elementAt(i); - if (!strings->removeElement(e)) { - _add(*(const UnicodeString*)e); + if (c.strings != nullptr) { + for (int32_t i=0; isize(); ++i) { + void* e = c.strings->elementAt(i); + if (strings == nullptr || !strings->removeElement(e)) { + _add(*(const UnicodeString*)e); + } } } return *this; @@ -1400,18 +1376,14 @@ UnicodeSet& UnicodeSet::clear(void) { if (isFrozen()) { return *this; } - if (list != NULL) { - list[0] = UNICODESET_HIGH; - } + list[0] = UNICODESET_HIGH; len = 1; releasePattern(); if (strings != NULL) { strings->removeAllElements(); } - if (list != NULL && strings != NULL) { - // Remove bogus - fFlags = 0; - } + // Remove bogus + fFlags = 0; return *this; } @@ -1445,10 +1417,6 @@ UChar32 UnicodeSet::getRangeEnd(int32_t index) const { return list[index*2 + 1] - 1; } -int32_t UnicodeSet::getStringCount() const { - return strings->size(); -} - const UnicodeString* UnicodeSet::getString(int32_t index) const { return (const UnicodeString*) strings->elementAt(index); } @@ -1462,22 +1430,32 @@ UnicodeSet& UnicodeSet::compact() { return *this; } // Delete buffer first to defragment memory less. - if (buffer != NULL) { + if (buffer != stackList) { uprv_free(buffer); buffer = NULL; - } - if (len < capacity) { - // Make the capacity equal to len or 1. - // We don't want to realloc of 0 size. - int32_t newCapacity = len + (len == 0); - UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * newCapacity); + bufferCapacity = 0; + } + if (list == stackList) { + // pass + } else if (len <= INITIAL_CAPACITY) { + uprv_memcpy(stackList, list, len * sizeof(UChar32)); + uprv_free(list); + list = stackList; + capacity = INITIAL_CAPACITY; + } else if ((len + 7) < capacity) { + // If we have more than a little unused capacity, shrink it to len. + UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * len); if (temp) { list = temp; - capacity = newCapacity; + capacity = len; } // else what the heck happened?! We allocated less memory! // Oh well. We'll keep our original array. } + if (strings != nullptr && strings->isEmpty()) { + delete strings; + strings = nullptr; + } return *this; } @@ -1488,10 +1466,8 @@ UnicodeSet& UnicodeSet::compact() { /** * Deserialize constructor. */ -UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization, UErrorCode &ec) - : len(1), capacity(1+START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) { +UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization serialization, + UErrorCode &ec) { if(U_FAILURE(ec)) { setToBogus(); @@ -1506,24 +1482,15 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se return; } - allocateStrings(ec); - if (U_FAILURE(ec)) { - setToBogus(); - return; - } - // bmp? int32_t headerSize = ((data[0]&0x8000)) ?2:1; int32_t bmpLength = (headerSize==1)?data[0]:data[1]; - len = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength; + int32_t newLength = (((data[0]&0x7FFF)-bmpLength)/2)+bmpLength; #ifdef DEBUG_SERIALIZE - printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,len, data[0],data[1],data[2],data[3]); + printf("dataLen %d headerSize %d bmpLen %d len %d. data[0]=%X/%X/%X/%X\n", dataLen,headerSize,bmpLength,newLength, data[0],data[1],data[2],data[3]); #endif - capacity = len+1; - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - if(!list || U_FAILURE(ec)) { - setToBogus(); + if(!ensureCapacity(newLength + 1)) { // +1 for HIGH return; } // copy bmp @@ -1535,15 +1502,18 @@ UnicodeSet::UnicodeSet(const uint16_t data[], int32_t dataLen, ESerialization se #endif } // copy smp - for(i=bmpLength;i MAX_LENGTH) { + newCapacity = MAX_LENGTH; + } + return newCapacity; + } +} + +bool UnicodeSet::ensureCapacity(int32_t newLen) { + if (newLen > MAX_LENGTH) { + newLen = MAX_LENGTH; + } if (newLen <= capacity) { - return; + return true; } - UChar32* temp = (UChar32*) uprv_realloc(list, sizeof(UChar32) * (newLen + GROW_EXTRA)); + int32_t newCapacity = nextCapacity(newLen); + UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); if (temp == NULL) { - ec = U_MEMORY_ALLOCATION_ERROR; setToBogus(); // set the object to bogus state if an OOM failure occurred. - return; + return false; + } + // Copy only the actual contents. + uprv_memcpy(temp, list, len * sizeof(UChar32)); + if (list != stackList) { + uprv_free(list); } list = temp; - capacity = newLen + GROW_EXTRA; - // else we keep the original contents on the memory failure. + capacity = newCapacity; + return true; } -void UnicodeSet::ensureBufferCapacity(int32_t newLen, UErrorCode& ec) { - if (buffer != NULL && newLen <= bufferCapacity) - return; - UChar32* temp = (UChar32*) uprv_realloc(buffer, sizeof(UChar32) * (newLen + GROW_EXTRA)); +bool UnicodeSet::ensureBufferCapacity(int32_t newLen) { + if (newLen > MAX_LENGTH) { + newLen = MAX_LENGTH; + } + if (newLen <= bufferCapacity) { + return true; + } + int32_t newCapacity = nextCapacity(newLen); + UChar32* temp = (UChar32*) uprv_malloc(newCapacity * sizeof(UChar32)); if (temp == NULL) { - ec = U_MEMORY_ALLOCATION_ERROR; setToBogus(); - return; + return false; + } + // The buffer has no contents to be copied. + // It is always filled from scratch after this call. + if (buffer != stackList) { + uprv_free(buffer); } buffer = temp; - bufferCapacity = newLen + GROW_EXTRA; - // else we keep the original contents on the memory failure. + bufferCapacity = newCapacity; + return true; } /** @@ -1727,9 +1729,7 @@ void UnicodeSet::exclusiveOr(const UChar32* other, int32_t otherLen, int8_t pola if (isFrozen() || isBogus()) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -1777,9 +1777,7 @@ void UnicodeSet::add(const UChar32* other, int32_t otherLen, int8_t polarity) { if (isFrozen() || isBogus() || other==NULL) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -1890,9 +1888,7 @@ void UnicodeSet::retain(const UChar32* other, int32_t otherLen, int8_t polarity) if (isFrozen() || isBogus()) { return; } - UErrorCode status = U_ZERO_ERROR; - ensureBufferCapacity(len + otherLen, status); - if (U_FAILURE(status)) { + if (!ensureBufferCapacity(len + otherLen)) { return; } @@ -2138,12 +2134,14 @@ UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, } } - for (int32_t i = 0; isize(); ++i) { - result.append(OPEN_BRACE); - _appendToPat(result, - *(const UnicodeString*) strings->elementAt(i), - escapeUnprintable); - result.append(CLOSE_BRACE); + if (strings != nullptr) { + for (int32_t i = 0; isize(); ++i) { + result.append(OPEN_BRACE); + _appendToPat(result, + *(const UnicodeString*) strings->elementAt(i), + escapeUnprintable); + result.append(CLOSE_BRACE); + } } return result.append(SET_CLOSE); } @@ -2162,13 +2160,12 @@ void UnicodeSet::releasePattern() { /** * Set the new pattern to cache. */ -void UnicodeSet::setPattern(const UnicodeString& newPat) { +void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) { releasePattern(); - int32_t newPatLen = newPat.length(); pat = (UChar *)uprv_malloc((newPatLen + 1) * sizeof(UChar)); if (pat) { patLen = newPatLen; - newPat.extractBetween(0, patLen, pat); + u_memcpy(pat, newPat, patLen); pat[patLen] = 0; } // else we don't care if malloc failed. This was just a nice cache. @@ -2177,30 +2174,15 @@ void UnicodeSet::setPattern(const UnicodeString& newPat) { UnicodeFunctor *UnicodeSet::freeze() { if(!isFrozen() && !isBogus()) { - // Do most of what compact() does before freezing because - // compact() will not work when the set is frozen. - // Small modification: Don't shrink if the savings would be tiny (<=GROW_EXTRA). - - // Delete buffer first to defragment memory less. - if (buffer != NULL) { - uprv_free(buffer); - buffer = NULL; - } - if (capacity > (len + GROW_EXTRA)) { - // Make the capacity equal to len or 1. - // We don't want to realloc of 0 size. - capacity = len + (len == 0); - list = (UChar32*) uprv_realloc(list, sizeof(UChar32) * capacity); - if (list == NULL) { // Check for memory allocation error. - setToBogus(); - return this; - } - } + compact(); // Optimize contains() and span() and similar functions. - if (!strings->isEmpty()) { + if (hasStrings()) { stringSpan = new UnicodeSetStringSpan(*this, *strings, UnicodeSetStringSpan::ALL); - if (stringSpan != NULL && !stringSpan->needsStringSpanUTF16()) { + if (stringSpan == nullptr) { + setToBogus(); + return this; + } else if (!stringSpan->needsStringSpanUTF16()) { // All strings are irrelevant for span() etc. because // all of each string's code points are contained in this set. // Do not check needsStringSpanUTF8() because UTF-8 has at most as @@ -2233,7 +2215,7 @@ int32_t UnicodeSet::span(const UChar *s, int32_t length, USetSpanCondition spanC } if(stringSpan!=NULL) { return stringSpan->span(s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF16_CONTAINED; @@ -2270,7 +2252,7 @@ int32_t UnicodeSet::spanBack(const UChar *s, int32_t length, USetSpanCondition s } if(stringSpan!=NULL) { return stringSpan->spanBack(s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF16_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF16_CONTAINED; @@ -2308,7 +2290,7 @@ int32_t UnicodeSet::spanUTF8(const char *s, int32_t length, USetSpanCondition sp } if(stringSpan!=NULL) { return stringSpan->spanUTF8((const uint8_t *)s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::FWD_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::FWD_UTF8_CONTAINED; @@ -2346,7 +2328,7 @@ int32_t UnicodeSet::spanBackUTF8(const char *s, int32_t length, USetSpanConditio } if(stringSpan!=NULL) { return stringSpan->spanBackUTF8((const uint8_t *)s, length, spanCondition); - } else if(!strings->isEmpty()) { + } else if(hasStrings()) { uint32_t which= spanCondition==USET_SPAN_NOT_CONTAINED ? UnicodeSetStringSpan::BACK_UTF8_NOT_CONTAINED : UnicodeSetStringSpan::BACK_UTF8_CONTAINED; diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index 97c7bc9d352ab9..882231ba1a5d5d 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -31,10 +31,6 @@ #include "util.h" #include "uvector.h" -// initial storage. Must be >= 0 -// *** same as in uniset.cpp ! *** -#define START_EXTRA 16 - U_NAMESPACE_BEGIN // TODO memory debugging provided inside uniset.cpp @@ -49,42 +45,16 @@ U_NAMESPACE_BEGIN UnicodeSet::UnicodeSet(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, options, symbols, status); - } - } + UErrorCode& status) { + applyPattern(pattern, options, symbols, status); _dbgct(this); } UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, uint32_t options, const SymbolTable* symbols, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, pos, options, symbols, status); - } - } + UErrorCode& status) { + applyPattern(pattern, pos, options, symbols, status); _dbgct(this); } @@ -199,7 +169,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { // start with input set to guarantee inclusion // USET_CASE: remove strings because the strings will actually be reduced (folded); // therefore, start with no strings and add only those needed - if (attribute & USET_CASE_INSENSITIVE) { + if ((attribute & USET_CASE_INSENSITIVE) && foldSet.hasStrings()) { foldSet.strings->removeAllElements(); } @@ -234,7 +204,7 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { } } } - if (strings != NULL && strings->size() > 0) { + if (hasStrings()) { if (attribute & USET_CASE_INSENSITIVE) { for (int32_t j=0; jsize(); ++j) { str = *(const UnicodeString *) strings->elementAt(j); diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index 1312de209802b5..6f7918a91ab9ed 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -47,10 +47,6 @@ U_NAMESPACE_USE -// initial storage. Must be >= 0 -// *** same as in uniset.cpp ! *** -#define START_EXTRA 16 - // Define UChar constants using hex for EBCDIC compatibility // Used #define to reduce private static exports and memory access time. #define SET_OPEN ((UChar)0x005B) /*[*/ @@ -185,21 +181,8 @@ isPOSIXClose(const UnicodeString &pattern, int32_t pos) { * @param pattern a string specifying what characters are in the set */ UnicodeSet::UnicodeSet(const UnicodeString& pattern, - UErrorCode& status) : - len(0), capacity(START_EXTRA), list(0), bmpSet(0), buffer(0), - bufferCapacity(0), patLen(0), pat(NULL), strings(NULL), stringSpan(NULL), - fFlags(0) -{ - if(U_SUCCESS(status)){ - list = (UChar32*) uprv_malloc(sizeof(UChar32) * capacity); - /* test for NULL */ - if(list == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - }else{ - allocateStrings(status); - applyPattern(pattern, status); - } - } + UErrorCode& status) { + applyPattern(pattern, status); _dbgct(this); } @@ -713,6 +696,11 @@ static UBool numericValueFilter(UChar32 ch, void* context) { return u_getNumericValue(ch) == *(double*)context; } +static UBool generalCategoryMaskFilter(UChar32 ch, void* context) { + int32_t value = *(int32_t*)context; + return (U_GET_GC_MASK((UChar32) ch) & value) != 0; +} + static UBool versionFilter(UChar32 ch, void* context) { static const UVersionInfo none = { 0, 0, 0, 0 }; UVersionInfo v; @@ -721,6 +709,16 @@ static UBool versionFilter(UChar32 ch, void* context) { return uprv_memcmp(&v, &none, sizeof(v)) > 0 && uprv_memcmp(&v, version, sizeof(v)) <= 0; } +typedef struct { + UProperty prop; + int32_t value; +} IntPropertyContext; + +static UBool intPropertyFilter(UChar32 ch, void* context) { + IntPropertyContext* c = (IntPropertyContext*)context; + return u_getIntPropertyValue((UChar32) ch, c->prop) == c->value; +} + static UBool scriptExtensionsFilter(UChar32 ch, void* context) { return uscript_hasScript(ch, *(UScriptCode*)context); } @@ -781,43 +779,6 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, namespace { -/** Maps map values to 1 if the mask contains their value'th bit, all others to 0. */ -uint32_t U_CALLCONV generalCategoryMaskFilter(const void *context, uint32_t value) { - uint32_t mask = *(const uint32_t *)context; - value = U_MASK(value) & mask; - if (value != 0) { value = 1; } - return value; -} - -/** Maps one map value to 1, all others to 0. */ -uint32_t U_CALLCONV intValueFilter(const void *context, uint32_t value) { - uint32_t v = *(const uint32_t *)context; - return value == v ? 1 : 0; -} - -} // namespace - -void UnicodeSet::applyIntPropertyValue(const UCPMap *map, - UCPMapValueFilter *filter, const void *context, - UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - clear(); - UChar32 start = 0, end; - uint32_t value; - while ((end = ucpmap_getRange(map, start, UCPMAP_RANGE_NORMAL, 0, - filter, context, &value)) >= 0) { - if (value != 0) { - add(start, end); - } - start = end + 1; - } - if (isBogus()) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } -} - -namespace { - static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { /* Note: we use ' ' in compiler code page */ int32_t j = 0; @@ -845,11 +806,10 @@ static UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { UnicodeSet& UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) { - if (U_FAILURE(ec)) { return *this; } - // All of the following check isFrozen() before modifying this set. + if (U_FAILURE(ec) || isFrozen()) { return *this; } if (prop == UCHAR_GENERAL_CATEGORY_MASK) { - const UCPMap *map = u_getIntPropertyMap(UCHAR_GENERAL_CATEGORY, &ec); - applyIntPropertyValue(map, generalCategoryMaskFilter, &value, ec); + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + applyFilter(generalCategoryMaskFilter, &value, inclusions, ec); } else if (prop == UCHAR_SCRIPT_EXTENSIONS) { const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); UScriptCode script = (UScriptCode)value; @@ -866,14 +826,11 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) clear(); } } else if (UCHAR_INT_START <= prop && prop < UCHAR_INT_LIMIT) { - const UCPMap *map = u_getIntPropertyMap(prop, &ec); - applyIntPropertyValue(map, intValueFilter, &value, ec); + const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); + IntPropertyContext c = {prop, value}; + applyFilter(intPropertyFilter, &c, inclusions, ec); } else { - // This code used to always call getInclusions(property source) - // which sets an error for an unsupported property. ec = U_ILLEGAL_ARGUMENT_ERROR; - // Otherwise we would just clear() this set because - // getIntPropertyValue(c, prop) returns 0 for all code points. } return *this; } diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index ff85734d615efa..31b0ed84bee07d 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -309,8 +309,7 @@ UnicodeString::UnicodeString(const UnicodeString& that) { } UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT { - fUnion.fFields.fLengthAndFlags = kShortString; - moveFrom(src); + copyFieldsFrom(src, TRUE); } UnicodeString::UnicodeString(const UnicodeString& that, @@ -572,7 +571,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { return *this; } -UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT { +UnicodeString &UnicodeString::operator=(UnicodeString &&src) U_NOEXCEPT { // No explicit check for self move assignment, consistent with standard library. // Self move assignment causes no crash nor leak but might make the object bogus. releaseArray(); @@ -580,7 +579,7 @@ UnicodeString &UnicodeString::moveFrom(UnicodeString &src) U_NOEXCEPT { return *this; } -// Same as moveFrom() except without memory management. +// Same as move assignment except without memory management. void UnicodeString::copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) U_NOEXCEPT { int16_t lengthAndFlags = fUnion.fFields.fLengthAndFlags = src.fUnion.fFields.fLengthAndFlags; if(lengthAndFlags & kUsingStackBuffer) { diff --git a/deps/icu-small/source/common/uobject.cpp b/deps/icu-small/source/common/uobject.cpp index 1133dd9b67aaa6..e222b2ce9b9096 100644 --- a/deps/icu-small/source/common/uobject.cpp +++ b/deps/icu-small/source/common/uobject.cpp @@ -58,32 +58,32 @@ U_NAMESPACE_BEGIN * and replace with uprv_malloc/uprv_free. */ -void * U_EXPORT2 UMemory::operator new(size_t size) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new(size_t size) U_NOEXCEPT { return uprv_malloc(size); } -void U_EXPORT2 UMemory::operator delete(void *p) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete(void *p) U_NOEXCEPT { if(p!=NULL) { uprv_free(p); } } -void * U_EXPORT2 UMemory::operator new[](size_t size) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new[](size_t size) U_NOEXCEPT { return uprv_malloc(size); } -void U_EXPORT2 UMemory::operator delete[](void *p) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete[](void *p) U_NOEXCEPT { if(p!=NULL) { uprv_free(p); } } #if U_HAVE_DEBUG_LOCATION_NEW -void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NO_THROW { +void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NOEXCEPT { return UMemory::operator new(size); } -void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NO_THROW { +void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NOEXCEPT { UMemory::operator delete(p); } #endif /* U_HAVE_DEBUG_LOCATION_NEW */ diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 2421c15d2bd0b6..7d99675220eb5f 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -26,23 +26,131 @@ #include "unicode/utypes.h" #include "unicode/uchar.h" #include "unicode/ucptrie.h" +#include "unicode/udata.h" #include "unicode/unorm2.h" #include "unicode/uscript.h" #include "unicode/ustring.h" #include "cstring.h" +#include "mutex.h" #include "normalizer2impl.h" #include "umutex.h" #include "ubidi_props.h" #include "uprops.h" #include "ucase.h" +#include "ucln_cmn.h" +#include "ulayout_props.h" #include "ustr_imp.h" -// ulayout_props_data.h is machine-generated by genprops -#define INCLUDED_FROM_UPROPS_CPP -#include "ulayout_props_data.h" - U_NAMESPACE_USE +// Unicode text layout properties data ----------------------------------------- + +namespace { + +icu::UInitOnce gLayoutInitOnce = U_INITONCE_INITIALIZER; +UDataMemory *gLayoutMemory = nullptr; + +UCPTrie *gInpcTrie = nullptr; // Indic_Positional_Category +UCPTrie *gInscTrie = nullptr; // Indic_Syllabic_Category +UCPTrie *gVoTrie = nullptr; // Vertical_Orientation + +int32_t gMaxInpcValue = 0; +int32_t gMaxInscValue = 0; +int32_t gMaxVoValue = 0; + +UBool U_CALLCONV uprops_cleanup() { + udata_close(gLayoutMemory); + gLayoutMemory = nullptr; + + ucptrie_close(gInpcTrie); + gInpcTrie = nullptr; + ucptrie_close(gInscTrie); + gInscTrie = nullptr; + ucptrie_close(gVoTrie); + gVoTrie = nullptr; + + gMaxInpcValue = 0; + gMaxInscValue = 0; + gMaxVoValue = 0; + + gLayoutInitOnce.reset(); + return TRUE; +} + +UBool U_CALLCONV +ulayout_isAcceptable(void * /*context*/, + const char * /* type */, const char * /*name*/, + const UDataInfo *pInfo) { + return pInfo->size >= 20 && + pInfo->isBigEndian == U_IS_BIG_ENDIAN && + pInfo->charsetFamily == U_CHARSET_FAMILY && + pInfo->dataFormat[0] == ULAYOUT_FMT_0 && + pInfo->dataFormat[1] == ULAYOUT_FMT_1 && + pInfo->dataFormat[2] == ULAYOUT_FMT_2 && + pInfo->dataFormat[3] == ULAYOUT_FMT_3 && + pInfo->formatVersion[0] == 1; +} + +// UInitOnce singleton initialization function +void U_CALLCONV ulayout_load(UErrorCode &errorCode) { + gLayoutMemory = udata_openChoice( + nullptr, ULAYOUT_DATA_TYPE, ULAYOUT_DATA_NAME, + ulayout_isAcceptable, nullptr, &errorCode); + if (U_FAILURE(errorCode)) { return; } + + const uint8_t *inBytes = (const uint8_t *)udata_getMemory(gLayoutMemory); + const int32_t *inIndexes = (const int32_t *)inBytes; + int32_t indexesLength = inIndexes[ULAYOUT_IX_INDEXES_LENGTH]; + if (indexesLength < 12) { + errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes. + return; + } + int32_t offset = indexesLength * 4; + int32_t top = inIndexes[ULAYOUT_IX_INPC_TRIE_TOP]; + int32_t trieSize = top - offset; + if (trieSize >= 16) { + gInpcTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + offset = top; + top = inIndexes[ULAYOUT_IX_INSC_TRIE_TOP]; + trieSize = top - offset; + if (trieSize >= 16) { + gInscTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + offset = top; + top = inIndexes[ULAYOUT_IX_VO_TRIE_TOP]; + trieSize = top - offset; + if (trieSize >= 16) { + gVoTrie = ucptrie_openFromBinary( + UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY, + inBytes + offset, trieSize, nullptr, &errorCode); + } + + uint32_t maxValues = inIndexes[ULAYOUT_IX_MAX_VALUES]; + gMaxInpcValue = maxValues >> ULAYOUT_MAX_INPC_SHIFT; + gMaxInscValue = (maxValues >> ULAYOUT_MAX_INSC_SHIFT) & 0xff; + gMaxVoValue = (maxValues >> ULAYOUT_MAX_VO_SHIFT) & 0xff; + + ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup); +} + +UBool ulayout_ensureData(UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + umtx_initOnce(gLayoutInitOnce, &ulayout_load, errorCode); + return U_SUCCESS(errorCode); +} + +UBool ulayout_ensureData() { + UErrorCode errorCode = U_ZERO_ERROR; + return ulayout_ensureData(errorCode); +} + +} // namespace + /* general properties API functions ----------------------------------------- */ struct BinaryProperty; @@ -434,15 +542,29 @@ static int32_t getTrailCombiningClass(const IntProperty &/*prop*/, UChar32 c, UP #endif static int32_t getInPC(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&inpc_trie, c); + return ulayout_ensureData() && gInpcTrie != nullptr ? ucptrie_get(gInpcTrie, c) : 0; } static int32_t getInSC(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&insc_trie, c); + return ulayout_ensureData() && gInscTrie != nullptr ? ucptrie_get(gInscTrie, c) : 0; } static int32_t getVo(const IntProperty &, UChar32 c, UProperty) { - return ucptrie_get(&vo_trie, c); + return ulayout_ensureData() && gVoTrie != nullptr ? ucptrie_get(gVoTrie, c) : 0; +} + +static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) { + if (!ulayout_ensureData()) { return 0; } + switch (which) { + case UCHAR_INDIC_POSITIONAL_CATEGORY: + return gMaxInpcValue; + case UCHAR_INDIC_SYLLABIC_CATEGORY: + return gMaxInscValue; + case UCHAR_VERTICAL_ORIENTATION: + return gMaxVoValue; + default: + return 0; + } } static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ @@ -480,9 +602,9 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={ { 2, UPROPS_SB_MASK, UPROPS_SB_SHIFT, defaultGetValue, defaultGetMaxValue }, { 2, UPROPS_WB_MASK, UPROPS_WB_SHIFT, defaultGetValue, defaultGetMaxValue }, { UPROPS_SRC_BIDI, 0, 0, getBiDiPairedBracketType, biDiGetMaxValue }, - { UPROPS_SRC_INPC, 0, maxInPCValue, getInPC, getMaxValueFromShift }, - { UPROPS_SRC_INSC, 0, maxInSCValue, getInSC, getMaxValueFromShift }, - { UPROPS_SRC_VO, 0, maxVoValue, getVo, getMaxValueFromShift }, + { UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue }, + { UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue }, + { UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue }, }; U_CAPI int32_t U_EXPORT2 @@ -586,23 +708,28 @@ uprops_getSource(UProperty which) { U_CFUNC void U_EXPORT2 uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *pErrorCode) { - if (U_FAILURE(*pErrorCode)) { return; } + if (!ulayout_ensureData(*pErrorCode)) { return; } const UCPTrie *trie; switch (src) { case UPROPS_SRC_INPC: - trie = &inpc_trie; + trie = gInpcTrie; break; case UPROPS_SRC_INSC: - trie = &insc_trie; + trie = gInscTrie; break; case UPROPS_SRC_VO: - trie = &vo_trie; + trie = gVoTrie; break; default: *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; return; } + if (trie == nullptr) { + *pErrorCode = U_MISSING_RESOURCE_ERROR; + return; + } + // Add the start code point of each same-value range of the trie. UChar32 start = 0, end; while ((end = ucptrie_getRange(trie, start, UCPMAP_RANGE_NORMAL, 0, diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index 1a8e4e84f7445d..c7d648694ee5c3 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -95,8 +95,15 @@ enum { * denominator: den = 20<<(frac20>>2) */ UPROPS_NTV_FRACTION20_START=UPROPS_NTV_BASE60_START+36, // 0x300+9*4=0x324 + /** + * Fraction-32 values: + * frac32 = ntv-0x34c = 0..15 -> 1|3|5|7 / 32|64|128|256 + * numerator: num = 2*(frac32&3)+1 + * denominator: den = 32<<(frac32>>2) + */ + UPROPS_NTV_FRACTION32_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c /** No numeric value (yet). */ - UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c + UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION32_START+16, // 0x34c+4*4=0x35c UPROPS_NTV_MAX_SMALL_INT=UPROPS_NTV_FRACTION_START-UPROPS_NTV_NUMERIC_START-1 }; @@ -462,7 +469,6 @@ class UnicodeSet; class CharacterProperties { public: CharacterProperties() = delete; - static void U_CALLCONV initInclusion(UPropertySource src, UErrorCode &errorCode); static const UnicodeSet *getInclusionsForProperty(UProperty prop, UErrorCode &errorCode); }; diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 3da73421c0cfb7..c9f2c860da7c33 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -21,6 +21,7 @@ ****************************************************************************** */ +#include "unicode/ures.h" #include "unicode/ustring.h" #include "unicode/ucnv.h" #include "charstr.h" @@ -48,7 +49,10 @@ TODO: This cache should probably be removed when the deprecated code is static UHashtable *cache = NULL; static icu::UInitOnce gCacheInitOnce; -static UMutex resbMutex = U_MUTEX_INITIALIZER; +static UMutex *resbMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /* INTERNAL: hashes an entry */ static int32_t U_CALLCONV hashEntry(const UHashTok parm) { @@ -92,13 +96,13 @@ static UBool chopLocale(char *name) { * Internal function */ static void entryIncrease(UResourceDataEntry *entry) { - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); entry->fCountExisting++; while(entry->fParent != NULL) { entry = entry->fParent; entry->fCountExisting++; } - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); } /** @@ -180,9 +184,9 @@ static int32_t ures_flushCache() /*if shared data hasn't even been lazy evaluated yet * return 0 */ - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); if (cache == NULL) { - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return 0; } @@ -214,7 +218,7 @@ static int32_t ures_flushCache() * got decremented by free_entry(). */ } while(deletedMore); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return rbDeletedNum; } @@ -228,9 +232,9 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) { const UHashElement *e; UResourceDataEntry *resB; - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); if (cache == NULL) { - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); fprintf(stderr,"%s:%d: RB Cache is NULL.\n", __FILE__, __LINE__); return FALSE; } @@ -250,7 +254,7 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void) { fprintf(stderr,"%s:%d: RB Cache still contains %d items.\n", __FILE__, __LINE__, uhash_count(cache)); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return cacheNotEmpty; } @@ -488,6 +492,9 @@ findFirstExisting(const char* path, char* name, /*Fallback data stuff*/ *hasChopped = chopLocale(name); + if (*hasChopped && *name == '\0') { + uprv_strcpy(name, "und"); + } } return r; } @@ -512,6 +519,18 @@ U_CFUNC void ures_initStackObject(UResourceBundle* resB) { ures_setIsStackObject(resB, TRUE); } +U_NAMESPACE_BEGIN + +StackUResourceBundle::StackUResourceBundle() { + ures_initStackObject(&bundle); +} + +StackUResourceBundle::~StackUResourceBundle() { + ures_close(&bundle); +} + +U_NAMESPACE_END + static UBool // returns U_SUCCESS(*status) loadParentsExceptRoot(UResourceDataEntry *&t1, char name[], int32_t nameCapacity, @@ -647,7 +666,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); { /* umtx_lock */ /* We're going to skip all the locales that do not have any data */ r = findFirstExisting(path, name, &isRoot, &hasChopped, &isDefault, &intStatus); @@ -746,7 +765,7 @@ static UResourceDataEntry *entryOpen(const char* path, const char* localeID, } } /* umtx_lock */ finishUnlock: - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); if(U_SUCCESS(*status)) { if(intStatus != U_ZERO_ERROR) { @@ -771,7 +790,7 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) { return NULL; } - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); // findFirstExisting() without fallbacks. UResourceDataEntry *r = init_entry(localeID, path, status); if(U_SUCCESS(*status)) { @@ -809,7 +828,7 @@ entryOpenDirect(const char* path, const char* localeID, UErrorCode* status) { t1 = t1->fParent; } } - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); return r; } @@ -852,9 +871,9 @@ static void entryCloseInt(UResourceDataEntry *resB) { */ static void entryClose(UResourceDataEntry *resB) { - umtx_lock(&resbMutex); + umtx_lock(resbMutex()); entryCloseInt(resB); - umtx_unlock(&resbMutex); + umtx_unlock(resbMutex()); } /* @@ -1110,7 +1129,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, UResourceDataEntry *dataEntry = mainRes->fData; char stackPath[URES_MAX_BUFFER_SIZE]; char *pathBuf = stackPath, *myPath = pathBuf; - if(uprv_strlen(keyPath) > URES_MAX_BUFFER_SIZE) { + if(uprv_strlen(keyPath) >= UPRV_LENGTHOF(stackPath)) { pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char)); if(pathBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -2300,11 +2319,13 @@ ures_openDirect(const char* path, const char* localeID, UErrorCode* status) { } /** - * API: This function is used to open a resource bundle + * Internal API: This function is used to open a resource bundle * proper fallback chaining is executed while initialization. * The result is stored in cache for later fallback search. + * + * Same as ures_open(), but uses the fill-in parameter and does not allocate a new bundle. */ -U_CAPI void U_EXPORT2 +U_INTERNAL void U_EXPORT2 ures_openFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) { if(U_SUCCESS(*status) && r == NULL) { @@ -2314,6 +2335,18 @@ ures_openFillIn(UResourceBundle *r, const char* path, ures_openWithType(r, path, localeID, URES_OPEN_LOCALE_DEFAULT_ROOT, status); } +/** + * Same as ures_openDirect(), but uses the fill-in parameter and does not allocate a new bundle. + */ +U_INTERNAL void U_EXPORT2 +ures_openDirectFillIn(UResourceBundle *r, const char* path, const char* localeID, UErrorCode* status) { + if(U_SUCCESS(*status) && r == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + ures_openWithType(r, path, localeID, URES_OPEN_DIRECT, status); +} + /** * API: Counts members. For arrays and tables, returns number of resources. * For strings, returns 1. diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index e4f75c9f115d0e..16144012a5bc0d 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -11,6 +11,7 @@ #define URESIMP_H #include "unicode/ures.h" +#include "unicode/utypes.h" #include "uresdata.h" @@ -82,6 +83,60 @@ struct UResourceBundle { U_CAPI void U_EXPORT2 ures_initStackObject(UResourceBundle* resB); +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +/** + * \class StackUResourceBundle + * "Smart pointer" like class, closes a UResourceBundle via ures_close(). + * + * This code: + * + * StackUResourceBundle bundle; + * foo(bundle.getAlias()); + * + * Is equivalent to this code: + * + * UResourceBundle bundle; + * ures_initStackObject(&bundle); + * foo(&bundle); + * ures_close(&bundle); + * + * @see LocalUResourceBundlePointer + * @internal + */ +class U_COMMON_API StackUResourceBundle { +public: + // No heap allocation. Use only on the stack. + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif + + StackUResourceBundle(); + ~StackUResourceBundle(); + + UResourceBundle* getAlias() { return &bundle; } + + UResourceBundle& ref() { return bundle; } + const UResourceBundle& ref() const { return bundle; } + + StackUResourceBundle(const StackUResourceBundle&) = delete; + StackUResourceBundle& operator=(const StackUResourceBundle&) = delete; + + StackUResourceBundle(StackUResourceBundle&&) = delete; + StackUResourceBundle& operator=(StackUResourceBundle&&) = delete; + +private: + UResourceBundle bundle; +}; + +U_NAMESPACE_END + +#endif /* __cplusplus */ + /** * Opens a resource bundle for the locale; * if there is not even a base language bundle, then loads the root bundle; @@ -275,4 +330,27 @@ U_CAPI const char* U_EXPORT2 ures_getLocaleInternal(const UResourceBundle* resourceBundle, UErrorCode* status); +/** + * Same as ures_openDirect() but uses the fill-in parameter instead of allocating a new bundle. + * + * @param r The existing UResourceBundle to fill in. If NULL then status will be + * set to U_ILLEGAL_ARGUMENT_ERROR. + * @param packageName The packageName and locale together point to an ICU udata object, + * as defined by udata_open( packageName, "res", locale, err) + * or equivalent. Typically, packageName will refer to a (.dat) file, or to + * a package registered with udata_setAppData(). Using a full file or directory + * pathname for packageName is deprecated. If NULL, ICU data will be used. + * @param locale specifies the locale for which we want to open the resource + * if NULL, the default locale will be used. If strlen(locale) == 0 + * root locale will be used. + * @param status The error code. + * @see ures_openDirect + * @internal + */ +U_CAPI void U_EXPORT2 +ures_openDirectFillIn(UResourceBundle *r, + const char *packageName, + const char *locale, + UErrorCode *status); + #endif /*URESIMP_H*/ diff --git a/deps/icu-small/source/common/uscript.cpp b/deps/icu-small/source/common/uscript.cpp index 83b5f7ef168f7e..98528c158b4387 100644 --- a/deps/icu-small/source/common/uscript.cpp +++ b/deps/icu-small/source/common/uscript.cpp @@ -18,8 +18,11 @@ #include "unicode/uchar.h" #include "unicode/uscript.h" #include "unicode/uloc.h" +#include "bytesinkutil.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "ulocimp.h" static const UScriptCode JAPANESE[3] = { USCRIPT_KATAKANA, USCRIPT_HIRAGANA, USCRIPT_HAN }; static const UScriptCode KOREAN[2] = { USCRIPT_HANGUL, USCRIPT_HAN }; @@ -98,7 +101,6 @@ uscript_getCode(const char* nameOrAbbrOrLocale, int32_t capacity, UErrorCode* err){ UBool triedCode; - char likely[ULOC_FULLNAME_CAPACITY]; UErrorCode internalErrorCode; int32_t length; @@ -125,10 +127,13 @@ uscript_getCode(const char* nameOrAbbrOrLocale, if(U_FAILURE(*err) || length != 0) { return length; } - (void)uloc_addLikelySubtags(nameOrAbbrOrLocale, - likely, UPRV_LENGTHOF(likely), &internalErrorCode); + icu::CharString likely; + { + icu::CharStringByteSink sink(&likely); + ulocimp_addLikelySubtags(nameOrAbbrOrLocale, sink, &internalErrorCode); + } if(U_SUCCESS(internalErrorCode) && internalErrorCode != U_STRING_NOT_TERMINATED_WARNING) { - length = getCodesFromLocale(likely, fillIn, capacity, err); + length = getCodesFromLocale(likely.data(), fillIn, capacity, err); if(U_FAILURE(*err) || length != 0) { return length; } diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index bfdb68c7a9c998..ee120b4ca1d34a 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -229,6 +229,10 @@ const int32_t SCRIPT_PROPS[] = { 0x10D12 | LIMITED_USE | RTL, // Rohg 0x10F42 | EXCLUSION | RTL, // Sogd 0x10F19 | EXCLUSION | RTL, // Sogo + 0x10FF1 | EXCLUSION | RTL, // Elym + 0x1E108 | LIMITED_USE, // Hmnp + 0x119CE | EXCLUSION, // Nand + 0x1E2E1 | LIMITED_USE, // Wcho // End copy-paste from parsescriptmetadata.py }; diff --git a/deps/icu-small/source/common/uset.cpp b/deps/icu-small/source/common/uset.cpp index 75ff5ddff52d1a..265a300b19060c 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -249,7 +249,7 @@ class USetAccess /* not : public UObject because all methods are static */ { public: /* Try to have the compiler inline these*/ inline static int32_t getStringCount(const UnicodeSet& set) { - return set.getStringCount(); + return set.stringsSize(); } inline static const UnicodeString* getString(const UnicodeSet& set, int32_t i) { diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index 5d5d3c4e3d6200..5c9780548c182d 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -116,7 +116,7 @@ void UnicodeSetIterator::reset() { stringCount = 0; } else { endRange = set->getRangeCount() - 1; - stringCount = set->strings->size(); + stringCount = set->stringsSize(); } range = 0; endElement = -1; diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index 1e54e6cab59eb2..9155ae077b3497 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -47,7 +47,10 @@ Static cache for already opened StringPrep profiles static UHashtable *SHARED_DATA_HASHTABLE = NULL; static icu::UInitOnce gSharedDataInitOnce; -static UMutex usprepMutex = U_MUTEX_INITIALIZER; +static UMutex *usprepMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /* format version of spp file */ //static uint8_t formatVersion[4]={ 0, 0, 0, 0 }; @@ -148,9 +151,9 @@ usprep_internal_flushCache(UBool noRefCount){ * if shared data hasn't even been lazy evaluated yet * return 0 */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); if (SHARED_DATA_HASHTABLE == NULL) { - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); return 0; } @@ -181,7 +184,7 @@ usprep_internal_flushCache(UBool noRefCount){ } } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); return deletedNum; } @@ -259,7 +262,7 @@ loadData(UStringPrepProfile* profile, } /* in the mutex block, set the data for this process */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); if(profile->sprepData==NULL) { profile->sprepData=dataMemory; dataMemory=NULL; @@ -268,7 +271,7 @@ loadData(UStringPrepProfile* profile, } else { p=(const int32_t *)udata_getMemory(profile->sprepData); } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); /* initialize some variables */ profile->mappingData=(uint16_t *)((uint8_t *)(p+_SPREP_INDEX_TOP)+profile->indexes[_SPREP_INDEX_TRIE_SIZE]); @@ -325,12 +328,12 @@ usprep_getProfile(const char* path, stackKey.path = (char*) path; /* fetch the data from the cache */ - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); if(profile != NULL) { profile->refCount++; } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); if(profile == NULL) { /* else load the data and put the data in the cache */ @@ -362,7 +365,7 @@ usprep_getProfile(const char* path, return NULL; } - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); // If another thread already inserted the same key/value, refcount and cleanup our thread data profile = (UStringPrepProfile*) (uhash_get(SHARED_DATA_HASHTABLE,&stackKey)); if(profile != NULL) { @@ -383,7 +386,7 @@ usprep_getProfile(const char* path, profile->refCount = 1; uhash_put(SHARED_DATA_HASHTABLE, key.orphan(), profile, status); } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); } return profile; @@ -422,12 +425,12 @@ usprep_close(UStringPrepProfile* profile){ return; } - umtx_lock(&usprepMutex); + umtx_lock(usprepMutex()); /* decrement the ref count*/ if(profile->refCount > 0){ profile->refCount--; } - umtx_unlock(&usprepMutex); + umtx_unlock(usprepMutex()); } diff --git a/deps/icu-small/source/common/ustr_cnv.cpp b/deps/icu-small/source/common/ustr_cnv.cpp index eb37232c25d50b..d2c2afea1592b3 100644 --- a/deps/icu-small/source/common/ustr_cnv.cpp +++ b/deps/icu-small/source/common/ustr_cnv.cpp @@ -40,14 +40,14 @@ u_getDefaultConverter(UErrorCode *status) UConverter *converter = NULL; if (gDefaultConverter != NULL) { - umtx_lock(NULL); + icu::umtx_lock(NULL); /* need to check to make sure it wasn't taken out from under us */ if (gDefaultConverter != NULL) { converter = gDefaultConverter; gDefaultConverter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } /* if the cache was empty, create a converter */ @@ -70,12 +70,12 @@ u_releaseDefaultConverter(UConverter *converter) ucnv_reset(converter); } ucnv_enableCleanup(); - umtx_lock(NULL); + icu::umtx_lock(NULL); if(gDefaultConverter == NULL) { gDefaultConverter = converter; converter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } if(converter != NULL) { @@ -89,14 +89,14 @@ u_flushDefaultConverter() UConverter *converter = NULL; if (gDefaultConverter != NULL) { - umtx_lock(NULL); + icu::umtx_lock(NULL); /* need to check to make sure it wasn't taken out from under us */ if (gDefaultConverter != NULL) { converter = gDefaultConverter; gDefaultConverter = NULL; } - umtx_unlock(NULL); + icu::umtx_unlock(NULL); } /* if the cache was populated, flush it */ diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 89888cf336b0e9..056b40eb4175f6 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -77,13 +77,7 @@ UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; } CharacterIterator &WholeStringBreakIterator::getText() const { - U_ASSERT(FALSE); // really should not be called - // Returns a null reference. - // Otherwise we would have to define a dummy CharacterIterator, - // and either have it as a field and const_cast it to a non-const reference, - // or have it via a pointer and return a reference to that. - CharacterIterator *none = nullptr; - return *none; + UPRV_UNREACHABLE; // really should not be called } UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const { if (U_SUCCESS(errorCode)) { @@ -105,10 +99,8 @@ void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { } } } -void WholeStringBreakIterator::adoptText(CharacterIterator* it) { - U_ASSERT(FALSE); // should not be called - length = it->getLength(); - delete it; +void WholeStringBreakIterator::adoptText(CharacterIterator*) { + UPRV_UNREACHABLE; // should not be called } int32_t WholeStringBreakIterator::first() { return 0; } diff --git a/deps/icu-small/source/common/utrace.cpp b/deps/icu-small/source/common/utrace.cpp index 7d0ddc6f8b0339..01bdb38e907518 100644 --- a/deps/icu-small/source/common/utrace.cpp +++ b/deps/icu-small/source/common/utrace.cpp @@ -67,8 +67,7 @@ utrace_exit(int32_t fnNumber, int32_t returnType, ...) { fmt = gExitFmtPtrStatus; break; default: - U_ASSERT(FALSE); - fmt = gExitFmt; + UPRV_UNREACHABLE; } va_start(args, returnType); diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 80e09c9c26b3e1..8de824cc3d48cb 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -309,6 +309,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) { trie=(UTrie2 *)uprv_malloc(sizeof(UTrie2)); if(trie==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return NULL; } uprv_memcpy(trie, other, sizeof(UTrie2)); @@ -333,6 +334,7 @@ utrie2_clone(const UTrie2 *other, UErrorCode *pErrorCode) { } if(trie->memory==NULL && trie->newTrie==NULL) { + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; uprv_free(trie); trie=NULL; } diff --git a/deps/icu-small/source/common/uvector.h b/deps/icu-small/source/common/uvector.h index ad75e23400aa9b..a7625cd01ac59a 100644 --- a/deps/icu-small/source/common/uvector.h +++ b/deps/icu-small/source/common/uvector.h @@ -142,19 +142,19 @@ class U_COMMON_API UVector : public UObject { UBool equals(const UVector &other) const; - void* firstElement(void) const; + inline void* firstElement(void) const; - void* lastElement(void) const; + inline void* lastElement(void) const; - int32_t lastElementi(void) const; + inline int32_t lastElementi(void) const; int32_t indexOf(void* obj, int32_t startIndex = 0) const; int32_t indexOf(int32_t obj, int32_t startIndex = 0) const; - UBool contains(void* obj) const; + inline UBool contains(void* obj) const; - UBool contains(int32_t obj) const; + inline UBool contains(int32_t obj) const; UBool containsAll(const UVector& other) const; @@ -168,9 +168,9 @@ class U_COMMON_API UVector : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; - UBool isEmpty(void) const; + inline UBool isEmpty(void) const; UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status); @@ -195,7 +195,7 @@ class U_COMMON_API UVector : public UObject { UElementsAreEqual *setComparer(UElementsAreEqual *c); - void* operator[](int32_t index) const; + inline void* operator[](int32_t index) const; /** * Removes the element at the given index from this vector and @@ -309,19 +309,19 @@ class U_COMMON_API UStack : public UVector { // It's okay not to have a virtual destructor (in UVector) // because UStack has no special cleanup to do. - UBool empty(void) const; + inline UBool empty(void) const; - void* peek(void) const; + inline void* peek(void) const; - int32_t peeki(void) const; + inline int32_t peeki(void) const; void* pop(void); int32_t popi(void); - void* push(void* obj, UErrorCode &status); + inline void* push(void* obj, UErrorCode &status); - int32_t push(int32_t i, UErrorCode &status); + inline int32_t push(int32_t i, UErrorCode &status); /* If the object o occurs as an item in this stack, diff --git a/deps/icu-small/source/common/uvectr32.h b/deps/icu-small/source/common/uvectr32.h index 3174e94c9f55a9..91a2dd2009eecb 100644 --- a/deps/icu-small/source/common/uvectr32.h +++ b/deps/icu-small/source/common/uvectr32.h @@ -97,21 +97,21 @@ class U_COMMON_API UVector32 : public UObject { // java.util.Vector API //------------------------------------------------------------ - void addElement(int32_t elem, UErrorCode &status); + inline void addElement(int32_t elem, UErrorCode &status); void setElementAt(int32_t elem, int32_t index); void insertElementAt(int32_t elem, int32_t index, UErrorCode &status); - int32_t elementAti(int32_t index) const; + inline int32_t elementAti(int32_t index) const; UBool equals(const UVector32 &other) const; - int32_t lastElementi(void) const; + inline int32_t lastElementi(void) const; int32_t indexOf(int32_t elem, int32_t startIndex = 0) const; - UBool contains(int32_t elem) const; + inline UBool contains(int32_t elem) const; UBool containsAll(const UVector32& other) const; @@ -123,9 +123,9 @@ class U_COMMON_API UVector32 : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; - UBool isEmpty(void) const; + inline UBool isEmpty(void) const; // Inline. Use this one for speedy size check. inline UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status); @@ -163,7 +163,7 @@ class U_COMMON_API UVector32 : public UObject { /** * Returns a pointer to the internal array holding the vector. */ - int32_t *getBuffer() const; + inline int32_t *getBuffer() const; /** * Set the maximum allowed buffer capacity for this vector/stack. @@ -197,16 +197,16 @@ class U_COMMON_API UVector32 : public UObject { // In the original UVector, these were in a separate derived class, UStack. // Here in UVector32, they are all together. public: - UBool empty(void) const; // TODO: redundant, same as empty(). Remove it? + inline UBool empty(void) const; // TODO: redundant, same as empty(). Remove it? - int32_t peeki(void) const; + inline int32_t peeki(void) const; - int32_t popi(void); + inline int32_t popi(void); - int32_t push(int32_t i, UErrorCode &status); + inline int32_t push(int32_t i, UErrorCode &status); - int32_t *reserveBlock(int32_t size, UErrorCode &status); - int32_t *popFrame(int32_t size); + inline int32_t *reserveBlock(int32_t size, UErrorCode &status); + inline int32_t *popFrame(int32_t size); }; diff --git a/deps/icu-small/source/common/uvectr64.h b/deps/icu-small/source/common/uvectr64.h index 1db4a1fe2ea3c4..6d26863eabc00d 100644 --- a/deps/icu-small/source/common/uvectr64.h +++ b/deps/icu-small/source/common/uvectr64.h @@ -96,17 +96,17 @@ class U_COMMON_API UVector64 : public UObject { // subset of java.util.Vector API //------------------------------------------------------------ - void addElement(int64_t elem, UErrorCode &status); + inline void addElement(int64_t elem, UErrorCode &status); void setElementAt(int64_t elem, int32_t index); void insertElementAt(int64_t elem, int32_t index, UErrorCode &status); - int64_t elementAti(int32_t index) const; + inline int64_t elementAti(int32_t index) const; //UBool equals(const UVector64 &other) const; - int64_t lastElementi(void) const; + inline int64_t lastElementi(void) const; //int32_t indexOf(int64_t elem, int32_t startIndex = 0) const; @@ -122,7 +122,7 @@ class U_COMMON_API UVector64 : public UObject { void removeAllElements(); - int32_t size(void) const; + inline int32_t size(void) const; inline UBool isEmpty(void) const { return count == 0; } @@ -152,7 +152,7 @@ class U_COMMON_API UVector64 : public UObject { /** * Returns a pointer to the internal array holding the vector. */ - int64_t *getBuffer() const; + inline int64_t *getBuffer() const; /** * Set the maximum allowed buffer capacity for this vector/stack. @@ -190,12 +190,12 @@ class U_COMMON_API UVector64 : public UObject { //int64_t peeki(void) const; - int64_t popi(void); + inline int64_t popi(void); - int64_t push(int64_t i, UErrorCode &status); + inline int64_t push(int64_t i, UErrorCode &status); - int64_t *reserveBlock(int32_t size, UErrorCode &status); - int64_t *popFrame(int32_t size); + inline int64_t *reserveBlock(int32_t size, UErrorCode &status); + inline int64_t *popFrame(int32_t size); }; diff --git a/deps/icu-small/source/common/wintz.cpp b/deps/icu-small/source/common/wintz.cpp index 764d99d06b30e7..115512e704cced 100644 --- a/deps/icu-small/source/common/wintz.cpp +++ b/deps/icu-small/source/common/wintz.cpp @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN -// The value of MAX_TIMEZONE_ID_LENGTH is 128, which is defined in DYNAMIC_TIME_ZONE_INFORMATION +// The max size of TimeZoneKeyName is 128, defined in DYNAMIC_TIME_ZONE_INFORMATION #define MAX_TIMEZONE_ID_LENGTH 128 /** @@ -44,7 +44,7 @@ U_NAMESPACE_BEGIN * Note: We use the Win32 API GetDynamicTimeZoneInformation to get the current time zone info. * This API returns a non-localized time zone name, which we can then map to an ICU time zone name. */ -U_CFUNC const char* U_EXPORT2 +U_INTERNAL const char* U_EXPORT2 uprv_detectWindowsTimeZone() { UErrorCode status = U_ZERO_ERROR; @@ -79,26 +79,25 @@ uprv_detectWindowsTimeZone() // convert from wchar_t* (UTF-16 on Windows) to char* (UTF-8). u_strToUTF8(dynamicTZKeyName, UPRV_LENGTHOF(dynamicTZKeyName), nullptr, - reinterpret_cast(dynamicTZI.TimeZoneKeyName), UPRV_LENGTHOF(dynamicTZI.TimeZoneKeyName), &status); + reinterpret_cast(dynamicTZI.TimeZoneKeyName), -1, &status); if (U_FAILURE(status)) { return nullptr; } if (dynamicTZI.TimeZoneKeyName[0] != 0) { - UResourceBundle winTZ; - ures_initStackObject(&winTZ); - ures_getByKey(bundle.getAlias(), dynamicTZKeyName, &winTZ, &status); + StackUResourceBundle winTZ; + ures_getByKey(bundle.getAlias(), dynamicTZKeyName, winTZ.getAlias(), &status); if (U_SUCCESS(status)) { const UChar* icuTZ = nullptr; if (errorCode != 0) { - icuTZ = ures_getStringByKey(&winTZ, ISOcode, &len, &status); + icuTZ = ures_getStringByKey(winTZ.getAlias(), ISOcode, &len, &status); } if (errorCode == 0 || icuTZ == nullptr) { /* fallback to default "001" and reset status */ status = U_ZERO_ERROR; - icuTZ = ures_getStringByKey(&winTZ, "001", &len, &status); + icuTZ = ures_getStringByKey(winTZ.getAlias(), "001", &len, &status); } if (U_SUCCESS(status)) { @@ -111,7 +110,6 @@ uprv_detectWindowsTimeZone() tmpid[index] = '\0'; } } - ures_close(&winTZ); } // Copy the timezone ID to icuid to be returned. diff --git a/deps/icu-small/source/common/wintz.h b/deps/icu-small/source/common/wintz.h index 0625bb204b197c..9140d2729a98f8 100644 --- a/deps/icu-small/source/common/wintz.h +++ b/deps/icu-small/source/common/wintz.h @@ -28,7 +28,7 @@ U_CDECL_BEGIN typedef struct _TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION; U_CDECL_END -U_CFUNC const char* U_EXPORT2 +U_INTERNAL const char* U_EXPORT2 uprv_detectWindowsTimeZone(); #endif /* U_PLATFORM_USES_ONLY_WIN32_API */ diff --git a/deps/icu-small/source/data/in/icudt63l.dat b/deps/icu-small/source/data/in/icudt64l.dat similarity index 58% rename from deps/icu-small/source/data/in/icudt63l.dat rename to deps/icu-small/source/data/in/icudt64l.dat index 60f57612c0d0e3..113b88a4804805 100644 Binary files a/deps/icu-small/source/data/in/icudt63l.dat and b/deps/icu-small/source/data/in/icudt64l.dat differ diff --git a/deps/icu-small/source/i18n/astro.cpp b/deps/icu-small/source/i18n/astro.cpp index 0bf32ae854f2a6..0d521b037dd772 100644 --- a/deps/icu-small/source/i18n/astro.cpp +++ b/deps/icu-small/source/i18n/astro.cpp @@ -65,7 +65,10 @@ static inline UBool isINVALID(double d) { return(uprv_isNaN(d)); } -static UMutex ccLock = U_MUTEX_INITIALIZER; +static icu::UMutex *ccLock() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} U_CDECL_BEGIN static UBool calendar_astro_cleanup(void) { @@ -1549,12 +1552,12 @@ int32_t CalendarCache::get(CalendarCache** cache, int32_t key, UErrorCode &statu if(U_FAILURE(status)) { return 0; } - umtx_lock(&ccLock); + umtx_lock(ccLock()); if(*cache == NULL) { createCache(cache, status); if(U_FAILURE(status)) { - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); return 0; } } @@ -1562,7 +1565,7 @@ int32_t CalendarCache::get(CalendarCache** cache, int32_t key, UErrorCode &statu res = uhash_igeti((*cache)->fTable, key); U_DEBUG_ASTRO_MSG(("%p: GET: [%d] == %d\n", (*cache)->fTable, key, res)); - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); return res; } @@ -1570,12 +1573,12 @@ void CalendarCache::put(CalendarCache** cache, int32_t key, int32_t value, UErro if(U_FAILURE(status)) { return; } - umtx_lock(&ccLock); + umtx_lock(ccLock()); if(*cache == NULL) { createCache(cache, status); if(U_FAILURE(status)) { - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); return; } } @@ -1583,7 +1586,7 @@ void CalendarCache::put(CalendarCache** cache, int32_t key, int32_t value, UErro uhash_iputi((*cache)->fTable, key, value, &status); U_DEBUG_ASTRO_MSG(("%p: PUT: [%d] := %d\n", (*cache)->fTable, key, value)); - umtx_unlock(&ccLock); + umtx_unlock(ccLock()); } CalendarCache::CalendarCache(int32_t size, UErrorCode &status) { diff --git a/deps/icu-small/source/i18n/brktrans.cpp b/deps/icu-small/source/i18n/brktrans.cpp index ab5a8038420b78..ac9e2afb7e4679 100644 --- a/deps/icu-small/source/i18n/brktrans.cpp +++ b/deps/icu-small/source/i18n/brktrans.cpp @@ -10,6 +10,8 @@ ********************************************************************** */ +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_TRANSLITERATION && !UCONFIG_NO_BREAK_ITERATION @@ -79,8 +81,8 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition& { Mutex m; BreakTransliterator *nonConstThis = const_cast(this); - boundaries.moveFrom(nonConstThis->cachedBoundaries); - bi.moveFrom(nonConstThis->cachedBI); + boundaries = std::move(nonConstThis->cachedBoundaries); + bi = std::move(nonConstThis->cachedBI); } if (bi.isNull()) { bi.adoptInstead(BreakIterator::createWordInstance(Locale::getEnglish(), status)); @@ -145,10 +147,10 @@ void BreakTransliterator::handleTransliterate(Replaceable& text, UTransPosition& Mutex m; BreakTransliterator *nonConstThis = const_cast(this); if (nonConstThis->cachedBI.isNull()) { - nonConstThis->cachedBI.moveFrom(bi); + nonConstThis->cachedBI = std::move(bi); } if (nonConstThis->cachedBoundaries.isNull()) { - nonConstThis->cachedBoundaries.moveFrom(boundaries); + nonConstThis->cachedBoundaries = std::move(boundaries); } } diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 24c2fb964e91a1..85a387ef49ed16 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -327,68 +327,73 @@ static ECalType getCalendarTypeForLocale(const char *locid) { } static Calendar *createStandardCalendar(ECalType calType, const Locale &loc, UErrorCode& status) { - Calendar *cal = NULL; + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer cal; switch (calType) { case CALTYPE_GREGORIAN: - cal = new GregorianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status); break; case CALTYPE_JAPANESE: - cal = new JapaneseCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new JapaneseCalendar(loc, status), status); break; case CALTYPE_BUDDHIST: - cal = new BuddhistCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new BuddhistCalendar(loc, status), status); break; case CALTYPE_ROC: - cal = new TaiwanCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new TaiwanCalendar(loc, status), status); break; case CALTYPE_PERSIAN: - cal = new PersianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new PersianCalendar(loc, status), status); break; case CALTYPE_ISLAMIC_TBLA: - cal = new IslamicCalendar(loc, status, IslamicCalendar::TBLA); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::TBLA), status); break; case CALTYPE_ISLAMIC_CIVIL: - cal = new IslamicCalendar(loc, status, IslamicCalendar::CIVIL); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::CIVIL), status); break; case CALTYPE_ISLAMIC_RGSA: // default any region specific not handled individually to islamic case CALTYPE_ISLAMIC: - cal = new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::ASTRONOMICAL), status); break; case CALTYPE_ISLAMIC_UMALQURA: - cal = new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA); + cal.adoptInsteadAndCheckErrorCode(new IslamicCalendar(loc, status, IslamicCalendar::UMALQURA), status); break; case CALTYPE_HEBREW: - cal = new HebrewCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new HebrewCalendar(loc, status), status); break; case CALTYPE_CHINESE: - cal = new ChineseCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new ChineseCalendar(loc, status), status); break; case CALTYPE_INDIAN: - cal = new IndianCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new IndianCalendar(loc, status), status); break; case CALTYPE_COPTIC: - cal = new CopticCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new CopticCalendar(loc, status), status); break; case CALTYPE_ETHIOPIC: - cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA); + cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_MIHRET_ERA), status); break; case CALTYPE_ETHIOPIC_AMETE_ALEM: - cal = new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA); + cal.adoptInsteadAndCheckErrorCode(new EthiopicCalendar(loc, status, EthiopicCalendar::AMETE_ALEM_ERA), status); break; case CALTYPE_ISO8601: - cal = new GregorianCalendar(loc, status); - cal->setFirstDayOfWeek(UCAL_MONDAY); - cal->setMinimalDaysInFirstWeek(4); + cal.adoptInsteadAndCheckErrorCode(new GregorianCalendar(loc, status), status); + if (cal.isValid()) { + cal->setFirstDayOfWeek(UCAL_MONDAY); + cal->setMinimalDaysInFirstWeek(4); + } break; case CALTYPE_DANGI: - cal = new DangiCalendar(loc, status); + cal.adoptInsteadAndCheckErrorCode(new DangiCalendar(loc, status), status); break; default: status = U_UNSUPPORTED_ERROR; } - return cal; + return cal.orphan(); } @@ -536,6 +541,10 @@ class CalendarService : public ICULocaleService { fprintf(stderr, "CalSvc:handleDefault for currentLoc %s, canloc %s\n", (const char*)loc.getName(), (const char*)loc2.getName()); #endif Calendar *nc = new GregorianCalendar(loc, status); + if (nc == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nc; + } #ifdef U_DEBUG_CALSVC UErrorCode status2 = U_ZERO_ERROR; @@ -1093,7 +1102,11 @@ Calendar::getKeywordValuesForLocale(const char* key, uenum_close(uenum); return NULL; } - return new UStringEnumeration(uenum); + UStringEnumeration* ustringenum = new UStringEnumeration(uenum); + if (ustringenum == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return ustringenum; } // ------------------------------------- @@ -3783,18 +3796,16 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& // 2). If the locale has a script designation then we ignore it, // then remove it ( i.e. "en_Latn_US" becomes "en_US" ) - char minLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 }; UErrorCode myStatus = U_ZERO_ERROR; - uloc_minimizeSubtags(desiredLocale.getName(),minLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus); - Locale min = Locale::createFromName(minLocaleID); + Locale min(desiredLocale); + min.minimizeSubtags(myStatus); Locale useLocale; if ( uprv_strlen(desiredLocale.getCountry()) == 0 || (uprv_strlen(desiredLocale.getScript()) > 0 && uprv_strlen(min.getScript()) == 0) ) { - char maxLocaleID[ULOC_FULLNAME_CAPACITY] = { 0 }; myStatus = U_ZERO_ERROR; - uloc_addLikelySubtags(desiredLocale.getName(),maxLocaleID,ULOC_FULLNAME_CAPACITY,&myStatus); - Locale max = Locale::createFromName(maxLocaleID); + Locale max(desiredLocale); + max.addLikelySubtags(myStatus); useLocale = Locale(max.getLanguage(),max.getCountry()); } else { useLocale = desiredLocale; diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index 17712ae62e7651..3c4ad2a846619f 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -51,7 +51,10 @@ static void debug_chnsecal_msg(const char *pat, ...) // --- The cache -- -static UMutex astroLock = U_MUTEX_INITIALIZER; // Protects access to gChineseCalendarAstro. +static icu::UMutex *astroLock() { // Protects access to gChineseCalendarAstro. + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static icu::CalendarAstronomer *gChineseCalendarAstro = NULL; // Lazy Creation & Access synchronized by class CalendarCache with a mutex. @@ -535,14 +538,14 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { // PST 1298 with a final result of Dec 14 10:31:59 PST 1299. double ms = daysToMillis(Grego::fieldsToDay(gyear, UCAL_DECEMBER, 1)); - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(ms); UDate solarLong = gChineseCalendarAstro->getSunTime(CalendarAstronomer::WINTER_SOLSTICE(), TRUE); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); // Winter solstice is 270 degrees solar longitude aka Dongzhi cacheValue = (int32_t)millisToDays(solarLong); @@ -565,14 +568,14 @@ int32_t ChineseCalendar::winterSolstice(int32_t gyear) const { */ int32_t ChineseCalendar::newMoonNear(double days, UBool after) const { - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(daysToMillis(days)); UDate newMoon = gChineseCalendarAstro->getMoonTime(CalendarAstronomer::NEW_MOON(), after); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); return (int32_t) millisToDays(newMoon); } @@ -597,14 +600,14 @@ int32_t ChineseCalendar::synodicMonthsBetween(int32_t day1, int32_t day2) const */ int32_t ChineseCalendar::majorSolarTerm(int32_t days) const { - umtx_lock(&astroLock); + umtx_lock(astroLock()); if(gChineseCalendarAstro == NULL) { gChineseCalendarAstro = new CalendarAstronomer(); ucln_i18n_registerCleanup(UCLN_I18N_CHINESE_CALENDAR, calendar_chinese_cleanup); } gChineseCalendarAstro->setTime(daysToMillis(days)); UDate solarLongitude = gChineseCalendarAstro->getSunLongitude(); - umtx_unlock(&astroLock); + umtx_unlock(astroLock()); // Compute (floor(solarLongitude / (pi/6)) + 2) % 12 int32_t term = ( ((int32_t)(6 * solarLongitude / CalendarAstronomer::PI)) + 2 ) % 12; diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 2a614fac5dcfbc..8bbe133664c2cd 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -226,27 +226,25 @@ initAvailableLocaleList(UErrorCode &status) { U_ASSERT(availableLocaleList == NULL); // for now, there is a hardcoded list, so just walk through that list and set it up. UResourceBundle *index = NULL; - UResourceBundle installed; + StackUResourceBundle installed; int32_t i = 0; - ures_initStackObject(&installed); index = ures_openDirect(U_ICUDATA_COLL, "res_index", &status); - ures_getByKey(index, "InstalledLocales", &installed, &status); + ures_getByKey(index, "InstalledLocales", installed.getAlias(), &status); if(U_SUCCESS(status)) { - availableLocaleListCount = ures_getSize(&installed); + availableLocaleListCount = ures_getSize(installed.getAlias()); availableLocaleList = new Locale[availableLocaleListCount]; if (availableLocaleList != NULL) { - ures_resetIterator(&installed); - while(ures_hasNext(&installed)) { + ures_resetIterator(installed.getAlias()); + while(ures_hasNext(installed.getAlias())) { const char *tempKey = NULL; - ures_getNextString(&installed, NULL, &tempKey, &status); + ures_getNextString(installed.getAlias(), NULL, &tempKey, &status); availableLocaleList[i++] = Locale(tempKey); } } U_ASSERT(availableLocaleListCount == i); - ures_close(&installed); } ures_close(index); ucln_i18n_registerCleanup(UCLN_I18N_COLLATOR, collator_cleanup); diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 954a20d2d97d45..45ac6ddcd5839b 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -577,8 +577,7 @@ CollationBuilder::getSpecialResetPosition(const UnicodeString &str, parserErrorReason = "LDML forbids tailoring to U+FFFF"; return 0; default: - U_ASSERT(FALSE); - return 0; + UPRV_UNREACHABLE; } int32_t index = findOrInsertNodeForRootCE(ce, strength, errorCode); diff --git a/deps/icu-small/source/i18n/collationdatabuilder.cpp b/deps/icu-small/source/i18n/collationdatabuilder.cpp index 1ebc20316021c3..fdd264f8aaa65a 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.cpp +++ b/deps/icu-small/source/i18n/collationdatabuilder.cpp @@ -852,8 +852,7 @@ CollationDataBuilder::copyFromBaseCE32(UChar32 c, uint32_t ce32, UBool withConte ce32 = encodeOneCE(Collation::unassignedCEFromCodePoint(c), errorCode); break; default: - U_ASSERT(FALSE); // require ce32 == base->getFinalCE32(ce32) - break; + UPRV_UNREACHABLE; // require ce32 == base->getFinalCE32(ce32) } return ce32; } diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 1aff936dee1d2a..2527f2f055a3f0 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -25,7 +25,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0x19, 0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0, 0,0,0x1a,0,0,0x16,0x18,0,0,0x1b,0x18,0,0,0,0x1c,0, -0,0x1d,0x1e,0,0,0x1f,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0, +0,0x1d,0x1e,0,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0x22,0,0x23,0, 0,0x24,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x25,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -164,7 +164,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0x2f, 0,0x30,0x31,0,0,0x2d,0x32,0,0,0x2d,0x33,0,0,0,0x32,0, 0,0,0x34,0,0,0x2d,0x32,0,0,0x35,0x32,0,0,0,0x36,0, -0,0x37,0x38,0,0,0x39,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0, +0,0x37,0x38,0,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0x3c,0,0x3d,0, 0,0x3e,0,0,0x32,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x3f,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/deps/icu-small/source/i18n/collationruleparser.cpp b/deps/icu-small/source/i18n/collationruleparser.cpp index 96dcc0d940b77a..ade6ecb552ae13 100644 --- a/deps/icu-small/source/i18n/collationruleparser.cpp +++ b/deps/icu-small/source/i18n/collationruleparser.cpp @@ -622,8 +622,11 @@ CollationRuleParser::parseSetting(UErrorCode &errorCode) { setParseError("expected language tag in [import langTag]", errorCode); return; } - if(length == 3 && uprv_memcmp(baseID, "und", 3) == 0) { + if(length == 0) { uprv_strcpy(baseID, "root"); + } else if(*baseID == '_') { + uprv_memmove(baseID + 3, baseID, length + 1); + uprv_memcpy(baseID, "und", 3); } // @collation=type, or length=0 if not specified char collationType[ULOC_KEYWORDS_CAPACITY]; diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 0afecb287a7a40..ad3565155dd382 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -36,9 +36,9 @@ U_NAMESPACE_BEGIN struct CSRecognizerInfo : public UMemory { CSRecognizerInfo(CharsetRecognizer *recognizer, UBool isDefaultEnabled) - : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {}; + : recognizer(recognizer), isDefaultEnabled(isDefaultEnabled) {} - ~CSRecognizerInfo() {delete recognizer;}; + ~CSRecognizerInfo() {delete recognizer;} CharsetRecognizer *recognizer; UBool isDefaultEnabled; diff --git a/deps/icu-small/source/i18n/currfmt.cpp b/deps/icu-small/source/i18n/currfmt.cpp index 06bdad042aad0e..8f20f783d25031 100644 --- a/deps/icu-small/source/i18n/currfmt.cpp +++ b/deps/icu-small/source/i18n/currfmt.cpp @@ -21,19 +21,16 @@ U_NAMESPACE_BEGIN CurrencyFormat::CurrencyFormat(const Locale& locale, UErrorCode& ec) : - MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec), fmt(NULL) + MeasureFormat(locale, UMEASFMT_WIDTH_WIDE, ec) { - fmt = NumberFormat::createCurrencyInstance(locale, ec); } CurrencyFormat::CurrencyFormat(const CurrencyFormat& other) : - MeasureFormat(other), fmt(NULL) + MeasureFormat(other) { - fmt = (NumberFormat*) other.fmt->clone(); } CurrencyFormat::~CurrencyFormat() { - delete fmt; } Format* CurrencyFormat::clone() const { @@ -45,14 +42,14 @@ UnicodeString& CurrencyFormat::format(const Formattable& obj, FieldPosition& pos, UErrorCode& ec) const { - return fmt->format(obj, appendTo, pos, ec); + return getCurrencyFormatInternal().format(obj, appendTo, pos, ec); } void CurrencyFormat::parseObject(const UnicodeString& source, Formattable& result, ParsePosition& pos) const { - CurrencyAmount* currAmt = fmt->parseCurrency(source, pos); + CurrencyAmount* currAmt = getCurrencyFormatInternal().parseCurrency(source, pos); if (currAmt != NULL) { result.adoptObject(currAmt); } diff --git a/deps/icu-small/source/i18n/currfmt.h b/deps/icu-small/source/i18n/currfmt.h index 97d44cbb1d146f..cc9bb3c1bacd05 100644 --- a/deps/icu-small/source/i18n/currfmt.h +++ b/deps/icu-small/source/i18n/currfmt.h @@ -86,10 +86,6 @@ class CurrencyFormat : public MeasureFormat { * Returns the class ID for this class. */ static UClassID U_EXPORT2 getStaticClassID(); - - private: - - NumberFormat* fmt; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/currunit.cpp b/deps/icu-small/source/i18n/currunit.cpp index 2ece508751bcec..39c49e468d117d 100644 --- a/deps/icu-small/source/i18n/currunit.cpp +++ b/deps/icu-small/source/i18n/currunit.cpp @@ -18,8 +18,10 @@ #include "unicode/ustring.h" #include "cstring.h" #include "uinvchar.h" +#include "charstr.h" static constexpr char16_t kDefaultCurrency[] = u"XXX"; +static constexpr char kDefaultCurrency8[] = "XXX"; U_NAMESPACE_BEGIN @@ -50,6 +52,30 @@ CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) { initCurrency(simpleIsoCode); } +CurrencyUnit::CurrencyUnit(StringPiece _isoCode, UErrorCode& ec) { + // Note: unlike the old constructor, reject empty arguments with an error. + char isoCodeBuffer[4]; + const char* isoCodeToUse; + // uprv_memchr checks that the string contains no internal NULs + if (_isoCode.length() != 3 || uprv_memchr(_isoCode.data(), 0, 3) != nullptr) { + isoCodeToUse = kDefaultCurrency8; + ec = U_ILLEGAL_ARGUMENT_ERROR; + } else if (!uprv_isInvariantString(_isoCode.data(), 3)) { + // TODO: Perform a more strict ASCII check like in ICU4J isAlpha3Code? + isoCodeToUse = kDefaultCurrency8; + ec = U_INVARIANT_CONVERSION_ERROR; + } else { + // Have to use isoCodeBuffer to ensure the string is NUL-terminated + uprv_strncpy(isoCodeBuffer, _isoCode.data(), 3); + isoCodeBuffer[3] = 0; + isoCodeToUse = isoCodeBuffer; + } + // TODO: Perform uppercasing here like in ICU4J Currency.getInstance()? + u_charsToUChars(isoCodeToUse, isoCode, 3); + isoCode[3] = 0; + initCurrency(isoCodeToUse); +} + CurrencyUnit::CurrencyUnit(const CurrencyUnit& other) : MeasureUnit(other) { u_strcpy(isoCode, other.isoCode); } diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 58696f6e93dfd5..039f5bc226bb0a 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -460,7 +460,12 @@ DateFormat::createInstanceForSkeleton( status = U_ILLEGAL_ARGUMENT_ERROR; return NULL; } - DateFormat *result = createInstanceForSkeleton(skeleton, locale, status); + Locale localeWithCalendar = locale; + localeWithCalendar.setKeywordValue("calendar", calendar->getType(), status); + if (U_FAILURE(status)) { + return NULL; + } + DateFormat *result = createInstanceForSkeleton(skeleton, localeWithCalendar, status); if (U_FAILURE(status)) { return NULL; } diff --git a/deps/icu-small/source/i18n/decNumberLocal.h b/deps/icu-small/source/i18n/decNumberLocal.h index a45b7d8cc63ef2..f6c291a9ad3359 100644 --- a/deps/icu-small/source/i18n/decNumberLocal.h +++ b/deps/icu-small/source/i18n/decNumberLocal.h @@ -166,7 +166,9 @@ /* Set DECDPUNMAX -- the maximum integer that fits in DECDPUN */ /* digits, and D2UTABLE -- the initializer for the D2U table */ - #if DECDPUN==1 + #ifndef DECDPUN + // no-op + #elif DECDPUN==1 #define DECDPUNMAX 9 #define D2UTABLE {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, \ 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, \ @@ -212,7 +214,7 @@ #define D2UTABLE {0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3, \ 3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5, \ 5,5,6,6,6,6} - #elif defined(DECDPUN) + #else #error DECDPUN must be in the range 1-9 #endif @@ -228,9 +230,9 @@ /* D2U -- return the number of Units needed to hold d digits */ /* (runtime version, with table lookaside for small d) */ - #if DECDPUN==8 + #if defined(DECDPUN) && DECDPUN==8 #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+7)>>3)) - #elif DECDPUN==4 + #elif defined(DECDPUN) && DECDPUN==4 #define D2U(d) ((unsigned)((d)<=DECMAXD2U?d2utable[d]:((d)+3)>>2)) #else #define D2U(d) ((d)<=DECMAXD2U?d2utable[d]:((d)+DECDPUN-1)/DECDPUN) diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index edd8910d9d4fd6..2a1e9347fa10d0 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -31,7 +31,7 @@ using namespace icu::numparse::impl; using ERoundingMode = icu::DecimalFormat::ERoundingMode; using EPadPosition = icu::DecimalFormat::EPadPosition; -// MSVC warns C4805 when comparing bool with UBool +// MSVC VS2015 warns C4805 when comparing bool with UBool, VS2017 no longer emits this warning. // TODO: Move this macro into a better place? #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN #define UBOOL_TO_BOOL(b) static_cast(b) @@ -45,6 +45,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat) DecimalFormat::DecimalFormat(UErrorCode& status) : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } // Use the default locale and decimal pattern. const char* localeName = Locale::getDefault().getName(); LocalPointer ns(NumberingSystem::createInstance(status)); @@ -59,6 +60,7 @@ DecimalFormat::DecimalFormat(UErrorCode& status) DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status) : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } @@ -66,6 +68,7 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, UErrorCode& status) DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } @@ -73,8 +76,10 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UNumberFormatStyle style, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } // If choice is a currency type, ignore the rounding information. - if (style == UNumberFormatStyle::UNUM_CURRENCY || style == UNumberFormatStyle::UNUM_CURRENCY_ISO || + if (style == UNumberFormatStyle::UNUM_CURRENCY || + style == UNumberFormatStyle::UNUM_CURRENCY_ISO || style == UNumberFormatStyle::UNUM_CURRENCY_ACCOUNTING || style == UNumberFormatStyle::UNUM_CASH_CURRENCY || style == UNumberFormatStyle::UNUM_CURRENCY_STANDARD || @@ -96,15 +101,17 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* } DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status) { + // we must take ownership of symbolsToAdopt, even in a failure case. LocalPointer adoptedSymbols(symbolsToAdopt); - fields = new DecimalFormatFields(); if (U_FAILURE(status)) { return; } + fields = new DecimalFormatFields(); if (fields == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } + fields->formatter.adoptInsteadAndCheckErrorCode(new LocalizedNumberFormatter(), status); fields->properties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); fields->exportedProperties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); if (adoptedSymbols.isNull()) { @@ -112,11 +119,20 @@ DecimalFormat::DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorC } else { fields->symbols.adoptInsteadAndCheckErrorCode(adoptedSymbols.orphan(), status); } + // In order to simplify error handling logic in the various getters/setters/etc, we do not allow + // any partially populated DecimalFormatFields object. We must have a fully complete fields object + // or else we set it to nullptr. + if (fields->formatter.isNull() || fields->properties.isNull() || fields->exportedProperties.isNull() || fields->symbols.isNull()) { + delete fields; + fields = nullptr; + status = U_MEMORY_ALLOCATION_ERROR; + } } #if UCONFIG_HAVE_PARSEALLINPUT void DecimalFormat::setParseAllInput(UNumberFormatAttributeValue value) { + if (fields == nullptr) { return; } if (value == fields->properties->parseAllInput) { return; } fields->properties->parseAllInput = value; } @@ -127,6 +143,12 @@ DecimalFormat& DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status) { if (U_FAILURE(status)) { return *this; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + switch (attr) { case UNUM_LENIENT_PARSE: setLenient(newValue != 0); @@ -254,6 +276,13 @@ DecimalFormat::setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErro int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const { if (U_FAILURE(status)) { return -1; } + + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } + switch (attr) { case UNUM_LENIENT_PARSE: return isLenient(); @@ -347,6 +376,9 @@ int32_t DecimalFormat::getAttribute(UNumberFormatAttribute attr, UErrorCode& sta } void DecimalFormat::setGroupingUsed(UBool enabled) { + if (fields == nullptr) { + return; + } if (UBOOL_TO_BOOL(enabled) == fields->properties->groupingUsed) { return; } NumberFormat::setGroupingUsed(enabled); // to set field for compatibility fields->properties->groupingUsed = enabled; @@ -354,6 +386,9 @@ void DecimalFormat::setGroupingUsed(UBool enabled) { } void DecimalFormat::setParseIntegerOnly(UBool value) { + if (fields == nullptr) { + return; + } if (UBOOL_TO_BOOL(value) == fields->properties->parseIntegerOnly) { return; } NumberFormat::setParseIntegerOnly(value); // to set field for compatibility fields->properties->parseIntegerOnly = value; @@ -361,6 +396,9 @@ void DecimalFormat::setParseIntegerOnly(UBool value) { } void DecimalFormat::setLenient(UBool enable) { + if (fields == nullptr) { + return; + } ParseMode mode = enable ? PARSE_MODE_LENIENT : PARSE_MODE_STRICT; if (!fields->properties->parseMode.isNull() && mode == fields->properties->parseMode.getNoError()) { return; } NumberFormat::setLenient(enable); // to set field for compatibility @@ -371,6 +409,7 @@ void DecimalFormat::setLenient(UBool enable) { DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UParseError&, UErrorCode& status) : DecimalFormat(symbolsToAdopt, status) { + if (U_FAILURE(status)) { return; } // TODO: What is parseError for? setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); @@ -378,44 +417,94 @@ DecimalFormat::DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* DecimalFormat::DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status) - : DecimalFormat(new DecimalFormatSymbols(symbols), status) { + : DecimalFormat(nullptr, status) { + if (U_FAILURE(status)) { return; } + LocalPointer dfs(new DecimalFormatSymbols(symbols), status); + if (U_FAILURE(status)) { + // If we failed to allocate DecimalFormatSymbols, then release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + fields->symbols.adoptInstead(dfs.orphan()); setPropertiesFromPattern(pattern, IGNORE_ROUNDING_IF_CURRENCY, status); touch(status); } DecimalFormat::DecimalFormat(const DecimalFormat& source) : NumberFormat(source) { + // If the object that we are copying from is invalid, no point in going further. + if (source.fields == nullptr) { + return; + } // Note: it is not safe to copy fields->formatter or fWarehouse directly because fields->formatter might have // dangling pointers to fields inside fWarehouse. The safe thing is to re-construct fields->formatter from // the property bag, despite being somewhat slower. fields = new DecimalFormatFields(); if (fields == nullptr) { - return; + return; // no way to report an error. } - fields->properties.adoptInstead(new DecimalFormatProperties(*source.fields->properties)); - fields->symbols.adoptInstead(new DecimalFormatSymbols(*source.fields->symbols)); - fields->exportedProperties.adoptInstead(new DecimalFormatProperties()); - if (fields->properties == nullptr || fields->symbols == nullptr || fields->exportedProperties == nullptr) { + UErrorCode status = U_ZERO_ERROR; + fields->formatter.adoptInsteadAndCheckErrorCode(new LocalizedNumberFormatter(), status); + fields->properties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(*source.fields->properties), status); + fields->symbols.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(*source.fields->symbols), status); + fields->exportedProperties.adoptInsteadAndCheckErrorCode(new DecimalFormatProperties(), status); + // In order to simplify error handling logic in the various getters/setters/etc, we do not allow + // any partially populated DecimalFormatFields object. We must have a fully complete fields object + // or else we set it to nullptr. + if (fields->formatter.isNull() || fields->properties.isNull() || fields->exportedProperties.isNull() || fields->symbols.isNull()) { + delete fields; + fields = nullptr; return; } - touchNoError(); + touch(status); } DecimalFormat& DecimalFormat::operator=(const DecimalFormat& rhs) { + // guard against self-assignment + if (this == &rhs) { + return *this; + } + // Make sure both objects are valid. + if (fields == nullptr || rhs.fields == nullptr) { + return *this; // unfortunately, no way to report an error. + } *fields->properties = *rhs.fields->properties; fields->exportedProperties->clear(); - fields->symbols.adoptInstead(new DecimalFormatSymbols(*rhs.fields->symbols)); - touchNoError(); + UErrorCode status = U_ZERO_ERROR; + LocalPointer dfs(new DecimalFormatSymbols(*rhs.fields->symbols), status); + if (U_FAILURE(status)) { + // We failed to allocate DecimalFormatSymbols, release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + return *this; + } + fields->symbols.adoptInstead(dfs.orphan()); + touch(status); + return *this; } DecimalFormat::~DecimalFormat() { + if (fields == nullptr) { return; } + delete fields->atomicParser.exchange(nullptr); delete fields->atomicCurrencyParser.exchange(nullptr); - delete fields; + delete fields; } Format* DecimalFormat::clone() const { - return new DecimalFormat(*this); + // can only clone valid objects. + if (fields == nullptr) { + return nullptr; + } + LocalPointer df(new DecimalFormat(*this)); + if (df.isValid() && df->fields != nullptr) { + return df.orphan(); + } + return nullptr; } UBool DecimalFormat::operator==(const Format& other) const { @@ -423,10 +512,19 @@ UBool DecimalFormat::operator==(const Format& other) const { if (otherDF == nullptr) { return false; } + // If either object is in an invalid state, prevent dereferencing nullptr below. + // Additionally, invalid objects should not be considered equal to anything. + if (fields == nullptr || otherDF->fields == nullptr) { + return false; + } return *fields->properties == *otherDF->fields->properties && *fields->symbols == *otherDF->fields->symbols; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos) const { + if (fields == nullptr) { + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) { return appendTo; } @@ -434,32 +532,50 @@ UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, Fie FormattedNumber output = fields->formatter->formatDouble(number, localStatus); fieldPositionHelper(output, pos, appendTo.length(), localStatus); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, localStatus); return appendTo; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatDouble(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatDouble(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (posIter == nullptr && fastFormatDouble(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatDouble(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } @@ -479,6 +595,10 @@ DecimalFormat::format(int32_t number, UnicodeString& appendTo, FieldPositionIter } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const { + if (fields == nullptr) { + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) { return appendTo; } @@ -486,67 +606,119 @@ UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, Fi FormattedNumber output = fields->formatter->formatInt(number, localStatus); fieldPositionHelper(output, pos, appendTo.length(), localStatus); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, localStatus); return appendTo; } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (pos.getField() == FieldPosition::DONT_CARE && fastFormatInt64(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatInt(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } if (posIter == nullptr && fastFormatInt64(number, appendTo)) { return appendTo; } FormattedNumber output = fields->formatter->formatInt(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimal(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status); fieldPositionIteratorHelper(output, posIter, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } UnicodeString& DecimalFormat::format(const DecimalQuantity& number, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; // don't overwrite status if it's already a failure. + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + appendTo.setToBogus(); + return appendTo; + } FormattedNumber output = fields->formatter->formatDecimalQuantity(number, status); fieldPositionHelper(output, pos, appendTo.length(), status); auto appendable = UnicodeStringAppendable(appendTo); - output.appendTo(appendable); + output.appendTo(appendable, status); return appendTo; } void DecimalFormat::parse(const UnicodeString& text, Formattable& output, ParsePosition& parsePosition) const { + if (fields == nullptr) { + return; + } if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) { + if (parsePosition.getIndex() == text.length()) { + // If there is nothing to parse, it is an error + parsePosition.setErrorIndex(parsePosition.getIndex()); + } return; } @@ -556,8 +728,13 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output, // parseCurrency method (backwards compatibility) int32_t startIndex = parsePosition.getIndex(); const NumberParserImpl* parser = getParser(status); - if (U_FAILURE(status)) { return; } + if (U_FAILURE(status)) { + return; // unfortunately no way to report back the error. + } parser->parse(text, startIndex, true, result, status); + if (U_FAILURE(status)) { + return; // unfortunately no way to report back the error. + } // TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here? if (result.success()) { parsePosition.setIndex(result.charEnd); @@ -568,6 +745,9 @@ void DecimalFormat::parse(const UnicodeString& text, Formattable& output, } CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePosition& parsePosition) const { + if (fields == nullptr) { + return nullptr; + } if (parsePosition.getIndex() < 0 || parsePosition.getIndex() >= text.length()) { return nullptr; } @@ -578,14 +758,24 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos // parseCurrency method (backwards compatibility) int32_t startIndex = parsePosition.getIndex(); const NumberParserImpl* parser = getCurrencyParser(status); - if (U_FAILURE(status)) { return nullptr; } + if (U_FAILURE(status)) { + return nullptr; + } parser->parse(text, startIndex, true, result, status); + if (U_FAILURE(status)) { + return nullptr; + } // TODO: Do we need to check for fImpl->properties->parseAllInput (UCONFIG_HAVE_PARSEALLINPUT) here? if (result.success()) { parsePosition.setIndex(result.charEnd); Formattable formattable; result.populateFormattable(formattable, parser->getParseFlags()); - return new CurrencyAmount(formattable, result.currencyCode, status); + LocalPointer currencyAmount( + new CurrencyAmount(formattable, result.currencyCode, status), status); + if (U_FAILURE(status)) { + return nullptr; + } + return currencyAmount.orphan(); } else { parsePosition.setErrorIndex(startIndex + result.charEnd); return nullptr; @@ -593,6 +783,9 @@ CurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, ParsePos } const DecimalFormatSymbols* DecimalFormat::getDecimalFormatSymbols(void) const { + if (fields == nullptr) { + return nullptr; + } return fields->symbols.getAlias(); } @@ -600,26 +793,56 @@ void DecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdo if (symbolsToAdopt == nullptr) { return; // do not allow caller to set fields->symbols to NULL } - fields->symbols.adoptInstead(symbolsToAdopt); + // we must take ownership of symbolsToAdopt, even in a failure case. + LocalPointer dfs(symbolsToAdopt); + if (fields == nullptr) { + return; + } + fields->symbols.adoptInstead(dfs.orphan()); touchNoError(); } void DecimalFormat::setDecimalFormatSymbols(const DecimalFormatSymbols& symbols) { - fields->symbols.adoptInstead(new DecimalFormatSymbols(symbols)); + if (fields == nullptr) { + return; + } + UErrorCode status = U_ZERO_ERROR; + LocalPointer dfs(new DecimalFormatSymbols(symbols), status); + if (U_FAILURE(status)) { + // We failed to allocate DecimalFormatSymbols, release fields and its members. + // We must have a fully complete fields object, we cannot have partially populated members. + delete fields; + fields = nullptr; + return; + } + fields->symbols.adoptInstead(dfs.orphan()); touchNoError(); } const CurrencyPluralInfo* DecimalFormat::getCurrencyPluralInfo(void) const { + if (fields == nullptr) { + return nullptr; + } return fields->properties->currencyPluralInfo.fPtr.getAlias(); } void DecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) { - fields->properties->currencyPluralInfo.fPtr.adoptInstead(toAdopt); + // TODO: should we guard against nullptr input, like in adoptDecimalFormatSymbols? + // we must take ownership of toAdopt, even in a failure case. + LocalPointer cpi(toAdopt); + if (fields == nullptr) { + return; + } + fields->properties->currencyPluralInfo.fPtr.adoptInstead(cpi.orphan()); touchNoError(); } void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) { + if (fields == nullptr) { + return; + } if (fields->properties->currencyPluralInfo.fPtr.isNull()) { + // Note: clone() can fail with OOM error, but we have no way to report it. :( fields->properties->currencyPluralInfo.fPtr.adoptInstead(info.clone()); } else { *fields->properties->currencyPluralInfo.fPtr = info; // copy-assignment operator @@ -628,74 +851,122 @@ void DecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) { } UnicodeString& DecimalFormat::getPositivePrefix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(true, false, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(true, false, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setPositivePrefix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->positivePrefix) { return; } fields->properties->positivePrefix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getNegativePrefix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(true, true, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(true, true, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setNegativePrefix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->negativePrefix) { return; } fields->properties->negativePrefix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getPositiveSuffix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(false, false, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(false, false, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setPositiveSuffix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->positiveSuffix) { return; } fields->properties->positiveSuffix = newValue; touchNoError(); } UnicodeString& DecimalFormat::getNegativeSuffix(UnicodeString& result) const { - ErrorCode localStatus; - fields->formatter->getAffixImpl(false, true, result, localStatus); + if (fields == nullptr) { + result.setToBogus(); + return result; + } + UErrorCode status = U_ZERO_ERROR; + fields->formatter->getAffixImpl(false, true, result, status); + if (U_FAILURE(status)) { result.setToBogus(); } return result; } void DecimalFormat::setNegativeSuffix(const UnicodeString& newValue) { + if (fields == nullptr) { + return; + } if (newValue == fields->properties->negativeSuffix) { return; } fields->properties->negativeSuffix = newValue; touchNoError(); } UBool DecimalFormat::isSignAlwaysShown() const { + // Not much we can do to report an error. + if (fields == nullptr) { + return DecimalFormatProperties::getDefault().signAlwaysShown; + } return fields->properties->signAlwaysShown; } void DecimalFormat::setSignAlwaysShown(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->signAlwaysShown) { return; } fields->properties->signAlwaysShown = value; touchNoError(); } int32_t DecimalFormat::getMultiplier(void) const { - if (fields->properties->multiplier != 1) { - return fields->properties->multiplier; - } else if (fields->properties->magnitudeMultiplier != 0) { - return static_cast(uprv_pow10(fields->properties->magnitudeMultiplier)); + const DecimalFormatProperties *dfp; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + dfp = &(DecimalFormatProperties::getDefault()); + } else { + dfp = fields->properties.getAlias(); + } + if (dfp->multiplier != 1) { + return dfp->multiplier; + } else if (dfp->magnitudeMultiplier != 0) { + return static_cast(uprv_pow10(dfp->magnitudeMultiplier)); } else { return 1; } } void DecimalFormat::setMultiplier(int32_t multiplier) { + if (fields == nullptr) { + return; + } if (multiplier == 0) { multiplier = 1; // one being the benign default value for a multiplier. } @@ -723,31 +994,49 @@ void DecimalFormat::setMultiplier(int32_t multiplier) { } int32_t DecimalFormat::getMultiplierScale() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().multiplierScale; + } return fields->properties->multiplierScale; } void DecimalFormat::setMultiplierScale(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->multiplierScale) { return; } fields->properties->multiplierScale = newValue; touchNoError(); } double DecimalFormat::getRoundingIncrement(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().roundingIncrement; + } return fields->exportedProperties->roundingIncrement; } void DecimalFormat::setRoundingIncrement(double newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->roundingIncrement) { return; } fields->properties->roundingIncrement = newValue; touchNoError(); } ERoundingMode DecimalFormat::getRoundingMode(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return static_cast(DecimalFormatProperties::getDefault().roundingMode.getNoError()); + } // UNumberFormatRoundingMode and ERoundingMode have the same values. return static_cast(fields->exportedProperties->roundingMode.getNoError()); } void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { + if (fields == nullptr) { return; } auto uRoundingMode = static_cast(roundingMode); if (!fields->properties->roundingMode.isNull() && uRoundingMode == fields->properties->roundingMode.getNoError()) { return; @@ -758,17 +1047,23 @@ void DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { } int32_t DecimalFormat::getFormatWidth(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().formatWidth; + } return fields->properties->formatWidth; } void DecimalFormat::setFormatWidth(int32_t width) { + if (fields == nullptr) { return; } if (width == fields->properties->formatWidth) { return; } fields->properties->formatWidth = width; touchNoError(); } UnicodeString DecimalFormat::getPadCharacterString() const { - if (fields->properties->padString.isBogus()) { + if (fields == nullptr || fields->properties->padString.isBogus()) { // Readonly-alias the static string kFallbackPaddingString return {TRUE, kFallbackPaddingString, -1}; } else { @@ -777,6 +1072,7 @@ UnicodeString DecimalFormat::getPadCharacterString() const { } void DecimalFormat::setPadCharacter(const UnicodeString& padChar) { + if (fields == nullptr) { return; } if (padChar == fields->properties->padString) { return; } if (padChar.length() > 0) { fields->properties->padString = UnicodeString(padChar.char32At(0)); @@ -787,7 +1083,7 @@ void DecimalFormat::setPadCharacter(const UnicodeString& padChar) { } EPadPosition DecimalFormat::getPadPosition(void) const { - if (fields->properties->padPosition.isNull()) { + if (fields == nullptr || fields->properties->padPosition.isNull()) { return EPadPosition::kPadBeforePrefix; } else { // UNumberFormatPadPosition and EPadPosition have the same values. @@ -796,6 +1092,7 @@ EPadPosition DecimalFormat::getPadPosition(void) const { } void DecimalFormat::setPadPosition(EPadPosition padPos) { + if (fields == nullptr) { return; } auto uPadPos = static_cast(padPos); if (!fields->properties->padPosition.isNull() && uPadPos == fields->properties->padPosition.getNoError()) { return; @@ -805,10 +1102,16 @@ void DecimalFormat::setPadPosition(EPadPosition padPos) { } UBool DecimalFormat::isScientificNotation(void) const { - return fields->properties->minimumExponentDigits != -1; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return (DecimalFormatProperties::getDefault().minimumExponentDigits != -1); + } + return (fields->properties->minimumExponentDigits != -1); } void DecimalFormat::setScientificNotation(UBool useScientific) { + if (fields == nullptr) { return; } int32_t minExp = useScientific ? 1 : -1; if (fields->properties->minimumExponentDigits == minExp) { return; } if (useScientific) { @@ -820,40 +1123,68 @@ void DecimalFormat::setScientificNotation(UBool useScientific) { } int8_t DecimalFormat::getMinimumExponentDigits(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return static_cast(DecimalFormatProperties::getDefault().minimumExponentDigits); + } return static_cast(fields->properties->minimumExponentDigits); } void DecimalFormat::setMinimumExponentDigits(int8_t minExpDig) { + if (fields == nullptr) { return; } if (minExpDig == fields->properties->minimumExponentDigits) { return; } fields->properties->minimumExponentDigits = minExpDig; touchNoError(); } UBool DecimalFormat::isExponentSignAlwaysShown(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().exponentSignAlwaysShown; + } return fields->properties->exponentSignAlwaysShown; } void DecimalFormat::setExponentSignAlwaysShown(UBool expSignAlways) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(expSignAlways) == fields->properties->exponentSignAlwaysShown) { return; } fields->properties->exponentSignAlwaysShown = expSignAlways; touchNoError(); } int32_t DecimalFormat::getGroupingSize(void) const { - if (fields->properties->groupingSize < 0) { + int32_t groupingSize; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + groupingSize = DecimalFormatProperties::getDefault().groupingSize; + } else { + groupingSize = fields->properties->groupingSize; + } + if (groupingSize < 0) { return 0; } - return fields->properties->groupingSize; + return groupingSize; } void DecimalFormat::setGroupingSize(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->groupingSize) { return; } fields->properties->groupingSize = newValue; touchNoError(); } int32_t DecimalFormat::getSecondaryGroupingSize(void) const { - int grouping2 = fields->properties->secondaryGroupingSize; + int32_t grouping2; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + grouping2 = DecimalFormatProperties::getDefault().secondaryGroupingSize; + } else { + grouping2 = fields->properties->secondaryGroupingSize; + } if (grouping2 < 0) { return 0; } @@ -861,84 +1192,128 @@ int32_t DecimalFormat::getSecondaryGroupingSize(void) const { } void DecimalFormat::setSecondaryGroupingSize(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->secondaryGroupingSize) { return; } fields->properties->secondaryGroupingSize = newValue; touchNoError(); } int32_t DecimalFormat::getMinimumGroupingDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().minimumGroupingDigits; + } return fields->properties->minimumGroupingDigits; } void DecimalFormat::setMinimumGroupingDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumGroupingDigits) { return; } fields->properties->minimumGroupingDigits = newValue; touchNoError(); } UBool DecimalFormat::isDecimalSeparatorAlwaysShown(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().decimalSeparatorAlwaysShown; + } return fields->properties->decimalSeparatorAlwaysShown; } void DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalSeparatorAlwaysShown) { return; } fields->properties->decimalSeparatorAlwaysShown = newValue; touchNoError(); } UBool DecimalFormat::isDecimalPatternMatchRequired(void) const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().decimalPatternMatchRequired; + } return fields->properties->decimalPatternMatchRequired; } void DecimalFormat::setDecimalPatternMatchRequired(UBool newValue) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(newValue) == fields->properties->decimalPatternMatchRequired) { return; } fields->properties->decimalPatternMatchRequired = newValue; touchNoError(); } UBool DecimalFormat::isParseNoExponent() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().parseNoExponent; + } return fields->properties->parseNoExponent; } void DecimalFormat::setParseNoExponent(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->parseNoExponent) { return; } fields->properties->parseNoExponent = value; touchNoError(); } UBool DecimalFormat::isParseCaseSensitive() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().parseCaseSensitive; + } return fields->properties->parseCaseSensitive; } void DecimalFormat::setParseCaseSensitive(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->parseCaseSensitive) { return; } fields->properties->parseCaseSensitive = value; touchNoError(); } UBool DecimalFormat::isFormatFailIfMoreThanMaxDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().formatFailIfMoreThanMaxDigits; + } return fields->properties->formatFailIfMoreThanMaxDigits; } void DecimalFormat::setFormatFailIfMoreThanMaxDigits(UBool value) { + if (fields == nullptr) { return; } if (UBOOL_TO_BOOL(value) == fields->properties->formatFailIfMoreThanMaxDigits) { return; } fields->properties->formatFailIfMoreThanMaxDigits = value; touchNoError(); } UnicodeString& DecimalFormat::toPattern(UnicodeString& result) const { + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + result.setToBogus(); + return result; + } // Pull some properties from exportedProperties and others from properties // to keep affix patterns intact. In particular, pull rounding properties // so that CurrencyUsage is reflected properly. // TODO: Consider putting this logic in number_patternstring.cpp instead. ErrorCode localStatus; DecimalFormatProperties tprops(*fields->properties); - bool useCurrency = ((!tprops.currency.isNull()) || !tprops.currencyPluralInfo.fPtr.isNull() || - !tprops.currencyUsage.isNull() || AffixUtils::hasCurrencySymbols( - tprops.positivePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.positiveSuffixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.negativePrefixPattern, localStatus) || AffixUtils::hasCurrencySymbols( - tprops.negativeSuffixPattern, localStatus)); + bool useCurrency = ( + !tprops.currency.isNull() || + !tprops.currencyPluralInfo.fPtr.isNull() || + !tprops.currencyUsage.isNull() || + AffixUtils::hasCurrencySymbols(tprops.positivePrefixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.positiveSuffixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.negativePrefixPattern, localStatus) || + AffixUtils::hasCurrencySymbols(tprops.negativeSuffixPattern, localStatus)); if (useCurrency) { tprops.minimumFractionDigits = fields->exportedProperties->minimumFractionDigits; tprops.maximumFractionDigits = fields->exportedProperties->maximumFractionDigits; @@ -949,6 +1324,11 @@ UnicodeString& DecimalFormat::toPattern(UnicodeString& result) const { } UnicodeString& DecimalFormat::toLocalizedPattern(UnicodeString& result) const { + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + result.setToBogus(); + return result; + } ErrorCode localStatus; result = toPattern(result); result = PatternStringUtils::convertLocalized(result, *fields->symbols, true, localStatus); @@ -961,6 +1341,13 @@ void DecimalFormat::applyPattern(const UnicodeString& pattern, UParseError&, UEr } void DecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } setPropertiesFromPattern(pattern, IGNORE_ROUNDING_NEVER, status); touch(status); } @@ -972,14 +1359,20 @@ void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern, } void DecimalFormat::applyLocalizedPattern(const UnicodeString& localizedPattern, UErrorCode& status) { - if (U_SUCCESS(status)) { - UnicodeString pattern = PatternStringUtils::convertLocalized( - localizedPattern, *fields->symbols, false, status); - applyPattern(pattern, status); + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; } + UnicodeString pattern = PatternStringUtils::convertLocalized( + localizedPattern, *fields->symbols, false, status); + applyPattern(pattern, status); } void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->maximumIntegerDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t min = fields->properties->minimumIntegerDigits; @@ -991,6 +1384,7 @@ void DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { } void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumIntegerDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t max = fields->properties->maximumIntegerDigits; @@ -1002,6 +1396,7 @@ void DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { } void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->maximumFractionDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t min = fields->properties->minimumFractionDigits; @@ -1013,6 +1408,7 @@ void DecimalFormat::setMaximumFractionDigits(int32_t newValue) { } void DecimalFormat::setMinimumFractionDigits(int32_t newValue) { + if (fields == nullptr) { return; } if (newValue == fields->properties->minimumFractionDigits) { return; } // For backwards compatibility, conflicting min/max need to keep the most recent setting. int32_t max = fields->properties->maximumFractionDigits; @@ -1024,14 +1420,25 @@ void DecimalFormat::setMinimumFractionDigits(int32_t newValue) { } int32_t DecimalFormat::getMinimumSignificantDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().minimumSignificantDigits; + } return fields->exportedProperties->minimumSignificantDigits; } int32_t DecimalFormat::getMaximumSignificantDigits() const { + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + return DecimalFormatProperties::getDefault().maximumSignificantDigits; + } return fields->exportedProperties->maximumSignificantDigits; } void DecimalFormat::setMinimumSignificantDigits(int32_t value) { + if (fields == nullptr) { return; } if (value == fields->properties->minimumSignificantDigits) { return; } int32_t max = fields->properties->maximumSignificantDigits; if (max >= 0 && max < value) { @@ -1042,6 +1449,7 @@ void DecimalFormat::setMinimumSignificantDigits(int32_t value) { } void DecimalFormat::setMaximumSignificantDigits(int32_t value) { + if (fields == nullptr) { return; } if (value == fields->properties->maximumSignificantDigits) { return; } int32_t min = fields->properties->minimumSignificantDigits; if (min >= 0 && min > value) { @@ -1052,10 +1460,20 @@ void DecimalFormat::setMaximumSignificantDigits(int32_t value) { } UBool DecimalFormat::areSignificantDigitsUsed() const { - return fields->properties->minimumSignificantDigits != -1 || fields->properties->maximumSignificantDigits != -1; + const DecimalFormatProperties* dfp; + // Not much we can do to report an error. + if (fields == nullptr) { + // Fallback to using the default instance of DecimalFormatProperties. + dfp = &(DecimalFormatProperties::getDefault()); + } else { + dfp = fields->properties.getAlias(); + } + return dfp->minimumSignificantDigits != -1 || dfp->maximumSignificantDigits != -1; } void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { + if (fields == nullptr) { return; } + // These are the default values from the old implementation. if (useSignificantDigits) { if (fields->properties->minimumSignificantDigits != -1 || @@ -1076,6 +1494,13 @@ void DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { } void DecimalFormat::setCurrency(const char16_t* theCurrency, UErrorCode& ec) { + // don't overwrite ec if it's already a failure. + if (U_FAILURE(ec)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + ec = U_MEMORY_ALLOCATION_ERROR; + return; + } CurrencyUnit currencyUnit(theCurrency, ec); if (U_FAILURE(ec)) { return; } if (!fields->properties->currency.isNull() && fields->properties->currency.getNoError() == currencyUnit) { @@ -1093,7 +1518,11 @@ void DecimalFormat::setCurrency(const char16_t* theCurrency) { } void DecimalFormat::setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec) { - if (U_FAILURE(*ec)) { + // don't overwrite ec if it's already a failure. + if (U_FAILURE(*ec)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + *ec = U_MEMORY_ALLOCATION_ERROR; return; } if (!fields->properties->currencyUsage.isNull() && newUsage == fields->properties->currencyUsage.getNoError()) { @@ -1106,7 +1535,7 @@ void DecimalFormat::setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec) { UCurrencyUsage DecimalFormat::getCurrencyUsage() const { // CurrencyUsage is not exported, so we have to get it from the input property bag. // TODO: Should we export CurrencyUsage instead? - if (fields->properties->currencyUsage.isNull()) { + if (fields == nullptr || fields->properties->currencyUsage.isNull()) { return UCURR_USAGE_STANDARD; } return fields->properties->currencyUsage.getNoError(); @@ -1114,26 +1543,58 @@ UCurrencyUsage DecimalFormat::getCurrencyUsage() const { void DecimalFormat::formatToDecimalQuantity(double number, DecimalQuantity& output, UErrorCode& status) const { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } fields->formatter->formatDouble(number, status).getDecimalQuantity(output, status); } void DecimalFormat::formatToDecimalQuantity(const Formattable& number, DecimalQuantity& output, UErrorCode& status) const { + // don't overwrite status if it's already a failure. + if (U_FAILURE(status)) { return; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return; + } UFormattedNumberData obj; number.populateDecimalQuantity(obj.quantity, status); fields->formatter->formatImpl(&obj, status); output = std::move(obj.quantity); } +const number::LocalizedNumberFormatter* DecimalFormat::toNumberFormatter(UErrorCode& status) const { + // We sometimes need to return nullptr here (see ICU-20380) + if (U_FAILURE(status)) { return nullptr; } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return &*fields->formatter; +} + const number::LocalizedNumberFormatter& DecimalFormat::toNumberFormatter() const { - return *fields->formatter; + UErrorCode localStatus = U_ZERO_ERROR; + return *toNumberFormatter(localStatus); } /** Rebuilds the formatter object from the property bag. */ void DecimalFormat::touch(UErrorCode& status) { - if (fields->exportedProperties == nullptr) { - // fields->exportedProperties is null only when the formatter is not ready yet. - // The only time when this happens is during legacy deserialization. + if (U_FAILURE(status)) { + return; + } + if (fields == nullptr) { + // We only get here if an OOM error happend during construction, copy construction, assignment, or modification. + // For regular construction, the caller should have checked the status variable for errors. + // For copy construction, there is unfortunately nothing to report the error, so we need to guard against + // this possible bad state here and set the status to an error. + status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -1141,14 +1602,15 @@ void DecimalFormat::touch(UErrorCode& status) { Locale locale = fields->symbols->getLocale(); // Note: The formatter is relatively cheap to create, and we need it to populate fields->exportedProperties, - // so automatically compute it here. The parser is a bit more expensive and is not needed until the + // so automatically recompute it here. The parser is a bit more expensive and is not needed until the // parse method is called, so defer that until needed. // TODO: Only update the pieces that changed instead of re-computing the whole formatter? - fields->formatter.adoptInstead( - new LocalizedNumberFormatter( - NumberPropertyMapper::create( - *fields->properties, *fields->symbols, fields->warehouse, *fields->exportedProperties, status).locale( - locale))); + + // Since memory has already been allocated for the formatter, we can move assign a stack-allocated object + // and don't need to call new. (Which is slower and could possibly fail). + *fields->formatter = NumberPropertyMapper::create( + *fields->properties, *fields->symbols, fields->warehouse, *fields->exportedProperties, status).locale( + locale); // Do this after fields->exportedProperties are set up setupFastFormat(); @@ -1251,6 +1713,7 @@ const numparse::impl::NumberParserImpl* DecimalFormat::getCurrencyParser(UErrorC void DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition, int32_t offset, UErrorCode& status) { + if (U_FAILURE(status)) { return; } // always return first occurrence: fieldPosition.setBeginIndex(0); fieldPosition.setEndIndex(0); @@ -1264,7 +1727,7 @@ DecimalFormat::fieldPositionHelper(const number::FormattedNumber& formatted, Fie void DecimalFormat::fieldPositionIteratorHelper(const number::FormattedNumber& formatted, FieldPositionIterator* fpi, int32_t offset, UErrorCode& status) { - if (fpi != nullptr) { + if (U_SUCCESS(status) && (fpi != nullptr)) { FieldPositionIteratorHandler fpih(fpi, status); fpih.setShift(offset); formatted.getAllFieldPositionsImpl(fpih, status); diff --git a/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp b/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp index 07d0b0eb0f8717..2add399f87c91f 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp +++ b/deps/icu-small/source/i18n/double-conversion-bignum-dtoa.cpp @@ -34,7 +34,7 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include +#include // ICU PATCH: Customize header file paths for ICU. diff --git a/deps/icu-small/source/i18n/double-conversion-bignum.cpp b/deps/icu-small/source/i18n/double-conversion-bignum.cpp index d5682af35f866d..5356923921c3c1 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum.cpp +++ b/deps/icu-small/source/i18n/double-conversion-bignum.cpp @@ -45,7 +45,7 @@ U_NAMESPACE_BEGIN namespace double_conversion { Bignum::Bignum() - : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { + : bigits_buffer_(), bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { for (int i = 0; i < kBigitCapacity; ++i) { bigits_[i] = 0; } @@ -459,26 +459,27 @@ void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) { mask >>= 2; uint64_t this_value = base; - bool delayed_multipliciation = false; + bool delayed_multiplication = false; const uint64_t max_32bits = 0xFFFFFFFF; while (mask != 0 && this_value <= max_32bits) { this_value = this_value * this_value; // Verify that there is enough space in this_value to perform the // multiplication. The first bit_size bits must be 0. if ((power_exponent & mask) != 0) { + ASSERT(bit_size > 0); uint64_t base_bits_mask = ~((static_cast(1) << (64 - bit_size)) - 1); bool high_bits_zero = (this_value & base_bits_mask) == 0; if (high_bits_zero) { this_value *= base; } else { - delayed_multipliciation = true; + delayed_multiplication = true; } } mask >>= 1; } AssignUInt64(this_value); - if (delayed_multipliciation) { + if (delayed_multiplication) { MultiplyByUInt32(base); } diff --git a/deps/icu-small/source/i18n/double-conversion-bignum.h b/deps/icu-small/source/i18n/double-conversion-bignum.h index d1af3bf5e77b15..d39a3dee010d8b 100644 --- a/deps/icu-small/source/i18n/double-conversion-bignum.h +++ b/deps/icu-small/source/i18n/double-conversion-bignum.h @@ -150,7 +150,7 @@ class Bignum { // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize). int exponent_; - DISALLOW_COPY_AND_ASSIGN(Bignum); + DC_DISALLOW_COPY_AND_ASSIGN(Bignum); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp index e49700444c6b48..e1b66d2c65c82e 100644 --- a/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp +++ b/deps/icu-small/source/i18n/double-conversion-cached-powers.cpp @@ -34,9 +34,9 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include -#include -#include +#include +#include +#include // ICU PATCH: Customize header file paths for ICU. diff --git a/deps/icu-small/source/i18n/double-conversion-ieee.h b/deps/icu-small/source/i18n/double-conversion-ieee.h index 952bcea27f6615..c83c8d9abbb46e 100644 --- a/deps/icu-small/source/i18n/double-conversion-ieee.h +++ b/deps/icu-small/source/i18n/double-conversion-ieee.h @@ -271,7 +271,7 @@ class Double { (biased_exponent << kPhysicalSignificandSize); } - DISALLOW_COPY_AND_ASSIGN(Double); + DC_DISALLOW_COPY_AND_ASSIGN(Double); }; class Single { @@ -408,7 +408,7 @@ class Single { const uint32_t d32_; - DISALLOW_COPY_AND_ASSIGN(Single); + DC_DISALLOW_COPY_AND_ASSIGN(Single); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/double-conversion-utils.h b/deps/icu-small/source/i18n/double-conversion-utils.h index 57fc49b231a3a0..1e44fcaa0e398d 100644 --- a/deps/icu-small/source/i18n/double-conversion-utils.h +++ b/deps/icu-small/source/i18n/double-conversion-utils.h @@ -37,8 +37,8 @@ #ifndef DOUBLE_CONVERSION_UTILS_H_ #define DOUBLE_CONVERSION_UTILS_H_ -#include -#include +#include +#include // ICU PATCH: Use U_ASSERT instead of #include "uassert.h" @@ -75,7 +75,22 @@ inline void abort_noreturn() { abort(); } // the output of the division with the expected result. (Inlining must be // disabled.) // On Linux,x86 89255e-22 != Div_double(89255.0/1e22) -// ICU PATCH: Enable ARM32 & ARM64 builds for Windows with 'defined(_M_ARM) || defined(_M_ARM64)'. +// +// For example: +/* +// -- in div.c +double Div_double(double x, double y) { return x / y; } + +// -- in main.c +double Div_double(double x, double y); // Forward declaration. + +int main(int argc, char** argv) { + return Div_double(89255.0, 1e22) == 89255e-22; +} +*/ +// Run as follows ./main || echo "correct" +// +// If it prints "correct" then the architecture should be here, in the "correct" section. #if defined(_M_X64) || defined(__x86_64__) || \ defined(__ARMEL__) || defined(__avr32__) || defined(_M_ARM) || defined(_M_ARM64) || \ defined(__hppa__) || defined(__ia64__) || \ @@ -85,10 +100,13 @@ inline void abort_noreturn() { abort(); } defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ defined(__SH4__) || defined(__alpha__) || \ defined(_MIPS_ARCH_MIPS32R2) || \ - defined(__AARCH64EL__) || defined(__aarch64__) || \ - defined(__riscv) + defined(__AARCH64EL__) || defined(__aarch64__) || defined(__AARCH64EB__) || \ + defined(__riscv) || \ + defined(__or1k__) || defined(__arc__) || \ + defined(__EMSCRIPTEN__) #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#elif defined(__mc68000__) +#elif defined(__mc68000__) || \ + defined(__pnacl__) || defined(__native_client__) #undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) #if defined(_WIN32) @@ -101,12 +119,6 @@ inline void abort_noreturn() { abort(); } #error Target architecture was not detected as supported by Double-Conversion. #endif -#if defined(__GNUC__) -#define DOUBLE_CONVERSION_UNUSED __attribute__((unused)) -#else -#define DOUBLE_CONVERSION_UNUSED -#endif - #if defined(_WIN32) && !defined(__MINGW32__) typedef signed char int8_t; @@ -145,8 +157,8 @@ typedef uint16_t uc16; // A macro to disallow the evil copy constructor and operator= functions // This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ +#ifndef DC_DISALLOW_COPY_AND_ASSIGN +#define DC_DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #endif @@ -157,10 +169,10 @@ typedef uint16_t uc16; // This should be used in the private: declarations for a class // that wants to prevent anyone from instantiating it. This is // especially useful for classes containing only static methods. -#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ +#ifndef DC_DISALLOW_IMPLICIT_CONSTRUCTORS +#define DC_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) + DC_DISALLOW_COPY_AND_ASSIGN(TypeName) #endif // ICU PATCH: Wrap in ICU namespace @@ -305,7 +317,7 @@ class StringBuilder { bool is_finalized() const { return position_ < 0; } - DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); }; // The type-based aliasing rule allows the compiler to assume that pointers of @@ -336,8 +348,12 @@ template inline Dest BitCast(const Source& source) { // Compile time assertion: sizeof(Dest) == sizeof(Source) // A compile error here means your Dest and Source have different sizes. - DOUBLE_CONVERSION_UNUSED - typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; +#if __cplusplus >= 201103L + static_assert(sizeof(Dest) == sizeof(Source), + "source and destination size mismatch"); +#else + typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; +#endif Dest dest; memmove(&dest, &source, sizeof(dest)); diff --git a/deps/icu-small/source/i18n/double-conversion.cpp b/deps/icu-small/source/i18n/double-conversion.cpp index 570a05bc42946c..1a60afbd64b6b7 100644 --- a/deps/icu-small/source/i18n/double-conversion.cpp +++ b/deps/icu-small/source/i18n/double-conversion.cpp @@ -34,8 +34,11 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING -#include -#include +// ICU PATCH: Do not include std::locale. + +#include +//#include +#include // ICU PATCH: Customize header file paths for ICU. // The file fixed-dtoa.h is not needed. @@ -432,21 +435,60 @@ void DoubleToStringConverter::DoubleToAscii(double v, } +namespace { + +inline char ToLower(char ch) { +#if 0 // do not include std::locale in ICU + static const std::ctype& cType = + std::use_facet >(std::locale::classic()); + return cType.tolower(ch); +#else + (void)ch; + UNREACHABLE(); +#endif +} + +inline char Pass(char ch) { + return ch; +} + +template +static inline bool ConsumeSubStringImpl(Iterator* current, + Iterator end, + const char* substring, + Converter converter) { + ASSERT(converter(**current) == *substring); + for (substring++; *substring != '\0'; substring++) { + ++*current; + if (*current == end || converter(**current) != *substring) { + return false; + } + } + ++*current; + return true; +} + // Consumes the given substring from the iterator. // Returns false, if the substring does not match. template static bool ConsumeSubString(Iterator* current, Iterator end, - const char* substring) { - ASSERT(**current == *substring); - for (substring++; *substring != '\0'; substring++) { - ++*current; - if (*current == end || **current != *substring) return false; + const char* substring, + bool allow_case_insensibility) { + if (allow_case_insensibility) { + return ConsumeSubStringImpl(current, end, substring, ToLower); + } else { + return ConsumeSubStringImpl(current, end, substring, Pass); } - ++*current; - return true; } +// Consumes first character of the str is equal to ch +inline bool ConsumeFirstCharacter(char ch, + const char* str, + bool case_insensibility) { + return case_insensibility ? ToLower(ch) == str[0] : ch == str[0]; +} +} // namespace // Maximum number of significant digits in decimal representation. // The longest possible double in decimal representation is @@ -513,7 +555,7 @@ static double SignedZero(bool sign) { // because it constant-propagated the radix and concluded that the last // condition was always true. By moving it into a separate function the // compiler wouldn't warn anymore. -#if _MSC_VER +#ifdef _MSC_VER #pragma optimize("",off) static bool IsDecimalDigitForRadix(int c, int radix) { return '0' <= c && c <= '9' && (c - '0') < radix; @@ -521,7 +563,7 @@ static bool IsDecimalDigitForRadix(int c, int radix) { #pragma optimize("",on) #else static bool inline IsDecimalDigitForRadix(int c, int radix) { - return '0' <= c && c <= '9' && (c - '0') < radix; + return '0' <= c && c <= '9' && (c - '0') < radix; } #endif // Returns true if 'c' is a character digit that is valid for the given radix. @@ -535,17 +577,86 @@ static bool IsCharacterDigitForRadix(int c, int radix, char a_character) { return radix > 10 && c >= a_character && c < a_character + radix - 10; } +// Returns true, when the iterator is equal to end. +template +static bool Advance (Iterator* it, uc16 separator, int base, Iterator& end) { + if (separator == StringToDoubleConverter::kNoSeparator) { + ++(*it); + return *it == end; + } + if (!isDigit(**it, base)) { + ++(*it); + return *it == end; + } + ++(*it); + if (*it == end) return true; + if (*it + 1 == end) return false; + if (**it == separator && isDigit(*(*it + 1), base)) { + ++(*it); + } + return *it == end; +} + +// Checks whether the string in the range start-end is a hex-float string. +// This function assumes that the leading '0x'/'0X' is already consumed. +// +// Hex float strings are of one of the following forms: +// - hex_digits+ 'p' ('+'|'-')? exponent_digits+ +// - hex_digits* '.' hex_digits+ 'p' ('+'|'-')? exponent_digits+ +// - hex_digits+ '.' 'p' ('+'|'-')? exponent_digits+ +template +static bool IsHexFloatString(Iterator start, + Iterator end, + uc16 separator, + bool allow_trailing_junk) { + ASSERT(start != end); + + Iterator current = start; + + bool saw_digit = false; + while (isDigit(*current, 16)) { + saw_digit = true; + if (Advance(¤t, separator, 16, end)) return false; + } + if (*current == '.') { + if (Advance(¤t, separator, 16, end)) return false; + while (isDigit(*current, 16)) { + saw_digit = true; + if (Advance(¤t, separator, 16, end)) return false; + } + if (!saw_digit) return false; // Only the '.', but no digits. + } + if (*current != 'p' && *current != 'P') return false; + if (Advance(¤t, separator, 16, end)) return false; + if (*current == '+' || *current == '-') { + if (Advance(¤t, separator, 16, end)) return false; + } + if (!isDigit(*current, 10)) return false; + if (Advance(¤t, separator, 16, end)) return true; + while (isDigit(*current, 10)) { + if (Advance(¤t, separator, 16, end)) return true; + } + return allow_trailing_junk || !AdvanceToNonspace(¤t, end); +} + // Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end. +// +// If parse_as_hex_float is true, then the string must be a valid +// hex-float. template static double RadixStringToIeee(Iterator* current, Iterator end, bool sign, + uc16 separator, + bool parse_as_hex_float, bool allow_trailing_junk, double junk_string_value, bool read_as_double, bool* result_is_junk) { ASSERT(*current != end); + ASSERT(!parse_as_hex_float || + IsHexFloatString(*current, end, separator, allow_trailing_junk)); const int kDoubleSize = Double::kSignificandSize; const int kSingleSize = Single::kSignificandSize; @@ -553,27 +664,39 @@ static double RadixStringToIeee(Iterator* current, *result_is_junk = true; + int64_t number = 0; + int exponent = 0; + const int radix = (1 << radix_log_2); + // Whether we have encountered a '.' and are parsing the decimal digits. + // Only relevant if parse_as_hex_float is true. + bool post_decimal = false; + // Skip leading 0s. while (**current == '0') { - ++(*current); - if (*current == end) { + if (Advance(current, separator, radix, end)) { *result_is_junk = false; return SignedZero(sign); } } - int64_t number = 0; - int exponent = 0; - const int radix = (1 << radix_log_2); - - do { + while (true) { int digit; if (IsDecimalDigitForRadix(**current, radix)) { digit = static_cast(**current) - '0'; + if (post_decimal) exponent -= radix_log_2; } else if (IsCharacterDigitForRadix(**current, radix, 'a')) { digit = static_cast(**current) - 'a' + 10; + if (post_decimal) exponent -= radix_log_2; } else if (IsCharacterDigitForRadix(**current, radix, 'A')) { digit = static_cast(**current) - 'A' + 10; + if (post_decimal) exponent -= radix_log_2; + } else if (parse_as_hex_float && **current == '.') { + post_decimal = true; + Advance(current, separator, radix, end); + ASSERT(*current != end); + continue; + } else if (parse_as_hex_float && (**current == 'p' || **current == 'P')) { + break; } else { if (allow_trailing_junk || !AdvanceToNonspace(current, end)) { break; @@ -596,17 +719,26 @@ static double RadixStringToIeee(Iterator* current, int dropped_bits_mask = ((1 << overflow_bits_count) - 1); int dropped_bits = static_cast(number) & dropped_bits_mask; number >>= overflow_bits_count; - exponent = overflow_bits_count; + exponent += overflow_bits_count; bool zero_tail = true; for (;;) { - ++(*current); - if (*current == end || !isDigit(**current, radix)) break; + if (Advance(current, separator, radix, end)) break; + if (parse_as_hex_float && **current == '.') { + // Just run over the '.'. We are just trying to see whether there is + // a non-zero digit somewhere. + Advance(current, separator, radix, end); + ASSERT(*current != end); + post_decimal = true; + } + if (!isDigit(**current, radix)) break; zero_tail = zero_tail && **current == '0'; - exponent += radix_log_2; + if (!post_decimal) exponent += radix_log_2; } - if (!allow_trailing_junk && AdvanceToNonspace(current, end)) { + if (!parse_as_hex_float && + !allow_trailing_junk && + AdvanceToNonspace(current, end)) { return junk_string_value; } @@ -628,15 +760,37 @@ static double RadixStringToIeee(Iterator* current, } break; } - ++(*current); - } while (*current != end); + if (Advance(current, separator, radix, end)) break; + } ASSERT(number < ((int64_t)1 << kSignificandSize)); ASSERT(static_cast(static_cast(number)) == number); *result_is_junk = false; - if (exponent == 0) { + if (parse_as_hex_float) { + ASSERT(**current == 'p' || **current == 'P'); + Advance(current, separator, radix, end); + ASSERT(*current != end); + bool is_negative = false; + if (**current == '+') { + Advance(current, separator, radix, end); + ASSERT(*current != end); + } else if (**current == '-') { + is_negative = true; + Advance(current, separator, radix, end); + ASSERT(*current != end); + } + int written_exponent = 0; + while (IsDecimalDigitForRadix(**current, 10)) { + written_exponent = 10 * written_exponent + **current - '0'; + if (Advance(current, separator, radix, end)) break; + } + if (is_negative) written_exponent = -written_exponent; + exponent += written_exponent; + } + + if (exponent == 0 || number == 0) { if (sign) { if (number == 0) return -0.0; number = -number; @@ -645,7 +799,8 @@ static double RadixStringToIeee(Iterator* current, } ASSERT(number != 0); - return Double(DiyFp(number, exponent)).value(); + double result = Double(DiyFp(number, exponent)).value(); + return sign ? -result : result; } template @@ -663,6 +818,7 @@ double StringToDoubleConverter::StringToIeee( const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0; const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0; const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0; + const bool allow_case_insensibility = (flags_ & ALLOW_CASE_INSENSIBILITY) != 0; // To make sure that iterator dereferencing is valid the following // convention is used: @@ -712,8 +868,8 @@ double StringToDoubleConverter::StringToIeee( } if (infinity_symbol_ != NULL) { - if (*current == infinity_symbol_[0]) { - if (!ConsumeSubString(¤t, end, infinity_symbol_)) { + if (ConsumeFirstCharacter(*current, infinity_symbol_, allow_case_insensibility)) { + if (!ConsumeSubString(¤t, end, infinity_symbol_, allow_case_insensibility)) { return junk_string_value_; } @@ -731,8 +887,8 @@ double StringToDoubleConverter::StringToIeee( } if (nan_symbol_ != NULL) { - if (*current == nan_symbol_[0]) { - if (!ConsumeSubString(¤t, end, nan_symbol_)) { + if (ConsumeFirstCharacter(*current, nan_symbol_, allow_case_insensibility)) { + if (!ConsumeSubString(¤t, end, nan_symbol_, allow_case_insensibility)) { return junk_string_value_; } @@ -751,8 +907,7 @@ double StringToDoubleConverter::StringToIeee( bool leading_zero = false; if (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -760,16 +915,24 @@ double StringToDoubleConverter::StringToIeee( leading_zero = true; // It could be hexadecimal value. - if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { + if (((flags_ & ALLOW_HEX) || (flags_ & ALLOW_HEX_FLOATS)) && + (*current == 'x' || *current == 'X')) { ++current; - if (current == end || !isDigit(*current, 16)) { - return junk_string_value_; // "0x". + + bool parse_as_hex_float = (flags_ & ALLOW_HEX_FLOATS) && + IsHexFloatString(current, end, separator_, allow_trailing_junk); + + if (current == end) return junk_string_value_; // "0x" + if (!parse_as_hex_float && !isDigit(*current, 16)) { + return junk_string_value_; } bool result_is_junk; double result = RadixStringToIeee<4>(¤t, end, sign, + separator_, + parse_as_hex_float, allow_trailing_junk, junk_string_value_, read_as_double, @@ -783,8 +946,7 @@ double StringToDoubleConverter::StringToIeee( // Ignore leading zeros in the integer part. while (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -805,8 +967,7 @@ double StringToDoubleConverter::StringToIeee( nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; } octal = octal && *current < '8'; - ++current; - if (current == end) goto parsing_done; + if (Advance(¤t, separator_, 10, end)) goto parsing_done; } if (significant_digits == 0) { @@ -817,8 +978,7 @@ double StringToDoubleConverter::StringToIeee( if (octal && !allow_trailing_junk) return junk_string_value_; if (octal) goto parsing_done; - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { if (significant_digits == 0 && !leading_zero) { return junk_string_value_; } else { @@ -831,8 +991,7 @@ double StringToDoubleConverter::StringToIeee( // Integer part consists of 0 or is absent. Significant digits start after // leading zeros (if any). while (*current == '0') { - ++current; - if (current == end) { + if (Advance(¤t, separator_, 10, end)) { *processed_characters_count = static_cast(current - input); return SignedZero(sign); } @@ -852,8 +1011,7 @@ double StringToDoubleConverter::StringToIeee( // Ignore insignificant digits in the fractional part. nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; } - ++current; - if (current == end) goto parsing_done; + if (Advance(¤t, separator_, 10, end)) goto parsing_done; } } @@ -869,9 +1027,11 @@ double StringToDoubleConverter::StringToIeee( if (*current == 'e' || *current == 'E') { if (octal && !allow_trailing_junk) return junk_string_value_; if (octal) goto parsing_done; + Iterator junk_begin = current; ++current; if (current == end) { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -883,6 +1043,7 @@ double StringToDoubleConverter::StringToIeee( ++current; if (current == end) { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -892,6 +1053,7 @@ double StringToDoubleConverter::StringToIeee( if (current == end || *current < '0' || *current > '9') { if (allow_trailing_junk) { + current = junk_begin; goto parsing_done; } else { return junk_string_value_; @@ -936,6 +1098,8 @@ double StringToDoubleConverter::StringToIeee( result = RadixStringToIeee<3>(&start, buffer + buffer_pos, sign, + separator_, + false, // Don't parse as hex_float. allow_trailing_junk, junk_string_value_, read_as_double, diff --git a/deps/icu-small/source/i18n/double-conversion.h b/deps/icu-small/source/i18n/double-conversion.h index 200537a360a7cc..377c710bf791e7 100644 --- a/deps/icu-small/source/i18n/double-conversion.h +++ b/deps/icu-small/source/i18n/double-conversion.h @@ -310,13 +310,18 @@ class DoubleToStringConverter { // should be at least kBase10MaximalLength + 1 characters long. static const int kBase10MaximalLength = 17; - // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or - // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v' - // after it has been casted to a single-precision float. That is, in this - // mode static_cast(v) must not be NaN, +Infinity or -Infinity. + // Converts the given double 'v' to digit characters. 'v' must not be NaN, + // +Infinity, or -Infinity. In SHORTEST_SINGLE-mode this restriction also + // applies to 'v' after it has been casted to a single-precision float. That + // is, in this mode static_cast(v) must not be NaN, +Infinity or + // -Infinity. // // The result should be interpreted as buffer * 10^(point-length). // + // The digits are written to the buffer in the platform's charset, which is + // often UTF-8 (with ASCII-range digits) but may be another charset, such + // as EBCDIC. + // // The output depends on the given mode: // - SHORTEST: produce the least amount of digits for which the internal // identity requirement is still satisfied. If the digits are printed @@ -393,7 +398,7 @@ class DoubleToStringConverter { const int max_trailing_padding_zeroes_in_precision_mode_; #endif // not needed for ICU - DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); }; @@ -408,9 +413,13 @@ class StringToDoubleConverter { ALLOW_TRAILING_JUNK = 4, ALLOW_LEADING_SPACES = 8, ALLOW_TRAILING_SPACES = 16, - ALLOW_SPACES_AFTER_SIGN = 32 + ALLOW_SPACES_AFTER_SIGN = 32, + ALLOW_CASE_INSENSIBILITY = 64, + ALLOW_HEX_FLOATS = 128, }; + static const uc16 kNoSeparator = '\0'; + // Flags should be a bit-or combination of the possible Flags-enum. // - NO_FLAGS: no special flags. // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers. @@ -440,6 +449,13 @@ class StringToDoubleConverter { // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign. // Ex: StringToDouble("- 123.2") -> -123.2. // StringToDouble("+ 123.2") -> 123.2 + // - ALLOW_CASE_INSENSIBILITY: ignore case of characters for special values: + // infinity and nan. + // - ALLOW_HEX_FLOATS: allows hexadecimal float literals. + // This *must* start with "0x" and separate the exponent with "p". + // Examples: 0x1.2p3 == 9.0 + // 0x10.1p0 == 16.0625 + // ALLOW_HEX and ALLOW_HEX_FLOATS are indendent. // // empty_string_value is returned when an empty string is given as input. // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string @@ -464,6 +480,12 @@ class StringToDoubleConverter { // - they must not have the same first character. // - they must not start with digits. // + // If the separator character is not kNoSeparator, then that specific + // character is ignored when in between two valid digits of the significant. + // It is not allowed to appear in the exponent. + // It is not allowed to lead or trail the number. + // It is not allowed to appear twice next to each other. + // // Examples: // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK, // empty_string_value = 0.0, @@ -503,16 +525,26 @@ class StringToDoubleConverter { // StringToDouble("01239E45") -> 1239e45. // StringToDouble("-infinity") -> NaN // junk_string_value. // StringToDouble("NaN") -> NaN // junk_string_value. + // + // flags = NO_FLAGS, + // separator = ' ': + // StringToDouble("1 2 3 4") -> 1234.0 + // StringToDouble("1 2") -> NaN // junk_string_value + // StringToDouble("1 000 000.0") -> 1000000.0 + // StringToDouble("1.000 000") -> 1.0 + // StringToDouble("1.0e1 000") -> NaN // junk_string_value StringToDoubleConverter(int flags, double empty_string_value, double junk_string_value, const char* infinity_symbol, - const char* nan_symbol) + const char* nan_symbol, + uc16 separator = kNoSeparator) : flags_(flags), empty_string_value_(empty_string_value), junk_string_value_(junk_string_value), infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol) { + nan_symbol_(nan_symbol), + separator_(separator) { } // Performs the conversion. @@ -547,6 +579,7 @@ class StringToDoubleConverter { const double junk_string_value_; const char* const infinity_symbol_; const char* const nan_symbol_; + const uc16 separator_; template double StringToIeee(Iterator start_pointer, @@ -554,7 +587,7 @@ class StringToDoubleConverter { bool read_as_double, int* processed_characters_count) const; - DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); + DC_DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); }; } // namespace double_conversion diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index c9dfa045831d60..04aa01eb4c2459 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -21,6 +21,9 @@ * 10/12/05 emmons Added setters for eraNames, month/day by width/context ******************************************************************************* */ + +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -232,8 +235,6 @@ static const char gDayPeriodTag[]="dayPeriod"; static const char gContextTransformsTag[]="contextTransforms"; -static UMutex LOCK = U_MUTEX_INITIALIZER; - /** * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly. * Work around this. @@ -1245,6 +1246,7 @@ const UnicodeString** DateFormatSymbols::getZoneStrings(int32_t& rowCount, int32_t& columnCount) const { const UnicodeString **result = NULL; + static UMutex LOCK = U_MUTEX_INITIALIZER; umtx_lock(&LOCK); if (fZoneStrings == NULL) { @@ -1500,7 +1502,7 @@ struct CalendarDataSink : public ResourceSink { * To avoid double deletion, 'maps' won't take ownership of the objects. Instead, * 'mapRefs' will own them and will delete them when CalendarDataSink is deleted. */ - UVector mapRefs; + MemoryPool mapRefs; // Paths and the aliases they point to UVector aliasPathPairs; @@ -1518,7 +1520,7 @@ struct CalendarDataSink : public ResourceSink { // Initializes CalendarDataSink with default values CalendarDataSink(UErrorCode& status) : arrays(FALSE, status), arraySizes(FALSE, status), maps(FALSE, status), - mapRefs(deleteHashtable, NULL, 10, status), + mapRefs(), aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status), currentCalendarType(), nextCalendarType(), resourcesToVisit(NULL), aliasRelativePath() { @@ -1663,7 +1665,7 @@ struct CalendarDataSink : public ResourceSink { // Set the resources to visit on the next calendar if (!resourcesToVisitNext.isNull()) { - resourcesToVisit.moveFrom(resourcesToVisitNext); + resourcesToVisit = std::move(resourcesToVisitNext); } } @@ -1688,14 +1690,14 @@ struct CalendarDataSink : public ResourceSink { if (value.getType() == URES_STRING) { // We are on a leaf, store the map elements into the stringMap if (i == 0) { - LocalPointer stringMapPtr(new Hashtable(FALSE, errorCode), errorCode); - stringMap = stringMapPtr.getAlias(); + // mapRefs will keep ownership of 'stringMap': + stringMap = mapRefs.create(FALSE, errorCode); + if (stringMap == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } maps.put(path, stringMap, errorCode); - // mapRefs will take ownership of 'stringMap': - mapRefs.addElement(stringMap, errorCode); if (U_FAILURE(errorCode)) { return; } - // Only release ownership after mapRefs takes it (no error happened): - stringMapPtr.orphan(); stringMap->setValueDeleter(uprv_deleteUObject); } U_ASSERT(stringMap != NULL); @@ -1839,11 +1841,6 @@ struct CalendarDataSink : public ResourceSink { static void U_CALLCONV deleteUnicodeStringArray(void *uArray) { delete[] static_cast(uArray); } - - // Deleter function to be used by 'maps' - static void U_CALLCONV deleteHashtable(void *table) { - delete static_cast(table); - } }; // Virtual destructors have to be defined out of line CalendarDataSink::~CalendarDataSink() { diff --git a/deps/icu-small/source/i18n/dtitvfmt.cpp b/deps/icu-small/source/i18n/dtitvfmt.cpp index d952cbf509dc40..0e124f5624002b 100644 --- a/deps/icu-small/source/i18n/dtitvfmt.cpp +++ b/deps/icu-small/source/i18n/dtitvfmt.cpp @@ -28,6 +28,7 @@ #include "dtitv_impl.h" #include "mutex.h" #include "uresimp.h" +#include "formattedval_impl.h" #ifdef DTITVFMT_DEBUG #include @@ -65,12 +66,26 @@ static const UChar gLaterFirstPrefix[] = {LOW_L, LOW_A, LOW_T, LOW_E, LOW_S,LOW_ static const UChar gEarlierFirstPrefix[] = {LOW_E, LOW_A, LOW_R, LOW_L, LOW_I, LOW_E, LOW_S, LOW_T, CAP_F, LOW_I, LOW_R, LOW_S, LOW_T, COLON}; +class FormattedDateIntervalData : public FormattedValueFieldPositionIteratorImpl { +public: + FormattedDateIntervalData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {} + virtual ~FormattedDateIntervalData(); +}; + +FormattedDateIntervalData::~FormattedDateIntervalData() = default; + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedDateInterval) + + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateIntervalFormat) // Mutex, protects access to fDateFormat, fFromCalendar and fToCalendar. // Needed because these data members are modified by const methods of DateIntervalFormat. -static UMutex gFormatterMutex = U_MUTEX_INITIALIZER; +static UMutex *gFormatterMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} DateIntervalFormat* U_EXPORT2 DateIntervalFormat::createInstance(const UnicodeString& skeleton, @@ -156,7 +171,7 @@ DateIntervalFormat::operator=(const DateIntervalFormat& itvfmt) { delete fTimePattern; delete fDateTimeFormat; { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); if ( itvfmt.fDateFormat ) { fDateFormat = (SimpleDateFormat*)itvfmt.fDateFormat->clone(); } else { @@ -218,7 +233,7 @@ DateIntervalFormat::operator==(const Format& other) const { if ((fInfo != fmt->fInfo) && (fInfo == NULL || fmt->fInfo == NULL)) {return FALSE;} if (fInfo && fmt->fInfo && (*fInfo != *fmt->fInfo )) {return FALSE;} { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); if (fDateFormat != fmt->fDateFormat && (fDateFormat == NULL || fmt->fDateFormat == NULL)) {return FALSE;} if (fDateFormat && fmt->fDateFormat && (*fDateFormat != *fmt->fDateFormat)) {return FALSE;} } @@ -271,15 +286,51 @@ DateIntervalFormat::format(const DateInterval* dtInterval, if ( U_FAILURE(status) ) { return appendTo; } - if (fFromCalendar == NULL || fToCalendar == NULL || fDateFormat == NULL || fInfo == NULL) { + if (fDateFormat == NULL || fInfo == NULL) { status = U_INVALID_STATE_ERROR; return appendTo; } - Mutex lock(&gFormatterMutex); - fFromCalendar->setTime(dtInterval->getFromDate(), status); - fToCalendar->setTime(dtInterval->getToDate(), status); - return formatImpl(*fFromCalendar, *fToCalendar, appendTo,fieldPosition, status); + FieldPositionOnlyHandler handler(fieldPosition); + handler.setAcceptFirstOnly(TRUE); + int8_t ignore; + + Mutex lock(gFormatterMutex()); + return formatIntervalImpl(*dtInterval, appendTo, ignore, handler, status); +} + + +FormattedDateInterval DateIntervalFormat::formatToValue( + const DateInterval& dtInterval, + UErrorCode& status) const { + LocalPointer result(new FormattedDateIntervalData(status), status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + UnicodeString string; + int8_t firstIndex; + auto handler = result->getHandler(status); + handler.setCategory(UFIELD_CATEGORY_DATE); + { + Mutex lock(gFormatterMutex()); + formatIntervalImpl(dtInterval, string, firstIndex, handler, status); + } + handler.getError(status); + result->appendString(string, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + + // Compute the span fields and sort them into place: + if (firstIndex != -1) { + result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + result->sort(); + } + + return FormattedDateInterval(result.orphan()); } @@ -289,8 +340,63 @@ DateIntervalFormat::format(Calendar& fromCalendar, UnicodeString& appendTo, FieldPosition& pos, UErrorCode& status) const { - Mutex lock(&gFormatterMutex); - return formatImpl(fromCalendar, toCalendar, appendTo, pos, status); + FieldPositionOnlyHandler handler(pos); + handler.setAcceptFirstOnly(TRUE); + int8_t ignore; + + Mutex lock(gFormatterMutex()); + return formatImpl(fromCalendar, toCalendar, appendTo, ignore, handler, status); +} + + +FormattedDateInterval DateIntervalFormat::formatToValue( + Calendar& fromCalendar, + Calendar& toCalendar, + UErrorCode& status) const { + LocalPointer result(new FormattedDateIntervalData(status), status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + UnicodeString string; + int8_t firstIndex; + auto handler = result->getHandler(status); + handler.setCategory(UFIELD_CATEGORY_DATE); + { + Mutex lock(gFormatterMutex()); + formatImpl(fromCalendar, toCalendar, string, firstIndex, handler, status); + } + handler.getError(status); + result->appendString(string, status); + if (U_FAILURE(status)) { + return FormattedDateInterval(status); + } + + // Compute the span fields and sort them into place: + if (firstIndex != -1) { + result->addOverlapSpans(UFIELD_CATEGORY_DATE_INTERVAL_SPAN, firstIndex, status); + result->sort(); + } + + return FormattedDateInterval(result.orphan()); +} + + +UnicodeString& DateIntervalFormat::formatIntervalImpl( + const DateInterval& dtInterval, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return appendTo; + } + if (fFromCalendar == nullptr || fToCalendar == nullptr) { + status = U_INVALID_STATE_ERROR; + return appendTo; + } + fFromCalendar->setTime(dtInterval.getFromDate(), status); + fToCalendar->setTime(dtInterval.getToDate(), status); + return formatImpl(*fFromCalendar, *fToCalendar, appendTo, firstIndex, fphandler, status); } @@ -298,12 +404,16 @@ UnicodeString& DateIntervalFormat::formatImpl(Calendar& fromCalendar, Calendar& toCalendar, UnicodeString& appendTo, - FieldPosition& pos, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const { if ( U_FAILURE(status) ) { return appendTo; } + // Initialize firstIndex to -1 (single date, no range) + firstIndex = -1; + // not support different calendar types and time zones //if ( fromCalendar.getType() != toCalendar.getType() ) { if ( !fromCalendar.isEquivalentTo(toCalendar) ) { @@ -346,7 +456,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, /* ignore the millisecond etc. small fields' difference. * use single date when all the above are the same. */ - return fDateFormat->format(fromCalendar, appendTo, pos); + return fDateFormat->_format(fromCalendar, appendTo, fphandler, status); } UBool fromToOnSameDay = (field==UCAL_AM_PM || field==UCAL_HOUR || field==UCAL_MINUTE || field==UCAL_SECOND); @@ -363,9 +473,9 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, * the smallest calendar field in pattern, * return single date format. */ - return fDateFormat->format(fromCalendar, appendTo, pos); + return fDateFormat->_format(fromCalendar, appendTo, fphandler, status); } - return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); + return fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status); } // If the first part in interval pattern is empty, // the 2nd part of it saves the full-pattern used in fall-back. @@ -375,7 +485,7 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, UnicodeString originalPattern; fDateFormat->toPattern(originalPattern); fDateFormat->applyPattern(intervalPattern.secondPart); - appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, pos, status); + appendTo = fallbackFormat(fromCalendar, toCalendar, fromToOnSameDay, appendTo, firstIndex, fphandler, status); fDateFormat->applyPattern(originalPattern); return appendTo; } @@ -384,24 +494,22 @@ DateIntervalFormat::formatImpl(Calendar& fromCalendar, if ( intervalPattern.laterDateFirst ) { firstCal = &toCalendar; secondCal = &fromCalendar; + firstIndex = 1; } else { firstCal = &fromCalendar; secondCal = &toCalendar; + firstIndex = 0; } // break the interval pattern into 2 parts, // first part should not be empty, UnicodeString originalPattern; fDateFormat->toPattern(originalPattern); fDateFormat->applyPattern(intervalPattern.firstPart); - fDateFormat->format(*firstCal, appendTo, pos); + fDateFormat->_format(*firstCal, appendTo, fphandler, status); + if ( !intervalPattern.secondPart.isEmpty() ) { fDateFormat->applyPattern(intervalPattern.secondPart); - FieldPosition otherPos; - otherPos.setField(pos.getField()); - fDateFormat->format(*secondCal, appendTo, otherPos); - if (pos.getEndIndex() == 0 && otherPos.getEndIndex() > 0) { - pos = otherPos; - } + fDateFormat->_format(*secondCal, appendTo, fphandler, status); } fDateFormat->applyPattern(originalPattern); return appendTo; @@ -492,7 +600,7 @@ const TimeZone& DateIntervalFormat::getTimeZone() const { if (fDateFormat != NULL) { - Mutex lock(&gFormatterMutex); + Mutex lock(gFormatterMutex()); return fDateFormat->getTimeZone(); } // If fDateFormat is NULL (unexpected), create default timezone. @@ -1022,7 +1130,9 @@ DateIntervalFormat::setSeparateDateTimePtn( } setIntervalPattern(UCAL_YEAR, skeleton, bestSkeleton, differenceInfo, &extendedSkeleton, &extendedBestSkeleton); - } else { + setIntervalPattern(UCAL_ERA, skeleton, bestSkeleton, differenceInfo, + &extendedSkeleton, &extendedBestSkeleton); + } else { setIntervalPattern(UCAL_MINUTE, skeleton, bestSkeleton, differenceInfo); setIntervalPattern(UCAL_HOUR, skeleton, bestSkeleton, differenceInfo); setIntervalPattern(UCAL_AM_PM, skeleton, bestSkeleton, differenceInfo); @@ -1294,40 +1404,37 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) return (i - count); } -static const UChar bracketedZero[] = {0x7B,0x30,0x7D}; -static const UChar bracketedOne[] = {0x7B,0x31,0x7D}; - -void -DateIntervalFormat::adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it - UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0} - UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1} - FieldPosition& posResult) { - int32_t index0 = combiningPattern.indexOf(bracketedZero, 3, 0); - int32_t index1 = combiningPattern.indexOf(bracketedOne, 3, 0); - if (index0 < 0 || index1 < 0) { +void DateIntervalFormat::fallbackFormatRange( + Calendar& fromCalendar, + Calendar& toCalendar, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const { + UnicodeString fallbackPattern; + fInfo->getFallbackIntervalPattern(fallbackPattern); + SimpleFormatter sf(fallbackPattern, 2, 2, status); + if (U_FAILURE(status)) { return; } - int32_t placeholderLen = 3; // length of "{0}" or "{1}" - if (index0 < index1) { - if (pos0.getEndIndex() > 0) { - posResult.setBeginIndex(pos0.getBeginIndex() + index0); - posResult.setEndIndex(pos0.getEndIndex() + index0); - } else if (pos1.getEndIndex() > 0) { - // here index1 >= 3 - index1 += pat0.length() - placeholderLen; // adjust for pat0 replacing {0} - posResult.setBeginIndex(pos1.getBeginIndex() + index1); - posResult.setEndIndex(pos1.getEndIndex() + index1); - } + int32_t offsets[2]; + UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2); + + // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available. + if (offsets[0] < offsets[1]) { + firstIndex = 0; + appendTo.append(patternBody.tempSubStringBetween(0, offsets[0])); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1])); + fDateFormat->_format(toCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1])); } else { - if (pos1.getEndIndex() > 0) { - posResult.setBeginIndex(pos1.getBeginIndex() + index1); - posResult.setEndIndex(pos1.getEndIndex() + index1); - } else if (pos0.getEndIndex() > 0) { - // here index0 >= 3 - index0 += pat1.length() - placeholderLen; // adjust for pat1 replacing {1} - posResult.setBeginIndex(pos0.getBeginIndex() + index0); - posResult.setEndIndex(pos0.getEndIndex() + index0); - } + firstIndex = 1; + appendTo.append(patternBody.tempSubStringBetween(0, offsets[1])); + fDateFormat->_format(toCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0])); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0])); } } @@ -1336,51 +1443,50 @@ DateIntervalFormat::fallbackFormat(Calendar& fromCalendar, Calendar& toCalendar, UBool fromToOnSameDay, // new UnicodeString& appendTo, - FieldPosition& pos, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const { if ( U_FAILURE(status) ) { return appendTo; } - UnicodeString fullPattern; // for saving the pattern in fDateFormat + UBool formatDatePlusTimeRange = (fromToOnSameDay && fDatePattern && fTimePattern); - // the fall back if (formatDatePlusTimeRange) { + SimpleFormatter sf(*fDateTimeFormat, 2, 2, status); + if (U_FAILURE(status)) { + return appendTo; + } + int32_t offsets[2]; + UnicodeString patternBody = sf.getTextWithNoArguments(offsets, 2); + + UnicodeString fullPattern; // for saving the pattern in fDateFormat fDateFormat->toPattern(fullPattern); // save current pattern, restore later - fDateFormat->applyPattern(*fTimePattern); - } - FieldPosition otherPos; - otherPos.setField(pos.getField()); - UnicodeString earlierDate; - fDateFormat->format(fromCalendar, earlierDate, pos); - UnicodeString laterDate; - fDateFormat->format(toCalendar, laterDate, otherPos); - UnicodeString fallbackPattern; - fInfo->getFallbackIntervalPattern(fallbackPattern); - adjustPosition(fallbackPattern, earlierDate, pos, laterDate, otherPos, pos); - UnicodeString fallbackRange; - SimpleFormatter(fallbackPattern, 2, 2, status). - format(earlierDate, laterDate, fallbackRange, status); - if ( U_SUCCESS(status) && formatDatePlusTimeRange ) { - // fallbackRange has just the time range, need to format the date part and combine that - fDateFormat->applyPattern(*fDatePattern); - UnicodeString datePortion; - otherPos.setBeginIndex(0); - otherPos.setEndIndex(0); - fDateFormat->format(fromCalendar, datePortion, otherPos); - adjustPosition(*fDateTimeFormat, fallbackRange, pos, datePortion, otherPos, pos); - const UnicodeString *values[2] = { - &fallbackRange, // {0} is time range - &datePortion, // {1} is single date portion - }; - SimpleFormatter(*fDateTimeFormat, 2, 2, status). - formatAndReplace(values, 2, fallbackRange, NULL, 0, status); - } - if ( U_SUCCESS(status) ) { - appendTo.append(fallbackRange); - } - if (formatDatePlusTimeRange) { + + // {0} is time range + // {1} is single date portion + // TODO(ICU-20406): Use SimpleFormatter Iterator interface when available. + if (offsets[0] < offsets[1]) { + appendTo.append(patternBody.tempSubStringBetween(0, offsets[0])); + fDateFormat->applyPattern(*fTimePattern); + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0], offsets[1])); + fDateFormat->applyPattern(*fDatePattern); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1])); + } else { + appendTo.append(patternBody.tempSubStringBetween(0, offsets[1])); + fDateFormat->applyPattern(*fDatePattern); + fDateFormat->_format(fromCalendar, appendTo, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[1], offsets[0])); + fDateFormat->applyPattern(*fTimePattern); + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); + appendTo.append(patternBody.tempSubStringBetween(offsets[0])); + } + // restore full pattern fDateFormat->applyPattern(fullPattern); + } else { + fallbackFormatRange(fromCalendar, toCalendar, appendTo, firstIndex, fphandler, status); } return appendTo; } @@ -1552,6 +1658,7 @@ DateIntervalFormat::fgCalendarFieldToPatternLetter[] = }; + U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index a289fc79c8da0e..c0a6980e5567bc 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -326,7 +326,9 @@ struct DateIntervalInfo::DateIntervalSink : public ResourceSink { char c0; if ((c0 = patternLetter[0]) != 0 && patternLetter[1] == 0) { // Check that the pattern letter is accepted - if (c0 == 'y') { + if (c0 == 'G') { + return UCAL_ERA; + } else if (c0 == 'y') { return UCAL_YEAR; } else if (c0 == 'M') { return UCAL_MONTH; diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index b44daf37bf5802..9ca29a3cc7e608 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -471,9 +471,14 @@ enum AllowedHourFormat{ ALLOWED_HOUR_FORMAT_UNKNOWN = -1, ALLOWED_HOUR_FORMAT_h, ALLOWED_HOUR_FORMAT_H, + ALLOWED_HOUR_FORMAT_K, // Added ICU-20383, used by JP + ALLOWED_HOUR_FORMAT_k, // Added ICU-20383, not currently used ALLOWED_HOUR_FORMAT_hb, - ALLOWED_HOUR_FORMAT_Hb, ALLOWED_HOUR_FORMAT_hB, + ALLOWED_HOUR_FORMAT_Kb, // Added ICU-20383, not currently used + ALLOWED_HOUR_FORMAT_KB, // Added ICU-20383, not currently used + // ICU-20383 The following are unlikely and not currently used + ALLOWED_HOUR_FORMAT_Hb, ALLOWED_HOUR_FORMAT_HB }; @@ -511,36 +516,55 @@ struct AllowedHourFormatsSink : public ResourceSink { const char *regionOrLocale = key; ResourceTable formatList = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } + // below we construct a list[] that has an entry for the "preferred" value at [0], + // followed by 1 or more entries for the "allowed" values, terminated with an + // entry for ALLOWED_HOUR_FORMAT_UNKNOWN (not included in length below) + LocalMemory list; + int32_t length = 0; + int32_t preferredFormat = ALLOWED_HOUR_FORMAT_UNKNOWN; for (int32_t j = 0; formatList.getKeyAndValue(j, key, value); ++j) { - if (uprv_strcmp(key, "allowed") == 0) { // Ignore "preferred" list. - LocalMemory list; - int32_t length; + if (uprv_strcmp(key, "allowed") == 0) { if (value.getType() == URES_STRING) { - if (list.allocateInsteadAndReset(2) == nullptr) { + length = 2; // 1 preferred to add later, 1 allowed to add now + if (list.allocateInsteadAndReset(length + 1) == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } - list[0] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); - length = 1; + list[1] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } else { ResourceArray allowedFormats = value.getArray(errorCode); - length = allowedFormats.getSize(); + length = allowedFormats.getSize() + 1; // 1 preferred, getSize allowed if (list.allocateInsteadAndReset(length + 1) == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return; } - for (int32_t k = 0; k < length; ++k) { - allowedFormats.getValue(k, value); + for (int32_t k = 1; k < length; ++k) { + allowedFormats.getValue(k-1, value); list[k] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } } - list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN; - uhash_put(localeToAllowedHourFormatsMap, - const_cast(regionOrLocale), list.orphan(), &errorCode); - if (U_FAILURE(errorCode)) { return; } + } else if (uprv_strcmp(key, "preferred") == 0) { + preferredFormat = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); } } + if (length > 1) { + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: list[1]; + } else { + // fallback handling for missing data + length = 2; // 1 preferred, 1 allowed + if (list.allocateInsteadAndReset(length + 1) == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: ALLOWED_HOUR_FORMAT_H; + list[1] = list[0]; + } + list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN; + // At this point list[] will have at least two non-ALLOWED_HOUR_FORMAT_UNKNOWN entries, + // followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + uhash_put(localeToAllowedHourFormatsMap, const_cast(regionOrLocale), list.orphan(), &errorCode); + if (U_FAILURE(errorCode)) { return; } } } @@ -548,10 +572,14 @@ struct AllowedHourFormatsSink : public ResourceSink { if (s.length() == 1) { if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; } if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; } + if (s[0] == CAP_K) { return ALLOWED_HOUR_FORMAT_K; } + if (s[0] == LOW_K) { return ALLOWED_HOUR_FORMAT_k; } } else if (s.length() == 2) { if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; } - if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; } if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; } + if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; } + if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; } + if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; } if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; } } @@ -587,16 +615,11 @@ U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UEr void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) { if (U_FAILURE(status)) { return; } - const char *localeID = locale.getName(); - char maxLocaleID[ULOC_FULLNAME_CAPACITY]; - int32_t length = uloc_addLikelySubtags(localeID, maxLocaleID, ULOC_FULLNAME_CAPACITY, &status); + Locale maxLocale(locale); + maxLocale.addLikelySubtags(status); if (U_FAILURE(status)) { return; - } else if (length == ULOC_FULLNAME_CAPACITY) { // no room for NUL - status = U_BUFFER_OVERFLOW_ERROR; - return; } - Locale maxLocale = Locale(maxLocaleID); const char *country = maxLocale.getCountry(); if (*country == '\0') { country = "001"; } @@ -614,13 +637,23 @@ void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErro } if (allowedFormats != nullptr) { // Lookup is successful + // Here allowedFormats points to a list consisting of key for preferredFormat, + // followed by one or more keys for allowedFormats, then followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + switch (allowedFormats[0]) { + case ALLOWED_HOUR_FORMAT_h: fDefaultHourFormatChar = LOW_H; break; + case ALLOWED_HOUR_FORMAT_H: fDefaultHourFormatChar = CAP_H; break; + case ALLOWED_HOUR_FORMAT_K: fDefaultHourFormatChar = CAP_K; break; + case ALLOWED_HOUR_FORMAT_k: fDefaultHourFormatChar = LOW_K; break; + default: fDefaultHourFormatChar = CAP_H; break; + } for (int32_t i = 0; i < UPRV_LENGTHOF(fAllowedHourFormats); ++i) { - fAllowedHourFormats[i] = allowedFormats[i]; - if (allowedFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) { + fAllowedHourFormats[i] = allowedFormats[i + 1]; + if (fAllowedHourFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) { break; } } } else { // Lookup failed, twice + fDefaultHourFormatChar = CAP_H; fAllowedHourFormats[0] = ALLOWED_HOUR_FORMAT_H; fAllowedHourFormats[1] = ALLOWED_HOUR_FORMAT_UNKNOWN; } @@ -750,8 +783,6 @@ DateTimePatternGenerator::hackTimes(const UnicodeString& hackPattern, UErrorCode #define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY) -static const UChar hourFormatChars[] = { CAP_H, LOW_H, CAP_K, LOW_K, 0 }; // HhKk, the hour format characters - void DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err) { destination.clear().append(DT_DateTimeGregorianTag, -1, err); // initial default @@ -791,18 +822,9 @@ void DateTimePatternGenerator::consumeShortTimePattern(const UnicodeString& shortTimePattern, UErrorCode& status) { if (U_FAILURE(status)) { return; } - // set fDefaultHourFormatChar to the hour format character from this pattern - int32_t tfIdx, tfLen = shortTimePattern.length(); - UBool ignoreChars = FALSE; - for (tfIdx = 0; tfIdx < tfLen; tfIdx++) { - UChar tfChar = shortTimePattern.charAt(tfIdx); - if ( tfChar == SINGLE_QUOTE ) { - ignoreChars = !ignoreChars; // toggle (handle quoted literals & '' for single quote) - } else if ( !ignoreChars && u_strchr(hourFormatChars, tfChar) != nullptr ) { - fDefaultHourFormatChar = tfChar; - break; - } - } + // ICU-20383 No longer set fDefaultHourFormatChar to the hour format character from + // this pattern; instead it is set from localeToAllowedHourFormatsMap which now + // includes entries for both preferred and allowed formats. // HACK for hh:ss hackTimes(shortTimePattern, status); @@ -1140,20 +1162,24 @@ DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& pattern if (patChr == LOW_J) { hourChar = fDefaultHourFormatChar; } else { - AllowedHourFormat preferred; + AllowedHourFormat bestAllowed; if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { - preferred = (AllowedHourFormat)fAllowedHourFormats[0]; + bestAllowed = (AllowedHourFormat)fAllowedHourFormats[0]; } else { status = U_INVALID_FORMAT_ERROR; return UnicodeString(); } - if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) { + if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) { hourChar = CAP_H; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_K || bestAllowed == ALLOWED_HOUR_FORMAT_KB || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { + hourChar = CAP_K; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_k) { + hourChar = LOW_K; } // in #13183 just add b/B to skeleton, no longer need to set special flags - if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) { + if (bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_hB || bestAllowed == ALLOWED_HOUR_FORMAT_KB) { dayPeriodChar = CAP_B; - } else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) { + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_Hb || bestAllowed == ALLOWED_HOUR_FORMAT_hb || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { dayPeriodChar = LOW_B; } } @@ -1804,7 +1830,7 @@ PatternMap::copyFrom(const PatternMap& other, UErrorCode& status) { if (prevElem != nullptr) { prevElem->next.adoptInstead(curElem); } else { - U_ASSERT(false); + UPRV_UNREACHABLE; } } prevElem = curElem; diff --git a/deps/icu-small/source/i18n/erarules.cpp b/deps/icu-small/source/i18n/erarules.cpp index 669f84423046fd..7e21a71c333f6f 100644 --- a/deps/icu-small/source/i18n/erarules.cpp +++ b/deps/icu-small/source/i18n/erarules.cpp @@ -1,6 +1,8 @@ // © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -9,6 +11,7 @@ #include "unicode/ucal.h" #include "unicode/ures.h" #include "unicode/ustring.h" +#include "unicode/timezone.h" #include "cmemory.h" #include "cstring.h" #include "erarules.h" @@ -101,7 +104,7 @@ static int32_t compareEncodedDateWithYMD(int encoded, int year, int month, int d EraRules::EraRules(LocalMemory& eraStartDates, int32_t numEras) : numEras(numEras) { - startDates.moveFrom(eraStartDates); + startDates = std::move(eraStartDates); initCurrentEra(); } @@ -288,9 +291,22 @@ int32_t EraRules::getEraIndex(int32_t year, int32_t month, int32_t day, UErrorCo } void EraRules::initCurrentEra() { - UDate now = ucal_getNow(); + // Compute local wall time in millis using ICU's default time zone. + UErrorCode ec = U_ZERO_ERROR; + UDate localMillis = ucal_getNow(); + + int32_t rawOffset, dstOffset; + TimeZone* zone = TimeZone::createDefault(); + // If we failed to create the default time zone, we are in a bad state and don't + // really have many options. Carry on using UTC millis as a fallback. + if (zone != nullptr) { + zone->getOffset(localMillis, FALSE, rawOffset, dstOffset, ec); + delete zone; + localMillis += (rawOffset + dstOffset); + } + int year, month0, dom, dow, doy, mid; - Grego::timeToFields(now, year, month0, dom, dow, doy, mid); + Grego::timeToFields(localMillis, year, month0, dom, dow, doy, mid); int currentEncodedDate = encodeDate(year, month0 + 1 /* changes to 1-base */, dom); int eraIdx = numEras - 1; while (eraIdx > 0) { @@ -301,7 +317,8 @@ void EraRules::initCurrentEra() { } // Note: current era could be before the first era. // In this case, this implementation returns the first era index (0). - currentEra = eraIdx;} + currentEra = eraIdx; +} U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/erarules.h b/deps/icu-small/source/i18n/erarules.h index 4ed86408325ed7..74b7862da4c18c 100644 --- a/deps/icu-small/source/i18n/erarules.h +++ b/deps/icu-small/source/i18n/erarules.h @@ -18,10 +18,16 @@ U_NAMESPACE_BEGIN // When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable: 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalMemory; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif class U_I18N_API EraRules : public UMemory { @@ -69,7 +75,8 @@ class U_I18N_API EraRules : public UMemory { /** * Gets the current era index. This is calculated only once for an instance of - * EraRules. + * EraRules. The current era calculation is based on the default time zone at + * the time of instantiation. * * @return era index of current era (or 0, when current date is before the first era) */ diff --git a/deps/icu-small/source/i18n/fmtable.cpp b/deps/icu-small/source/i18n/fmtable.cpp index cb6134cb4b2423..9baa5ff480db6a 100644 --- a/deps/icu-small/source/i18n/fmtable.cpp +++ b/deps/icu-small/source/i18n/fmtable.cpp @@ -732,9 +732,14 @@ CharString *Formattable::internalGetCharString(UErrorCode &status) { // Older ICUs called uprv_decNumberToString here, which is not exactly the same as // DecimalQuantity::toScientificString(). The biggest difference is that uprv_decNumberToString does // not print scientific notation for magnitudes greater than -5 and smaller than some amount (+5?). - if (fDecimalQuantity->isZero()) { + if (fDecimalQuantity->isInfinite()) { + fDecimalStr->append("Infinity", status); + } else if (fDecimalQuantity->isNaN()) { + fDecimalStr->append("NaN", status); + } else if (fDecimalQuantity->isZero()) { fDecimalStr->append("0", -1, status); - } else if (std::abs(fDecimalQuantity->getMagnitude()) < 5) { + } else if (fType==kLong || fType==kInt64 || // use toPlainString for integer types + (fDecimalQuantity->getMagnitude() != INT32_MIN && std::abs(fDecimalQuantity->getMagnitude()) < 5)) { fDecimalStr->appendInvariantChars(fDecimalQuantity->toPlainString(), status); } else { fDecimalStr->appendInvariantChars(fDecimalQuantity->toScientificString(), status); diff --git a/deps/icu-small/source/i18n/formattedval_impl.h b/deps/icu-small/source/i18n/formattedval_impl.h new file mode 100644 index 00000000000000..69ba0922edc81f --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_impl.h @@ -0,0 +1,259 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __FORMVAL_IMPL_H__ +#define __FORMVAL_IMPL_H__ + +#include "unicode/utypes.h" +#if !UCONFIG_NO_FORMATTING + +// This file contains compliant implementations of FormattedValue which can be +// leveraged by ICU formatters. +// +// Each implementation is defined in its own cpp file in order to split +// dependencies more modularly. + +#include "unicode/formattedvalue.h" +#include "capi_helper.h" +#include "fphdlimp.h" +#include "util.h" +#include "uvectr32.h" +#include "number_stringbuilder.h" + + +/** + * Represents the type of constraint for ConstrainedFieldPosition. + * + * Constraints are used to control the behavior of iteration in FormattedValue. + * + * @internal + */ +typedef enum UCFPosConstraintType { + /** + * Represents the lack of a constraint. + * + * This is the value of fConstraint if no "constrain" methods were called. + * + * @internal + */ + UCFPOS_CONSTRAINT_NONE = 0, + + /** + * Represents that the field category is constrained. + * + * This is the value of fConstraint if constraintCategory was called. + * + * FormattedValue implementations should not change the field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_CATEGORY, + + /** + * Represents that the field and field category are constrained. + * + * This is the value of fConstraint if constraintField was called. + * + * FormattedValue implementations should not change the field or field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_FIELD +} UCFPosConstraintType; + + +U_NAMESPACE_BEGIN + + +/** Implementation using FieldPositionHandler to accept fields. */ +class FormattedValueFieldPositionIteratorImpl : public UMemory, public FormattedValue { +public: + + /** @param initialFieldCapacity Initially allocate space for this many fields. */ + FormattedValueFieldPositionIteratorImpl(int32_t initialFieldCapacity, UErrorCode& status); + + virtual ~FormattedValueFieldPositionIteratorImpl(); + + // Implementation of FormattedValue (const): + + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + // Additional methods used during construction phase only (non-const): + + FieldPositionIteratorHandler getHandler(UErrorCode& status); + void appendString(UnicodeString string, UErrorCode& status); + + /** + * Computes the spans for duplicated values. + * For example, if the string has fields: + * + * ...aa..[b.cc]..d.[bb.e.c]..a.. + * + * then the spans will be the bracketed regions. + * + * Assumes that the currently known fields are sorted + * and all in the same category. + */ + void addOverlapSpans(UFieldCategory spanCategory, int8_t firstIndex, UErrorCode& status); + + /** + * Sorts the fields: start index first, length second. + */ + void sort(); + +private: + UnicodeString fString; + UVector32 fFields; +}; + + +class FormattedValueNumberStringBuilderImpl : public UMemory, public FormattedValue { +public: + + FormattedValueNumberStringBuilderImpl(number::impl::Field numericField); + + virtual ~FormattedValueNumberStringBuilderImpl(); + + // Implementation of FormattedValue (const): + + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + Appendable& appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + inline number::impl::NumberStringBuilder& getStringRef() { + return fString; + } + + inline const number::impl::NumberStringBuilder& getStringRef() const { + return fString; + } + +private: + number::impl::NumberStringBuilder fString; + number::impl::Field fNumericField; +}; + + +// C API Helpers for FormattedValue +// Magic number as ASCII == "UFV" +struct UFormattedValueImpl; +typedef IcuCApiHelper UFormattedValueApiHelper; +struct UFormattedValueImpl : public UMemory, public UFormattedValueApiHelper { + // This pointer should be set by the child class. + FormattedValue* fFormattedValue = nullptr; +}; + + +/** Boilerplate to check for valid status before dereferencing the fData pointer. */ +#define UPRV_FORMATTED_VALUE_METHOD_GUARD(returnExpression) \ + if (U_FAILURE(status)) { \ + return returnExpression; \ + } \ + if (fData == nullptr) { \ + status = fErrorCode; \ + return returnExpression; \ + } \ + + +/** Implementation of the methods from U_FORMATTED_VALUE_SUBCLASS_AUTO. */ +#define UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(Name) \ + Name::Name(Name&& src) U_NOEXCEPT \ + : fData(src.fData), fErrorCode(src.fErrorCode) { \ + src.fData = nullptr; \ + src.fErrorCode = U_INVALID_STATE_ERROR; \ + } \ + Name::~Name() { \ + delete fData; \ + fData = nullptr; \ + } \ + Name& Name::operator=(Name&& src) U_NOEXCEPT { \ + delete fData; \ + fData = src.fData; \ + src.fData = nullptr; \ + fErrorCode = src.fErrorCode; \ + src.fErrorCode = U_INVALID_STATE_ERROR; \ + return *this; \ + } \ + UnicodeString Name::toString(UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \ + return fData->toString(status); \ + } \ + UnicodeString Name::toTempString(UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) \ + return fData->toTempString(status); \ + } \ + Appendable& Name::appendTo(Appendable& appendable, UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(appendable) \ + return fData->appendTo(appendable, status); \ + } \ + UBool Name::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const { \ + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) \ + return fData->nextPosition(cfpos, status); \ + } + + +/** Like UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL but without impl type declarations. */ +#define UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix) \ + U_CAPI CType* U_EXPORT2 \ + Prefix ## _openResult (UErrorCode* ec) { \ + if (U_FAILURE(*ec)) { \ + return nullptr; \ + } \ + ImplType* impl = new ImplType(); \ + if (impl == nullptr) { \ + *ec = U_MEMORY_ALLOCATION_ERROR; \ + return nullptr; \ + } \ + return static_cast(impl)->exportForC(); \ + } \ + U_DRAFT const UFormattedValue* U_EXPORT2 \ + Prefix ## _resultAsValue (const CType* uresult, UErrorCode* ec) { \ + const ImplType* result = HelperType::validate(uresult, *ec); \ + if (U_FAILURE(*ec)) { return nullptr; } \ + return static_cast(result)->exportConstForC(); \ + } \ + U_CAPI void U_EXPORT2 \ + Prefix ## _closeResult (CType* uresult) { \ + UErrorCode localStatus = U_ZERO_ERROR; \ + const ImplType* impl = HelperType::validate(uresult, localStatus); \ + delete impl; \ + } + + +/** + * Implementation of the standard methods for a UFormattedValue "subclass" C API. + * @param CPPType The public C++ type, like FormattedList + * @param CType The public C type, like UFormattedList + * @param ImplType A name to use for the implementation class + * @param HelperType A name to use for the "mixin" typedef for C API conversion + * @param Prefix The C API prefix, like ulistfmt + * @param MagicNumber A unique 32-bit number to use to identify this type + */ +#define UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL(CPPType, CType, ImplType, HelperType, Prefix, MagicNumber) \ + U_NAMESPACE_BEGIN \ + class ImplType; \ + typedef IcuCApiHelper HelperType; \ + class ImplType : public UFormattedValueImpl, public HelperType { \ + public: \ + ImplType(); \ + ~ImplType(); \ + CPPType fImpl; \ + }; \ + ImplType::ImplType() { \ + fFormattedValue = &fImpl; \ + } \ + ImplType::~ImplType() {} \ + U_NAMESPACE_END \ + UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL(CType, ImplType, HelperType, Prefix) + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ +#endif // __FORMVAL_IMPL_H__ diff --git a/deps/icu-small/source/i18n/formattedval_iterimpl.cpp b/deps/icu-small/source/i18n/formattedval_iterimpl.cpp new file mode 100644 index 00000000000000..75328fae883bbc --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_iterimpl.cpp @@ -0,0 +1,176 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +// This file contains one implementation of FormattedValue. +// Other independent implementations should go into their own cpp file for +// better dependency modularization. + +#include "formattedval_impl.h" +#include "putilimp.h" + +U_NAMESPACE_BEGIN + + +FormattedValueFieldPositionIteratorImpl::FormattedValueFieldPositionIteratorImpl( + int32_t initialFieldCapacity, + UErrorCode& status) + : fFields(initialFieldCapacity * 4, status) { +} + +FormattedValueFieldPositionIteratorImpl::~FormattedValueFieldPositionIteratorImpl() = default; + +UnicodeString FormattedValueFieldPositionIteratorImpl::toString( + UErrorCode&) const { + return fString; +} + +UnicodeString FormattedValueFieldPositionIteratorImpl::toTempString( + UErrorCode&) const { + // The alias must point to memory owned by this object; + // fastCopyFrom doesn't do this when using a stack buffer. + return UnicodeString(TRUE, fString.getBuffer(), fString.length()); +} + +Appendable& FormattedValueFieldPositionIteratorImpl::appendTo( + Appendable& appendable, + UErrorCode&) const { + appendable.appendString(fString.getBuffer(), fString.length()); + return appendable; +} + +UBool FormattedValueFieldPositionIteratorImpl::nextPosition( + ConstrainedFieldPosition& cfpos, + UErrorCode&) const { + U_ASSERT(fFields.size() % 4 == 0); + int32_t numFields = fFields.size() / 4; + int32_t i = static_cast(cfpos.getInt64IterationContext()); + for (; i < numFields; i++) { + UFieldCategory category = static_cast(fFields.elementAti(i * 4)); + int32_t field = fFields.elementAti(i * 4 + 1); + if (cfpos.matchesField(category, field)) { + int32_t start = fFields.elementAti(i * 4 + 2); + int32_t limit = fFields.elementAti(i * 4 + 3); + cfpos.setState(category, field, start, limit); + break; + } + } + cfpos.setInt64IterationContext(i == numFields ? i : i + 1); + return i < numFields; +} + + +FieldPositionIteratorHandler FormattedValueFieldPositionIteratorImpl::getHandler( + UErrorCode& status) { + return FieldPositionIteratorHandler(&fFields, status); +} + +void FormattedValueFieldPositionIteratorImpl::appendString( + UnicodeString string, + UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + fString.append(string); + // Make the string NUL-terminated + if (fString.getTerminatedBuffer() == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } +} + + +void FormattedValueFieldPositionIteratorImpl::addOverlapSpans( + UFieldCategory spanCategory, + int8_t firstIndex, + UErrorCode& status) { + // In order to avoid fancy data structures, this is an O(N^2) algorithm, + // which should be fine for all real-life applications of this function. + int32_t s1a = INT32_MAX; + int32_t s1b = 0; + int32_t s2a = INT32_MAX; + int32_t s2b = 0; + int32_t numFields = fFields.size() / 4; + for (int32_t i = 0; i higher rank + comparison = start2 - start1; + } else if (limit1 != limit2) { + // Higher length (end index) -> lower rank + comparison = limit1 - limit2; + } else if (categ1 != categ2) { + // Higher field category -> lower rank + comparison = categ1 - categ2; + } else if (field1 != field2) { + // Higher field -> higher rank + comparison = field2 - field1; + } + if (comparison < 0) { + // Perform a swap + isSorted = false; + fFields.setElementAt(categ2, i*4 + 0); + fFields.setElementAt(field2, i*4 + 1); + fFields.setElementAt(start2, i*4 + 2); + fFields.setElementAt(limit2, i*4 + 3); + fFields.setElementAt(categ1, i*4 + 4); + fFields.setElementAt(field1, i*4 + 5); + fFields.setElementAt(start1, i*4 + 6); + fFields.setElementAt(limit1, i*4 + 7); + } + } + if (isSorted) { + break; + } + } +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/formattedval_sbimpl.cpp b/deps/icu-small/source/i18n/formattedval_sbimpl.cpp new file mode 100644 index 00000000000000..1fbecf25ac6bb6 --- /dev/null +++ b/deps/icu-small/source/i18n/formattedval_sbimpl.cpp @@ -0,0 +1,46 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +// This file contains one implementation of FormattedValue. +// Other independent implementations should go into their own cpp file for +// better dependency modularization. + +#include "formattedval_impl.h" + +U_NAMESPACE_BEGIN + + +FormattedValueNumberStringBuilderImpl::FormattedValueNumberStringBuilderImpl(number::impl::Field numericField) + : fNumericField(numericField) { +} + +FormattedValueNumberStringBuilderImpl::~FormattedValueNumberStringBuilderImpl() { +} + + +UnicodeString FormattedValueNumberStringBuilderImpl::toString(UErrorCode&) const { + return fString.toUnicodeString(); +} + +UnicodeString FormattedValueNumberStringBuilderImpl::toTempString(UErrorCode&) const { + return fString.toTempUnicodeString(); +} + +Appendable& FormattedValueNumberStringBuilderImpl::appendTo(Appendable& appendable, UErrorCode&) const { + appendable.appendString(fString.chars(), fString.length()); + return appendable; +} + +UBool FormattedValueNumberStringBuilderImpl::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const { + // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool + return fString.nextPosition(cfpos, fNumericField, status) ? TRUE : FALSE; +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/formattedvalue.cpp b/deps/icu-small/source/i18n/formattedvalue.cpp new file mode 100644 index 00000000000000..e2c9c42fc88a36 --- /dev/null +++ b/deps/icu-small/source/i18n/formattedvalue.cpp @@ -0,0 +1,232 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/formattedvalue.h" +#include "formattedval_impl.h" +#include "capi_helper.h" + +U_NAMESPACE_BEGIN + + +ConstrainedFieldPosition::ConstrainedFieldPosition() {} + +ConstrainedFieldPosition::~ConstrainedFieldPosition() {} + +void ConstrainedFieldPosition::reset() { + fContext = 0LL; + fField = 0; + fStart = 0; + fLimit = 0; + fConstraint = UCFPOS_CONSTRAINT_NONE; + fCategory = UFIELD_CATEGORY_UNDEFINED; +} + +void ConstrainedFieldPosition::constrainCategory(int32_t category) { + fConstraint = UCFPOS_CONSTRAINT_CATEGORY; + fCategory = category; +} + +void ConstrainedFieldPosition::constrainField(int32_t category, int32_t field) { + fConstraint = UCFPOS_CONSTRAINT_FIELD; + fCategory = category; + fField = field; +} + +void ConstrainedFieldPosition::setInt64IterationContext(int64_t context) { + fContext = context; +} + +UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) const { + switch (fConstraint) { + case UCFPOS_CONSTRAINT_NONE: + return TRUE; + case UCFPOS_CONSTRAINT_CATEGORY: + return fCategory == category; + case UCFPOS_CONSTRAINT_FIELD: + return fCategory == category && fField == field; + default: + UPRV_UNREACHABLE; + } +} + +void ConstrainedFieldPosition::setState( + int32_t category, + int32_t field, + int32_t start, + int32_t limit) { + fCategory = category; + fField = field; + fStart = start; + fLimit = limit; +} + + +FormattedValue::~FormattedValue() = default; + + +/////////////////////// +/// C API FUNCTIONS /// +/////////////////////// + +struct UConstrainedFieldPositionImpl : public UMemory, + // Magic number as ASCII == "UCF" + public IcuCApiHelper { + ConstrainedFieldPosition fImpl; +}; + +U_CAPI UConstrainedFieldPosition* U_EXPORT2 +ucfpos_open(UErrorCode* ec) { + auto* impl = new UConstrainedFieldPositionImpl(); + if (impl == nullptr) { + *ec = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return impl->exportForC(); +} + +U_CAPI void U_EXPORT2 +ucfpos_reset(UConstrainedFieldPosition* ptr, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.reset(); +} + +U_CAPI void U_EXPORT2 +ucfpos_constrainCategory(UConstrainedFieldPosition* ptr, int32_t category, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.constrainCategory(category); +} + +U_CAPI void U_EXPORT2 +ucfpos_constrainField(UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.constrainField(category, field); +} + +U_CAPI int32_t U_EXPORT2 +ucfpos_getCategory(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return UFIELD_CATEGORY_UNDEFINED; + } + return impl->fImpl.getCategory(); +} + +U_CAPI int32_t U_EXPORT2 +ucfpos_getField(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.getField(); +} + +U_CAPI void U_EXPORT2 +ucfpos_getIndexes(const UConstrainedFieldPosition* ptr, int32_t* pStart, int32_t* pLimit, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + *pStart = impl->fImpl.getStart(); + *pLimit = impl->fImpl.getLimit(); +} + +U_CAPI int64_t U_EXPORT2 +ucfpos_getInt64IterationContext(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.getInt64IterationContext(); +} + +U_CAPI void U_EXPORT2 +ucfpos_setInt64IterationContext(UConstrainedFieldPosition* ptr, int64_t context, UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.setInt64IterationContext(context); +} + +U_CAPI UBool U_EXPORT2 +ucfpos_matchesField(const UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.matchesField(category, field); +} + +U_CAPI void U_EXPORT2 +ucfpos_setState( + UConstrainedFieldPosition* ptr, + int32_t category, + int32_t field, + int32_t start, + int32_t limit, + UErrorCode* ec) { + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return; + } + impl->fImpl.setState(category, field, start, limit); +} + +U_CAPI void U_EXPORT2 +ucfpos_close(UConstrainedFieldPosition* ptr) { + UErrorCode localStatus = U_ZERO_ERROR; + auto* impl = UConstrainedFieldPositionImpl::validate(ptr, localStatus); + delete impl; +} + + +U_DRAFT const UChar* U_EXPORT2 +ufmtval_getString( + const UFormattedValue* ufmtval, + int32_t* pLength, + UErrorCode* ec) { + const auto* impl = UFormattedValueApiHelper::validate(ufmtval, *ec); + if (U_FAILURE(*ec)) { + return nullptr; + } + UnicodeString readOnlyAlias = impl->fFormattedValue->toTempString(*ec); + if (U_FAILURE(*ec)) { + return nullptr; + } + if (pLength != nullptr) { + *pLength = readOnlyAlias.length(); + } + return readOnlyAlias.getBuffer(); +} + + +U_DRAFT UBool U_EXPORT2 +ufmtval_nextPosition( + const UFormattedValue* ufmtval, + UConstrainedFieldPosition* ucfpos, + UErrorCode* ec) { + const auto* fmtval = UFormattedValueApiHelper::validate(ufmtval, *ec); + auto* cfpos = UConstrainedFieldPositionImpl::validate(ucfpos, *ec); + if (U_FAILURE(*ec)) { + return FALSE; + } + return fmtval->fFormattedValue->nextPosition(cfpos->fImpl, *ec); +} + + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/fphdlimp.cpp b/deps/icu-small/source/i18n/fphdlimp.cpp index c4015fae1bbaff..f51bf4bae7889c 100644 --- a/deps/icu-small/source/i18n/fphdlimp.cpp +++ b/deps/icu-small/source/i18n/fphdlimp.cpp @@ -38,7 +38,8 @@ FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { void FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { - if (pos.getField() == id) { + if (pos.getField() == id && (!acceptFirstOnly || !seenFirst)) { + seenFirst = TRUE; pos.setBeginIndex(start + fShift); pos.setEndIndex(limit + fShift); } @@ -57,17 +58,27 @@ FieldPositionOnlyHandler::isRecording(void) const { return pos.getField() != FieldPosition::DONT_CARE; } +void FieldPositionOnlyHandler::setAcceptFirstOnly(UBool acceptFirstOnly) { + this->acceptFirstOnly = acceptFirstOnly; +} + // utility subclass FieldPositionIteratorHandler FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& _status) - : iter(posIter), vec(NULL), status(_status) { + : iter(posIter), vec(NULL), status(_status), fCategory(UFIELD_CATEGORY_UNDEFINED) { if (iter && U_SUCCESS(status)) { vec = new UVector32(status); } } +FieldPositionIteratorHandler::FieldPositionIteratorHandler( + UVector32* vec, + UErrorCode& status) + : iter(nullptr), vec(vec), status(status), fCategory(UFIELD_CATEGORY_UNDEFINED) { +} + FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { // setData adopts the vec regardless of status, so it's safe to null it if (iter) { @@ -79,8 +90,9 @@ FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { void FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { - if (iter && U_SUCCESS(status) && start < limit) { + if (vec && U_SUCCESS(status) && start < limit) { int32_t size = vec->size(); + vec->addElement(fCategory, status); vec->addElement(id, status); vec->addElement(start + fShift, status); vec->addElement(limit + fShift, status); diff --git a/deps/icu-small/source/i18n/fphdlimp.h b/deps/icu-small/source/i18n/fphdlimp.h index a6827e01e98b4b..00937830fe7b80 100644 --- a/deps/icu-small/source/i18n/fphdlimp.h +++ b/deps/icu-small/source/i18n/fphdlimp.h @@ -16,6 +16,7 @@ #include "unicode/fieldpos.h" #include "unicode/fpositer.h" +#include "unicode/formattedvalue.h" U_NAMESPACE_BEGIN @@ -40,6 +41,8 @@ class U_I18N_API FieldPositionHandler: public UMemory { class FieldPositionOnlyHandler : public FieldPositionHandler { FieldPosition& pos; + UBool acceptFirstOnly = FALSE; + UBool seenFirst = FALSE; public: FieldPositionOnlyHandler(FieldPosition& pos); @@ -48,6 +51,13 @@ class FieldPositionOnlyHandler : public FieldPositionHandler { void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE; void shiftLast(int32_t delta) U_OVERRIDE; UBool isRecording(void) const U_OVERRIDE; + + /** + * Enable this option to lock in the FieldPosition value after seeing the + * first occurrence of the field. The default behavior is to take the last + * occurrence. + */ + void setAcceptFirstOnly(UBool acceptFirstOnly); }; @@ -57,21 +67,38 @@ class FieldPositionIteratorHandler : public FieldPositionHandler { FieldPositionIterator* iter; // can be NULL UVector32* vec; UErrorCode status; + UFieldCategory fCategory; // Note, we keep a reference to status, so if status is on the stack, we have // to be destroyed before status goes out of scope. Easiest thing is to // allocate us on the stack in the same (or narrower) scope as status has. // This attempts to encourage that by blocking heap allocation. - void *operator new(size_t s); - void *operator new[](size_t s); + static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete; + static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete; +#if U_HAVE_PLACEMENT_NEW + static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete; +#endif public: FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& status); + /** If using this constructor, you must call getError() when done formatting! */ + FieldPositionIteratorHandler(UVector32* vec, UErrorCode& status); ~FieldPositionIteratorHandler(); void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE; void shiftLast(int32_t delta) U_OVERRIDE; UBool isRecording(void) const U_OVERRIDE; + + /** Copies a failed error code into _status. */ + inline void getError(UErrorCode& _status) { + if (U_SUCCESS(_status) && U_FAILURE(status)) { + _status = status; + } + } + + inline void setCategory(UFieldCategory category) { + fCategory = category; + } }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/fpositer.cpp b/deps/icu-small/source/i18n/fpositer.cpp index 79e2791db8d371..b6e1b58309b4e0 100644 --- a/deps/icu-small/source/i18n/fpositer.cpp +++ b/deps/icu-small/source/i18n/fpositer.cpp @@ -65,10 +65,10 @@ void FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) { if (adopt->size() == 0) { delete adopt; adopt = NULL; - } else if ((adopt->size() % 3) != 0) { + } else if ((adopt->size() % 4) != 0) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { - for (int i = 1; i < adopt->size(); i += 3) { + for (int i = 2; i < adopt->size(); i += 4) { if (adopt->elementAti(i) >= adopt->elementAti(i+1)) { status = U_ILLEGAL_ARGUMENT_ERROR; break; @@ -95,6 +95,8 @@ UBool FieldPositionIterator::next(FieldPosition& fp) { return FALSE; } + // Ignore the first element of the tetrad: used for field category + pos++; fp.setField(data->elementAti(pos++)); fp.setBeginIndex(data->elementAti(pos++)); fp.setEndIndex(data->elementAti(pos++)); diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index e60bc520bcc0e8..106cf424c59d88 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -32,7 +32,7 @@ #include "uhash.h" static UHashtable* gGenderInfoCache = NULL; -static UMutex gGenderMetaLock = U_MUTEX_INITIALIZER; + static const char* gNeutralStr = "neutral"; static const char* gMailTaintsStr = "maleTaints"; static const char* gMixedNeutralStr = "mixedNeutral"; @@ -98,6 +98,7 @@ const GenderInfo* GenderInfo::getInstance(const Locale& locale, UErrorCode& stat return NULL; } + static UMutex gGenderMetaLock = U_MUTEX_INITIALIZER; const GenderInfo* result = NULL; const char* key = locale.getName(); { diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index 11615a1e5141d3..8d6171af011e5d 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -54,7 +54,6 @@ static void debug_islamcal_msg(const char *pat, ...) // --- The cache -- // cache of months -static UMutex astroLock = U_MUTEX_INITIALIZER; // pod bay door lock static icu::CalendarCache *gMonthCache = NULL; static icu::CalendarAstronomer *gIslamicCalendarAstro = NULL; @@ -223,9 +222,7 @@ const char *IslamicCalendar::getType() const { sType = "islamic-umalqura"; break; default: - U_ASSERT(false); // out of range - sType = "islamic"; // "islamic" is used as the generic type - break; + UPRV_UNREACHABLE; // out of range } return sType; } @@ -473,6 +470,7 @@ double IslamicCalendar::moonAge(UDate time, UErrorCode &status) { double age = 0; + static UMutex astroLock = U_MUTEX_INITIALIZER; // pod bay door lock umtx_lock(&astroLock); if(gIslamicCalendarAstro == NULL) { gIslamicCalendarAstro = new CalendarAstronomer(); @@ -675,8 +673,7 @@ void IslamicCalendar::handleComputeFields(int32_t julianDay, UErrorCode &status) month = m; } } else { // invalid 'civil' - U_ASSERT(false); // should not get here, out of range - year=month=0; + UPRV_UNREACHABLE; // should not get here, out of range } dayOfMonth = (days - monthStart(year, month)) + 1; diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index 056781617d6d9d..cc061fd1410d84 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -18,6 +18,16 @@ #if !UCONFIG_NO_FORMATTING #if U_PLATFORM_HAS_WINUWP_API == 0 #include // getenv() is not available in UWP env +#else +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +# define VC_EXTRALEAN +# define NOUSER +# define NOSERVICE +# define NOIME +# define NOMCX +#include #endif #include "cmemory.h" #include "erarules.h" @@ -51,8 +61,9 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR static const char* TENTATIVE_ERA_VAR_NAME = "ICU_ENABLE_TENTATIVE_ERA"; -// Initialize global Japanese era data -static void U_CALLCONV initializeEras(UErrorCode &status) { + +// Export the following for use by test code. +UBool JapaneseCalendar::enableTentativeEra() { // Although start date of next Japanese era is planned ahead, a name of // new era might not be available. This implementation allows tester to // check a new era without era names by settings below (in priority order). @@ -77,7 +88,13 @@ static void U_CALLCONV initializeEras(UErrorCode &status) { includeTentativeEra = TRUE; } #endif - gJapaneseEraRules = EraRules::createInstance("japanese", includeTentativeEra, status); + return includeTentativeEra; +} + + +// Initialize global Japanese era data +static void U_CALLCONV initializeEras(UErrorCode &status) { + gJapaneseEraRules = EraRules::createInstance("japanese", JapaneseCalendar::enableTentativeEra(), status); if (U_FAILURE(status)) { return; } @@ -233,7 +250,7 @@ int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType l if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { return 0; } - return gCurrentEra; + return gJapaneseEraRules->getNumberOfEras() - 1; // max known era, not gCurrentEra case UCAL_YEAR: { switch (limitType) { @@ -265,7 +282,7 @@ int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode if (U_FAILURE(status)) { return 0; // error case... any value } - if (era == gCurrentEra) { + if (era == gJapaneseEraRules->getNumberOfEras() - 1) { // max known era, not gCurrentEra // TODO: Investigate what value should be used here - revisit after 4.0. return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); } else { diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index 67d2d7031526a2..a32f3db5635473 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -66,8 +66,15 @@ U_NAMESPACE_BEGIN class JapaneseCalendar : public GregorianCalendar { public: + /** + * Check environment variable. + * @internal + */ + U_I18N_API static UBool U_EXPORT2 enableTentativeEra(void); + /** * Useful constants for JapaneseCalendar. + * Exported for use by test code. * @internal */ U_I18N_API static uint32_t U_EXPORT2 getCurrentEra(void); // the current era diff --git a/deps/icu-small/source/i18n/listformatter.cpp b/deps/icu-small/source/i18n/listformatter.cpp index d9195348529c57..64d2e36ae15059 100644 --- a/deps/icu-small/source/i18n/listformatter.cpp +++ b/deps/icu-small/source/i18n/listformatter.cpp @@ -31,6 +31,7 @@ #include "ucln_in.h" #include "uresimp.h" #include "resource.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN @@ -65,9 +66,20 @@ ListFormatInternal(const ListFormatInternal &other) : }; +#if !UCONFIG_NO_FORMATTING +class FormattedListData : public FormattedValueFieldPositionIteratorImpl { +public: + FormattedListData(UErrorCode& status) : FormattedValueFieldPositionIteratorImpl(5, status) {} + virtual ~FormattedListData(); +}; + +FormattedListData::~FormattedListData() = default; + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedList) +#endif + static Hashtable* listPatternHash = nullptr; -static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; static const char STANDARD_STYLE[] = "standard"; U_CDECL_BEGIN @@ -132,6 +144,7 @@ const ListFormatInternal* ListFormatter::getListFormatInternal( keyBuffer.append(':', errorCode).append(style, errorCode); UnicodeString key(keyBuffer.data(), -1, US_INV); ListFormatInternal* result = nullptr; + static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; { Mutex m(&listFormatterMutex); if (listPatternHash == nullptr) { @@ -377,7 +390,7 @@ UnicodeString& ListFormatter::format( int32_t offset; FieldPositionIteratorHandler handler(posIter, errorCode); return format_(items, nItems, appendTo, -1, offset, &handler, errorCode); -}; +} #endif UnicodeString& ListFormatter::format( @@ -390,6 +403,44 @@ UnicodeString& ListFormatter::format( return format_(items, nItems, appendTo, index, offset, nullptr, errorCode); } +#if !UCONFIG_NO_FORMATTING +FormattedList ListFormatter::formatStringsToValue( + const UnicodeString items[], + int32_t nItems, + UErrorCode& errorCode) const { + LocalPointer result(new FormattedListData(errorCode), errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + UnicodeString string; + int32_t offset; + auto handler = result->getHandler(errorCode); + handler.setCategory(UFIELD_CATEGORY_LIST); + format_(items, nItems, string, -1, offset, &handler, errorCode); + handler.getError(errorCode); + result->appendString(string, errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + + // Add span fields and sort + ConstrainedFieldPosition cfpos; + cfpos.constrainField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD); + int32_t i = 0; + handler.setCategory(UFIELD_CATEGORY_LIST_SPAN); + while (result->nextPosition(cfpos, errorCode)) { + handler.addAttribute(i++, cfpos.getStart(), cfpos.getLimit()); + } + handler.getError(errorCode); + if (U_FAILURE(errorCode)) { + return FormattedList(errorCode); + } + result->sort(); + + return FormattedList(result.orphan()); +} +#endif + UnicodeString& ListFormatter::format_( const UnicodeString items[], int32_t nItems, diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index 03974ff4b74048..03e4417e64da6a 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -36,6 +36,8 @@ #include "unicode/putil.h" #include "unicode/smpdtfmt.h" #include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_longnames.h" #include "sharednumberformat.h" #include "sharedpluralrules.h" @@ -45,9 +47,6 @@ U_NAMESPACE_BEGIN -static constexpr int32_t PER_UNIT_INDEX = StandardPlural::COUNT; -static constexpr int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1; -static constexpr int32_t MEAS_UNIT_COUNT = 142; // see assertion in MeasureFormatCacheData constructor static constexpr int32_t WIDTH_INDEX_COUNT = UMEASFMT_WIDTH_NARROW + 1; UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat) @@ -91,6 +90,19 @@ static UMeasureFormatWidth getRegularWidth(UMeasureFormatWidth width) { return width; } +static UNumberUnitWidth getUnitWidth(UMeasureFormatWidth width) { + switch (width) { + case UMEASFMT_WIDTH_WIDE: + return UNUM_UNIT_WIDTH_FULL_NAME; + case UMEASFMT_WIDTH_NARROW: + case UMEASFMT_WIDTH_NUMERIC: + return UNUM_UNIT_WIDTH_NARROW; + case UMEASFMT_WIDTH_SHORT: + default: + return UNUM_UNIT_WIDTH_SHORT; + } +} + /** * Instances contain all MeasureFormat specific data for a particular locale. * This data is cached. It is never copied, but is shared via shared pointers. @@ -110,20 +122,10 @@ class MeasureFormatCacheData : public SharedObject { * - UMEASFMT_WIDTH_WIDE/SHORT/NARROW: sideways alias for missing data */ UMeasureFormatWidth widthFallback[WIDTH_INDEX_COUNT]; - /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */ - SimpleFormatter* patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT]; - const UChar* dnams[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT]; - SimpleFormatter perFormatters[WIDTH_INDEX_COUNT]; MeasureFormatCacheData(); virtual ~MeasureFormatCacheData(); - UBool hasPerFormatter(int32_t width) const { - // TODO: Create a more obvious way to test if the per-formatter has been set? - // Use pointers, check for NULL? Or add an isValid() method? - return perFormatters[width].getArgumentLimit() == 2; - } - void adoptCurrencyFormat(int32_t widthIndex, NumberFormat *nfToAdopt) { delete currencyFormats[widthIndex]; currencyFormats[widthIndex] = nfToAdopt; @@ -157,14 +159,9 @@ class MeasureFormatCacheData : public SharedObject { MeasureFormatCacheData::MeasureFormatCacheData() : integerFormat(nullptr), numericDateFormatters(nullptr) { - // Please update MEAS_UNIT_COUNT if it gets out of sync with the true count! - U_ASSERT(MEAS_UNIT_COUNT == MeasureUnit::getIndexCount()); - for (int32_t i = 0; i < WIDTH_INDEX_COUNT; ++i) { widthFallback[i] = UMEASFMT_WIDTH_COUNT; } - memset(&patterns[0][0][0], 0, sizeof(patterns)); - memset(&dnams[0][0], 0, sizeof(dnams)); memset(currencyFormats, 0, sizeof(currencyFormats)); } @@ -172,13 +169,6 @@ MeasureFormatCacheData::~MeasureFormatCacheData() { for (int32_t i = 0; i < UPRV_LENGTHOF(currencyFormats); ++i) { delete currencyFormats[i]; } - for (int32_t i = 0; i < MEAS_UNIT_COUNT; ++i) { - for (int32_t j = 0; j < WIDTH_INDEX_COUNT; ++j) { - for (int32_t k = 0; k < PATTERN_COUNT; ++k) { - delete patterns[i][j][k]; - } - } - } // Note: the contents of 'dnams' are pointers into the resource bundle delete integerFormat; delete numericDateFormatters; @@ -201,250 +191,6 @@ static UBool getString( return TRUE; } -namespace { - -static const UChar g_LOCALE_units[] = { - 0x2F, 0x4C, 0x4F, 0x43, 0x41, 0x4C, 0x45, 0x2F, - 0x75, 0x6E, 0x69, 0x74, 0x73 -}; -static const UChar gShort[] = { 0x53, 0x68, 0x6F, 0x72, 0x74 }; -static const UChar gNarrow[] = { 0x4E, 0x61, 0x72, 0x72, 0x6F, 0x77 }; - -/** - * Sink for enumerating all of the measurement unit display names. - * Contains inner sink classes, each one corresponding to a type of resource table. - * The outer sink handles the top-level units, unitsNarrow, and unitsShort tables. - * - * More specific bundles (en_GB) are enumerated before their parents (en_001, en, root): - * Only store a value if it is still missing, that is, it has not been overridden. - * - * C++: Each inner sink class has a reference to the main outer sink. - * Java: Use non-static inner classes instead. - */ -struct UnitDataSink : public ResourceSink { - - // Output data. - MeasureFormatCacheData &cacheData; - - // Path to current data. - UMeasureFormatWidth width; - const char *type; - int32_t unitIndex; - - UnitDataSink(MeasureFormatCacheData &outputData) - : cacheData(outputData), - width(UMEASFMT_WIDTH_COUNT), type(NULL), unitIndex(0) {} - ~UnitDataSink(); - - void setFormatterIfAbsent(int32_t index, const ResourceValue &value, - int32_t minPlaceholders, UErrorCode &errorCode) { - U_ASSERT(unitIndex < MEAS_UNIT_COUNT); - U_ASSERT(width < WIDTH_INDEX_COUNT); - U_ASSERT(index < PATTERN_COUNT); - SimpleFormatter **patterns = &cacheData.patterns[unitIndex][width][0]; - if (U_SUCCESS(errorCode) && patterns[index] == NULL) { - if (minPlaceholders >= 0) { - patterns[index] = new SimpleFormatter( - value.getUnicodeString(errorCode), minPlaceholders, 1, errorCode); - } - if (U_SUCCESS(errorCode) && patterns[index] == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - } - } - - void setDnamIfAbsent(const ResourceValue &value, UErrorCode& errorCode) { - U_ASSERT(unitIndex < MEAS_UNIT_COUNT); - U_ASSERT(width < WIDTH_INDEX_COUNT); - if (cacheData.dnams[unitIndex][width] == NULL) { - int32_t length; - cacheData.dnams[unitIndex][width] = value.getString(length, errorCode); - } - } - - /** - * Consume a display pattern. For example, - * unitsShort/duration/hour contains other{"{0} hrs"}. - */ - void consumePattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "dnam") == 0) { - // The display name for the unit in the current width. - setDnamIfAbsent(value, errorCode); - } else if (uprv_strcmp(key, "per") == 0) { - // For example, "{0}/h". - setFormatterIfAbsent(PER_UNIT_INDEX, value, 1, errorCode); - } else { - // The key must be one of the plural form strings. For example: - // one{"{0} hr"} - // other{"{0} hrs"} - setFormatterIfAbsent(StandardPlural::indexFromString(key, errorCode), value, 0, - errorCode); - } - } - - /** - * Consume a table of per-unit tables. For example, - * unitsShort/duration contains tables for duration-unit subtypes day & hour. - */ - void consumeSubtypeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - unitIndex = MeasureUnit::internalGetIndexForTypeAndSubtype(type, key); - if (unitIndex < 0) { - // TODO: How to handle unexpected data? - // See http://bugs.icu-project.org/trac/ticket/12597 - return; - } - - // We no longer handle units like "coordinate" here (which do not have plural variants) - if (value.getType() == URES_TABLE) { - // Units that have plural variants - ResourceTable patternTableTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; patternTableTable.getKeyAndValue(i, key, value); ++i) { - consumePattern(key, value, errorCode); - } - } else { - // TODO: How to handle unexpected data? - // See http://bugs.icu-project.org/trac/ticket/12597 - return; - } - } - - /** - * Consume compound x-per-y display pattern. For example, - * unitsShort/compound/per may be "{0}/{1}". - */ - void consumeCompoundPattern(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode) && uprv_strcmp(key, "per") == 0) { - cacheData.perFormatters[width]. - applyPatternMinMaxArguments(value.getUnicodeString(errorCode), 2, 2, errorCode); - } - } - - /** - * Consume a table of unit type tables. For example, - * unitsShort contains tables for area & duration. - * It also contains a table for the compound/per pattern. - */ - void consumeUnitTypesTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "currency") == 0) { - // Skip. - } else if (uprv_strcmp(key, "compound") == 0) { - if (!cacheData.hasPerFormatter(width)) { - ResourceTable compoundTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; compoundTable.getKeyAndValue(i, key, value); ++i) { - consumeCompoundPattern(key, value, errorCode); - } - } - } else if (uprv_strcmp(key, "coordinate") == 0) { - // special handling but we need to determine what that is - } else { - type = key; - ResourceTable subtypeTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; subtypeTable.getKeyAndValue(i, key, value); ++i) { - consumeSubtypeTable(key, value, errorCode); - } - } - } - - void consumeAlias(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - // Handle aliases like - // units:alias{"/LOCALE/unitsShort"} - // which should only occur in the root bundle. - UMeasureFormatWidth sourceWidth = widthFromKey(key); - if (sourceWidth == UMEASFMT_WIDTH_COUNT) { - // Alias from something we don't care about. - return; - } - UMeasureFormatWidth targetWidth = widthFromAlias(value, errorCode); - if (targetWidth == UMEASFMT_WIDTH_COUNT) { - // We do not recognize what to fall back to. - errorCode = U_INVALID_FORMAT_ERROR; - return; - } - // Check that we do not fall back to another fallback. - if (cacheData.widthFallback[targetWidth] != UMEASFMT_WIDTH_COUNT) { - errorCode = U_INVALID_FORMAT_ERROR; - return; - } - cacheData.widthFallback[sourceWidth] = targetWidth; - } - - void consumeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode) && (width = widthFromKey(key)) != UMEASFMT_WIDTH_COUNT) { - ResourceTable unitTypesTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { - consumeUnitTypesTable(key, value, errorCode); - } - } - } - - static UMeasureFormatWidth widthFromKey(const char *key) { - if (uprv_strncmp(key, "units", 5) == 0) { - key += 5; - if (*key == 0) { - return UMEASFMT_WIDTH_WIDE; - } else if (uprv_strcmp(key, "Short") == 0) { - return UMEASFMT_WIDTH_SHORT; - } else if (uprv_strcmp(key, "Narrow") == 0) { - return UMEASFMT_WIDTH_NARROW; - } - } - return UMEASFMT_WIDTH_COUNT; - } - - static UMeasureFormatWidth widthFromAlias(const ResourceValue &value, UErrorCode &errorCode) { - int32_t length; - const UChar *s = value.getAliasString(length, errorCode); - // For example: "/LOCALE/unitsShort" - if (U_SUCCESS(errorCode) && length >= 13 && u_memcmp(s, g_LOCALE_units, 13) == 0) { - s += 13; - length -= 13; - if (*s == 0) { - return UMEASFMT_WIDTH_WIDE; - } else if (u_strCompare(s, length, gShort, 5, FALSE) == 0) { - return UMEASFMT_WIDTH_SHORT; - } else if (u_strCompare(s, length, gNarrow, 6, FALSE) == 0) { - return UMEASFMT_WIDTH_NARROW; - } - } - return UMEASFMT_WIDTH_COUNT; - } - - virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, - UErrorCode &errorCode) { - // Main entry point to sink - ResourceTable widthsTable = value.getTable(errorCode); - if (U_FAILURE(errorCode)) { return; } - for (int i = 0; widthsTable.getKeyAndValue(i, key, value); ++i) { - if (value.getType() == URES_ALIAS) { - consumeAlias(key, value, errorCode); - } else { - consumeTable(key, value, errorCode); - } - } - } -}; - -// Virtual destructors must be defined out of line. -UnitDataSink::~UnitDataSink() {} - -} // namespace - -static UBool loadMeasureUnitData( - const UResourceBundle *resource, - MeasureFormatCacheData &cacheData, - UErrorCode &status) { - UnitDataSink sink(cacheData); - ures_getAllItemsWithFallback(resource, "", sink, status); - return U_SUCCESS(status); -} - static UnicodeString loadNumericDateFormatterPattern( const UResourceBundle *resource, const char *pattern, @@ -507,12 +253,6 @@ const MeasureFormatCacheData *LocaleCacheKey::createObje if (U_FAILURE(status)) { return NULL; } - if (!loadMeasureUnitData( - unitsBundle.getAlias(), - *result, - status)) { - return NULL; - } result->adoptNumericDateFormatters(loadNumericDateFormatters( unitsBundle.getAlias(), status)); if (U_FAILURE(status)) { @@ -764,29 +504,21 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit( if (U_FAILURE(status)) { return appendTo; } - bool isResolved = false; - MeasureUnit resolvedUnit = - MeasureUnit::resolveUnitPerUnit(measure.getUnit(), perUnit, &isResolved); - if (isResolved) { - Measure newMeasure(measure.getNumber(), new MeasureUnit(resolvedUnit), status); - return formatMeasure( - newMeasure, **numberFormat, appendTo, pos, status); - } - FieldPosition fpos(pos.getField()); - UnicodeString result; - int32_t offset = withPerUnitAndAppend( - formatMeasure( - measure, **numberFormat, result, fpos, status), - perUnit, - appendTo, - status); - if (U_FAILURE(status)) { + auto* df = dynamic_cast(&getNumberFormatInternal()); + if (df == nullptr) { + // Don't know how to handle other types of NumberFormat + status = U_UNSUPPORTED_ERROR; return appendTo; } - if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) { - pos.setBeginIndex(fpos.getBeginIndex() + offset); - pos.setEndIndex(fpos.getEndIndex() + offset); + number::FormattedNumber result; + if (auto* lnf = df->toNumberFormatter(status)) { + result = lnf->unit(measure.getUnit()) + .perUnit(perUnit) + .unitWidth(getUnitWidth(fWidth)) + .formatDouble(measure.getNumber().getDouble(status), status); } + DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status); + appendTo.append(result.toTempString(status)); return appendTo; } @@ -838,22 +570,12 @@ UnicodeString &MeasureFormat::formatMeasures( return appendTo; } -UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& /*status*/) const { - UMeasureFormatWidth width = getRegularWidth(fWidth); - const UChar* const* styleToDnam = cache->dnams[unit.getIndex()]; - const UChar* dnam = styleToDnam[width]; - if (dnam == NULL) { - int32_t fallbackWidth = cache->widthFallback[width]; - dnam = styleToDnam[fallbackWidth]; - } - - UnicodeString result; - if (dnam == NULL) { - result.setToBogus(); - } else { - result.setTo(dnam, -1); - } - return result; +UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& status) const { + return number::impl::LongNameHandler::getUnitDisplayName( + getLocale(status), + unit, + getUnitWidth(fWidth), + status); } void MeasureFormat::initMeasureFormat( @@ -882,6 +604,7 @@ void MeasureFormat::initMeasureFormat( SharedObject::copyPtr(pr, pluralRules); pr->removeRef(); if (nf.isNull()) { + // TODO: Clean this up const SharedNumberFormat *shared = NumberFormat::createSharedInstance( locale, UNUM_DECIMAL, status); if (U_FAILURE(status)) { @@ -926,10 +649,14 @@ UBool MeasureFormat::setMeasureFormatLocale(const Locale &locale, UErrorCode &st return U_SUCCESS(status); } -const NumberFormat &MeasureFormat::getNumberFormat() const { +const NumberFormat &MeasureFormat::getNumberFormatInternal() const { return **numberFormat; } +const NumberFormat &MeasureFormat::getCurrencyFormatInternal() const { + return *cache->getCurrencyFormat(UMEASFMT_WIDTH_NARROW); +} + const PluralRules &MeasureFormat::getPluralRules() const { return **pluralRules; } @@ -962,11 +689,21 @@ UnicodeString &MeasureFormat::formatMeasure( pos, status); } - UnicodeString formattedNumber; - StandardPlural::Form pluralForm = QuantityFormatter::selectPlural( - amtNumber, nf, **pluralRules, formattedNumber, pos, status); - const SimpleFormatter *formatter = getPluralFormatter(amtUnit, fWidth, pluralForm, status); - return QuantityFormatter::format(*formatter, formattedNumber, appendTo, pos, status); + auto* df = dynamic_cast(&nf); + if (df == nullptr) { + // Don't know how to handle other types of NumberFormat + status = U_UNSUPPORTED_ERROR; + return appendTo; + } + number::FormattedNumber result; + if (auto* lnf = df->toNumberFormatter(status)) { + result = lnf->unit(amtUnit) + .unitWidth(getUnitWidth(fWidth)) + .formatDouble(amtNumber.getDouble(status), status); + } + DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status); + appendTo.append(result.toTempString(status)); + return appendTo; } // Formats hours-minutes-seconds as 5:37:23 or similar. @@ -1101,108 +838,6 @@ UnicodeString &MeasureFormat::formatNumeric( return appendTo; } -const SimpleFormatter *MeasureFormat::getFormatterOrNull( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const { - width = getRegularWidth(width); - SimpleFormatter *const (*unitPatterns)[PATTERN_COUNT] = &cache->patterns[unit.getIndex()][0]; - if (unitPatterns[width][index] != NULL) { - return unitPatterns[width][index]; - } - int32_t fallbackWidth = cache->widthFallback[width]; - if (fallbackWidth != UMEASFMT_WIDTH_COUNT && unitPatterns[fallbackWidth][index] != NULL) { - return unitPatterns[fallbackWidth][index]; - } - return NULL; -} - -const SimpleFormatter *MeasureFormat::getFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return NULL; - } - const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index); - if (pattern == NULL) { - errorCode = U_MISSING_RESOURCE_ERROR; - } - return pattern; -} - -const SimpleFormatter *MeasureFormat::getPluralFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const { - if (U_FAILURE(errorCode)) { - return NULL; - } - if (index != StandardPlural::OTHER) { - const SimpleFormatter *pattern = getFormatterOrNull(unit, width, index); - if (pattern != NULL) { - return pattern; - } - } - return getFormatter(unit, width, StandardPlural::OTHER, errorCode); -} - -const SimpleFormatter *MeasureFormat::getPerFormatter( - UMeasureFormatWidth width, - UErrorCode &status) const { - if (U_FAILURE(status)) { - return NULL; - } - width = getRegularWidth(width); - const SimpleFormatter * perFormatters = cache->perFormatters; - if (perFormatters[width].getArgumentLimit() == 2) { - return &perFormatters[width]; - } - int32_t fallbackWidth = cache->widthFallback[width]; - if (fallbackWidth != UMEASFMT_WIDTH_COUNT && - perFormatters[fallbackWidth].getArgumentLimit() == 2) { - return &perFormatters[fallbackWidth]; - } - status = U_MISSING_RESOURCE_ERROR; - return NULL; -} - -int32_t MeasureFormat::withPerUnitAndAppend( - const UnicodeString &formatted, - const MeasureUnit &perUnit, - UnicodeString &appendTo, - UErrorCode &status) const { - int32_t offset = -1; - if (U_FAILURE(status)) { - return offset; - } - const SimpleFormatter *perUnitFormatter = getFormatterOrNull(perUnit, fWidth, PER_UNIT_INDEX); - if (perUnitFormatter != NULL) { - const UnicodeString *params[] = {&formatted}; - perUnitFormatter->formatAndAppend( - params, - UPRV_LENGTHOF(params), - appendTo, - &offset, - 1, - status); - return offset; - } - const SimpleFormatter *perFormatter = getPerFormatter(fWidth, status); - const SimpleFormatter *pattern = - getPluralFormatter(perUnit, fWidth, StandardPlural::ONE, status); - if (U_FAILURE(status)) { - return offset; - } - UnicodeString perUnitString = pattern->getTextWithNoArguments(); - perUnitString.trim(); - const UnicodeString *params[] = {&formatted, &perUnitString}; - perFormatter->formatAndAppend( - params, - UPRV_LENGTHOF(params), - appendTo, - &offset, - 1, - status); - return offset; -} - UnicodeString &MeasureFormat::formatMeasuresSlowTrack( const Measure *measures, int32_t measureCount, @@ -1214,7 +849,7 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( } FieldPosition dontCare(FieldPosition::DONT_CARE); FieldPosition fpos(pos.getField()); - UnicodeString *results = new UnicodeString[measureCount]; + LocalArray results(new UnicodeString[measureCount], status); int32_t fieldPositionFoundIndex = -1; for (int32_t i = 0; i < measureCount; ++i) { const NumberFormat *nf = cache->getIntegerFormat(); @@ -1224,7 +859,6 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( if (fieldPositionFoundIndex == -1) { formatMeasure(measures[i], *nf, results[i], fpos, status); if (U_FAILURE(status)) { - delete [] results; return appendTo; } if (fpos.getBeginIndex() != 0 || fpos.getEndIndex() != 0) { @@ -1236,40 +870,35 @@ UnicodeString &MeasureFormat::formatMeasuresSlowTrack( } int32_t offset; listFormatter->format( - results, + results.getAlias(), measureCount, appendTo, fieldPositionFoundIndex, offset, status); if (U_FAILURE(status)) { - delete [] results; return appendTo; } + // Fix up FieldPosition indexes if our field is found. if (offset != -1) { pos.setBeginIndex(fpos.getBeginIndex() + offset); pos.setEndIndex(fpos.getEndIndex() + offset); } - delete [] results; return appendTo; } MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(const Locale& locale, UErrorCode& ec) { - CurrencyFormat* fmt = NULL; - if (U_SUCCESS(ec)) { - fmt = new CurrencyFormat(locale, ec); - if (U_FAILURE(ec)) { - delete fmt; - fmt = NULL; - } + if (U_FAILURE(ec)) { + return nullptr; } - return fmt; + LocalPointer fmt(new CurrencyFormat(locale, ec), ec); + return fmt.orphan(); } MeasureFormat* U_EXPORT2 MeasureFormat::createCurrencyFormat(UErrorCode& ec) { if (U_FAILURE(ec)) { - return NULL; + return nullptr; } return MeasureFormat::createCurrencyFormat(Locale::getDefault(), ec); } diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index f6059f8c6dc808..428283e6dda8d4 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -38,48 +38,52 @@ static const int32_t gOffsets[] = { 0, 2, 7, - 16, - 22, - 26, - 325, - 336, - 347, - 351, - 357, - 361, - 381, - 382, + 17, + 25, + 29, + 328, + 339, + 354, + 358, + 366, + 368, + 372, 393, - 396, - 402, - 408, + 395, + 409, 412, - 416, - 441 + 418, + 426, + 430, + 434, + 436, + 463 }; static const int32_t gIndexes[] = { 0, 2, 7, - 16, - 22, - 26, - 26, - 37, - 48, - 52, - 58, - 62, - 82, - 83, + 17, + 25, + 29, + 29, + 40, + 55, + 59, + 67, + 69, + 73, 94, - 97, - 103, - 109, + 96, + 110, 113, - 117, - 142 + 119, + 127, + 131, + 135, + 137, + 164 }; // Must be sorted alphabetically. @@ -94,6 +98,7 @@ static const char * const gTypes[] = { "duration", "electric", "energy", + "force", "frequency", "length", "light", @@ -103,6 +108,7 @@ static const char * const gTypes[] = { "pressure", "speed", "temperature", + "torque", "volume" }; @@ -116,6 +122,7 @@ static const char * const gSubTypes[] = { "radian", "revolution", "acre", + "dunam", "hectare", "square-centimeter", "square-foot", @@ -127,9 +134,11 @@ static const char * const gSubTypes[] = { "karat", "milligram-per-deciliter", "millimole-per-liter", + "mole", "part-per-million", "percent", "permille", + "permyriad", "liter-per-100kilometers", "liter-per-kilometer", "mile-per-gallon", @@ -446,25 +455,33 @@ static const char * const gSubTypes[] = { "terabyte", "century", "day", + "day-person", "hour", "microsecond", "millisecond", "minute", "month", + "month-person", "nanosecond", "second", "week", + "week-person", "year", + "year-person", "ampere", "milliampere", "ohm", "volt", + "british-thermal-unit", "calorie", + "electronvolt", "foodcalorie", "joule", "kilocalorie", "kilojoule", "kilowatt-hour", + "newton", + "pound-force", "gigahertz", "hertz", "kilohertz", @@ -488,9 +505,13 @@ static const char * const gSubTypes[] = { "parsec", "picometer", "point", + "solar-radius", "yard", "lux", + "solar-luminosity", "carat", + "dalton", + "earth-mass", "gram", "kilogram", "metric-ton", @@ -499,6 +520,7 @@ static const char * const gSubTypes[] = { "ounce", "ounce-troy", "pound", + "solar-mass", "stone", "ton", "base", @@ -513,6 +535,8 @@ static const char * const gSubTypes[] = { "atmosphere", "hectopascal", "inch-hg", + "kilopascal", + "megapascal", "millibar", "millimeter-of-mercury", "pound-per-square-inch", @@ -524,7 +548,10 @@ static const char * const gSubTypes[] = { "fahrenheit", "generic", "kelvin", + "newton-meter", + "pound-foot", "acre-foot", + "barrel", "bushel", "centiliter", "cubic-centimeter", @@ -538,6 +565,7 @@ static const char * const gSubTypes[] = { "cup-metric", "deciliter", "fluid-ounce", + "fluid-ounce-imperial", "gallon", "gallon-imperial", "hectoliter", @@ -553,574 +581,1306 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {368, 338, 17, 0}, - {370, 344, 17, 2}, - {372, 338, 17, 3}, - {372, 430, 4, 2}, - {372, 431, 4, 3}, - {387, 428, 3, 1}, - {390, 11, 16, 5}, - {433, 368, 4, 1} + {379, 342, 18, 0}, + {381, 349, 18, 2}, + {383, 342, 18, 3}, + {383, 452, 4, 2}, + {383, 453, 4, 3}, + {402, 449, 3, 1}, + {405, 12, 17, 7}, + {455, 379, 4, 1} }; // Shortcuts to the base unit in order to make the default constructor fast -static const int32_t kBaseTypeIdx = 14; +static const int32_t kBaseTypeIdx = 15; static const int32_t kBaseSubTypeIdx = 0; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { return MeasureUnit::create(0, 0, status); } +MeasureUnit MeasureUnit::getGForce() { + return MeasureUnit(0, 0); +} + MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) { return MeasureUnit::create(0, 1, status); } +MeasureUnit MeasureUnit::getMeterPerSecondSquared() { + return MeasureUnit(0, 1); +} + MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) { return MeasureUnit::create(1, 0, status); } +MeasureUnit MeasureUnit::getArcMinute() { + return MeasureUnit(1, 0); +} + MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) { return MeasureUnit::create(1, 1, status); } +MeasureUnit MeasureUnit::getArcSecond() { + return MeasureUnit(1, 1); +} + MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) { return MeasureUnit::create(1, 2, status); } +MeasureUnit MeasureUnit::getDegree() { + return MeasureUnit(1, 2); +} + MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) { return MeasureUnit::create(1, 3, status); } +MeasureUnit MeasureUnit::getRadian() { + return MeasureUnit(1, 3); +} + MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) { return MeasureUnit::create(1, 4, status); } +MeasureUnit MeasureUnit::getRevolutionAngle() { + return MeasureUnit(1, 4); +} + MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) { return MeasureUnit::create(2, 0, status); } -MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { +MeasureUnit MeasureUnit::getAcre() { + return MeasureUnit(2, 0); +} + +MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) { return MeasureUnit::create(2, 1, status); } -MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { +MeasureUnit MeasureUnit::getDunam() { + return MeasureUnit(2, 1); +} + +MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) { return MeasureUnit::create(2, 2, status); } -MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { +MeasureUnit MeasureUnit::getHectare() { + return MeasureUnit(2, 2); +} + +MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) { return MeasureUnit::create(2, 3, status); } -MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareCentimeter() { + return MeasureUnit(2, 3); +} + +MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) { return MeasureUnit::create(2, 4, status); } -MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareFoot() { + return MeasureUnit(2, 4); +} + +MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) { return MeasureUnit::create(2, 5, status); } -MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareInch() { + return MeasureUnit(2, 5); +} + +MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) { return MeasureUnit::create(2, 6, status); } -MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareKilometer() { + return MeasureUnit(2, 6); +} + +MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) { return MeasureUnit::create(2, 7, status); } -MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { +MeasureUnit MeasureUnit::getSquareMeter() { + return MeasureUnit(2, 7); +} + +MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) { return MeasureUnit::create(2, 8, status); } +MeasureUnit MeasureUnit::getSquareMile() { + return MeasureUnit(2, 8); +} + +MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) { + return MeasureUnit::create(2, 9, status); +} + +MeasureUnit MeasureUnit::getSquareYard() { + return MeasureUnit(2, 9); +} + MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) { return MeasureUnit::create(3, 0, status); } +MeasureUnit MeasureUnit::getKarat() { + return MeasureUnit(3, 0); +} + MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) { return MeasureUnit::create(3, 1, status); } +MeasureUnit MeasureUnit::getMilligramPerDeciliter() { + return MeasureUnit(3, 1); +} + MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) { return MeasureUnit::create(3, 2, status); } -MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) { +MeasureUnit MeasureUnit::getMillimolePerLiter() { + return MeasureUnit(3, 2); +} + +MeasureUnit *MeasureUnit::createMole(UErrorCode &status) { return MeasureUnit::create(3, 3, status); } -MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { +MeasureUnit MeasureUnit::getMole() { + return MeasureUnit(3, 3); +} + +MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) { return MeasureUnit::create(3, 4, status); } -MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { +MeasureUnit MeasureUnit::getPartPerMillion() { + return MeasureUnit(3, 4); +} + +MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) { return MeasureUnit::create(3, 5, status); } +MeasureUnit MeasureUnit::getPercent() { + return MeasureUnit(3, 5); +} + +MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) { + return MeasureUnit::create(3, 6, status); +} + +MeasureUnit MeasureUnit::getPermille() { + return MeasureUnit(3, 6); +} + +MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) { + return MeasureUnit::create(3, 7, status); +} + +MeasureUnit MeasureUnit::getPermyriad() { + return MeasureUnit(3, 7); +} + MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) { return MeasureUnit::create(4, 0, status); } +MeasureUnit MeasureUnit::getLiterPer100Kilometers() { + return MeasureUnit(4, 0); +} + MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) { return MeasureUnit::create(4, 1, status); } +MeasureUnit MeasureUnit::getLiterPerKilometer() { + return MeasureUnit(4, 1); +} + MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) { return MeasureUnit::create(4, 2, status); } +MeasureUnit MeasureUnit::getMilePerGallon() { + return MeasureUnit(4, 2); +} + MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } +MeasureUnit MeasureUnit::getMilePerGallonImperial() { + return MeasureUnit(4, 3); +} + MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { return MeasureUnit::create(6, 0, status); } +MeasureUnit MeasureUnit::getBit() { + return MeasureUnit(6, 0); +} + MeasureUnit *MeasureUnit::createByte(UErrorCode &status) { return MeasureUnit::create(6, 1, status); } +MeasureUnit MeasureUnit::getByte() { + return MeasureUnit(6, 1); +} + MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) { return MeasureUnit::create(6, 2, status); } +MeasureUnit MeasureUnit::getGigabit() { + return MeasureUnit(6, 2); +} + MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) { return MeasureUnit::create(6, 3, status); } +MeasureUnit MeasureUnit::getGigabyte() { + return MeasureUnit(6, 3); +} + MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) { return MeasureUnit::create(6, 4, status); } +MeasureUnit MeasureUnit::getKilobit() { + return MeasureUnit(6, 4); +} + MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) { return MeasureUnit::create(6, 5, status); } +MeasureUnit MeasureUnit::getKilobyte() { + return MeasureUnit(6, 5); +} + MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) { return MeasureUnit::create(6, 6, status); } +MeasureUnit MeasureUnit::getMegabit() { + return MeasureUnit(6, 6); +} + MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) { return MeasureUnit::create(6, 7, status); } +MeasureUnit MeasureUnit::getMegabyte() { + return MeasureUnit(6, 7); +} + MeasureUnit *MeasureUnit::createPetabyte(UErrorCode &status) { return MeasureUnit::create(6, 8, status); } +MeasureUnit MeasureUnit::getPetabyte() { + return MeasureUnit(6, 8); +} + MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) { return MeasureUnit::create(6, 9, status); } +MeasureUnit MeasureUnit::getTerabit() { + return MeasureUnit(6, 9); +} + MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) { return MeasureUnit::create(6, 10, status); } +MeasureUnit MeasureUnit::getTerabyte() { + return MeasureUnit(6, 10); +} + MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) { return MeasureUnit::create(7, 0, status); } +MeasureUnit MeasureUnit::getCentury() { + return MeasureUnit(7, 0); +} + MeasureUnit *MeasureUnit::createDay(UErrorCode &status) { return MeasureUnit::create(7, 1, status); } -MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { +MeasureUnit MeasureUnit::getDay() { + return MeasureUnit(7, 1); +} + +MeasureUnit *MeasureUnit::createDayPerson(UErrorCode &status) { return MeasureUnit::create(7, 2, status); } -MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getDayPerson() { + return MeasureUnit(7, 2); +} + +MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { return MeasureUnit::create(7, 3, status); } -MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getHour() { + return MeasureUnit(7, 3); +} + +MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { return MeasureUnit::create(7, 4, status); } -MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { +MeasureUnit MeasureUnit::getMicrosecond() { + return MeasureUnit(7, 4); +} + +MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { return MeasureUnit::create(7, 5, status); } -MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { +MeasureUnit MeasureUnit::getMillisecond() { + return MeasureUnit(7, 5); +} + +MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { return MeasureUnit::create(7, 6, status); } -MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getMinute() { + return MeasureUnit(7, 6); +} + +MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { return MeasureUnit::create(7, 7, status); } -MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { +MeasureUnit MeasureUnit::getMonth() { + return MeasureUnit(7, 7); +} + +MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) { return MeasureUnit::create(7, 8, status); } -MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { +MeasureUnit MeasureUnit::getMonthPerson() { + return MeasureUnit(7, 8); +} + +MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { return MeasureUnit::create(7, 9, status); } -MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { +MeasureUnit MeasureUnit::getNanosecond() { + return MeasureUnit(7, 9); +} + +MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { return MeasureUnit::create(7, 10, status); } +MeasureUnit MeasureUnit::getSecond() { + return MeasureUnit(7, 10); +} + +MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { + return MeasureUnit::create(7, 11, status); +} + +MeasureUnit MeasureUnit::getWeek() { + return MeasureUnit(7, 11); +} + +MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) { + return MeasureUnit::create(7, 12, status); +} + +MeasureUnit MeasureUnit::getWeekPerson() { + return MeasureUnit(7, 12); +} + +MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { + return MeasureUnit::create(7, 13, status); +} + +MeasureUnit MeasureUnit::getYear() { + return MeasureUnit(7, 13); +} + +MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) { + return MeasureUnit::create(7, 14, status); +} + +MeasureUnit MeasureUnit::getYearPerson() { + return MeasureUnit(7, 14); +} + MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) { return MeasureUnit::create(8, 0, status); } +MeasureUnit MeasureUnit::getAmpere() { + return MeasureUnit(8, 0); +} + MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { return MeasureUnit::create(8, 1, status); } +MeasureUnit MeasureUnit::getMilliampere() { + return MeasureUnit(8, 1); +} + MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { return MeasureUnit::create(8, 2, status); } +MeasureUnit MeasureUnit::getOhm() { + return MeasureUnit(8, 2); +} + MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { return MeasureUnit::create(8, 3, status); } -MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getVolt() { + return MeasureUnit(8, 3); +} + +MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) { return MeasureUnit::create(9, 0, status); } -MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getBritishThermalUnit() { + return MeasureUnit(9, 0); +} + +MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { return MeasureUnit::create(9, 1, status); } -MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { +MeasureUnit MeasureUnit::getCalorie() { + return MeasureUnit(9, 1); +} + +MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) { return MeasureUnit::create(9, 2, status); } -MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { +MeasureUnit MeasureUnit::getElectronvolt() { + return MeasureUnit(9, 2); +} + +MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { return MeasureUnit::create(9, 3, status); } -MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { +MeasureUnit MeasureUnit::getFoodcalorie() { + return MeasureUnit(9, 3); +} + +MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { return MeasureUnit::create(9, 4, status); } -MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { +MeasureUnit MeasureUnit::getJoule() { + return MeasureUnit(9, 4); +} + +MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { return MeasureUnit::create(9, 5, status); } -MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { +MeasureUnit MeasureUnit::getKilocalorie() { + return MeasureUnit(9, 5); +} + +MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { + return MeasureUnit::create(9, 6, status); +} + +MeasureUnit MeasureUnit::getKilojoule() { + return MeasureUnit(9, 6); +} + +MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { + return MeasureUnit::create(9, 7, status); +} + +MeasureUnit MeasureUnit::getKilowattHour() { + return MeasureUnit(9, 7); +} + +MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { return MeasureUnit::create(10, 0, status); } -MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { +MeasureUnit MeasureUnit::getNewton() { + return MeasureUnit(10, 0); +} + +MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { return MeasureUnit::create(10, 1, status); } +MeasureUnit MeasureUnit::getPoundForce() { + return MeasureUnit(10, 1); +} + +MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { + return MeasureUnit::create(11, 0, status); +} + +MeasureUnit MeasureUnit::getGigahertz() { + return MeasureUnit(11, 0); +} + +MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { + return MeasureUnit::create(11, 1, status); +} + +MeasureUnit MeasureUnit::getHertz() { + return MeasureUnit(11, 1); +} + MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) { - return MeasureUnit::create(10, 2, status); + return MeasureUnit::create(11, 2, status); +} + +MeasureUnit MeasureUnit::getKilohertz() { + return MeasureUnit(11, 2); } MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) { - return MeasureUnit::create(10, 3, status); + return MeasureUnit::create(11, 3, status); +} + +MeasureUnit MeasureUnit::getMegahertz() { + return MeasureUnit(11, 3); } MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) { - return MeasureUnit::create(11, 0, status); + return MeasureUnit::create(12, 0, status); +} + +MeasureUnit MeasureUnit::getAstronomicalUnit() { + return MeasureUnit(12, 0); } MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) { - return MeasureUnit::create(11, 1, status); + return MeasureUnit::create(12, 1, status); +} + +MeasureUnit MeasureUnit::getCentimeter() { + return MeasureUnit(12, 1); } MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { - return MeasureUnit::create(11, 2, status); + return MeasureUnit::create(12, 2, status); +} + +MeasureUnit MeasureUnit::getDecimeter() { + return MeasureUnit(12, 2); } MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { - return MeasureUnit::create(11, 3, status); + return MeasureUnit::create(12, 3, status); +} + +MeasureUnit MeasureUnit::getFathom() { + return MeasureUnit(12, 3); } MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { - return MeasureUnit::create(11, 4, status); + return MeasureUnit::create(12, 4, status); +} + +MeasureUnit MeasureUnit::getFoot() { + return MeasureUnit(12, 4); } MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { - return MeasureUnit::create(11, 5, status); + return MeasureUnit::create(12, 5, status); +} + +MeasureUnit MeasureUnit::getFurlong() { + return MeasureUnit(12, 5); } MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { - return MeasureUnit::create(11, 6, status); + return MeasureUnit::create(12, 6, status); +} + +MeasureUnit MeasureUnit::getInch() { + return MeasureUnit(12, 6); } MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) { - return MeasureUnit::create(11, 7, status); + return MeasureUnit::create(12, 7, status); +} + +MeasureUnit MeasureUnit::getKilometer() { + return MeasureUnit(12, 7); } MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) { - return MeasureUnit::create(11, 8, status); + return MeasureUnit::create(12, 8, status); +} + +MeasureUnit MeasureUnit::getLightYear() { + return MeasureUnit(12, 8); } MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) { - return MeasureUnit::create(11, 9, status); + return MeasureUnit::create(12, 9, status); +} + +MeasureUnit MeasureUnit::getMeter() { + return MeasureUnit(12, 9); } MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) { - return MeasureUnit::create(11, 10, status); + return MeasureUnit::create(12, 10, status); +} + +MeasureUnit MeasureUnit::getMicrometer() { + return MeasureUnit(12, 10); } MeasureUnit *MeasureUnit::createMile(UErrorCode &status) { - return MeasureUnit::create(11, 11, status); + return MeasureUnit::create(12, 11, status); +} + +MeasureUnit MeasureUnit::getMile() { + return MeasureUnit(12, 11); } MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) { - return MeasureUnit::create(11, 12, status); + return MeasureUnit::create(12, 12, status); +} + +MeasureUnit MeasureUnit::getMileScandinavian() { + return MeasureUnit(12, 12); } MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { - return MeasureUnit::create(11, 13, status); + return MeasureUnit::create(12, 13, status); +} + +MeasureUnit MeasureUnit::getMillimeter() { + return MeasureUnit(12, 13); } MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { - return MeasureUnit::create(11, 14, status); + return MeasureUnit::create(12, 14, status); +} + +MeasureUnit MeasureUnit::getNanometer() { + return MeasureUnit(12, 14); } MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { - return MeasureUnit::create(11, 15, status); + return MeasureUnit::create(12, 15, status); +} + +MeasureUnit MeasureUnit::getNauticalMile() { + return MeasureUnit(12, 15); } MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { - return MeasureUnit::create(11, 16, status); + return MeasureUnit::create(12, 16, status); +} + +MeasureUnit MeasureUnit::getParsec() { + return MeasureUnit(12, 16); } MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { - return MeasureUnit::create(11, 17, status); + return MeasureUnit::create(12, 17, status); +} + +MeasureUnit MeasureUnit::getPicometer() { + return MeasureUnit(12, 17); } MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { - return MeasureUnit::create(11, 18, status); + return MeasureUnit::create(12, 18, status); +} + +MeasureUnit MeasureUnit::getPoint() { + return MeasureUnit(12, 18); +} + +MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) { + return MeasureUnit::create(12, 19, status); +} + +MeasureUnit MeasureUnit::getSolarRadius() { + return MeasureUnit(12, 19); } MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { - return MeasureUnit::create(11, 19, status); + return MeasureUnit::create(12, 20, status); +} + +MeasureUnit MeasureUnit::getYard() { + return MeasureUnit(12, 20); } MeasureUnit *MeasureUnit::createLux(UErrorCode &status) { - return MeasureUnit::create(12, 0, status); + return MeasureUnit::create(13, 0, status); +} + +MeasureUnit MeasureUnit::getLux() { + return MeasureUnit(13, 0); +} + +MeasureUnit *MeasureUnit::createSolarLuminosity(UErrorCode &status) { + return MeasureUnit::create(13, 1, status); +} + +MeasureUnit MeasureUnit::getSolarLuminosity() { + return MeasureUnit(13, 1); } MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { - return MeasureUnit::create(13, 0, status); + return MeasureUnit::create(14, 0, status); +} + +MeasureUnit MeasureUnit::getCarat() { + return MeasureUnit(14, 0); +} + +MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) { + return MeasureUnit::create(14, 1, status); +} + +MeasureUnit MeasureUnit::getDalton() { + return MeasureUnit(14, 1); +} + +MeasureUnit *MeasureUnit::createEarthMass(UErrorCode &status) { + return MeasureUnit::create(14, 2, status); +} + +MeasureUnit MeasureUnit::getEarthMass() { + return MeasureUnit(14, 2); } MeasureUnit *MeasureUnit::createGram(UErrorCode &status) { - return MeasureUnit::create(13, 1, status); + return MeasureUnit::create(14, 3, status); +} + +MeasureUnit MeasureUnit::getGram() { + return MeasureUnit(14, 3); } MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) { - return MeasureUnit::create(13, 2, status); + return MeasureUnit::create(14, 4, status); +} + +MeasureUnit MeasureUnit::getKilogram() { + return MeasureUnit(14, 4); } MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { - return MeasureUnit::create(13, 3, status); + return MeasureUnit::create(14, 5, status); +} + +MeasureUnit MeasureUnit::getMetricTon() { + return MeasureUnit(14, 5); } MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) { - return MeasureUnit::create(13, 4, status); + return MeasureUnit::create(14, 6, status); +} + +MeasureUnit MeasureUnit::getMicrogram() { + return MeasureUnit(14, 6); } MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) { - return MeasureUnit::create(13, 5, status); + return MeasureUnit::create(14, 7, status); +} + +MeasureUnit MeasureUnit::getMilligram() { + return MeasureUnit(14, 7); } MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) { - return MeasureUnit::create(13, 6, status); + return MeasureUnit::create(14, 8, status); +} + +MeasureUnit MeasureUnit::getOunce() { + return MeasureUnit(14, 8); } MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) { - return MeasureUnit::create(13, 7, status); + return MeasureUnit::create(14, 9, status); +} + +MeasureUnit MeasureUnit::getOunceTroy() { + return MeasureUnit(14, 9); } MeasureUnit *MeasureUnit::createPound(UErrorCode &status) { - return MeasureUnit::create(13, 8, status); + return MeasureUnit::create(14, 10, status); +} + +MeasureUnit MeasureUnit::getPound() { + return MeasureUnit(14, 10); +} + +MeasureUnit *MeasureUnit::createSolarMass(UErrorCode &status) { + return MeasureUnit::create(14, 11, status); +} + +MeasureUnit MeasureUnit::getSolarMass() { + return MeasureUnit(14, 11); } MeasureUnit *MeasureUnit::createStone(UErrorCode &status) { - return MeasureUnit::create(13, 9, status); + return MeasureUnit::create(14, 12, status); +} + +MeasureUnit MeasureUnit::getStone() { + return MeasureUnit(14, 12); } MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { - return MeasureUnit::create(13, 10, status); + return MeasureUnit::create(14, 13, status); +} + +MeasureUnit MeasureUnit::getTon() { + return MeasureUnit(14, 13); } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(16, 0, status); +} + +MeasureUnit MeasureUnit::getGigawatt() { + return MeasureUnit(16, 0); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(16, 1, status); +} + +MeasureUnit MeasureUnit::getHorsepower() { + return MeasureUnit(16, 1); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); +} + +MeasureUnit MeasureUnit::getKilowatt() { + return MeasureUnit(16, 2); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 3, status); +} + +MeasureUnit MeasureUnit::getMegawatt() { + return MeasureUnit(16, 3); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 4, status); +} + +MeasureUnit MeasureUnit::getMilliwatt() { + return MeasureUnit(16, 4); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(15, 5, status); + return MeasureUnit::create(16, 5, status); +} + +MeasureUnit MeasureUnit::getWatt() { + return MeasureUnit(16, 5); } MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(17, 0, status); +} + +MeasureUnit MeasureUnit::getAtmosphere() { + return MeasureUnit(17, 0); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(17, 1, status); +} + +MeasureUnit MeasureUnit::getHectopascal() { + return MeasureUnit(17, 1); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(17, 2, status); +} + +MeasureUnit MeasureUnit::getInchHg() { + return MeasureUnit(17, 2); +} + +MeasureUnit *MeasureUnit::createKilopascal(UErrorCode &status) { + return MeasureUnit::create(17, 3, status); +} + +MeasureUnit MeasureUnit::getKilopascal() { + return MeasureUnit(17, 3); +} + +MeasureUnit *MeasureUnit::createMegapascal(UErrorCode &status) { + return MeasureUnit::create(17, 4, status); +} + +MeasureUnit MeasureUnit::getMegapascal() { + return MeasureUnit(17, 4); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(17, 5, status); +} + +MeasureUnit MeasureUnit::getMillibar() { + return MeasureUnit(17, 5); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(16, 4, status); + return MeasureUnit::create(17, 6, status); +} + +MeasureUnit MeasureUnit::getMillimeterOfMercury() { + return MeasureUnit(17, 6); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(16, 5, status); + return MeasureUnit::create(17, 7, status); +} + +MeasureUnit MeasureUnit::getPoundPerSquareInch() { + return MeasureUnit(17, 7); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); +} + +MeasureUnit MeasureUnit::getKilometerPerHour() { + return MeasureUnit(18, 0); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); +} + +MeasureUnit MeasureUnit::getKnot() { + return MeasureUnit(18, 1); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); +} + +MeasureUnit MeasureUnit::getMeterPerSecond() { + return MeasureUnit(18, 2); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); +} + +MeasureUnit MeasureUnit::getMilePerHour() { + return MeasureUnit(18, 3); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); +} + +MeasureUnit MeasureUnit::getCelsius() { + return MeasureUnit(19, 0); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); +} + +MeasureUnit MeasureUnit::getFahrenheit() { + return MeasureUnit(19, 1); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); +} + +MeasureUnit MeasureUnit::getGenericTemperature() { + return MeasureUnit(19, 2); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); +} + +MeasureUnit MeasureUnit::getKelvin() { + return MeasureUnit(19, 3); +} + +MeasureUnit *MeasureUnit::createNewtonMeter(UErrorCode &status) { + return MeasureUnit::create(20, 0, status); +} + +MeasureUnit MeasureUnit::getNewtonMeter() { + return MeasureUnit(20, 0); +} + +MeasureUnit *MeasureUnit::createPoundFoot(UErrorCode &status) { + return MeasureUnit::create(20, 1, status); +} + +MeasureUnit MeasureUnit::getPoundFoot() { + return MeasureUnit(20, 1); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(19, 0, status); + return MeasureUnit::create(21, 0, status); +} + +MeasureUnit MeasureUnit::getAcreFoot() { + return MeasureUnit(21, 0); +} + +MeasureUnit *MeasureUnit::createBarrel(UErrorCode &status) { + return MeasureUnit::create(21, 1, status); +} + +MeasureUnit MeasureUnit::getBarrel() { + return MeasureUnit(21, 1); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(19, 1, status); + return MeasureUnit::create(21, 2, status); +} + +MeasureUnit MeasureUnit::getBushel() { + return MeasureUnit(21, 2); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(19, 2, status); + return MeasureUnit::create(21, 3, status); +} + +MeasureUnit MeasureUnit::getCentiliter() { + return MeasureUnit(21, 3); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(19, 3, status); + return MeasureUnit::create(21, 4, status); +} + +MeasureUnit MeasureUnit::getCubicCentimeter() { + return MeasureUnit(21, 4); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(19, 4, status); + return MeasureUnit::create(21, 5, status); +} + +MeasureUnit MeasureUnit::getCubicFoot() { + return MeasureUnit(21, 5); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(19, 5, status); + return MeasureUnit::create(21, 6, status); +} + +MeasureUnit MeasureUnit::getCubicInch() { + return MeasureUnit(21, 6); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(19, 6, status); + return MeasureUnit::create(21, 7, status); +} + +MeasureUnit MeasureUnit::getCubicKilometer() { + return MeasureUnit(21, 7); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(19, 7, status); + return MeasureUnit::create(21, 8, status); +} + +MeasureUnit MeasureUnit::getCubicMeter() { + return MeasureUnit(21, 8); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(19, 8, status); + return MeasureUnit::create(21, 9, status); +} + +MeasureUnit MeasureUnit::getCubicMile() { + return MeasureUnit(21, 9); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(19, 9, status); + return MeasureUnit::create(21, 10, status); +} + +MeasureUnit MeasureUnit::getCubicYard() { + return MeasureUnit(21, 10); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(19, 10, status); + return MeasureUnit::create(21, 11, status); +} + +MeasureUnit MeasureUnit::getCup() { + return MeasureUnit(21, 11); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(19, 11, status); + return MeasureUnit::create(21, 12, status); +} + +MeasureUnit MeasureUnit::getCupMetric() { + return MeasureUnit(21, 12); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(19, 12, status); + return MeasureUnit::create(21, 13, status); +} + +MeasureUnit MeasureUnit::getDeciliter() { + return MeasureUnit(21, 13); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(19, 13, status); + return MeasureUnit::create(21, 14, status); +} + +MeasureUnit MeasureUnit::getFluidOunce() { + return MeasureUnit(21, 14); +} + +MeasureUnit *MeasureUnit::createFluidOunceImperial(UErrorCode &status) { + return MeasureUnit::create(21, 15, status); +} + +MeasureUnit MeasureUnit::getFluidOunceImperial() { + return MeasureUnit(21, 15); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(19, 14, status); + return MeasureUnit::create(21, 16, status); +} + +MeasureUnit MeasureUnit::getGallon() { + return MeasureUnit(21, 16); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(19, 15, status); + return MeasureUnit::create(21, 17, status); +} + +MeasureUnit MeasureUnit::getGallonImperial() { + return MeasureUnit(21, 17); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(19, 16, status); + return MeasureUnit::create(21, 18, status); +} + +MeasureUnit MeasureUnit::getHectoliter() { + return MeasureUnit(21, 18); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(19, 17, status); + return MeasureUnit::create(21, 19, status); +} + +MeasureUnit MeasureUnit::getLiter() { + return MeasureUnit(21, 19); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(19, 18, status); + return MeasureUnit::create(21, 20, status); +} + +MeasureUnit MeasureUnit::getMegaliter() { + return MeasureUnit(21, 20); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(19, 19, status); + return MeasureUnit::create(21, 21, status); +} + +MeasureUnit MeasureUnit::getMilliliter() { + return MeasureUnit(21, 21); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(19, 20, status); + return MeasureUnit::create(21, 22, status); +} + +MeasureUnit MeasureUnit::getPint() { + return MeasureUnit(21, 22); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(19, 21, status); + return MeasureUnit::create(21, 23, status); +} + +MeasureUnit MeasureUnit::getPintMetric() { + return MeasureUnit(21, 23); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(19, 22, status); + return MeasureUnit::create(21, 24, status); +} + +MeasureUnit MeasureUnit::getQuart() { + return MeasureUnit(21, 24); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(19, 23, status); + return MeasureUnit::create(21, 25, status); +} + +MeasureUnit MeasureUnit::getTablespoon() { + return MeasureUnit(21, 25); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(19, 24, status); + return MeasureUnit::create(21, 26, status); +} + +MeasureUnit MeasureUnit::getTeaspoon() { + return MeasureUnit(21, 26); } // End generated code diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 8ff86a2cacf018..e39b26b969889f 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -810,26 +810,31 @@ MessageFormat::getFormats(int32_t& cnt) const // method on this object. We construct and resize an array // on demand that contains aliases to the subformats[i].format // pointers. + + // Get total required capacity first (it's refreshed on each call). + int32_t totalCapacity = 0; + for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0; ++totalCapacity) {}; + MessageFormat* t = const_cast (this); cnt = 0; - if (formatAliases == NULL) { - t->formatAliasesCapacity = (argTypeCount<10) ? 10 : argTypeCount; + if (formatAliases == nullptr) { + t->formatAliasesCapacity = totalCapacity; Format** a = (Format**) uprv_malloc(sizeof(Format*) * formatAliasesCapacity); - if (a == NULL) { + if (a == nullptr) { t->formatAliasesCapacity = 0; - return NULL; + return nullptr; } t->formatAliases = a; - } else if (argTypeCount > formatAliasesCapacity) { + } else if (totalCapacity > formatAliasesCapacity) { Format** a = (Format**) - uprv_realloc(formatAliases, sizeof(Format*) * argTypeCount); - if (a == NULL) { + uprv_realloc(formatAliases, sizeof(Format*) * totalCapacity); + if (a == nullptr) { t->formatAliasesCapacity = 0; - return NULL; + return nullptr; } t->formatAliases = a; - t->formatAliasesCapacity = argTypeCount; + t->formatAliasesCapacity = totalCapacity; } for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0;) { @@ -1673,7 +1678,6 @@ void MessageFormat::cacheExplicitFormats(UErrorCode& status) { } } - Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeString& style, Formattable::Type& formattableType, UParseError& parseError, UErrorCode& ec) { @@ -1683,6 +1687,7 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin Format* fmt = NULL; int32_t typeID, styleID; DateFormat::EStyle date_style; + int32_t firstNonSpace; switch (typeID = findKeyword(type, TYPE_IDS)) { case 0: // number @@ -1702,11 +1707,10 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin fmt = createIntegerFormat(fLocale, ec); break; default: // pattern or skeleton - int32_t i = 0; - for (; PatternProps::isWhiteSpace(style.charAt(i)); i++); - if (style.compare(i, 2, u"::", 0, 2) == 0) { + firstNonSpace = PatternProps::skipWhiteSpace(style, 0); + if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) { // Skeleton - UnicodeString skeleton = style.tempSubString(i + 2); + UnicodeString skeleton = style.tempSubString(firstNonSpace + 2); fmt = number::NumberFormatter::forSkeleton(skeleton, ec).locale(fLocale).toFormat(ec); } else { // Pattern @@ -1725,19 +1729,27 @@ Format* MessageFormat::createAppropriateFormat(UnicodeString& type, UnicodeStrin case 1: // date case 2: // time formattableType = Formattable::kDate; - styleID = findKeyword(style, DATE_STYLE_IDS); - date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault; - - if (typeID == 1) { - fmt = DateFormat::createDateInstance(date_style, fLocale); + firstNonSpace = PatternProps::skipWhiteSpace(style, 0); + if (style.compare(firstNonSpace, 2, u"::", 0, 2) == 0) { + // Skeleton + UnicodeString skeleton = style.tempSubString(firstNonSpace + 2); + fmt = DateFormat::createInstanceForSkeleton(skeleton, fLocale, ec); } else { - fmt = DateFormat::createTimeInstance(date_style, fLocale); - } + // Pattern + styleID = findKeyword(style, DATE_STYLE_IDS); + date_style = (styleID >= 0) ? DATE_STYLES[styleID] : DateFormat::kDefault; - if (styleID < 0 && fmt != NULL) { - SimpleDateFormat* sdtfmt = dynamic_cast(fmt); - if (sdtfmt != NULL) { - sdtfmt->applyPattern(style); + if (typeID == 1) { + fmt = DateFormat::createDateInstance(date_style, fLocale); + } else { + fmt = DateFormat::createTimeInstance(date_style, fLocale); + } + + if (styleID < 0 && fmt != NULL) { + SimpleDateFormat* sdtfmt = dynamic_cast(fmt); + if (sdtfmt != NULL) { + sdtfmt->applyPattern(style); + } } } break; diff --git a/deps/icu-small/source/i18n/number_affixutils.cpp b/deps/icu-small/source/i18n/number_affixutils.cpp index 8da29a03d52d56..3eb9c59bf49090 100644 --- a/deps/icu-small/source/i18n/number_affixutils.cpp +++ b/deps/icu-small/source/i18n/number_affixutils.cpp @@ -64,7 +64,7 @@ int32_t AffixUtils::estimateLength(const UnicodeString &patternString, UErrorCod } break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } offset += U16_LENGTH(cp); @@ -131,34 +131,33 @@ UnicodeString AffixUtils::escape(const UnicodeString &input) { Field AffixUtils::getFieldForType(AffixPatternType type) { switch (type) { case TYPE_MINUS_SIGN: - return Field::UNUM_SIGN_FIELD; + return UNUM_SIGN_FIELD; case TYPE_PLUS_SIGN: - return Field::UNUM_SIGN_FIELD; + return UNUM_SIGN_FIELD; case TYPE_PERCENT: - return Field::UNUM_PERCENT_FIELD; + return UNUM_PERCENT_FIELD; case TYPE_PERMILLE: - return Field::UNUM_PERMILL_FIELD; + return UNUM_PERMILL_FIELD; case TYPE_CURRENCY_SINGLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_DOUBLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_TRIPLE: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_QUAD: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_QUINT: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; case TYPE_CURRENCY_OVERFLOW: - return Field::UNUM_CURRENCY_FIELD; + return UNUM_CURRENCY_FIELD; default: - U_ASSERT(false); - return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function" + UPRV_UNREACHABLE; } } int32_t AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &output, int32_t position, - const SymbolProvider &provider, UErrorCode &status) { + const SymbolProvider &provider, Field field, UErrorCode &status) { int32_t length = 0; AffixTag tag; while (hasNext(tag, affixPattern)) { @@ -171,7 +170,7 @@ AffixUtils::unescape(const UnicodeString &affixPattern, NumberStringBuilder &out length += output.insert( position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status); } else { - length += output.insertCodePoint(position + length, tag.codePoint, UNUM_FIELD_COUNT, status); + length += output.insertCodePoint(position + length, tag.codePoint, field, status); } } return length; @@ -382,7 +381,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); } default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } // End of string @@ -411,8 +410,7 @@ AffixTag AffixUtils::nextToken(AffixTag tag, const UnicodeString &patternString, case STATE_OVERFLOW_CURR: return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); default: - U_ASSERT(false); - return {-1}; // suppress "control reaches end of non-void function" + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h index 1d7e1a115e046a..f011a54b316166 100644 --- a/deps/icu-small/source/i18n/number_affixutils.h +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -144,7 +144,8 @@ class U_I18N_API AffixUtils { * @param provider An object to generate locale symbols. */ static int32_t unescape(const UnicodeString& affixPattern, NumberStringBuilder& output, - int32_t position, const SymbolProvider& provider, UErrorCode& status); + int32_t position, const SymbolProvider& provider, Field field, + UErrorCode& status); /** * Sames as {@link #unescape}, but only calculates the code point count. More efficient than {@link #unescape} diff --git a/deps/icu-small/source/i18n/number_asformat.cpp b/deps/icu-small/source/i18n/number_asformat.cpp index c6bb538932cec8..9d3ea69f578e1e 100644 --- a/deps/icu-small/source/i18n/number_asformat.cpp +++ b/deps/icu-small/source/i18n/number_asformat.cpp @@ -62,12 +62,12 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj, // always return first occurrence: pos.setBeginIndex(0); pos.setEndIndex(0); - bool found = data.string.nextFieldPosition(pos, status); + bool found = data.getStringRef().nextFieldPosition(pos, status); if (found && appendTo.length() != 0) { pos.setBeginIndex(pos.getBeginIndex() + appendTo.length()); pos.setEndIndex(pos.getEndIndex() + appendTo.length()); } - appendTo.append(data.string.toTempUnicodeString()); + appendTo.append(data.getStringRef().toTempUnicodeString()); return appendTo; } @@ -84,10 +84,10 @@ UnicodeString& LocalizedNumberFormatterAsFormat::format(const Formattable& obj, if (U_FAILURE(status)) { return appendTo; } - appendTo.append(data.string.toTempUnicodeString()); + appendTo.append(data.getStringRef().toTempUnicodeString()); if (posIter != nullptr) { FieldPositionIteratorHandler fpih(posIter, status); - data.string.getAllFieldPositions(fpih, status); + data.getStringRef().getAllFieldPositions(fpih, status); } return appendTo; } diff --git a/deps/icu-small/source/i18n/number_capi.cpp b/deps/icu-small/source/i18n/number_capi.cpp index 37ad8bd76fcd72..712e0a6631db56 100644 --- a/deps/icu-small/source/i18n/number_capi.cpp +++ b/deps/icu-small/source/i18n/number_capi.cpp @@ -12,6 +12,7 @@ #include "fphdlimp.h" #include "number_utypes.h" #include "numparse_types.h" +#include "formattedval_impl.h" #include "unicode/numberformatter.h" #include "unicode/unumberformatter.h" @@ -20,67 +21,63 @@ using namespace icu::number; using namespace icu::number::impl; -////////////////////////////////// -/// C API CONVERSION FUNCTIONS /// -////////////////////////////////// +U_NAMESPACE_BEGIN +namespace number { +namespace impl { -UNumberFormatterData* UNumberFormatterData::validate(UNumberFormatter* input, UErrorCode& status) { - auto* constInput = static_cast(input); - auto* validated = validate(constInput, status); - return const_cast(validated); -} +/** + * Implementation class for UNumberFormatter. Wraps a LocalizedNumberFormatter. + */ +struct UNumberFormatterData : public UMemory, + // Magic number as ASCII == "NFR" (NumberFormatteR) + public IcuCApiHelper { + LocalizedNumberFormatter fFormatter; +}; -const UNumberFormatterData* -UNumberFormatterData::validate(const UNumberFormatter* input, UErrorCode& status) { - if (U_FAILURE(status)) { - return nullptr; - } - if (input == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; - } - auto* impl = reinterpret_cast(input); - if (impl->fMagic != UNumberFormatterData::kMagic) { - status = U_INVALID_FORMAT_ERROR; - return nullptr; - } - return impl; +struct UFormattedNumberImpl; + +// Magic number as ASCII == "FDN" (FormatteDNumber) +typedef IcuCApiHelper UFormattedNumberApiHelper; + +struct UFormattedNumberImpl : public UFormattedValueImpl, public UFormattedNumberApiHelper { + UFormattedNumberImpl(); + ~UFormattedNumberImpl(); + + FormattedNumber fImpl; + UFormattedNumberData fData; +}; + +UFormattedNumberImpl::UFormattedNumberImpl() + : fImpl(&fData) { + fFormattedValue = &fImpl; } -UNumberFormatter* UNumberFormatterData::exportForC() { - return reinterpret_cast(this); +UFormattedNumberImpl::~UFormattedNumberImpl() { + // Disown the data from fImpl so it doesn't get deleted twice + fImpl.fData = nullptr; } -UFormattedNumberData* UFormattedNumberData::validate(UFormattedNumber* input, UErrorCode& status) { - auto* constInput = static_cast(input); - auto* validated = validate(constInput, status); - return const_cast(validated); } +} +U_NAMESPACE_END + + +UPRV_FORMATTED_VALUE_CAPI_NO_IMPLTYPE_AUTO_IMPL( + UFormattedNumber, + UFormattedNumberImpl, + UFormattedNumberApiHelper, + unumf) + -const UFormattedNumberData* -UFormattedNumberData::validate(const UFormattedNumber* input, UErrorCode& status) { +const DecimalQuantity* icu::number::impl::validateUFormattedNumberToDecimalQuantity( + const UFormattedNumber* uresult, UErrorCode& status) { + auto* result = UFormattedNumberApiHelper::validate(uresult, status); if (U_FAILURE(status)) { return nullptr; } - if (input == nullptr) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return nullptr; - } - auto* impl = reinterpret_cast(input); - if (impl->fMagic != UFormattedNumberData::kMagic) { - status = U_INVALID_FORMAT_ERROR; - return nullptr; - } - return impl; + return &result->fData.quantity; } -UFormattedNumber* UFormattedNumberData::exportForC() { - return reinterpret_cast(this); -} - -///////////////////////////////////// -/// END CAPI CONVERSION FUNCTIONS /// -///////////////////////////////////// U_CAPI UNumberFormatter* U_EXPORT2 @@ -97,13 +94,17 @@ unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const return impl->exportForC(); } -U_CAPI UFormattedNumber* U_EXPORT2 -unumf_openResult(UErrorCode* ec) { - auto* impl = new UFormattedNumberData(); +U_CAPI UNumberFormatter* U_EXPORT2 +unumf_openForSkeletonAndLocaleWithError(const UChar* skeleton, int32_t skeletonLen, const char* locale, + UParseError* perror, UErrorCode* ec) { + auto* impl = new UNumberFormatterData(); if (impl == nullptr) { *ec = U_MEMORY_ALLOCATION_ERROR; return nullptr; } + // Readonly-alias constructor (first argument is whether we are NUL-terminated) + UnicodeString skeletonString(skeletonLen == -1, skeleton, skeletonLen); + impl->fFormatter = NumberFormatter::forSkeleton(skeletonString, *perror, *ec).locale(locale); return impl->exportForC(); } @@ -111,43 +112,43 @@ U_CAPI void U_EXPORT2 unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToLong(value); - formatter->fFormatter.formatImpl(result, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToLong(value); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI void U_EXPORT2 unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToDouble(value); - formatter->fFormatter.formatImpl(result, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToDouble(value); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI void U_EXPORT2 unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen, UFormattedNumber* uresult, UErrorCode* ec) { const UNumberFormatterData* formatter = UNumberFormatterData::validate(uformatter, *ec); - UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } - result->string.clear(); - result->quantity.setToDecNumber({value, valueLen}, *ec); + result->fData.getStringRef().clear(); + result->fData.quantity.setToDecNumber({value, valueLen}, *ec); if (U_FAILURE(*ec)) { return; } - formatter->fFormatter.formatImpl(result, *ec); + formatter->fFormatter.formatImpl(&result->fData, *ec); } U_CAPI int32_t U_EXPORT2 unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return 0; } if (buffer == nullptr ? bufferCapacity != 0 : bufferCapacity < 0) { @@ -155,12 +156,12 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf return 0; } - return result->string.toTempUnicodeString().extract(buffer, bufferCapacity, *ec); + return result->fImpl.toTempString(*ec).extract(buffer, bufferCapacity, *ec); } U_CAPI UBool U_EXPORT2 unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return FALSE; } if (ufpos == nullptr) { @@ -172,7 +173,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u fp.setField(ufpos->field); fp.setBeginIndex(ufpos->beginIndex); fp.setEndIndex(ufpos->endIndex); - bool retval = result->string.nextFieldPosition(fp, *ec); + bool retval = result->fImpl.nextFieldPosition(fp, *ec); ufpos->beginIndex = fp.getBeginIndex(); ufpos->endIndex = fp.getEndIndex(); // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool @@ -182,7 +183,7 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u U_CAPI void U_EXPORT2 unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer, UErrorCode* ec) { - const UFormattedNumberData* result = UFormattedNumberData::validate(uresult, *ec); + const auto* result = UFormattedNumberApiHelper::validate(uresult, *ec); if (U_FAILURE(*ec)) { return; } if (ufpositer == nullptr) { @@ -191,15 +192,7 @@ unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPosition } auto* fpi = reinterpret_cast(ufpositer); - FieldPositionIteratorHandler fpih(fpi, *ec); - result->string.getAllFieldPositions(fpih, *ec); -} - -U_CAPI void U_EXPORT2 -unumf_closeResult(UFormattedNumber* uresult) { - UErrorCode localStatus = U_ZERO_ERROR; - const UFormattedNumberData* impl = UFormattedNumberData::validate(uresult, localStatus); - delete impl; + result->fImpl.getAllFieldPositions(*fpi, *ec); } U_CAPI void U_EXPORT2 diff --git a/deps/icu-small/source/i18n/number_compact.cpp b/deps/icu-small/source/i18n/number_compact.cpp index 10942c35f535df..f330251be38c88 100644 --- a/deps/icu-small/source/i18n/number_compact.cpp +++ b/deps/icu-small/source/i18n/number_compact.cpp @@ -260,7 +260,7 @@ void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReferen ParsedPatternInfo patternInfo; PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); if (U_FAILURE(status)) { return; } - buildReference.setPatternInfo(&patternInfo); + buildReference.setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD); info.mod = buildReference.createImmutable(status); if (U_FAILURE(status)) { return; } info.patternString = patternString; @@ -297,7 +297,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr for (; i < precomputedModsLength; i++) { const CompactModInfo &info = precomputedMods[i]; if (u_strcmp(patternString, info.patternString) == 0) { - info.mod->applyToMicros(micros, quantity); + info.mod->applyToMicros(micros, quantity, status); break; } } @@ -310,7 +310,7 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr ParsedPatternInfo &patternInfo = const_cast(this)->unsafePatternInfo; PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); static_cast(const_cast(micros.modMiddle)) - ->setPatternInfo(&patternInfo); + ->setPatternInfo(&patternInfo, UNUM_COMPACT_FIELD); } // We already performed rounding. Do not perform it again. diff --git a/deps/icu-small/source/i18n/number_decimalquantity.cpp b/deps/icu-small/source/i18n/number_decimalquantity.cpp index 2c4182b1c6ecda..d899c27671181e 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.cpp +++ b/deps/icu-small/source/i18n/number_decimalquantity.cpp @@ -112,10 +112,8 @@ DecimalQuantity& DecimalQuantity::operator=(DecimalQuantity&& src) U_NOEXCEPT { void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) { bogus = other.bogus; - lOptPos = other.lOptPos; lReqPos = other.lReqPos; rReqPos = other.rReqPos; - rOptPos = other.rOptPos; scale = other.scale; precision = other.precision; flags = other.flags; @@ -125,18 +123,15 @@ void DecimalQuantity::copyFieldsFrom(const DecimalQuantity& other) { } void DecimalQuantity::clear() { - lOptPos = INT32_MAX; lReqPos = 0; rReqPos = 0; - rOptPos = INT32_MIN; flags = 0; setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data } -void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) { +void DecimalQuantity::setMinInteger(int32_t minInt) { // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. U_ASSERT(minInt >= 0); - U_ASSERT(maxInt >= minInt); // Special behavior: do not set minInt to be less than what is already set. // This is so significant digits rounding can set the integer length. @@ -145,49 +140,68 @@ void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) { } // Save values into internal state - // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE - lOptPos = maxInt; lReqPos = minInt; } -void DecimalQuantity::setFractionLength(int32_t minFrac, int32_t maxFrac) { +void DecimalQuantity::setMinFraction(int32_t minFrac) { // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. U_ASSERT(minFrac >= 0); - U_ASSERT(maxFrac >= minFrac); // Save values into internal state // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE rReqPos = -minFrac; - rOptPos = -maxFrac; +} + +void DecimalQuantity::applyMaxInteger(int32_t maxInt) { + // Validation should happen outside of DecimalQuantity, e.g., in the Precision class. + U_ASSERT(maxInt >= 0); + + if (precision == 0) { + return; + } + + if (maxInt <= scale) { + setBcdToZero(); + return; + } + + int32_t magnitude = getMagnitude(); + if (maxInt <= magnitude) { + popFromLeft(magnitude - maxInt + 1); + compact(); + } } uint64_t DecimalQuantity::getPositionFingerprint() const { uint64_t fingerprint = 0; - fingerprint ^= lOptPos; fingerprint ^= (lReqPos << 16); fingerprint ^= (static_cast(rReqPos) << 32); - fingerprint ^= (static_cast(rOptPos) << 48); return fingerprint; } void DecimalQuantity::roundToIncrement(double roundingIncrement, RoundingMode roundingMode, - int32_t maxFrac, UErrorCode& status) { - // TODO(13701): This is innefficient. Improve? - // TODO(13701): Should we convert to decNumber instead? - roundToInfinity(); - double temp = toDouble(); - temp /= roundingIncrement; - // Use another DecimalQuantity to perform the actual rounding... - DecimalQuantity dq; - dq.setToDouble(temp); - dq.roundToMagnitude(0, roundingMode, status); - temp = dq.toDouble(); - temp *= roundingIncrement; - setToDouble(temp); - // Since we reset the value to a double, we need to specify the rounding boundary - // in order to get the DecimalQuantity out of approximation mode. - // NOTE: In Java, we have minMaxFrac, but in C++, the two are differentiated. - roundToMagnitude(-maxFrac, roundingMode, status); + UErrorCode& status) { + // Do not call this method with an increment having only a 1 or a 5 digit! + // Use a more efficient call to either roundToMagnitude() or roundToNickel(). + // Check a few popular rounding increments; a more thorough check is in Java. + U_ASSERT(roundingIncrement != 0.01); + U_ASSERT(roundingIncrement != 0.05); + U_ASSERT(roundingIncrement != 0.1); + U_ASSERT(roundingIncrement != 0.5); + U_ASSERT(roundingIncrement != 1); + U_ASSERT(roundingIncrement != 5); + + DecNum incrementDN; + incrementDN.setTo(roundingIncrement, status); + if (U_FAILURE(status)) { return; } + + // Divide this DecimalQuantity by the increment, round, then multiply back. + divideBy(incrementDN, status); + if (U_FAILURE(status)) { return; } + roundToMagnitude(0, roundingMode, status); + if (U_FAILURE(status)) { return; } + multiplyBy(incrementDN, status); + if (U_FAILURE(status)) { return; } } void DecimalQuantity::multiplyBy(const DecNum& multiplicand, UErrorCode& status) { @@ -270,7 +284,7 @@ int32_t DecimalQuantity::getUpperDisplayMagnitude() const { U_ASSERT(!isApproximate); int32_t magnitude = scale + precision; - int32_t result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude; + int32_t result = (lReqPos > magnitude) ? lReqPos : magnitude; return result - 1; } @@ -280,7 +294,7 @@ int32_t DecimalQuantity::getLowerDisplayMagnitude() const { U_ASSERT(!isApproximate); int32_t magnitude = scale; - int32_t result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude; + int32_t result = (rReqPos < magnitude) ? rReqPos : magnitude; return result; } @@ -501,7 +515,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const { // if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ } // Fallback behavior upon truncateIfOverflow is to truncate at 17 digits. uint64_t result = 0L; - int32_t upperMagnitude = std::min(scale + precision, lOptPos) - 1; + int32_t upperMagnitude = scale + precision - 1; if (truncateIfOverflow) { upperMagnitude = std::min(upperMagnitude, 17); } @@ -517,7 +531,7 @@ int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const { uint64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const { uint64_t result = 0L; int32_t magnitude = -1; - int32_t lowerMagnitude = std::max(scale, rOptPos); + int32_t lowerMagnitude = scale; if (includeTrailingZeros) { lowerMagnitude = std::min(lowerMagnitude, rReqPos); } @@ -606,36 +620,62 @@ void DecimalQuantity::truncate() { } } +void DecimalQuantity::roundToNickel(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + roundToMagnitude(magnitude, roundingMode, true, status); +} + void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + roundToMagnitude(magnitude, roundingMode, false, status); +} + +void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status) { // The position in the BCD at which rounding will be performed; digits to the right of position // will be rounded away. - // TODO: Andy: There was a test failure because of integer overflow here. Should I do - // "safe subtraction" everywhere in the code? What's the nicest way to do it? int position = safeSubtract(magnitude, scale); - if (position <= 0 && !isApproximate) { + // "trailing" = least significant digit to the left of rounding + int8_t trailingDigit = getDigitPos(position); + + if (position <= 0 && !isApproximate && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { // All digits are to the left of the rounding magnitude. } else if (precision == 0) { // No rounding for zero. } else { // Perform rounding logic. // "leading" = most significant digit to the right of rounding - // "trailing" = least significant digit to the left of rounding int8_t leadingDigit = getDigitPos(safeSubtract(position, 1)); - int8_t trailingDigit = getDigitPos(position); // Compute which section of the number we are in. // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles) // LOWER means we are between the bottom edge and the midpoint, like 1.391 // MIDPOINT means we are exactly in the middle, like 1.500 // UPPER means we are between the midpoint and the top edge, like 1.916 - roundingutils::Section section = roundingutils::SECTION_MIDPOINT; + roundingutils::Section section; if (!isApproximate) { - if (leadingDigit < 5) { + if (nickel && trailingDigit != 2 && trailingDigit != 7) { + // Nickel rounding, and not at .02x or .07x + if (trailingDigit < 2) { + // .00, .01 => down to .00 + section = roundingutils::SECTION_LOWER; + } else if (trailingDigit < 5) { + // .03, .04 => up to .05 + section = roundingutils::SECTION_UPPER; + } else if (trailingDigit < 7) { + // .05, .06 => down to .05 + section = roundingutils::SECTION_LOWER; + } else { + // .08, .09 => up to .10 + section = roundingutils::SECTION_UPPER; + } + } else if (leadingDigit < 5) { + // Includes nickel rounding .020-.024 and .070-.074 section = roundingutils::SECTION_LOWER; } else if (leadingDigit > 5) { + // Includes nickel rounding .026-.029 and .076-.079 section = roundingutils::SECTION_UPPER; } else { + // Includes nickel rounding .025 and .075 + section = roundingutils::SECTION_MIDPOINT; for (int p = safeSubtract(position, 2); p >= 0; p--) { if (getDigitPos(p) != 0) { section = roundingutils::SECTION_UPPER; @@ -646,7 +686,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM } else { int32_t p = safeSubtract(position, 2); int32_t minP = uprv_max(0, precision - 14); - if (leadingDigit == 0) { + if (leadingDigit == 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { section = roundingutils::SECTION_LOWER_EDGE; for (; p >= minP; p--) { if (getDigitPos(p) != 0) { @@ -654,21 +694,23 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM break; } } - } else if (leadingDigit == 4) { + } else if (leadingDigit == 4 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) { + section = roundingutils::SECTION_MIDPOINT; for (; p >= minP; p--) { if (getDigitPos(p) != 9) { section = roundingutils::SECTION_LOWER; break; } } - } else if (leadingDigit == 5) { + } else if (leadingDigit == 5 && (!nickel || trailingDigit == 2 || trailingDigit == 7)) { + section = roundingutils::SECTION_MIDPOINT; for (; p >= minP; p--) { if (getDigitPos(p) != 0) { section = roundingutils::SECTION_UPPER; break; } } - } else if (leadingDigit == 9) { + } else if (leadingDigit == 9 && (!nickel || trailingDigit == 4 || trailingDigit == 9)) { section = roundingutils::SECTION_UPPER_EDGE; for (; p >= minP; p--) { if (getDigitPos(p) != 9) { @@ -676,9 +718,26 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM break; } } + } else if (nickel && trailingDigit != 2 && trailingDigit != 7) { + // Nickel rounding, and not at .02x or .07x + if (trailingDigit < 2) { + // .00, .01 => down to .00 + section = roundingutils::SECTION_LOWER; + } else if (trailingDigit < 5) { + // .03, .04 => up to .05 + section = roundingutils::SECTION_UPPER; + } else if (trailingDigit < 7) { + // .05, .06 => down to .05 + section = roundingutils::SECTION_LOWER; + } else { + // .08, .09 => up to .10 + section = roundingutils::SECTION_UPPER; + } } else if (leadingDigit < 5) { + // Includes nickel rounding .020-.024 and .070-.074 section = roundingutils::SECTION_LOWER; } else { + // Includes nickel rounding .026-.029 and .076-.079 section = roundingutils::SECTION_UPPER; } @@ -686,10 +745,10 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM if (safeSubtract(position, 1) < precision - 14 || (roundsAtMidpoint && section == roundingutils::SECTION_MIDPOINT) || (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) { - // Oops! This means that we have to get the exact representation of the double, because - // the zone of uncertainty is along the rounding boundary. + // Oops! This means that we have to get the exact representation of the double, + // because the zone of uncertainty is along the rounding boundary. convertToAccurateDouble(); - roundToMagnitude(magnitude, roundingMode, status); // start over + roundToMagnitude(magnitude, roundingMode, nickel, status); // start over return; } @@ -698,7 +757,7 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM origDouble = 0.0; origDelta = 0; - if (position <= 0) { + if (position <= 0 && (!nickel || trailingDigit == 0 || trailingDigit == 5)) { // All digits are to the left of the rounding magnitude. return; } @@ -708,7 +767,14 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM if (section == -2) { section = roundingutils::SECTION_UPPER; } } - bool roundDown = roundingutils::getRoundingDirection((trailingDigit % 2) == 0, + // Nickel rounding "half even" goes to the nearest whole (away from the 5). + bool isEven = nickel + ? (trailingDigit < 2 || trailingDigit > 7 + || (trailingDigit == 2 && section != roundingutils::SECTION_UPPER) + || (trailingDigit == 7 && section == roundingutils::SECTION_UPPER)) + : (trailingDigit % 2) == 0; + + bool roundDown = roundingutils::getRoundingDirection(isEven, isNegative(), section, roundingMode, @@ -725,12 +791,28 @@ void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingM shiftRight(position); } + if (nickel) { + if (trailingDigit < 5 && roundDown) { + setDigitPos(0, 0); + compact(); + return; + } else if (trailingDigit >= 5 && !roundDown) { + setDigitPos(0, 9); + trailingDigit = 9; + // do not return: use the bubbling logic below + } else { + setDigitPos(0, 5); + // compact not necessary: digit at position 0 is nonzero + return; + } + } + // Bubble the result to the higher digits if (!roundDown) { if (trailingDigit == 9) { int bubblePos = 0; - // Note: in the long implementation, the most digits BCD can have at this point is 15, - // so bubblePos <= 15 and getDigitPos(bubblePos) is safe. + // Note: in the long implementation, the most digits BCD can have at this point is + // 15, so bubblePos <= 15 and getDigitPos(bubblePos) is safe. for (; getDigitPos(bubblePos) == 9; bubblePos++) {} shiftRight(bubblePos); // shift off the trailing 9s } @@ -806,10 +888,8 @@ UnicodeString DecimalQuantity::toScientificString() const { result.append(u"0E+0", -1); return result; } - // NOTE: It is not safe to add to lOptPos (aka maxInt) or subtract from - // rOptPos (aka -maxFrac) due to overflow. - int32_t upperPos = std::min(precision + scale, lOptPos) - scale - 1; - int32_t lowerPos = std::max(scale, rOptPos) - scale; + int32_t upperPos = precision - 1; + int32_t lowerPos = 0; int32_t p = upperPos; result.append(u'0' + getDigitPos(p)); if ((--p) >= lowerPos) { @@ -820,7 +900,10 @@ UnicodeString DecimalQuantity::toScientificString() const { } result.append(u'E'); int32_t _scale = upperPos + scale; - if (_scale < 0) { + if (_scale == INT32_MIN) { + result.append({u"-2147483648", -1}); + return result; + } else if (_scale < 0) { _scale *= -1; result.append(u'-'); } else { @@ -904,6 +987,19 @@ void DecimalQuantity::shiftRight(int32_t numDigits) { precision -= numDigits; } +void DecimalQuantity::popFromLeft(int32_t numDigits) { + U_ASSERT(numDigits <= precision); + if (usingBytes) { + int i = precision - 1; + for (; i >= precision - numDigits; i--) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong &= (static_cast(1) << ((precision - numDigits) * 4)) - 1; + } + precision -= numDigits; +} + void DecimalQuantity::setBcdToZero() { if (usingBytes) { uprv_free(fBCD.bcdBytes.ptr); @@ -1158,10 +1254,8 @@ bool DecimalQuantity::operator==(const DecimalQuantity& other) const { scale == other.scale && precision == other.precision && flags == other.flags - && lOptPos == other.lOptPos && lReqPos == other.lReqPos && rReqPos == other.rReqPos - && rOptPos == other.rOptPos && isApproximate == other.isApproximate; if (!basicEquals) { return false; @@ -1191,11 +1285,9 @@ UnicodeString DecimalQuantity::toString() const { snprintf( buffer8, sizeof(buffer8), - "", - (lOptPos > 999 ? 999 : lOptPos), + "", lReqPos, rReqPos, - (rOptPos < -999 ? -999 : rOptPos), (usingBytes ? "bytes" : "long"), (isNegative() ? "-" : ""), (precision == 0 ? "0" : digits.getAlias()), diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h index 8e04dea7eb5c43..06cc836c7796f2 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.h +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -53,22 +53,28 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { DecimalQuantity &operator=(DecimalQuantity&& src) U_NOEXCEPT; /** - * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate. + * Sets the minimum integer digits that this {@link DecimalQuantity} should generate. * This method does not perform rounding. * * @param minInt The minimum number of integer digits. - * @param maxInt The maximum number of integer digits. */ - void setIntegerLength(int32_t minInt, int32_t maxInt); + void setMinInteger(int32_t minInt); /** - * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate. + * Sets the minimum fraction digits that this {@link DecimalQuantity} should generate. * This method does not perform rounding. * * @param minFrac The minimum number of fraction digits. - * @param maxFrac The maximum number of fraction digits. */ - void setFractionLength(int32_t minFrac, int32_t maxFrac); + void setMinFraction(int32_t minFrac); + + /** + * Truncates digits from the upper magnitude of the number in order to satisfy the + * specified maximum number of integer digits. + * + * @param maxInt The maximum number of integer digits. + */ + void applyMaxInteger(int32_t maxInt); /** * Rounds the number to a specified interval, such as 0.05. @@ -76,20 +82,29 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { *

If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead. * * @param roundingIncrement The increment to which to round. - * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + * @param roundingMode The {@link RoundingMode} to use if rounding is necessary. */ void roundToIncrement(double roundingIncrement, RoundingMode roundingMode, - int32_t maxFrac, UErrorCode& status); + UErrorCode& status); /** Removes all fraction digits. */ void truncate(); + /** + * Rounds the number to the nearest multiple of 5 at the specified magnitude. + * For example, when magnitude == -2, this performs rounding to the nearest 0.05. + * + * @param magnitude The magnitude at which the digit should become either 0 or 5. + * @param roundingMode Rounding strategy. + */ + void roundToNickel(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status); + /** * Rounds the number to a specified magnitude (power of ten). * * @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will * round to 2 decimal places. - * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + * @param roundingMode The {@link RoundingMode} to use if rounding is necessary. */ void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status); @@ -260,7 +275,7 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { inline bool isUsingBytes() { return usingBytes; } /** Visible for testing */ - inline bool isExplicitExactDouble() { return explicitExactDouble; }; + inline bool isExplicitExactDouble() { return explicitExactDouble; } bool operator==(const DecimalQuantity& other) const; @@ -327,36 +342,11 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ int32_t origDelta; - // Four positions: left optional '(', left required '[', right required ']', right optional ')'. - // These four positions determine which digits are displayed in the output string. They do NOT - // affect rounding. These positions are internal-only and can be specified only by the public - // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others. - // - // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed. - // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone" - // and are displayed unless they are trailing off the left or right edge of the number and - // have a numerical value of zero. In order to be "trailing", the digits need to be beyond - // the decimal point in their respective directions. - // * Digits outside of the "optional zone" are never displayed. - // - // See the table below for illustrative examples. - // - // +---------+---------+---------+---------+------------+------------------------+--------------+ - // | lOptPos | lReqPos | rReqPos | rOptPos | number | positions | en-US string | - // +---------+---------+---------+---------+------------+------------------------+--------------+ - // | 5 | 2 | -1 | -5 | 1234.567 | ( 12[34.5]67 ) | 1,234.567 | - // | 3 | 2 | -1 | -5 | 1234.567 | 1(2[34.5]67 ) | 234.567 | - // | 3 | 2 | -1 | -2 | 1234.567 | 1(2[34.5]6)7 | 234.56 | - // | 6 | 4 | 2 | -5 | 123456789. | 123(45[67]89. ) | 456,789. | - // | 6 | 4 | 2 | 1 | 123456789. | 123(45[67]8)9. | 456,780. | - // | -1 | -1 | -3 | -4 | 0.123456 | 0.1([23]4)56 | .0234 | - // | 6 | 4 | -2 | -2 | 12.3 | ( [ 12.3 ]) | 0012.30 | - // +---------+---------+---------+---------+------------+------------------------+--------------+ - // - int32_t lOptPos = INT32_MAX; + // Positions to keep track of leading and trailing zeros. + // lReqPos is the magnitude of the first required leading zero. + // rReqPos is the magnitude of the last required trailing zero. int32_t lReqPos = 0; int32_t rReqPos = 0; - int32_t rOptPos = INT32_MIN; /** * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map @@ -382,6 +372,8 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ bool explicitExactDouble = false; + void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, bool nickel, UErrorCode& status); + /** * Returns a single digit from the BCD list. No internal state is changed by calling this method. * @@ -410,8 +402,22 @@ class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { */ void shiftLeft(int32_t numDigits); + /** + * Directly removes digits from the end of the BCD list. + * Updates the scale and precision. + * + * CAUTION: it is the caller's responsibility to call {@link #compact} after this method. + */ void shiftRight(int32_t numDigits); + /** + * Directly removes digits from the front of the BCD list. + * Updates precision. + * + * CAUTION: it is the caller's responsibility to call {@link #compact} after this method. + */ + void popFromLeft(int32_t numDigits); + /** * Sets the internal representation to zero. Clears any values stored in scale, precision, * hasDouble, origDouble, origDelta, and BCD data. diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.cpp b/deps/icu-small/source/i18n/number_decimfmtprops.cpp index 12fe7060e2d051..30481ce5bf0110 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.cpp +++ b/deps/icu-small/source/i18n/number_decimfmtprops.cpp @@ -21,6 +21,7 @@ char kRawDefaultProperties[sizeof(DecimalFormatProperties)]; icu::UInitOnce gDefaultPropertiesInitOnce = U_INITONCE_INITIALIZER; void U_CALLCONV initDefaultProperties(UErrorCode&) { + // can't fail, uses placement new into staticly allocated space. new(kRawDefaultProperties) DecimalFormatProperties(); // set to the default instance } @@ -142,4 +143,10 @@ bool DecimalFormatProperties::equalsDefaultExceptFastFormat() const { return _equals(*reinterpret_cast(kRawDefaultProperties), true); } +const DecimalFormatProperties& DecimalFormatProperties::getDefault() { + UErrorCode localStatus = U_ZERO_ERROR; + umtx_initOnce(gDefaultPropertiesInitOnce, &initDefaultProperties, localStatus); + return *reinterpret_cast(kRawDefaultProperties); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.h b/deps/icu-small/source/i18n/number_decimfmtprops.h index f288b6e0d97f58..1ce84d9dc388d7 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.h +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN // data member of CurrencyPluralInfoWrapper. // (When building DLLs for Windows this is required.) #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable: 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalPointer; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif namespace number { @@ -149,6 +155,11 @@ struct U_I18N_API DecimalFormatProperties : public UMemory { */ bool equalsDefaultExceptFastFormat() const; + /** + * Returns the default DecimalFormatProperties instance. + */ + static const DecimalFormatProperties& getDefault(); + private: bool _equals(const DecimalFormatProperties& other, bool ignoreForFastFormat) const; }; diff --git a/deps/icu-small/source/i18n/number_fluent.cpp b/deps/icu-small/source/i18n/number_fluent.cpp index a66e3bd0f23510..09e0905609eb30 100644 --- a/deps/icu-small/source/i18n/number_fluent.cpp +++ b/deps/icu-small/source/i18n/number_fluent.cpp @@ -151,7 +151,7 @@ Derived NumberFormatterSettings::roundingMode(UNumberFormatRoundingMode } template -Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy) const& { +Derived NumberFormatterSettings::grouping(UNumberGroupingStrategy strategy) const& { Derived copy(*this); // NOTE: This is slightly different than how the setting is stored in Java // because we want to put it on the stack. @@ -160,7 +160,7 @@ Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy) c } template -Derived NumberFormatterSettings::grouping(UGroupingStrategy strategy)&& { +Derived NumberFormatterSettings::grouping(UNumberGroupingStrategy strategy)&& { Derived move(std::move(*this)); move.fMacros.grouper = Grouper::forStrategy(strategy); return move; @@ -322,12 +322,25 @@ Derived NumberFormatterSettings::macros(impl::MacroProps&& macros)&& { template UnicodeString NumberFormatterSettings::toSkeleton(UErrorCode& status) const { + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } if (fMacros.copyErrorTo(status)) { return ICU_Utility::makeBogusString(); } return skeleton::generate(fMacros, status); } +template +LocalPointer NumberFormatterSettings::clone() const & { + return LocalPointer(new Derived(*this)); +} + +template +LocalPointer NumberFormatterSettings::clone() && { + return LocalPointer(new Derived(std::move(*this))); +} + // Declare all classes that implement NumberFormatterSettings // See https://stackoverflow.com/a/495056/1407170 template @@ -347,7 +360,12 @@ LocalizedNumberFormatter NumberFormatter::withLocale(const Locale& locale) { UnlocalizedNumberFormatter NumberFormatter::forSkeleton(const UnicodeString& skeleton, UErrorCode& status) { - return skeleton::create(skeleton, status); + return skeleton::create(skeleton, nullptr, status); +} + +UnlocalizedNumberFormatter +NumberFormatter::forSkeleton(const UnicodeString& skeleton, UParseError& perror, UErrorCode& status) { + return skeleton::create(skeleton, &perror, status); } @@ -666,10 +684,14 @@ LocalizedNumberFormatter::formatDecimalQuantity(const DecimalQuantity& dq, UErro void LocalizedNumberFormatter::formatImpl(impl::UFormattedNumberData* results, UErrorCode& status) const { if (computeCompiled(status)) { - fCompiled->format(results->quantity, results->string, status); + fCompiled->format(results->quantity, results->getStringRef(), status); } else { - NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->string, status); + NumberFormatterImpl::formatStatic(fMacros, results->quantity, results->getStringRef(), status); } + if (U_FAILURE(status)) { + return; + } + results->getStringRef().writeTerminator(status); } void LocalizedNumberFormatter::getAffixImpl(bool isPrefix, bool isNegative, UnicodeString& result, @@ -745,122 +767,13 @@ int32_t LocalizedNumberFormatter::getCallCount() const { } Format* LocalizedNumberFormatter::toFormat(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } LocalPointer retval( new LocalizedNumberFormatterAsFormat(*this, fMacros.locale), status); return retval.orphan(); } -FormattedNumber::FormattedNumber(FormattedNumber&& src) U_NOEXCEPT - : fResults(src.fResults), fErrorCode(src.fErrorCode) { - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; -} - -FormattedNumber& FormattedNumber::operator=(FormattedNumber&& src) U_NOEXCEPT { - delete fResults; - fResults = src.fResults; - fErrorCode = src.fErrorCode; - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; - return *this; -} - -UnicodeString FormattedNumber::toString() const { - UErrorCode localStatus = U_ZERO_ERROR; - return toString(localStatus); -} - -UnicodeString FormattedNumber::toString(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->string.toUnicodeString(); -} - -Appendable& FormattedNumber::appendTo(Appendable& appendable) { - UErrorCode localStatus = U_ZERO_ERROR; - return appendTo(appendable, localStatus); -} - -Appendable& FormattedNumber::appendTo(Appendable& appendable, UErrorCode& status) const { - if (U_FAILURE(status)) { - return appendable; - } - if (fResults == nullptr) { - status = fErrorCode; - return appendable; - } - appendable.appendString(fResults->string.chars(), fResults->string.length()); - return appendable; -} - -void FormattedNumber::populateFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - // in case any users were depending on the old behavior: - fieldPosition.setBeginIndex(0); - fieldPosition.setEndIndex(0); - fResults->string.nextFieldPosition(fieldPosition, status); -} - -UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { - if (U_FAILURE(status)) { - return FALSE; - } - if (fResults == nullptr) { - status = fErrorCode; - return FALSE; - } - // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool - return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; -} - -void FormattedNumber::populateFieldPositionIterator(FieldPositionIterator& iterator, UErrorCode& status) { - getAllFieldPositions(iterator, status); -} - -void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { - FieldPositionIteratorHandler fpih(&iterator, status); - getAllFieldPositionsImpl(fpih, status); -} - -void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, - UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - fResults->string.getAllFieldPositions(fpih, status); -} - -void FormattedNumber::getDecimalQuantity(DecimalQuantity& output, UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - output = fResults->quantity; -} - -FormattedNumber::~FormattedNumber() { - delete fResults; -} - #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_formatimpl.cpp b/deps/icu-small/source/i18n/number_formatimpl.cpp index 60c18ee284e238..08b833beb7ad2e 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.cpp +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -172,13 +172,12 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, // Pre-compute a few values for efficiency. bool isCurrency = utils::unitIsCurrency(macros.unit); bool isNoUnit = utils::unitIsNoUnit(macros.unit); - bool isPercent = isNoUnit && utils::unitIsPercent(macros.unit); - bool isPermille = isNoUnit && utils::unitIsPermille(macros.unit); - bool isCldrUnit = !isCurrency && !isNoUnit; + bool isPercent = utils::unitIsPercent(macros.unit); + bool isPermille = utils::unitIsPermille(macros.unit); bool isAccounting = macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS || macros.sign == UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO; - CurrencyUnit currency(nullptr, status); + CurrencyUnit currency(u"", status); if (isCurrency) { currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit } @@ -194,6 +193,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) { unitWidth = macros.unitWidth; } + bool isCldrUnit = !isCurrency && !isNoUnit && + (unitWidth == UNUM_UNIT_WIDTH_FULL_NAME || !(isPercent || isPermille)); // Select the numbering system. LocalPointer nsLocal; @@ -207,6 +208,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, nsLocal.adoptInstead(ns); } const char* nsName = U_SUCCESS(status) ? ns->getName() : "latn"; + uprv_strncpy(fMicros.nsName, nsName, 8); + fMicros.nsName[8] = 0; // guarantee NUL-terminated // Resolve the symbols. Do this here because currency may need to customize them. if (macros.symbols.isDecimalFormatSymbols()) { @@ -241,7 +244,9 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, } if (pattern == nullptr) { CldrPatternStyle patternStyle; - if (isPercent || isPermille) { + if (isCldrUnit) { + patternStyle = CLDR_PATTERN_STYLE_DECIMAL; + } else if (isPercent || isPermille) { patternStyle = CLDR_PATTERN_STYLE_PERCENT; } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { patternStyle = CLDR_PATTERN_STYLE_DECIMAL; @@ -344,7 +349,8 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, fPatternModifier.adoptInstead(patternModifier); patternModifier->setPatternInfo( macros.affixProvider != nullptr ? macros.affixProvider - : static_cast(fPatternInfo.getAlias())); + : static_cast(fPatternInfo.getAlias()), + UNUM_FIELD_COUNT); patternModifier->setPatternAttributes(fMicros.sign, isPermille); if (patternModifier->needsPlurals()) { patternModifier->setSymbols( diff --git a/deps/icu-small/source/i18n/number_formatimpl.h b/deps/icu-small/source/i18n/number_formatimpl.h index fda38c92845f87..fd8708c532e131 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.h +++ b/deps/icu-small/source/i18n/number_formatimpl.h @@ -64,6 +64,10 @@ class NumberFormatterImpl : public UMemory { int32_t getPrefixSuffix(int8_t signum, StandardPlural::Form plural, NumberStringBuilder& outString, UErrorCode& status) const; + const MicroProps& getRawMicroProps() const { + return fMicros; + } + /** * Synthesizes the output string from a MicroProps and DecimalQuantity. * This method formats only the main number, not affixes. diff --git a/deps/icu-small/source/i18n/number_grouping.cpp b/deps/icu-small/source/i18n/number_grouping.cpp index da32cca99a38df..41f727a458f943 100644 --- a/deps/icu-small/source/i18n/number_grouping.cpp +++ b/deps/icu-small/source/i18n/number_grouping.cpp @@ -34,7 +34,7 @@ int16_t getMinGroupingForLocale(const Locale& locale) { } -Grouper Grouper::forStrategy(UGroupingStrategy grouping) { +Grouper Grouper::forStrategy(UNumberGroupingStrategy grouping) { switch (grouping) { case UNUM_GROUPING_OFF: return {-1, -1, -2, grouping}; @@ -47,8 +47,7 @@ Grouper Grouper::forStrategy(UGroupingStrategy grouping) { case UNUM_GROUPING_THOUSANDS: return {3, 3, 1, grouping}; default: - U_ASSERT(FALSE); - return {}; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/number_integerwidth.cpp b/deps/icu-small/source/i18n/number_integerwidth.cpp index 6416b292982e56..d62aef444dca96 100644 --- a/deps/icu-small/source/i18n/number_integerwidth.cpp +++ b/deps/icu-small/source/i18n/number_integerwidth.cpp @@ -43,14 +43,15 @@ void IntegerWidth::apply(impl::DecimalQuantity& quantity, UErrorCode& status) co if (fHasError) { status = U_ILLEGAL_ARGUMENT_ERROR; } else if (fUnion.minMaxInt.fMaxInt == -1) { - quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, INT32_MAX); + quantity.setMinInteger(fUnion.minMaxInt.fMinInt); } else { // Enforce the backwards-compatibility feature "FormatFailIfMoreThanMaxDigits" if (fUnion.minMaxInt.fFormatFailIfMoreThanMaxDigits && fUnion.minMaxInt.fMaxInt < quantity.getMagnitude()) { status = U_ILLEGAL_ARGUMENT_ERROR; } - quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, fUnion.minMaxInt.fMaxInt); + quantity.setMinInteger(fUnion.minMaxInt.fMinInt); + quantity.applyMaxInteger(fUnion.minMaxInt.fMaxInt); } } diff --git a/deps/icu-small/source/i18n/number_longnames.cpp b/deps/icu-small/source/i18n/number_longnames.cpp index fd8e8d381a1d76..0cd160042a46d3 100644 --- a/deps/icu-small/source/i18n/number_longnames.cpp +++ b/deps/icu-small/source/i18n/number_longnames.cpp @@ -14,6 +14,7 @@ #include "number_microprops.h" #include #include "cstring.h" +#include "util.h" using namespace icu; using namespace icu::number; @@ -91,6 +92,17 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber PluralTableSink sink(outArray); LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status)); if (U_FAILURE(status)) { return; } + + // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ... + // TODO(ICU-20400): Get duration-*-person data properly with aliases. + StringPiece subtypeForResource; + int32_t subtypeLen = static_cast(uprv_strlen(unit.getSubtype())); + if (subtypeLen > 7 && uprv_strcmp(unit.getSubtype() + subtypeLen - 7, "-person") == 0) { + subtypeForResource = {unit.getSubtype(), subtypeLen - 7}; + } else { + subtypeForResource = unit.getSubtype(); + } + CharString key; key.append("units", status); if (width == UNUM_UNIT_WIDTH_NARROW) { @@ -101,7 +113,24 @@ void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumber key.append("/", status); key.append(unit.getType(), status); key.append("/", status); - key.append(unit.getSubtype(), status); + key.append(subtypeForResource, status); + + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, localStatus); + if (width == UNUM_UNIT_WIDTH_SHORT) { + if (U_FAILURE(localStatus)) { + status = localStatus; + } + return; + } + + // TODO(ICU-13353): The fallback to short does not work in ICU4C. + // Manually fall back to short (this is done automatically in Java). + key.clear(); + key.append("unitsShort/", status); + key.append(unit.getType(), status); + key.append("/", status); + key.append(subtypeForResource, status); ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, status); } @@ -181,8 +210,7 @@ LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unitRef, c UnicodeString simpleFormats[ARRAY_LENGTH]; getMeasureData(loc, unit, width, simpleFormats, status); if (U_FAILURE(status)) { return result; } - // TODO: What field to use for units? - result->simpleFormatsToModifiers(simpleFormats, UNUM_FIELD_COUNT, status); + result->simpleFormatsToModifiers(simpleFormats, UNUM_MEASURE_UNIT_FIELD, status); return result; } @@ -220,11 +248,23 @@ LongNameHandler::forCompoundUnit(const Locale &loc, const MeasureUnit &unit, con compiled.format(UnicodeString(u"{0}"), secondaryString, perUnitFormat, status); if (U_FAILURE(status)) { return result; } } - // TODO: What field to use for units? - result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_FIELD_COUNT, status); + result->multiSimpleFormatsToModifiers(primaryData, perUnitFormat, UNUM_MEASURE_UNIT_FIELD, status); return result; } +UnicodeString LongNameHandler::getUnitDisplayName( + const Locale& loc, + const MeasureUnit& unit, + UNumberUnitWidth width, + UErrorCode& status) { + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } + UnicodeString simpleFormats[ARRAY_LENGTH]; + getMeasureData(loc, unit, width, simpleFormats, status); + return simpleFormats[DNAM_INDEX]; +} + LongNameHandler* LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, const MicroPropsGenerator *parent, @@ -273,10 +313,8 @@ void LongNameHandler::multiSimpleFormatsToModifiers(const UnicodeString *leadFor void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const { parent->processQuantity(quantity, micros, status); - // TODO: Avoid the copy here? - DecimalQuantity copy(quantity); - micros.rounder.apply(copy, status); - micros.modOuter = &fModifiers[utils::getStandardPlural(rules, copy)]; + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status); + micros.modOuter = &fModifiers[pluralForm]; } const Modifier* LongNameHandler::getModifier(int8_t /*signum*/, StandardPlural::Form plural) const { diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h index a71d0caadf125c..76fb82d744b6d4 100644 --- a/deps/icu-small/source/i18n/number_longnames.h +++ b/deps/icu-small/source/i18n/number_longnames.h @@ -16,6 +16,12 @@ namespace impl { class LongNameHandler : public MicroPropsGenerator, public ModifierStore, public UMemory { public: + static UnicodeString getUnitDisplayName( + const Locale& loc, + const MeasureUnit& unit, + UNumberUnitWidth width, + UErrorCode& status); + static LongNameHandler* forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status); diff --git a/deps/icu-small/source/i18n/number_mapper.cpp b/deps/icu-small/source/i18n/number_mapper.cpp index 2c9a8e5178f35e..40fd5284b86649 100644 --- a/deps/icu-small/source/i18n/number_mapper.cpp +++ b/deps/icu-small/source/i18n/number_mapper.cpp @@ -80,8 +80,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert /////////// bool useCurrency = ( - !properties.currency.isNull() || !properties.currencyPluralInfo.fPtr.isNull() || - !properties.currencyUsage.isNull() || affixProvider->hasCurrencySign()); + !properties.currency.isNull() || + !properties.currencyPluralInfo.fPtr.isNull() || + !properties.currencyUsage.isNull() || + affixProvider->hasCurrencySign()); CurrencyUnit currency = resolveCurrency(properties, locale, status); UCurrencyUsage currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD); if (useCurrency) { @@ -141,7 +143,11 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert if (!properties.currencyUsage.isNull()) { precision = Precision::constructCurrency(currencyUsage).withCurrency(currency); } else if (roundingIncrement != 0.0) { - precision = Precision::constructIncrement(roundingIncrement, minFrac); + if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) { + precision = Precision::constructFraction(minFrac, maxFrac); + } else { + precision = Precision::constructIncrement(roundingIncrement, minFrac); + } } else if (explicitMinMaxSig) { minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig; maxSig = maxSig < 0 ? kMaxIntFracSig : maxSig < minSig ? minSig : maxSig > kMaxIntFracSig @@ -153,7 +159,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert precision = Precision::constructCurrency(currencyUsage); } if (!precision.isBogus()) { - precision = precision.withMode(roundingMode); + precision.fRoundingMode = roundingMode; macros.precision = precision; } @@ -176,7 +182,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert // PADDING // ///////////// - if (properties.formatWidth != -1) { + if (properties.formatWidth > 0) { macros.padder = Padder::forProperties(properties); } @@ -232,10 +238,10 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert int maxFrac_ = properties.maximumFractionDigits; if (minInt_ == 0 && maxFrac_ == 0) { // Patterns like "#E0" and "##E0", which mean no rounding! - macros.precision = Precision::unlimited().withMode(roundingMode); + macros.precision = Precision::unlimited(); } else if (minInt_ == 0 && minFrac_ == 0) { // Patterns like "#.##E0" (no zeros in the mantissa), which mean round to maxFrac+1 - macros.precision = Precision::constructSignificant(1, maxFrac_ + 1).withMode(roundingMode); + macros.precision = Precision::constructSignificant(1, maxFrac_ + 1); } else { int maxSig_ = minInt_ + maxFrac_; // Bug #20058: if maxInt_ > minInt_ > 1, then minInt_ should be 1. @@ -245,8 +251,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert int minSig_ = minInt_ + minFrac_; // To avoid regression, maxSig is not reset when minInt_ set to 1. // TODO: Reset maxSig_ = 1 + minFrac_ to follow the spec. - macros.precision = Precision::constructSignificant(minSig_, maxSig_).withMode(roundingMode); + macros.precision = Precision::constructSignificant(minSig_, maxSig_); } + macros.precision.fRoundingMode = roundingMode; } } @@ -295,7 +302,9 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert if (rounding_.fType == Precision::PrecisionType::RND_FRACTION) { minFrac_ = rounding_.fUnion.fracSig.fMinFrac; maxFrac_ = rounding_.fUnion.fracSig.fMaxFrac; - } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT) { + } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT + || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE + || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) { increment_ = rounding_.fUnion.increment.fIncrement; minFrac_ = rounding_.fUnion.increment.fMinFrac; maxFrac_ = rounding_.fUnion.increment.fMinFrac; @@ -315,7 +324,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert } -void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode&) { +void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& properties, UErrorCode& status) { fBogus = false; // There are two ways to set affixes in DecimalFormat: via the pattern string (applyPattern), and via the @@ -325,9 +334,7 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper // 2) Otherwise, follows UTS 35 rules based on the pattern string. // // Importantly, the explicit setters affect only the one field they override. If you set the positive - // prefix, that should not affect the negative prefix. Since it is impossible for the user of this class - // to know whether the origin for a string was the override or the pattern, we have to say that we always - // have a negative subpattern and perform all resolution logic here. + // prefix, that should not affect the negative prefix. // Convenience: Extract the properties into local variables. // Variables are named with three chars: [p/n][p/s][o/p] @@ -379,6 +386,14 @@ void PropertiesAffixPatternProvider::setTo(const DecimalFormatProperties& proper // UTS 35: Default negative prefix is the positive prefix. negSuffix = psp.isBogus() ? u"" : psp; } + + // For declaring if this is a currency pattern, we need to look at the + // original pattern, not at any user-specified overrides. + isCurrencyPattern = ( + AffixUtils::hasCurrencySymbols(ppp, status) || + AffixUtils::hasCurrencySymbols(psp, status) || + AffixUtils::hasCurrencySymbols(npp, status) || + AffixUtils::hasCurrencySymbols(nsp, status)); } char16_t PropertiesAffixPatternProvider::charAt(int flags, int i) const { @@ -415,8 +430,11 @@ bool PropertiesAffixPatternProvider::positiveHasPlusSign() const { } bool PropertiesAffixPatternProvider::hasNegativeSubpattern() const { - // See comments in the constructor for more information on why this is always true. - return true; + return ( + (negSuffix != posSuffix) || + negPrefix.tempSubString(1) != posPrefix || + negPrefix.charAt(0) != u'-' + ); } bool PropertiesAffixPatternProvider::negativeHasMinusSign() const { @@ -426,11 +444,7 @@ bool PropertiesAffixPatternProvider::negativeHasMinusSign() const { } bool PropertiesAffixPatternProvider::hasCurrencySign() const { - ErrorCode localStatus; - return AffixUtils::hasCurrencySymbols(posPrefix, localStatus) || - AffixUtils::hasCurrencySymbols(posSuffix, localStatus) || - AffixUtils::hasCurrencySymbols(negPrefix, localStatus) || - AffixUtils::hasCurrencySymbols(negSuffix, localStatus); + return isCurrencyPattern; } bool PropertiesAffixPatternProvider::containsSymbolType(AffixPatternType type, UErrorCode& status) const { diff --git a/deps/icu-small/source/i18n/number_mapper.h b/deps/icu-small/source/i18n/number_mapper.h index 82c5711c8d0ce7..d28e9cec393a05 100644 --- a/deps/icu-small/source/i18n/number_mapper.h +++ b/deps/icu-small/source/i18n/number_mapper.h @@ -63,6 +63,7 @@ class PropertiesAffixPatternProvider : public AffixPatternProvider, public UMemo UnicodeString posSuffix; UnicodeString negPrefix; UnicodeString negSuffix; + bool isCurrencyPattern; const UnicodeString& getStringInternal(int32_t flags) const; @@ -135,7 +136,7 @@ struct DecimalFormatFields : public UMemory { * The pre-computed formatter object. Setters cause this to be re-computed atomically. The {@link * #format} method uses the formatter directly without needing to synchronize. */ - LocalPointer formatter; + LocalPointer formatter; /** The lazy-computed parser for .parse() */ std::atomic<::icu::numparse::impl::NumberParserImpl*> atomicParser = {}; diff --git a/deps/icu-small/source/i18n/number_microprops.h b/deps/icu-small/source/i18n/number_microprops.h index daa887bb0dd861..d2393aea50c098 100644 --- a/deps/icu-small/source/i18n/number_microprops.h +++ b/deps/icu-small/source/i18n/number_microprops.h @@ -32,6 +32,7 @@ struct MicroProps : public MicroPropsGenerator { UNumberSignDisplay sign; UNumberDecimalSeparatorDisplay decimal; bool useCurrency; + char nsName[9]; // Note: This struct has no direct ownership of the following pointers. const DecimalFormatSymbols* symbols; diff --git a/deps/icu-small/source/i18n/number_modifiers.cpp b/deps/icu-small/source/i18n/number_modifiers.cpp index d92ec63b08da58..1fcbe7b9b79301 100644 --- a/deps/icu-small/source/i18n/number_modifiers.cpp +++ b/deps/icu-small/source/i18n/number_modifiers.cpp @@ -92,14 +92,13 @@ bool ConstantAffixModifier::isStrong() const { bool ConstantAffixModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void ConstantAffixModifier::getParameters(Parameters& output) const { (void)output; // This method is not currently used. - U_ASSERT(false); + UPRV_UNREACHABLE; } bool ConstantAffixModifier::semanticallyEquivalent(const Modifier& other) const { @@ -157,7 +156,7 @@ SimpleModifier::SimpleModifier() int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, UErrorCode &status) const { - return formatAsPrefixSuffix(output, leftIndex, rightIndex, fField, status); + return formatAsPrefixSuffix(output, leftIndex, rightIndex, status); } int32_t SimpleModifier::getPrefixLength() const { @@ -182,8 +181,7 @@ bool SimpleModifier::isStrong() const { bool SimpleModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void SimpleModifier::getParameters(Parameters& output) const { @@ -206,13 +204,13 @@ bool SimpleModifier::semanticallyEquivalent(const Modifier& other) const { int32_t SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, - Field field, UErrorCode &status) const { + UErrorCode &status) const { if (fSuffixOffset == -1 && fPrefixLength + fSuffixLength > 0) { // There is no argument for the inner number; overwrite the entire segment with our string. - return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + return result.splice(startIndex, endIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status); } else { if (fPrefixLength > 0) { - result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, fField, status); } if (fSuffixLength > 0) { result.insert( @@ -220,7 +218,7 @@ SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startI fCompiledPattern, 1 + fSuffixOffset, 1 + fSuffixOffset + fSuffixLength, - field, + fField, status); } return fPrefixLength + fSuffixLength; diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h index 65ada937d03345..495128bb149dcf 100644 --- a/deps/icu-small/source/i18n/number_modifiers.h +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -100,7 +100,7 @@ class U_I18N_API SimpleModifier : public Modifier, public UMemory { * @return The number of characters (UTF-16 code points) that were added to the StringBuilder. */ int32_t - formatAsPrefixSuffix(NumberStringBuilder& result, int32_t startIndex, int32_t endIndex, Field field, + formatAsPrefixSuffix(NumberStringBuilder& result, int32_t startIndex, int32_t endIndex, UErrorCode& status) const; /** diff --git a/deps/icu-small/source/i18n/number_multiplier.cpp b/deps/icu-small/source/i18n/number_multiplier.cpp index ecb50dd9b82019..8f07e548de121b 100644 --- a/deps/icu-small/source/i18n/number_multiplier.cpp +++ b/deps/icu-small/source/i18n/number_multiplier.cpp @@ -65,6 +65,9 @@ Scale::Scale(Scale&& src) U_NOEXCEPT Scale& Scale::operator=(Scale&& src) U_NOEXCEPT { fMagnitude = src.fMagnitude; + if (fArbitrary != nullptr) { + delete fArbitrary; + } fArbitrary = src.fArbitrary; fError = src.fError; // Take ownership away from src if necessary diff --git a/deps/icu-small/source/i18n/number_output.cpp b/deps/icu-small/source/i18n/number_output.cpp new file mode 100644 index 00000000000000..6f4e2482044f14 --- /dev/null +++ b/deps/icu-small/source/i18n/number_output.cpp @@ -0,0 +1,50 @@ +// © 2019 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/numberformatter.h" +#include "number_utypes.h" +#include "util.h" +#include "number_decimalquantity.h" + +U_NAMESPACE_BEGIN +namespace number { + + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumber) + +#define UPRV_NOARG + +UBool FormattedNumber::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) + // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool + return fData->getStringRef().nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; +} + +void FormattedNumber::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { + FieldPositionIteratorHandler fpih(&iterator, status); + getAllFieldPositionsImpl(fpih, status); +} + +void FormattedNumber::getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, + UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + fData->getStringRef().getAllFieldPositions(fpih, status); +} + +void FormattedNumber::getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const { + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + output = fData->quantity; +} + + +impl::UFormattedNumberData::~UFormattedNumberData() = default; + + +} // namespace number +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.cpp b/deps/icu-small/source/i18n/number_patternmodifier.cpp index 4c61a0d35bca82..75de439f3ed2e1 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.cpp +++ b/deps/icu-small/source/i18n/number_patternmodifier.cpp @@ -23,13 +23,14 @@ AffixPatternProvider::~AffixPatternProvider() = default; MutablePatternModifier::MutablePatternModifier(bool isStrong) : fStrong(isStrong) {} -void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo) { +void MutablePatternModifier::setPatternInfo(const AffixPatternProvider* patternInfo, Field field) { fPatternInfo = patternInfo; + fField = field; } void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) { fSignDisplay = signDisplay; - this->perMilleReplacesPercent = perMille; + fPerMilleReplacesPercent = perMille; } void MutablePatternModifier::setSymbols(const DecimalFormatSymbols* symbols, @@ -126,18 +127,16 @@ ImmutablePatternModifier::ImmutablePatternModifier(AdoptingModifierStore* pm, co void ImmutablePatternModifier::processQuantity(DecimalQuantity& quantity, MicroProps& micros, UErrorCode& status) const { parent->processQuantity(quantity, micros, status); - applyToMicros(micros, quantity); + applyToMicros(micros, quantity, status); } -void ImmutablePatternModifier::applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const { +void ImmutablePatternModifier::applyToMicros( + MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const { if (rules == nullptr) { micros.modMiddle = pm->getModifierWithoutPlural(quantity.signum()); } else { - // TODO: Fix this. Avoid the copy. - DecimalQuantity copy(quantity); - copy.roundToInfinity(); - StandardPlural::Form plural = utils::getStandardPlural(rules, copy); - micros.modMiddle = pm->getModifier(quantity.signum(), plural); + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, rules, quantity, status); + micros.modMiddle = pm->getModifier(quantity.signum(), pluralForm); } } @@ -163,10 +162,8 @@ void MutablePatternModifier::processQuantity(DecimalQuantity& fq, MicroProps& mi // This method needs to be const because it overrides a const method in the parent class. auto nonConstThis = const_cast(this); if (needsPlurals()) { - // TODO: Fix this. Avoid the copy. - DecimalQuantity copy(fq); - micros.rounder.apply(copy, status); - nonConstThis->setNumberProperties(fq.signum(), utils::getStandardPlural(fRules, copy)); + StandardPlural::Form pluralForm = utils::getPluralSafe(micros.rounder, fRules, fq, status); + nonConstThis->setNumberProperties(fq.signum(), pluralForm); } else { nonConstThis->setNumberProperties(fq.signum(), StandardPlural::Form::COUNT); } @@ -236,39 +233,37 @@ bool MutablePatternModifier::isStrong() const { bool MutablePatternModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void MutablePatternModifier::getParameters(Parameters& output) const { (void)output; // This method is not currently used. - U_ASSERT(false); + UPRV_UNREACHABLE; } bool MutablePatternModifier::semanticallyEquivalent(const Modifier& other) const { (void)other; // This method is not currently used. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder& sb, int position, UErrorCode& status) { prepareAffix(true); - int length = AffixUtils::unescape(currentAffix, sb, position, *this, status); + int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status); return length; } int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder& sb, int position, UErrorCode& status) { prepareAffix(false); - int length = AffixUtils::unescape(currentAffix, sb, position, *this, status); + int32_t length = AffixUtils::unescape(currentAffix, sb, position, *this, fField, status); return length; } /** This method contains the heart of the logic for rendering LDML affix strings. */ void MutablePatternModifier::prepareAffix(bool isPrefix) { PatternStringUtils::patternInfoToStringBuilder( - *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, perMilleReplacesPercent, currentAffix); + *fPatternInfo, isPrefix, fSignum, fSignDisplay, fPlural, fPerMilleReplacesPercent, currentAffix); } UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { @@ -307,15 +302,13 @@ UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { case AffixPatternType::TYPE_CURRENCY_QUINT: return UnicodeString(u"\uFFFD"); default: - U_ASSERT(false); - return UnicodeString(); + UPRV_UNREACHABLE; } } UnicodeString MutablePatternModifier::toUnicodeString() const { // Never called by AffixUtils - U_ASSERT(false); - return UnicodeString(); + UPRV_UNREACHABLE; } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.h b/deps/icu-small/source/i18n/number_patternmodifier.h index ea80d6305e75b4..27e293b64ce50f 100644 --- a/deps/icu-small/source/i18n/number_patternmodifier.h +++ b/deps/icu-small/source/i18n/number_patternmodifier.h @@ -21,10 +21,16 @@ U_NAMESPACE_BEGIN // data member of AdoptingModifierStore. // (When building DLLs for Windows this is required.) #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +#if defined(_MSC_VER) // Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= -#pragma warning(suppress: 4661) +#pragma warning(push) +#pragma warning(disable : 4661) +#endif template class U_I18N_API LocalPointerBase; template class U_I18N_API LocalPointer; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif #endif namespace number { @@ -40,7 +46,7 @@ class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public U void processQuantity(DecimalQuantity&, MicroProps& micros, UErrorCode& status) const U_OVERRIDE; - void applyToMicros(MicroProps& micros, DecimalQuantity& quantity) const; + void applyToMicros(MicroProps& micros, const DecimalQuantity& quantity, UErrorCode& status) const; const Modifier* getModifier(int8_t signum, StandardPlural::Form plural) const; @@ -95,8 +101,11 @@ class U_I18N_API MutablePatternModifier * Sets a reference to the parsed decimal format pattern, usually obtained from * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is * accepted. + * + * @param field + * Which field to use for literal characters in the pattern. */ - void setPatternInfo(const AffixPatternProvider *patternInfo); + void setPatternInfo(const AffixPatternProvider *patternInfo, Field field); /** * Sets attributes that imply changes to the literal interpretation of the pattern string affixes. @@ -203,8 +212,9 @@ class U_I18N_API MutablePatternModifier // Pattern details (initialized in setPatternInfo and setPatternAttributes) const AffixPatternProvider *fPatternInfo; + Field fField; UNumberSignDisplay fSignDisplay; - bool perMilleReplacesPercent; + bool fPerMilleReplacesPercent; // Symbol details (initialized in setSymbols) const DecimalFormatSymbols *fSymbols; diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp index 63195eed989e54..90754246633064 100644 --- a/deps/icu-small/source/i18n/number_patternstring.cpp +++ b/deps/icu-small/source/i18n/number_patternstring.cpp @@ -15,6 +15,7 @@ #include "unicode/utf16.h" #include "number_utils.h" #include "number_roundingutils.h" +#include "number_mapper.h" using namespace icu; using namespace icu::number; @@ -49,7 +50,7 @@ PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFo char16_t ParsedPatternInfo::charAt(int32_t flags, int32_t index) const { const Endpoints& endpoints = getEndpoints(flags); if (index < 0 || index >= endpoints.end - endpoints.start) { - U_ASSERT(false); + UPRV_UNREACHABLE; } return pattern.charAt(endpoints.start + index); } @@ -643,69 +644,67 @@ PatternParser::patternInfoToProperties(DecimalFormatProperties& properties, Pars /// End PatternStringParser.java; begin PatternStringUtils.java /// /////////////////////////////////////////////////////////////////// +// Determine whether a given roundingIncrement should be ignored for formatting +// based on the current maxFrac value (maximum fraction digits). For example a +// roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac +// is 2 or more. Note that roundingIncrements are rounded in significance, so +// a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e. +// it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of +// 0.005 is treated like 0.001 for significance). This is the reason for the +// initial doubling below. +// roundIncr must be non-zero. +bool PatternStringUtils::ignoreRoundingIncrement(double roundIncr, int32_t maxFrac) { + if (maxFrac < 0) { + return false; + } + int32_t frac = 0; + roundIncr *= 2.0; + for (frac = 0; frac <= maxFrac && roundIncr <= 1.0; frac++, roundIncr *= 10.0); + return (frac > maxFrac); +} + UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatProperties& properties, UErrorCode& status) { UnicodeString sb; // Convenience references // The uprv_min() calls prevent DoS - int dosMax = 100; - int groupingSize = uprv_min(properties.secondaryGroupingSize, dosMax); - int firstGroupingSize = uprv_min(properties.groupingSize, dosMax); - int paddingWidth = uprv_min(properties.formatWidth, dosMax); + int32_t dosMax = 100; + int32_t grouping1 = uprv_max(0, uprv_min(properties.groupingSize, dosMax)); + int32_t grouping2 = uprv_max(0, uprv_min(properties.secondaryGroupingSize, dosMax)); + bool useGrouping = properties.groupingUsed; + int32_t paddingWidth = uprv_min(properties.formatWidth, dosMax); NullableValue paddingLocation = properties.padPosition; UnicodeString paddingString = properties.padString; - int minInt = uprv_max(uprv_min(properties.minimumIntegerDigits, dosMax), 0); - int maxInt = uprv_min(properties.maximumIntegerDigits, dosMax); - int minFrac = uprv_max(uprv_min(properties.minimumFractionDigits, dosMax), 0); - int maxFrac = uprv_min(properties.maximumFractionDigits, dosMax); - int minSig = uprv_min(properties.minimumSignificantDigits, dosMax); - int maxSig = uprv_min(properties.maximumSignificantDigits, dosMax); + int32_t minInt = uprv_max(0, uprv_min(properties.minimumIntegerDigits, dosMax)); + int32_t maxInt = uprv_min(properties.maximumIntegerDigits, dosMax); + int32_t minFrac = uprv_max(0, uprv_min(properties.minimumFractionDigits, dosMax)); + int32_t maxFrac = uprv_min(properties.maximumFractionDigits, dosMax); + int32_t minSig = uprv_min(properties.minimumSignificantDigits, dosMax); + int32_t maxSig = uprv_min(properties.maximumSignificantDigits, dosMax); bool alwaysShowDecimal = properties.decimalSeparatorAlwaysShown; - int exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax); + int32_t exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax); bool exponentShowPlusSign = properties.exponentSignAlwaysShown; - UnicodeString pp = properties.positivePrefix; - UnicodeString ppp = properties.positivePrefixPattern; - UnicodeString ps = properties.positiveSuffix; - UnicodeString psp = properties.positiveSuffixPattern; - UnicodeString np = properties.negativePrefix; - UnicodeString npp = properties.negativePrefixPattern; - UnicodeString ns = properties.negativeSuffix; - UnicodeString nsp = properties.negativeSuffixPattern; + + PropertiesAffixPatternProvider affixes(properties, status); // Prefixes - if (!ppp.isBogus()) { - sb.append(ppp); - } - sb.append(AffixUtils::escape(pp)); - int afterPrefixPos = sb.length(); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_PREFIX)); + int32_t afterPrefixPos = sb.length(); // Figure out the grouping sizes. - int grouping1, grouping2, grouping; - if (groupingSize != uprv_min(dosMax, -1) && firstGroupingSize != uprv_min(dosMax, -1) && - groupingSize != firstGroupingSize) { - grouping = groupingSize; - grouping1 = groupingSize; - grouping2 = firstGroupingSize; - } else if (groupingSize != uprv_min(dosMax, -1)) { - grouping = groupingSize; - grouping1 = 0; - grouping2 = groupingSize; - } else if (firstGroupingSize != uprv_min(dosMax, -1)) { - grouping = groupingSize; - grouping1 = 0; - grouping2 = firstGroupingSize; - } else { - grouping = 0; + if (!useGrouping) { grouping1 = 0; grouping2 = 0; + } else if (grouping1 == grouping2) { + grouping1 = 0; } - int groupingLength = grouping1 + grouping2 + 1; + int32_t groupingLength = grouping1 + grouping2 + 1; // Figure out the digits we need to put in the pattern. double roundingInterval = properties.roundingIncrement; UnicodeString digitsString; - int digitsStringScale = 0; + int32_t digitsStringScale = 0; if (maxSig != uprv_min(dosMax, -1)) { // Significant Digits. while (digitsString.length() < minSig) { @@ -714,9 +713,9 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP while (digitsString.length() < maxSig) { digitsString.append(u'#'); } - } else if (roundingInterval != 0.0) { + } else if (roundingInterval != 0.0 && !ignoreRoundingIncrement(roundingInterval,maxFrac)) { // Rounding Interval. - digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval); + digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval, nullptr); // TODO: Check for DoS here? DecimalQuantity incrementQuantity; incrementQuantity.setToDouble(roundingInterval); @@ -739,22 +738,30 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP } // Write the digits to the string builder - int m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale); + int32_t m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale); m0 = (maxInt != dosMax) ? uprv_max(maxInt, m0) - 1 : m0 - 1; - int mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale; - for (int magnitude = m0; magnitude >= mN; magnitude--) { - int di = digitsString.length() + digitsStringScale - magnitude - 1; + int32_t mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale; + for (int32_t magnitude = m0; magnitude >= mN; magnitude--) { + int32_t di = digitsString.length() + digitsStringScale - magnitude - 1; if (di < 0 || di >= digitsString.length()) { sb.append(u'#'); } else { sb.append(digitsString.charAt(di)); } - if (magnitude > grouping2 && grouping > 0 && (magnitude - grouping2) % grouping == 0) { + // Decimal separator + if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { + sb.append(u'.'); + } + if (!useGrouping) { + continue; + } + // Least-significant grouping separator + if (magnitude > 0 && magnitude == grouping1) { sb.append(u','); - } else if (magnitude > 0 && magnitude == grouping2) { + } + // All other grouping separators + if (magnitude > grouping1 && grouping2 > 0 && (magnitude - grouping1) % grouping2 == 0) { sb.append(u','); - } else if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { - sb.append(u'.'); } } @@ -764,25 +771,22 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP if (exponentShowPlusSign) { sb.append(u'+'); } - for (int i = 0; i < exponentDigits; i++) { + for (int32_t i = 0; i < exponentDigits; i++) { sb.append(u'0'); } } // Suffixes - int beforeSuffixPos = sb.length(); - if (!psp.isBogus()) { - sb.append(psp); - } - sb.append(AffixUtils::escape(ps)); + int32_t beforeSuffixPos = sb.length(); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_SUFFIX)); // Resolve Padding - if (paddingWidth != -1 && !paddingLocation.isNull()) { + if (paddingWidth > 0 && !paddingLocation.isNull()) { while (paddingWidth - sb.length() > 0) { sb.insert(afterPrefixPos, u'#'); beforeSuffixPos++; } - int addedLength; + int32_t addedLength; switch (paddingLocation.get(status)) { case PadPosition::UNUM_PAD_BEFORE_PREFIX: addedLength = escapePaddingString(paddingString, sb, 0, status); @@ -810,23 +814,16 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP // Negative affixes // Ignore if the negative prefix pattern is "-" and the negative suffix is empty - if (!np.isBogus() || !ns.isBogus() || (npp.isBogus() && !nsp.isBogus()) || - (!npp.isBogus() && (npp.length() != 1 || npp.charAt(0) != u'-' || nsp.length() != 0))) { + if (affixes.hasNegativeSubpattern()) { sb.append(u';'); - if (!npp.isBogus()) { - sb.append(npp); - } - sb.append(AffixUtils::escape(np)); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_PREFIX)); // Copy the positive digit format into the negative. // This is optional; the pattern is the same as if '#' were appended here instead. // NOTE: It is not safe to append the UnicodeString to itself, so we need to copy. // See http://bugs.icu-project.org/trac/ticket/13707 UnicodeString copy(sb); sb.append(copy, afterPrefixPos, beforeSuffixPos - afterPrefixPos); - if (!nsp.isBogus()) { - sb.append(nsp); - } - sb.append(AffixUtils::escape(ns)); + sb.append(affixes.getString(AffixPatternProvider::AFFIX_NEG_SUFFIX)); } return sb; diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h index 91e120c16a1a84..42e7c3916133d1 100644 --- a/deps/icu-small/source/i18n/number_patternstring.h +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -98,7 +98,7 @@ struct U_I18N_API ParsedPatternInfo : public AffixPatternProvider, public UMemor int32_t offset = 0; explicit ParserState(const UnicodeString& _pattern) - : pattern(_pattern) {}; + : pattern(_pattern) {} ParserState& operator=(ParserState&& src) U_NOEXCEPT { // Leave pattern reference alone; it will continue to point to the same place in memory, @@ -222,6 +222,28 @@ class U_I18N_API PatternParser { class U_I18N_API PatternStringUtils { public: + /** + * Determine whether a given roundingIncrement should be ignored for formatting + * based on the current maxFrac value (maximum fraction digits). For example a + * roundingIncrement of 0.01 should be ignored if maxFrac is 1, but not if maxFrac + * is 2 or more. Note that roundingIncrements are rounded up in significance, so + * a roundingIncrement of 0.006 is treated like 0.01 for this determination, i.e. + * it should not be ignored if maxFrac is 2 or more (but a roundingIncrement of + * 0.005 is treated like 0.001 for significance). + * + * This test is needed for both NumberPropertyMapper::oldToNew and + * PatternStringUtils::propertiesToPatternString. In Java it cannot be + * exported by NumberPropertyMapper (package provate) so it is in + * PatternStringUtils, do the same in C. + * + * @param roundIncr + * The roundingIncrement to be checked. Must be non-zero. + * @param maxFrac + * The current maximum fraction digits value. + * @return true if roundIncr should be ignored for formatting. + */ + static bool ignoreRoundingIncrement(double roundIncr, int32_t maxFrac); + /** * Creates a pattern string from a property bag. * diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp index ae4b8849fbe956..9e369f7925fe2f 100644 --- a/deps/icu-small/source/i18n/number_rounding.cpp +++ b/deps/icu-small/source/i18n/number_rounding.cpp @@ -55,7 +55,7 @@ int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) MultiplierProducer::~MultiplierProducer() = default; -digits_t roundingutils::doubleFractionLength(double input) { +digits_t roundingutils::doubleFractionLength(double input, int8_t* singleDigit) { char buffer[DoubleToStringConverter::kBase10MaximalLength + 1]; bool sign; // unused; always positive int32_t length; @@ -71,6 +71,14 @@ digits_t roundingutils::doubleFractionLength(double input) { &point ); + if (singleDigit == nullptr) { + // no-op + } else if (length == 1) { + *singleDigit = buffer[0] - '0'; + } else { + *singleDigit = -1; + } + return static_cast(length - point); } @@ -161,13 +169,6 @@ CurrencyPrecision Precision::currency(UCurrencyUsage currencyUsage) { return constructCurrency(currencyUsage); } -Precision Precision::withMode(RoundingMode roundingMode) const { - if (fType == RND_ERROR) { return *this; } // no-op in error state - Precision retval = *this; - retval.fRoundingMode = roundingMode; - return retval; -} - Precision FractionPrecision::withMinDigits(int32_t minSignificantDigits) const { if (fType == RND_ERROR) { return *this; } // no-op in error state if (minSignificantDigits >= 1 && minSignificantDigits <= kMaxIntFracSig) { @@ -254,14 +255,27 @@ Precision::constructFractionSignificant(const FractionPrecision &base, int32_t m IncrementPrecision Precision::constructIncrement(double increment, int32_t minFrac) { IncrementSettings settings; + // Note: For number formatting, fIncrement is used for RND_INCREMENT but not + // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all + // three when constructing a skeleton. settings.fIncrement = increment; settings.fMinFrac = static_cast(minFrac); // One of the few pre-computed quantities: // Note: it is possible for minFrac to be more than maxFrac... (misleading) - settings.fMaxFrac = roundingutils::doubleFractionLength(increment); + int8_t singleDigit; + settings.fMaxFrac = roundingutils::doubleFractionLength(increment, &singleDigit); PrecisionUnion union_; union_.increment = settings; - return {RND_INCREMENT, union_, kDefaultMode}; + if (singleDigit == 1) { + // NOTE: In C++, we must return the correct value type with the correct union. + // It would be invalid to return a RND_FRACTION here because the methods on the + // IncrementPrecision type assume that the union is backed by increment data. + return {RND_INCREMENT_ONE, union_, kDefaultMode}; + } else if (singleDigit == 5) { + return {RND_INCREMENT_FIVE, union_, kDefaultMode}; + } else { + return {RND_INCREMENT, union_, kDefaultMode}; + } } CurrencyPrecision Precision::constructCurrency(UCurrencyUsage usage) { @@ -348,9 +362,8 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac), fRoundingMode, status); - value.setFractionLength( - uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac)), - INT32_MAX); + value.setMinFraction( + uprv_max(0, -getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac))); break; case Precision::RND_SIGNIFICANT: @@ -358,12 +371,11 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig), fRoundingMode, status); - value.setFractionLength( - uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig)), - INT32_MAX); + value.setMinFraction( + uprv_max(0, -getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig))); // Make sure that digits are displayed on zero. if (value.isZero() && fPrecision.fUnion.fracSig.fMinSig > 0) { - value.setIntegerLength(1, INT32_MAX); + value.setMinInteger(1); } break; @@ -384,7 +396,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const roundingMag = uprv_min(roundingMag, candidate); } value.roundToMagnitude(roundingMag, fRoundingMode, status); - value.setFractionLength(uprv_max(0, -displayMag), INT32_MAX); + value.setMinFraction(uprv_max(0, -displayMag)); break; } @@ -392,15 +404,32 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, UErrorCode& status) const value.roundToIncrement( fPrecision.fUnion.increment.fIncrement, fRoundingMode, - fPrecision.fUnion.increment.fMaxFrac, status); - value.setFractionLength(fPrecision.fUnion.increment.fMinFrac, INT32_MAX); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); + break; + + case Precision::RND_INCREMENT_ONE: + value.roundToMagnitude( + -fPrecision.fUnion.increment.fMaxFrac, + fRoundingMode, + status); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); + break; + + case Precision::RND_INCREMENT_FIVE: + value.roundToNickel( + -fPrecision.fUnion.increment.fMaxFrac, + fRoundingMode, + status); + value.setMinFraction(fPrecision.fUnion.increment.fMinFrac); break; case Precision::RND_CURRENCY: // Call .withCurrency() before .apply()! - U_ASSERT(false); - break; + UPRV_UNREACHABLE; + + default: + UPRV_UNREACHABLE; } } @@ -408,7 +437,7 @@ void RoundingImpl::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCod // This method is intended for the one specific purpose of helping print "00.000E0". U_ASSERT(isSignificantDigits()); U_ASSERT(value.isZero()); - value.setFractionLength(fPrecision.fUnion.fracSig.fMinSig - minInt, INT32_MAX); + value.setMinFraction(fPrecision.fUnion.fracSig.fMinSig - minInt); } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_roundingutils.h b/deps/icu-small/source/i18n/number_roundingutils.h index 66d58bb775bbee..9c2c47b6e41b31 100644 --- a/deps/icu-small/source/i18n/number_roundingutils.h +++ b/deps/icu-small/source/i18n/number_roundingutils.h @@ -134,8 +134,11 @@ inline bool roundsAtMidpoint(int roundingMode) { /** * Computes the number of fraction digits in a double. Used for computing maxFrac for an increment. * Calls into the DoubleToStringConverter library to do so. + * + * @param singleDigit An output parameter; set to a number if that is the + * only digit in the double, or -1 if there is more than one digit. */ -digits_t doubleFractionLength(double input); +digits_t doubleFractionLength(double input, int8_t* singleDigit); } // namespace roundingutils diff --git a/deps/icu-small/source/i18n/number_scientific.cpp b/deps/icu-small/source/i18n/number_scientific.cpp index 07c1ce9dac2c89..6df07b9cc9e988 100644 --- a/deps/icu-small/source/i18n/number_scientific.cpp +++ b/deps/icu-small/source/i18n/number_scientific.cpp @@ -96,8 +96,7 @@ bool ScientificModifier::isStrong() const { bool ScientificModifier::containsField(UNumberFormatFields field) const { (void)field; // This method is not used for inner modifiers. - U_ASSERT(false); - return false; + UPRV_UNREACHABLE; } void ScientificModifier::getParameters(Parameters& output) const { diff --git a/deps/icu-small/source/i18n/number_skeletons.cpp b/deps/icu-small/source/i18n/number_skeletons.cpp index c7bb18b5f3d2b5..4c280ad11dd8da 100644 --- a/deps/icu-small/source/i18n/number_skeletons.cpp +++ b/deps/icu-small/source/i18n/number_skeletons.cpp @@ -159,8 +159,7 @@ Notation stem_to_object::notation(skeleton::StemEnum stem) { case STEM_NOTATION_SIMPLE: return Notation::simple(); default: - U_ASSERT(false); - return Notation::simple(); // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -176,8 +175,7 @@ MeasureUnit stem_to_object::unit(skeleton::StemEnum stem) { // Slicing is okay return NoUnit::permille(); // NOLINT default: - U_ASSERT(false); - return {}; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -192,8 +190,7 @@ Precision stem_to_object::precision(skeleton::StemEnum stem) { case STEM_PRECISION_CURRENCY_CASH: return Precision::currency(UCURR_USAGE_CASH); default: - U_ASSERT(false); - return Precision::integer(); // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -216,12 +213,11 @@ UNumberFormatRoundingMode stem_to_object::roundingMode(skeleton::StemEnum stem) case STEM_ROUNDING_MODE_UNNECESSARY: return UNUM_ROUND_UNNECESSARY; default: - U_ASSERT(false); - return UNUM_ROUND_UNNECESSARY; + UPRV_UNREACHABLE; } } -UGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) { +UNumberGroupingStrategy stem_to_object::groupingStrategy(skeleton::StemEnum stem) { switch (stem) { case STEM_GROUP_OFF: return UNUM_GROUPING_OFF; @@ -315,11 +311,11 @@ void enum_to_stem_string::roundingMode(UNumberFormatRoundingMode value, UnicodeS sb.append(u"rounding-mode-unnecessary", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } -void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeString& sb) { +void enum_to_stem_string::groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb) { switch (value) { case UNUM_GROUPING_OFF: sb.append(u"group-off", -1); @@ -337,7 +333,7 @@ void enum_to_stem_string::groupingStrategy(UGroupingStrategy value, UnicodeStrin sb.append(u"group-thousands", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -359,7 +355,7 @@ void enum_to_stem_string::unitWidth(UNumberUnitWidth value, UnicodeString& sb) { sb.append(u"unit-width-hidden", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -387,7 +383,7 @@ void enum_to_stem_string::signDisplay(UNumberSignDisplay value, UnicodeString& s sb.append(u"sign-accounting-except-zero", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } @@ -401,15 +397,46 @@ enum_to_stem_string::decimalSeparatorDisplay(UNumberDecimalSeparatorDisplay valu sb.append(u"decimal-always", -1); break; default: - U_ASSERT(false); + UPRV_UNREACHABLE; } } -UnlocalizedNumberFormatter skeleton::create(const UnicodeString& skeletonString, UErrorCode& status) { +UnlocalizedNumberFormatter skeleton::create( + const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status) { + + // Initialize perror + if (perror != nullptr) { + perror->line = 0; + perror->offset = -1; + perror->preContext[0] = 0; + perror->postContext[0] = 0; + } + umtx_initOnce(gNumberSkeletonsInitOnce, &initNumberSkeletons, status); - MacroProps macros = parseSkeleton(skeletonString, status); - return NumberFormatter::with().macros(macros); + if (U_FAILURE(status)) { + return {}; + } + + int32_t errOffset; + MacroProps macros = parseSkeleton(skeletonString, errOffset, status); + if (U_SUCCESS(status)) { + return NumberFormatter::with().macros(macros); + } + + if (perror == nullptr) { + return {}; + } + + // Populate the UParseError with the error location + perror->offset = errOffset; + int32_t contextStart = uprv_max(0, errOffset - U_PARSE_CONTEXT_LEN + 1); + int32_t contextEnd = uprv_min(skeletonString.length(), errOffset + U_PARSE_CONTEXT_LEN - 1); + skeletonString.extract(contextStart, errOffset - contextStart, perror->preContext, 0); + perror->preContext[errOffset - contextStart] = 0; + skeletonString.extract(errOffset, contextEnd - errOffset, perror->postContext, 0); + perror->postContext[contextEnd - errOffset] = 0; + return {}; } UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) { @@ -419,8 +446,9 @@ UnicodeString skeleton::generate(const MacroProps& macros, UErrorCode& status) { return sb; } -MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status) { - if (U_FAILURE(status)) { return MacroProps(); } +MacroProps skeleton::parseSkeleton( + const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status) { + U_ASSERT(U_SUCCESS(status)); // Add a trailing whitespace to the end of the skeleton string to make code cleaner. UnicodeString tempSkeletonString(skeletonString); @@ -464,7 +492,10 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo stem = parseOption(stem, segment, macros, status); } segment.resetLength(); - if (U_FAILURE(status)) { return macros; } + if (U_FAILURE(status)) { + errOffset = segment.getOffset(); + return macros; + } // Consume the segment: segment.adjustOffset(offset); @@ -475,6 +506,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Unexpected separator character", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; } else { @@ -486,6 +518,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Unexpected option separator", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; } @@ -502,6 +535,7 @@ MacroProps skeleton::parseSkeleton(const UnicodeString& skeletonString, UErrorCo // segment.setLength(U16_LENGTH(cp)); // for error message // throw new SkeletonSyntaxException("Stem requires an option", segment); status = U_NUMBER_SKELETON_SYNTAX_ERROR; + errOffset = segment.getOffset(); return macros; default: break; @@ -665,8 +699,7 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se return STATE_SCALE; default: - U_ASSERT(false); - return STATE_NULL; // return a value: silence compiler warning + UPRV_UNREACHABLE; } } @@ -1389,7 +1422,9 @@ bool GeneratorHelpers::precision(const MacroProps& macros, UnicodeString& sb, UE } else { blueprint_helpers::generateDigitsStem(impl.fMinSig, -1, sb, status); } - } else if (macros.precision.fType == Precision::RND_INCREMENT) { + } else if (macros.precision.fType == Precision::RND_INCREMENT + || macros.precision.fType == Precision::RND_INCREMENT_ONE + || macros.precision.fType == Precision::RND_INCREMENT_FIVE) { const Precision::IncrementSettings& impl = macros.precision.fUnion.increment; sb.append(u"precision-increment/", -1); blueprint_helpers::generateIncrementOption( diff --git a/deps/icu-small/source/i18n/number_skeletons.h b/deps/icu-small/source/i18n/number_skeletons.h index 0161f5f0ba8c1a..bc228bd0d7408e 100644 --- a/deps/icu-small/source/i18n/number_skeletons.h +++ b/deps/icu-small/source/i18n/number_skeletons.h @@ -122,7 +122,8 @@ enum StemEnum { * A number skeleton string, possibly not in its shortest form. * @return An UnlocalizedNumberFormatter with behavior defined by the given skeleton string. */ -UnlocalizedNumberFormatter create(const UnicodeString& skeletonString, UErrorCode& status); +UnlocalizedNumberFormatter create( + const UnicodeString& skeletonString, UParseError* perror, UErrorCode& status); /** * Create a skeleton string corresponding to the given NumberFormatter. @@ -138,7 +139,7 @@ UnicodeString generate(const MacroProps& macros, UErrorCode& status); * * Internal: use the create() endpoint instead of this function. */ -MacroProps parseSkeleton(const UnicodeString& skeletonString, UErrorCode& status); +MacroProps parseSkeleton(const UnicodeString& skeletonString, int32_t& errOffset, UErrorCode& status); /** * Given that the current segment represents a stem, parse it and save the result. @@ -174,7 +175,7 @@ Precision precision(skeleton::StemEnum stem); UNumberFormatRoundingMode roundingMode(skeleton::StemEnum stem); -UGroupingStrategy groupingStrategy(skeleton::StemEnum stem); +UNumberGroupingStrategy groupingStrategy(skeleton::StemEnum stem); UNumberUnitWidth unitWidth(skeleton::StemEnum stem); @@ -192,7 +193,7 @@ namespace enum_to_stem_string { void roundingMode(UNumberFormatRoundingMode value, UnicodeString& sb); -void groupingStrategy(UGroupingStrategy value, UnicodeString& sb); +void groupingStrategy(UNumberGroupingStrategy value, UnicodeString& sb); void unitWidth(UNumberUnitWidth value, UnicodeString& sb); diff --git a/deps/icu-small/source/i18n/number_stringbuilder.cpp b/deps/icu-small/source/i18n/number_stringbuilder.cpp index 74ba33fbbc159f..03300b33ac5e21 100644 --- a/deps/icu-small/source/i18n/number_stringbuilder.cpp +++ b/deps/icu-small/source/i18n/number_stringbuilder.cpp @@ -6,7 +6,9 @@ #if !UCONFIG_NO_FORMATTING #include "number_stringbuilder.h" +#include "static_unicode_sets.h" #include "unicode/utf16.h" +#include "number_utils.h" using namespace icu; using namespace icu::number; @@ -32,7 +34,15 @@ inline void uprv_memmove2(void* dest, const void* src, size_t len) { } // namespace -NumberStringBuilder::NumberStringBuilder() = default; +NumberStringBuilder::NumberStringBuilder() { +#if U_DEBUG + // Initializing the memory to non-zero helps catch some bugs that involve + // reading from an improperly terminated string. + for (int32_t i=0; i= 0); U_ASSERT(index <= fLength); @@ -427,65 +447,121 @@ bool NumberStringBuilder::nextFieldPosition(FieldPosition& fp, UErrorCode& statu return FALSE; } - auto field = static_cast(rawField); - - bool seenStart = false; - int32_t fractionStart = -1; - int32_t startIndex = fp.getEndIndex(); - for (int i = fZero + startIndex; i <= fZero + fLength; i++) { - Field _field = UNUM_FIELD_COUNT; - if (i < fZero + fLength) { - _field = getFieldPtr()[i]; - } - if (seenStart && field != _field) { - // Special case: GROUPING_SEPARATOR counts as an INTEGER. - if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) { - continue; + ConstrainedFieldPosition cfpos; + cfpos.constrainField(UFIELD_CATEGORY_NUMBER, rawField); + cfpos.setState(UFIELD_CATEGORY_NUMBER, rawField, fp.getBeginIndex(), fp.getEndIndex()); + if (nextPosition(cfpos, 0, status)) { + fp.setBeginIndex(cfpos.getStart()); + fp.setEndIndex(cfpos.getLimit()); + return true; + } + + // Special case: fraction should start after integer if fraction is not present + if (rawField == UNUM_FRACTION_FIELD && fp.getEndIndex() == 0) { + bool inside = false; + int32_t i = fZero; + for (; i < fZero + fLength; i++) { + if (isIntOrGroup(getFieldPtr()[i]) || getFieldPtr()[i] == UNUM_DECIMAL_SEPARATOR_FIELD) { + inside = true; + } else if (inside) { + break; } - fp.setEndIndex(i - fZero); - break; - } else if (!seenStart && field == _field) { - fp.setBeginIndex(i - fZero); - seenStart = true; - } - if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { - fractionStart = i - fZero + 1; } + fp.setBeginIndex(i - fZero); + fp.setEndIndex(i - fZero); } - // Backwards compatibility: FRACTION needs to start after INTEGER if empty. - // Do not return that a field was found, though, since there is not actually a fraction part. - if (field == UNUM_FRACTION_FIELD && !seenStart && fractionStart != -1) { - fp.setBeginIndex(fractionStart); - fp.setEndIndex(fractionStart); - } - - return seenStart; + return false; } void NumberStringBuilder::getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const { - Field current = UNUM_FIELD_COUNT; - int32_t currentStart = -1; - for (int32_t i = 0; i < fLength; i++) { - Field field = fieldAt(i); - if (current == UNUM_INTEGER_FIELD && field == UNUM_GROUPING_SEPARATOR_FIELD) { - // Special case: GROUPING_SEPARATOR counts as an INTEGER. - fpih.addAttribute(UNUM_GROUPING_SEPARATOR_FIELD, i, i + 1); - } else if (current != field) { - if (current != UNUM_FIELD_COUNT) { - fpih.addAttribute(current, currentStart, i); + ConstrainedFieldPosition cfpos; + while (nextPosition(cfpos, 0, status)) { + fpih.addAttribute(cfpos.getField(), cfpos.getStart(), cfpos.getLimit()); + } +} + +// Signal the end of the string using a field that doesn't exist and that is +// different from UNUM_FIELD_COUNT, which is used for "null number field". +static constexpr Field kEndField = 0xff; + +bool NumberStringBuilder::nextPosition(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& /*status*/) const { + auto numericCAF = NumFieldUtils::expand(numericField); + int32_t fieldStart = -1; + Field currField = UNUM_FIELD_COUNT; + for (int32_t i = fZero + cfpos.getLimit(); i <= fZero + fLength; i++) { + Field _field = (i < fZero + fLength) ? getFieldPtr()[i] : kEndField; + // Case 1: currently scanning a field. + if (currField != UNUM_FIELD_COUNT) { + if (currField != _field) { + int32_t end = i - fZero; + // Grouping separators can be whitespace; don't throw them out! + if (currField != UNUM_GROUPING_SEPARATOR_FIELD) { + end = trimBack(i - fZero); + } + if (end <= fieldStart) { + // Entire field position is ignorable; skip. + fieldStart = -1; + currField = UNUM_FIELD_COUNT; + i--; // look at this index again + continue; + } + int32_t start = fieldStart; + if (currField != UNUM_GROUPING_SEPARATOR_FIELD) { + start = trimFront(start); + } + auto caf = NumFieldUtils::expand(currField); + cfpos.setState(caf.category, caf.field, start, end); + return true; } - current = field; - currentStart = i; + continue; } - if (U_FAILURE(status)) { - return; + // Special case: coalesce the INTEGER if we are pointing at the end of the INTEGER. + if (cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD) + && i > fZero + // don't return the same field twice in a row: + && i - fZero > cfpos.getLimit() + && isIntOrGroup(getFieldPtr()[i - 1]) + && !isIntOrGroup(_field)) { + int j = i - 1; + for (; j >= fZero && isIntOrGroup(getFieldPtr()[j]); j--) {} + cfpos.setState(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, j - fZero + 1, i - fZero); + return true; + } + // Special case: coalesce NUMERIC if we are pointing at the end of the NUMERIC. + if (numericField != 0 + && cfpos.matchesField(numericCAF.category, numericCAF.field) + && i > fZero + // don't return the same field twice in a row: + && (i - fZero > cfpos.getLimit() + || cfpos.getCategory() != numericCAF.category + || cfpos.getField() != numericCAF.field) + && isNumericField(getFieldPtr()[i - 1]) + && !isNumericField(_field)) { + int j = i - 1; + for (; j >= fZero && isNumericField(getFieldPtr()[j]); j--) {} + cfpos.setState(numericCAF.category, numericCAF.field, j - fZero + 1, i - fZero); + return true; + } + // Special case: skip over INTEGER; will be coalesced later. + if (_field == UNUM_INTEGER_FIELD) { + _field = UNUM_FIELD_COUNT; + } + // Case 2: no field starting at this position. + if (_field == UNUM_FIELD_COUNT || _field == kEndField) { + continue; + } + // Case 3: check for field starting at this position + auto caf = NumFieldUtils::expand(_field); + if (cfpos.matchesField(caf.category, caf.field)) { + fieldStart = i - fZero; + currField = _field; } } - if (current != UNUM_FIELD_COUNT) { - fpih.addAttribute(current, currentStart, fLength); - } + + U_ASSERT(currField == UNUM_FIELD_COUNT); + return false; } bool NumberStringBuilder::containsField(Field field) const { @@ -497,4 +573,27 @@ bool NumberStringBuilder::containsField(Field field) const { return false; } +bool NumberStringBuilder::isIntOrGroup(Field field) { + return field == UNUM_INTEGER_FIELD + || field == UNUM_GROUPING_SEPARATOR_FIELD; +} + +bool NumberStringBuilder::isNumericField(Field field) { + return NumFieldUtils::isNumericField(field); +} + +int32_t NumberStringBuilder::trimBack(int32_t limit) const { + return unisets::get(unisets::DEFAULT_IGNORABLES)->spanBack( + getCharPtr() + fZero, + limit, + USET_SPAN_CONTAINED); +} + +int32_t NumberStringBuilder::trimFront(int32_t start) const { + return start + unisets::get(unisets::DEFAULT_IGNORABLES)->span( + getCharPtr() + fZero + start, + fLength - start, + USET_SPAN_CONTAINED); +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_stringbuilder.h b/deps/icu-small/source/i18n/number_stringbuilder.h index b14ad9ede2f90f..d48f6e106cf87e 100644 --- a/deps/icu-small/source/i18n/number_stringbuilder.h +++ b/deps/icu-small/source/i18n/number_stringbuilder.h @@ -85,6 +85,8 @@ class U_I18N_API NumberStringBuilder : public UMemory { int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status); + void writeTerminator(UErrorCode& status); + /** * Gets a "safe" UnicodeString that can be used even after the NumberStringBuilder is destructed. * */ @@ -106,6 +108,8 @@ class U_I18N_API NumberStringBuilder : public UMemory { void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; + bool nextPosition(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& status) const; + bool containsField(Field field) const; private: @@ -140,6 +144,14 @@ class U_I18N_API NumberStringBuilder : public UMemory { int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status); int32_t remove(int32_t index, int32_t count); + + static bool isIntOrGroup(Field field); + + static bool isNumericField(Field field); + + int32_t trimBack(int32_t limit) const; + + int32_t trimFront(int32_t start) const; }; } // namespace impl diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h index 00a6818869fdc2..225d1e57750490 100644 --- a/deps/icu-small/source/i18n/number_types.h +++ b/deps/icu-small/source/i18n/number_types.h @@ -23,7 +23,11 @@ namespace impl { // Typedef several enums for brevity and for easier comparison to Java. -typedef UNumberFormatFields Field; +// Convention: bottom 4 bits for field, top 4 bits for field category. +// Field category 0 implies the number category so that the number field +// literals can be directly passed as a Field type. +// See the helper functions in "NumFieldUtils" in number_utils.h +typedef uint8_t Field; typedef UNumberFormatRoundingMode RoundingMode; @@ -346,6 +350,7 @@ class U_I18N_API NullableValue { T fValue; }; + } // namespace impl } // namespace number U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/number_utils.cpp b/deps/icu-small/source/i18n/number_utils.cpp index c79d2de9fa3f55..0983b7b0726ec2 100644 --- a/deps/icu-small/source/i18n/number_utils.cpp +++ b/deps/icu-small/source/i18n/number_utils.cpp @@ -70,7 +70,7 @@ const char16_t* utils::getPatternForStyle(const Locale& locale, const char* nsNa break; default: patternKey = "decimalFormat"; // silence compiler error - U_ASSERT(false); + UPRV_UNREACHABLE; } LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status)); if (U_FAILURE(status)) { return u""; } @@ -237,7 +237,9 @@ void DecNum::multiplyBy(const DecNum& rhs, UErrorCode& status) { void DecNum::divideBy(const DecNum& rhs, UErrorCode& status) { uprv_decNumberDivide(fData, fData, rhs.fData, &fContext); - if (fContext.status != 0) { + if ((fContext.status & DEC_Inexact) != 0) { + // Ignore. + } else if (fContext.status != 0) { status = U_INTERNAL_PROGRAM_ERROR; } } diff --git a/deps/icu-small/source/i18n/number_utils.h b/deps/icu-small/source/i18n/number_utils.h index c367166009c0dc..203dec6d83b92b 100644 --- a/deps/icu-small/source/i18n/number_utils.h +++ b/deps/icu-small/source/i18n/number_utils.h @@ -32,6 +32,48 @@ enum CldrPatternStyle { CLDR_PATTERN_STYLE_COUNT, }; + +/** + * Helper functions for dealing with the Field typedef, which stores fields + * in a compressed format. + */ +class NumFieldUtils { +public: + struct CategoryFieldPair { + int32_t category; + int32_t field; + }; + + /** Compile-time function to construct a Field from a category and a field */ + template + static constexpr Field compress() { + static_assert(category != 0, "cannot use Undefined category in NumFieldUtils"); + static_assert(category <= 0xf, "only 4 bits for category"); + static_assert(field <= 0xf, "only 4 bits for field"); + return static_cast((category << 4) | field); + } + + /** Runtime inline function to unpack the category and field from the Field */ + static inline CategoryFieldPair expand(Field field) { + if (field == UNUM_FIELD_COUNT) { + return {UFIELD_CATEGORY_UNDEFINED, 0}; + } + CategoryFieldPair ret = { + (field >> 4), + (field & 0xf) + }; + if (ret.category == 0) { + ret.category = UFIELD_CATEGORY_NUMBER; + } + return ret; + } + + static inline bool isNumericField(Field field) { + int8_t category = field >> 4; + return category == 0 || category == UFIELD_CATEGORY_NUMBER; + } +}; + // Namespace for naked functions namespace utils { @@ -82,6 +124,23 @@ inline StandardPlural::Form getStandardPlural(const PluralRules *rules, } } +/** + * Computes the plural form after copying the number and applying rounding rules. + */ +inline StandardPlural::Form getPluralSafe( + const RoundingImpl& rounder, + const PluralRules* rules, + const DecimalQuantity& dq, + UErrorCode& status) { + // TODO(ICU-20500): Avoid the copy? + DecimalQuantity copy(dq); + rounder.apply(copy, status); + if (U_FAILURE(status)) { + return StandardPlural::Form::OTHER; + } + return getStandardPlural(rules, copy); +} + } // namespace utils } // namespace impl diff --git a/deps/icu-small/source/i18n/number_utypes.h b/deps/icu-small/source/i18n/number_utypes.h index 48bfce1969754a..88b493cbc254c9 100644 --- a/deps/icu-small/source/i18n/number_utypes.h +++ b/deps/icu-small/source/i18n/number_utypes.h @@ -11,63 +11,32 @@ #include "number_types.h" #include "number_decimalquantity.h" #include "number_stringbuilder.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN namespace number { namespace impl { -/** - * Implementation class for UNumberFormatter with a magic number for safety. - * - * Wraps a LocalizedNumberFormatter by value. - */ -struct UNumberFormatterData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "NFR" (NumberFormatteR with room at the end) - static constexpr int32_t kMagic = 0x4E465200; - - // Data members: - int32_t fMagic = kMagic; - LocalizedNumberFormatter fFormatter; - - /** Convert from UNumberFormatter -> UNumberFormatterData. */ - static UNumberFormatterData* validate(UNumberFormatter* input, UErrorCode& status); - - /** Convert from UNumberFormatter -> UNumberFormatterData (const version). */ - static const UNumberFormatterData* validate(const UNumberFormatter* input, UErrorCode& status); - - /** Convert from UNumberFormatterData -> UNumberFormatter. */ - UNumberFormatter* exportForC(); -}; +/** Helper function used in upluralrules.cpp */ +const DecimalQuantity* validateUFormattedNumberToDecimalQuantity( + const UFormattedNumber* uresult, UErrorCode& status); /** - * Implementation class for UFormattedNumber with magic number for safety. + * Struct for data used by FormattedNumber. * - * This struct is also held internally by the C++ version FormattedNumber since the member types are not + * This struct is held internally by the C++ version FormattedNumber since the member types are not * declared in the public header file. * * The DecimalQuantity is not currently being used by FormattedNumber, but at some point it could be used * to add a toDecNumber() or similar method. */ -struct UFormattedNumberData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "FDN" (FormatteDNumber with room at the end) - static constexpr int32_t kMagic = 0x46444E00; +class UFormattedNumberData : public FormattedValueNumberStringBuilderImpl { +public: + UFormattedNumberData() : FormattedValueNumberStringBuilderImpl(0) {} + virtual ~UFormattedNumberData(); - // Data members: - int32_t fMagic = kMagic; DecimalQuantity quantity; - NumberStringBuilder string; - - /** Convert from UFormattedNumber -> UFormattedNumberData. */ - static UFormattedNumberData* validate(UFormattedNumber* input, UErrorCode& status); - - /** Convert from UFormattedNumber -> UFormattedNumberData (const version). */ - static const UFormattedNumberData* validate(const UFormattedNumber* input, UErrorCode& status); - - /** Convert from UFormattedNumberData -> UFormattedNumber. */ - UFormattedNumber* exportForC(); }; diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index ef47e1e01b5ee6..21efd184558778 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -156,7 +156,6 @@ static const icu::number::impl::CldrPatternStyle gFormatCldrStyles[UNUM_FORMAT_S // Static hashtable cache of NumberingSystem objects used by NumberFormat static UHashtable * NumberingSystem_cache = NULL; -static UMutex nscacheMutex = U_MUTEX_INITIALIZER; static icu::UInitOnce gNSCacheInitOnce = U_INITONCE_INITIALIZER; #if !UCONFIG_NO_SERVICE @@ -1363,6 +1362,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale, // TODO: Bad hash key usage, see ticket #8504. int32_t hashKey = desiredLocale.hashCode(); + static icu::UMutex nscacheMutex = U_MUTEX_INITIALIZER; Mutex lock(&nscacheMutex); ns = (NumberingSystem *)uhash_iget(NumberingSystem_cache, hashKey); if (ns == NULL) { diff --git a/deps/icu-small/source/i18n/numparse_affixes.cpp b/deps/icu-small/source/i18n/numparse_affixes.cpp index c30d241693c8bf..12543a641b5946 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.cpp +++ b/deps/icu-small/source/i18n/numparse_affixes.cpp @@ -100,7 +100,7 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, addMatcher(fWarehouse.currency(status)); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } else if (fIgnorables != nullptr && fIgnorables->getSet()->contains(cp)) { @@ -109,7 +109,12 @@ void AffixPatternMatcherBuilder::consumeToken(AffixPatternType type, UChar32 cp, } else { // Case 3: the token is a non-ignorable literal. - addMatcher(fWarehouse.nextCodePointMatcher(cp)); + if (auto* ptr = fWarehouse.nextCodePointMatcher(cp, status)) { + addMatcher(*ptr); + } else { + // OOM; unwind the stack + return; + } } fLastTypeOrCp = type != TYPE_CODEPOINT ? type : cp; } @@ -125,51 +130,6 @@ AffixPatternMatcher AffixPatternMatcherBuilder::build() { return AffixPatternMatcher(fMatchers, fMatchersLen, fPattern); } - -CodePointMatcherWarehouse::CodePointMatcherWarehouse() - : codePointCount(0), codePointNumBatches(0) {} - -CodePointMatcherWarehouse::~CodePointMatcherWarehouse() { - // Delete the variable number of batches of code point matchers - for (int32_t i = 0; i < codePointNumBatches; i++) { - delete[] codePointsOverflow[i]; - } -} - -CodePointMatcherWarehouse::CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT - : codePoints(std::move(src.codePoints)), - codePointsOverflow(std::move(src.codePointsOverflow)), - codePointCount(src.codePointCount), - codePointNumBatches(src.codePointNumBatches) {} - -CodePointMatcherWarehouse& -CodePointMatcherWarehouse::operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT { - codePoints = std::move(src.codePoints); - codePointsOverflow = std::move(src.codePointsOverflow); - codePointCount = src.codePointCount; - codePointNumBatches = src.codePointNumBatches; - return *this; -} - -NumberParseMatcher& CodePointMatcherWarehouse::nextCodePointMatcher(UChar32 cp) { - if (codePointCount < CODE_POINT_STACK_CAPACITY) { - return codePoints[codePointCount++] = {cp}; - } - int32_t totalCapacity = CODE_POINT_STACK_CAPACITY + codePointNumBatches * CODE_POINT_BATCH_SIZE; - if (codePointCount >= totalCapacity) { - // Need a new batch - auto* nextBatch = new CodePointMatcher[CODE_POINT_BATCH_SIZE]; - if (codePointNumBatches >= codePointsOverflow.getCapacity()) { - // Need more room for storing pointers to batches - codePointsOverflow.resize(codePointNumBatches * 2, codePointNumBatches); - } - codePointsOverflow[codePointNumBatches++] = nextBatch; - } - return codePointsOverflow[codePointNumBatches - 1][(codePointCount++ - CODE_POINT_STACK_CAPACITY) % - CODE_POINT_BATCH_SIZE] = {cp}; -} - - AffixTokenMatcherWarehouse::AffixTokenMatcherWarehouse(const AffixTokenMatcherSetupData* setupData) : fSetupData(setupData) {} @@ -197,8 +157,15 @@ IgnorablesMatcher& AffixTokenMatcherWarehouse::ignorables() { return fSetupData->ignorables; } -NumberParseMatcher& AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp) { - return fCodePoints.nextCodePointMatcher(cp); +NumberParseMatcher* AffixTokenMatcherWarehouse::nextCodePointMatcher(UChar32 cp, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + auto* result = fCodePoints.create(cp); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; } diff --git a/deps/icu-small/source/i18n/numparse_affixes.h b/deps/icu-small/source/i18n/numparse_affixes.h index be8c4fb56473d1..e498483fbca8cf 100644 --- a/deps/icu-small/source/i18n/numparse_affixes.h +++ b/deps/icu-small/source/i18n/numparse_affixes.h @@ -7,14 +7,14 @@ #ifndef __NUMPARSE_AFFIXES_H__ #define __NUMPARSE_AFFIXES_H__ +#include "cmemory.h" + #include "numparse_types.h" #include "numparse_symbols.h" #include "numparse_currency.h" #include "number_affixutils.h" #include "number_currencysymbols.h" -#include - U_NAMESPACE_BEGIN namespace numparse { namespace impl { @@ -47,50 +47,20 @@ class CodePointMatcher : public NumberParseMatcher, public UMemory { } // namespace impl } // namespace numparse -// Export a explicit template instantiations of MaybeStackArray and CompactUnicodeString. +// Export a explicit template instantiations of MaybeStackArray, MemoryPool and CompactUnicodeString. // When building DLLs for Windows this is required even though no direct access leaks out of the i18n library. // (See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.) -// Note: These need to be outside of the impl::numparse namespace, or Clang will generate a compile error. +// Note: These need to be outside of the numparse::impl namespace, or Clang will generate a compile error. #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN +template class U_I18N_API MaybeStackArray; template class U_I18N_API MaybeStackArray; -template class U_I18N_API MaybeStackArray; +template class U_I18N_API MemoryPool; template class U_I18N_API numparse::impl::CompactUnicodeString<4>; #endif namespace numparse { namespace impl { -/** - * A warehouse to retain ownership of CodePointMatchers. - */ -// Exported as U_I18N_API for tests -class U_I18N_API CodePointMatcherWarehouse : public UMemory { - private: - static constexpr int32_t CODE_POINT_STACK_CAPACITY = 5; // Number of entries directly on the stack - static constexpr int32_t CODE_POINT_BATCH_SIZE = 10; // Number of entries per heap allocation - - public: - CodePointMatcherWarehouse(); - - // A custom destructor is needed to free the memory from MaybeStackArray. - // A custom move constructor and move assignment seem to be needed because of the custom destructor. - - ~CodePointMatcherWarehouse(); - - CodePointMatcherWarehouse(CodePointMatcherWarehouse&& src) U_NOEXCEPT; - - CodePointMatcherWarehouse& operator=(CodePointMatcherWarehouse&& src) U_NOEXCEPT; - - NumberParseMatcher& nextCodePointMatcher(UChar32 cp); - - private: - std::array codePoints; // By value - MaybeStackArray codePointsOverflow; // On heap in "batches" - int32_t codePointCount; // Total for both the ones by value and on heap - int32_t codePointNumBatches; // Number of batches in codePointsOverflow -}; - - struct AffixTokenMatcherSetupData { const CurrencySymbols& currencySymbols; const DecimalFormatSymbols& dfs; @@ -129,7 +99,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { IgnorablesMatcher& ignorables(); - NumberParseMatcher& nextCodePointMatcher(UChar32 cp); + NumberParseMatcher* nextCodePointMatcher(UChar32 cp, UErrorCode& status); private: // NOTE: The following field may be unsafe to access after construction is done! @@ -143,7 +113,7 @@ class U_I18N_API AffixTokenMatcherWarehouse : public UMemory { CombinedCurrencyMatcher fCurrency; // Use a child class for code point matchers, since it requires non-default operators. - CodePointMatcherWarehouse fCodePoints; + MemoryPool fCodePoints; friend class AffixPatternMatcherBuilder; friend class AffixPatternMatcher; diff --git a/deps/icu-small/source/i18n/numparse_impl.cpp b/deps/icu-small/source/i18n/numparse_impl.cpp index 3192a3959389a7..412ea89c86b651 100644 --- a/deps/icu-small/source/i18n/numparse_impl.cpp +++ b/deps/icu-small/source/i18n/numparse_impl.cpp @@ -72,7 +72,7 @@ NumberParserImpl::createSimpleParser(const Locale& locale, const UnicodeString& parser->addMatcher(parser->fLocalMatchers.padding = {u"@"}); parser->addMatcher(parser->fLocalMatchers.scientific = {symbols, grouper}); parser->addMatcher(parser->fLocalMatchers.currency = {currencySymbols, symbols, parseFlags, status}); -// parser.addMatcher(new RequireNumberMatcher()); + parser->addMatcher(parser->fLocalValidators.number = {}); parser->freeze(); return parser.orphan(); @@ -252,9 +252,13 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre StringSegment segment(input, 0 != (fParseFlags & PARSE_FLAG_IGNORE_CASE)); segment.adjustOffset(start); if (greedy) { - parseGreedyRecursive(segment, result, status); + parseGreedy(segment, result, status); + } else if (0 != (fParseFlags & PARSE_FLAG_ALLOW_INFINITE_RECURSION)) { + // Start at 1 so that recursionLevels never gets to 0 + parseLongestRecursive(segment, result, 1, status); } else { - parseLongestRecursive(segment, result, status); + // Arbitrary recursion safety limit: 100 levels. + parseLongestRecursive(segment, result, -100, status); } for (int32_t i = 0; i < fNumMatchers; i++) { fMatchers[i]->postProcess(result); @@ -262,44 +266,53 @@ void NumberParserImpl::parse(const UnicodeString& input, int32_t start, bool gre result.postProcess(); } -void NumberParserImpl::parseGreedyRecursive(StringSegment& segment, ParsedNumber& result, +void NumberParserImpl::parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const { - // Base Case - if (segment.length() == 0) { - return; - } - - int initialOffset = segment.getOffset(); - for (int32_t i = 0; i < fNumMatchers; i++) { + // Note: this method is not recursive in order to avoid stack overflow. + for (int i = 0; i smokeTest(segment)) { + // Matcher failed smoke test: try the next one + i++; continue; } + int32_t initialOffset = segment.getOffset(); matcher->match(segment, result, status); if (U_FAILURE(status)) { return; } if (segment.getOffset() != initialOffset) { - // In a greedy parse, recurse on only the first match. - parseGreedyRecursive(segment, result, status); - // The following line resets the offset so that the StringSegment says the same across - // the function - // call boundary. Since we recurse only once, this line is not strictly necessary. - segment.setOffset(initialOffset); - return; + // Greedy heuristic: accept the match and loop back + i = 0; + continue; + } else { + // Matcher did not match: try the next one + i++; + continue; } + UPRV_UNREACHABLE; } // NOTE: If we get here, the greedy parse completed without consuming the entire string. } void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumber& result, + int32_t recursionLevels, UErrorCode& status) const { // Base Case if (segment.length() == 0) { return; } + // Safety against stack overflow + if (recursionLevels == 0) { + return; + } + // TODO: Give a nice way for the matcher to reset the ParsedNumber? ParsedNumber initial(result); ParsedNumber candidate; @@ -326,7 +339,7 @@ void NumberParserImpl::parseLongestRecursive(StringSegment& segment, ParsedNumbe // If the entire segment was consumed, recurse. if (segment.getOffset() - initialOffset == charsToConsume) { - parseLongestRecursive(segment, candidate, status); + parseLongestRecursive(segment, candidate, recursionLevels + 1, status); if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/numparse_impl.h b/deps/icu-small/source/i18n/numparse_impl.h index 992114c7edee18..7d5f0b6f0bd07b 100644 --- a/deps/icu-small/source/i18n/numparse_impl.h +++ b/deps/icu-small/source/i18n/numparse_impl.h @@ -95,9 +95,10 @@ class U_I18N_API NumberParserImpl : public MutableMatcherCollection, public UMem explicit NumberParserImpl(parse_flags_t parseFlags); - void parseGreedyRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; + void parseGreedy(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; - void parseLongestRecursive(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; + void parseLongestRecursive( + StringSegment& segment, ParsedNumber& result, int32_t recursionLevels, UErrorCode& status) const; }; diff --git a/deps/icu-small/source/i18n/numparse_parsednumber.cpp b/deps/icu-small/source/i18n/numparse_parsednumber.cpp index 98da4e8319227a..3145f718dc26b5 100644 --- a/deps/icu-small/source/i18n/numparse_parsednumber.cpp +++ b/deps/icu-small/source/i18n/numparse_parsednumber.cpp @@ -52,7 +52,7 @@ bool ParsedNumber::seenNumber() const { return !quantity.bogus || 0 != (flags & FLAG_NAN) || 0 != (flags & FLAG_INFINITY); } -double ParsedNumber::getDouble() const { +double ParsedNumber::getDouble(UErrorCode& status) const { bool sawNaN = 0 != (flags & FLAG_NAN); bool sawInfinity = 0 != (flags & FLAG_INFINITY); @@ -69,7 +69,10 @@ double ParsedNumber::getDouble() const { return INFINITY; } } - U_ASSERT(!quantity.bogus); + if (quantity.bogus) { + status = U_INVALID_STATE_ERROR; + return 0.0; + } if (quantity.isZero() && quantity.isNegative()) { return -0.0; } diff --git a/deps/icu-small/source/i18n/numparse_symbols.cpp b/deps/icu-small/source/i18n/numparse_symbols.cpp index 9ccceec8475d01..e0daab9374f8b1 100644 --- a/deps/icu-small/source/i18n/numparse_symbols.cpp +++ b/deps/icu-small/source/i18n/numparse_symbols.cpp @@ -90,7 +90,7 @@ void IgnorablesMatcher::accept(StringSegment&, ParsedNumber&) const { InfinityMatcher::InfinityMatcher(const DecimalFormatSymbols& dfs) - : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_KEY) { + : SymbolMatcher(dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol), unisets::INFINITY_SIGN) { } bool InfinityMatcher::isDisabled(const ParsedNumber& result) const { diff --git a/deps/icu-small/source/i18n/numparse_types.h b/deps/icu-small/source/i18n/numparse_types.h index ab591eaba83af5..f837d8d2795a2b 100644 --- a/deps/icu-small/source/i18n/numparse_types.h +++ b/deps/icu-small/source/i18n/numparse_types.h @@ -49,6 +49,7 @@ enum ParseFlags { // PARSE_FLAG_OPTIMIZE = 0x0800, // no longer used // PARSE_FLAG_FORCE_BIG_DECIMAL = 0x1000, // not used in ICU4C PARSE_FLAG_NO_FOREIGN_CURRENCY = 0x2000, + PARSE_FLAG_ALLOW_INFINITE_RECURSION = 0x4000, }; @@ -63,7 +64,7 @@ class CompactUnicodeString { CompactUnicodeString(const UnicodeString& text) : fBuffer(text.length() + 1) { - memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length()); + uprv_memcpy(fBuffer.getAlias(), text.getBuffer(), sizeof(UChar) * text.length()); fBuffer[text.length()] = 0; } @@ -160,7 +161,7 @@ class U_I18N_API ParsedNumber { bool seenNumber() const; - double getDouble() const; + double getDouble(UErrorCode& status) const; void populateFormattable(Formattable& output, parse_flags_t parseFlags) const; @@ -266,7 +267,7 @@ class U_I18N_API StringSegment : public UMemory { bool operator==(const UnicodeString& other) const; private: - const UnicodeString fStr; + const UnicodeString& fStr; int32_t fStart; int32_t fEnd; bool fFoldCase; @@ -346,7 +347,7 @@ class U_I18N_API NumberParseMatcher { */ virtual void postProcess(ParsedNumber&) const { // Default implementation: no-op - }; + } // String for debugging virtual UnicodeString toString() const = 0; diff --git a/deps/icu-small/source/i18n/numrange_fluent.cpp b/deps/icu-small/source/i18n/numrange_fluent.cpp index 12b006c8ad5540..b284561cdc2b6f 100644 --- a/deps/icu-small/source/i18n/numrange_fluent.cpp +++ b/deps/icu-small/source/i18n/numrange_fluent.cpp @@ -162,6 +162,16 @@ Derived NumberRangeFormatterSettings::identityFallback(UNumberRangeIden return move; } +template +LocalPointer NumberRangeFormatterSettings::clone() const & { + return LocalPointer(new Derived(*this)); +} + +template +LocalPointer NumberRangeFormatterSettings::clone() && { + return LocalPointer(new Derived(std::move(*this))); +} + // Declare all classes that implement NumberRangeFormatterSettings // See https://stackoverflow.com/a/495056/1407170 template @@ -318,6 +328,10 @@ void LocalizedNumberRangeFormatter::formatImpl( return; } impl->format(results, equalBeforeRounding, status); + if (U_FAILURE(status)) { + return; + } + results.getStringRef().writeTerminator(status); } const impl::NumberRangeFormatterImpl* @@ -361,56 +375,14 @@ LocalizedNumberRangeFormatter::getFormatter(UErrorCode& status) const { } -FormattedNumberRange::FormattedNumberRange(FormattedNumberRange&& src) U_NOEXCEPT - : fResults(src.fResults), fErrorCode(src.fErrorCode) { - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; -} +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedNumberRange) -FormattedNumberRange& FormattedNumberRange::operator=(FormattedNumberRange&& src) U_NOEXCEPT { - delete fResults; - fResults = src.fResults; - fErrorCode = src.fErrorCode; - // Disown src.fResults to prevent double-deletion - src.fResults = nullptr; - src.fErrorCode = U_INVALID_STATE_ERROR; - return *this; -} - -UnicodeString FormattedNumberRange::toString(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->string.toUnicodeString(); -} - -Appendable& FormattedNumberRange::appendTo(Appendable& appendable, UErrorCode& status) const { - if (U_FAILURE(status)) { - return appendable; - } - if (fResults == nullptr) { - status = fErrorCode; - return appendable; - } - appendable.appendString(fResults->string.chars(), fResults->string.length()); - return appendable; -} +#define UPRV_NOARG UBool FormattedNumberRange::nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const { - if (U_FAILURE(status)) { - return FALSE; - } - if (fResults == nullptr) { - status = fErrorCode; - return FALSE; - } + UPRV_FORMATTED_VALUE_METHOD_GUARD(FALSE) // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool - return fResults->string.nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; + return fData->getStringRef().nextFieldPosition(fieldPosition, status) ? TRUE : FALSE; } void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator, UErrorCode& status) const { @@ -420,52 +392,27 @@ void FormattedNumberRange::getAllFieldPositions(FieldPositionIterator& iterator, void FormattedNumberRange::getAllFieldPositionsImpl( FieldPositionIteratorHandler& fpih, UErrorCode& status) const { - if (U_FAILURE(status)) { - return; - } - if (fResults == nullptr) { - status = fErrorCode; - return; - } - fResults->string.getAllFieldPositions(fpih, status); + UPRV_FORMATTED_VALUE_METHOD_GUARD(UPRV_NOARG) + fData->getStringRef().getAllFieldPositions(fpih, status); } UnicodeString FormattedNumberRange::getFirstDecimal(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->quantity1.toScientificString(); + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) + return fData->quantity1.toScientificString(); } UnicodeString FormattedNumberRange::getSecondDecimal(UErrorCode& status) const { - if (U_FAILURE(status)) { - return ICU_Utility::makeBogusString(); - } - if (fResults == nullptr) { - status = fErrorCode; - return ICU_Utility::makeBogusString(); - } - return fResults->quantity2.toScientificString(); + UPRV_FORMATTED_VALUE_METHOD_GUARD(ICU_Utility::makeBogusString()) + return fData->quantity2.toScientificString(); } UNumberRangeIdentityResult FormattedNumberRange::getIdentityResult(UErrorCode& status) const { - if (U_FAILURE(status)) { - return UNUM_IDENTITY_RESULT_NOT_EQUAL; - } - if (fResults == nullptr) { - status = fErrorCode; - return UNUM_IDENTITY_RESULT_NOT_EQUAL; - } - return fResults->identityResult; + UPRV_FORMATTED_VALUE_METHOD_GUARD(UNUM_IDENTITY_RESULT_NOT_EQUAL) + return fData->identityResult; } -FormattedNumberRange::~FormattedNumberRange() { - delete fResults; -} + +UFormattedNumberRangeData::~UFormattedNumberRangeData() = default; diff --git a/deps/icu-small/source/i18n/numrange_impl.cpp b/deps/icu-small/source/i18n/numrange_impl.cpp index 21365bfc59bca3..05eb2b84de3d87 100644 --- a/deps/icu-small/source/i18n/numrange_impl.cpp +++ b/deps/icu-small/source/i18n/numrange_impl.cpp @@ -41,12 +41,12 @@ class NumberRangeDataSink : public ResourceSink { if (U_FAILURE(status)) { return; } for (int i = 0; miscTable.getKeyAndValue(i, key, value); i++) { if (uprv_strcmp(key, "range") == 0) { - if (fData.rangePattern.getArgumentLimit() != 0) { + if (hasRangeData()) { continue; // have already seen this pattern } fData.rangePattern = {value.getUnicodeString(status), status}; } else if (uprv_strcmp(key, "approximately") == 0) { - if (fData.approximatelyPattern.getArgumentLimit() != 0) { + if (hasApproxData()) { continue; // have already seen this pattern } fData.approximatelyPattern = {value.getUnicodeString(status), status}; @@ -54,6 +54,27 @@ class NumberRangeDataSink : public ResourceSink { } } + bool hasRangeData() { + return fData.rangePattern.getArgumentLimit() != 0; + } + + bool hasApproxData() { + return fData.approximatelyPattern.getArgumentLimit() != 0; + } + + bool isComplete() { + return hasRangeData() && hasApproxData(); + } + + void fillInDefaults(UErrorCode& status) { + if (!hasRangeData()) { + fData.rangePattern = {u"{0}–{1}", status}; + } + if (!hasApproxData()) { + fData.approximatelyPattern = {u"~{0}", status}; + } + } + private: NumberRangeData& fData; }; @@ -68,19 +89,21 @@ void getNumberRangeData(const char* localeName, const char* nsName, NumberRangeD dataPath.append("NumberElements/", -1, status); dataPath.append(nsName, -1, status); dataPath.append("/miscPatterns", -1, status); - ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, status); if (U_FAILURE(status)) { return; } - // TODO: Is it necessary to manually fall back to latn, or does the data sink take care of that? - - if (data.rangePattern.getArgumentLimit() == 0) { - // No data! - data.rangePattern = {u"{0}–{1}", status}; + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), dataPath.data(), sink, localStatus); + if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) { + status = localStatus; + return; } - if (data.approximatelyPattern.getArgumentLimit() == 0) { - // No data! - data.approximatelyPattern = {u"~{0}", status}; + + // Fall back to latn if necessary + if (!sink.isComplete()) { + ures_getAllItemsWithFallback(rb.getAlias(), "NumberElements/latn/miscPatterns", sink, status); } + + sink.fillInDefaults(status); } class PluralRangesDataSink : public ResourceSink { @@ -177,15 +200,14 @@ NumberRangeFormatterImpl::NumberRangeFormatterImpl(const RangeMacroProps& macros fCollapse(macros.collapse), fIdentityFallback(macros.identityFallback) { - // TODO: As of this writing (ICU 63), there is no locale that has different number miscPatterns - // based on numbering system. Therefore, data is loaded only from latn. If this changes, - // this part of the code should be updated to load from the local numbering system. - // The numbering system could come from the one specified in the NumberFormatter passed to - // numberFormatterBoth() or similar. - // See ICU-20144 + const char* nsName = formatterImpl1.getRawMicroProps().nsName; + if (uprv_strcmp(nsName, formatterImpl2.getRawMicroProps().nsName) != 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } NumberRangeData data; - getNumberRangeData(macros.locale.getName(), "latn", data, status); + getNumberRangeData(macros.locale.getName(), nsName, data, status); if (U_FAILURE(status)) { return; } fRangeFormatter = data.rangePattern; fApproximatelyModifier = {data.approximatelyPattern, UNUM_FIELD_COUNT, false}; @@ -269,8 +291,7 @@ void NumberRangeFormatterImpl::format(UFormattedNumberRangeData& data, bool equa break; default: - U_ASSERT(false); - break; + UPRV_UNREACHABLE; } } @@ -280,8 +301,8 @@ void NumberRangeFormatterImpl::formatSingleValue(UFormattedNumberRangeData& data UErrorCode& status) const { if (U_FAILURE(status)) { return; } if (fSameFormatters) { - int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status); - NumberFormatterImpl::writeAffixes(micros1, data.string, 0, length, status); + int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status); + NumberFormatterImpl::writeAffixes(micros1, data.getStringRef(), 0, length, status); } else { formatRange(data, micros1, micros2, status); } @@ -293,12 +314,12 @@ void NumberRangeFormatterImpl::formatApproximately (UFormattedNumberRangeData& d UErrorCode& status) const { if (U_FAILURE(status)) { return; } if (fSameFormatters) { - int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status); + int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.getStringRef(), 0, status); // HEURISTIC: Desired modifier order: inner, middle, approximately, outer. - length += micros1.modInner->apply(data.string, 0, length, status); - length += micros1.modMiddle->apply(data.string, 0, length, status); - length += fApproximatelyModifier.apply(data.string, 0, length, status); - micros1.modOuter->apply(data.string, 0, length, status); + length += micros1.modInner->apply(data.getStringRef(), 0, length, status); + length += micros1.modMiddle->apply(data.getStringRef(), 0, length, status); + length += fApproximatelyModifier.apply(data.getStringRef(), 0, length, status); + micros1.modOuter->apply(data.getStringRef(), 0, length, status); } else { formatRange(data, micros1, micros2, status); } @@ -376,7 +397,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data, break; } - NumberStringBuilder& string = data.string; + NumberStringBuilder& string = data.getStringRef(); int32_t lengthPrefix = 0; int32_t length1 = 0; int32_t lengthInfix = 0; diff --git a/deps/icu-small/source/i18n/numrange_impl.h b/deps/icu-small/source/i18n/numrange_impl.h index 787fc656860d53..dc25dd4d67bfeb 100644 --- a/deps/icu-small/source/i18n/numrange_impl.h +++ b/deps/icu-small/source/i18n/numrange_impl.h @@ -14,6 +14,7 @@ #include "number_decimalquantity.h" #include "number_formatimpl.h" #include "number_stringbuilder.h" +#include "formattedval_impl.h" U_NAMESPACE_BEGIN namespace number { namespace impl { @@ -24,20 +25,18 @@ namespace impl { * * Has incomplete magic number logic that will need to be finished * if this is to be exposed as C API in the future. + * + * Possible magic number: 0x46445200 + * Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end) */ -struct UFormattedNumberRangeData : public UMemory { - // The magic number to identify incoming objects. - // Reads in ASCII as "FDR" (FormatteDnumberRange with room at the end) - static constexpr int32_t kMagic = 0x46445200; +class UFormattedNumberRangeData : public FormattedValueNumberStringBuilderImpl { +public: + UFormattedNumberRangeData() : FormattedValueNumberStringBuilderImpl(0) {} + virtual ~UFormattedNumberRangeData(); - // Data members: - int32_t fMagic = kMagic; DecimalQuantity quantity1; DecimalQuantity quantity2; - NumberStringBuilder string; UNumberRangeIdentityResult identityResult = UNUM_IDENTITY_RESULT_COUNT; - - // No C conversion methods (no C API yet) }; diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 514fe05e5ae6de..80056f925b027f 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -26,6 +26,8 @@ #include "unicode/numsys.h" #include "cstring.h" #include "uassert.h" +#include "ucln_in.h" +#include "umutex.h" #include "uresimp.h" #include "numsys_impl.h" @@ -258,83 +260,90 @@ void NumberingSystem::setName(const char *n) { if ( n == nullptr ) { name[0] = (char) 0; } else { - uprv_strncpy(name,n,NUMSYS_NAME_CAPACITY); - name[NUMSYS_NAME_CAPACITY] = '\0'; // Make sure it is null terminated. + uprv_strncpy(name,n,kInternalNumSysNameCapacity); + name[kInternalNumSysNameCapacity] = '\0'; // Make sure it is null terminated. } } UBool NumberingSystem::isAlgorithmic() const { return ( algorithmic ); } -StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { - // TODO(ticket #11908): Init-once static cache, with u_cleanup() callback. - static StringEnumeration* availableNames = nullptr; +namespace { + +UVector* gNumsysNames = nullptr; +UInitOnce gNumSysInitOnce = U_INITONCE_INITIALIZER; + +U_CFUNC UBool U_CALLCONV numSysCleanup() { + delete gNumsysNames; + gNumsysNames = nullptr; + gNumSysInitOnce.reset(); + return true; +} +U_CFUNC void initNumsysNames(UErrorCode &status) { + U_ASSERT(gNumsysNames == nullptr); + ucln_i18n_registerCleanup(UCLN_I18N_NUMSYS, numSysCleanup); + + // TODO: Simple array of UnicodeString objects, based on length of table resource? + LocalPointer numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status); if (U_FAILURE(status)) { - return nullptr; + return; } - if ( availableNames == nullptr ) { - // TODO: Simple array of UnicodeString objects, based on length of table resource? - LocalPointer numsysNames(new UVector(uprv_deleteUObject, nullptr, status), status); - if (U_FAILURE(status)) { - return nullptr; + UErrorCode rbstatus = U_ZERO_ERROR; + UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus); + numberingSystemsInfo = + ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus); + if (U_FAILURE(rbstatus)) { + // Don't stomp on the catastrophic failure of OOM. + if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { + status = rbstatus; + } else { + status = U_MISSING_RESOURCE_ERROR; } + ures_close(numberingSystemsInfo); + return; + } - UErrorCode rbstatus = U_ZERO_ERROR; - UResourceBundle *numberingSystemsInfo = ures_openDirect(nullptr, "numberingSystems", &rbstatus); - numberingSystemsInfo = ures_getByKey(numberingSystemsInfo, "numberingSystems", numberingSystemsInfo, &rbstatus); - if (U_FAILURE(rbstatus)) { - // Don't stomp on the catastrophic failure of OOM. - if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { - status = rbstatus; - } else { - status = U_MISSING_RESOURCE_ERROR; - } - ures_close(numberingSystemsInfo); - return nullptr; + while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) { + LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus)); + if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { + status = rbstatus; // we want to report OOM failure back to the caller. + break; } - - while ( ures_hasNext(numberingSystemsInfo) && U_SUCCESS(status) ) { - LocalUResourceBundlePointer nsCurrent(ures_getNextResource(numberingSystemsInfo, nullptr, &rbstatus)); - if (rbstatus == U_MEMORY_ALLOCATION_ERROR) { - status = rbstatus; // we want to report OOM failure back to the caller. - break; - } - const char *nsName = ures_getKey(nsCurrent.getAlias()); - LocalPointer newElem(new UnicodeString(nsName, -1, US_INV), status); + const char *nsName = ures_getKey(nsCurrent.getAlias()); + LocalPointer newElem(new UnicodeString(nsName, -1, US_INV), status); + if (U_SUCCESS(status)) { + numsysNames->addElement(newElem.getAlias(), status); if (U_SUCCESS(status)) { - numsysNames->addElement(newElem.getAlias(), status); - if (U_SUCCESS(status)) { - newElem.orphan(); // on success, the numsysNames vector owns newElem. - } + newElem.orphan(); // on success, the numsysNames vector owns newElem. } } + } - ures_close(numberingSystemsInfo); - if (U_FAILURE(status)) { - return nullptr; - } - availableNames = new NumsysNameEnumeration(numsysNames.getAlias(), status); - if (availableNames == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - numsysNames.orphan(); // The names got adopted. + ures_close(numberingSystemsInfo); + if (U_SUCCESS(status)) { + gNumsysNames = numsysNames.orphan(); } + return; +} - return availableNames; +} // end anonymous namespace + +StringEnumeration* NumberingSystem::getAvailableNames(UErrorCode &status) { + umtx_initOnce(gNumSysInitOnce, &initNumsysNames, status); + LocalPointer result(new NumsysNameEnumeration(status), status); + return result.orphan(); } -NumsysNameEnumeration::NumsysNameEnumeration(UVector *numsysNames, UErrorCode& /*status*/) { - pos=0; - fNumsysNames = numsysNames; +NumsysNameEnumeration::NumsysNameEnumeration(UErrorCode& status) : pos(0) { + (void)status; } const UnicodeString* NumsysNameEnumeration::snext(UErrorCode& status) { - if (U_SUCCESS(status) && (fNumsysNames != nullptr) && (pos < fNumsysNames->size())) { - return (const UnicodeString*)fNumsysNames->elementAt(pos++); + if (U_SUCCESS(status) && (gNumsysNames != nullptr) && (pos < gNumsysNames->size())) { + return (const UnicodeString*)gNumsysNames->elementAt(pos++); } return nullptr; } @@ -346,11 +355,10 @@ NumsysNameEnumeration::reset(UErrorCode& /*status*/) { int32_t NumsysNameEnumeration::count(UErrorCode& /*status*/) const { - return (fNumsysNames==nullptr) ? 0 : fNumsysNames->size(); + return (gNumsysNames==nullptr) ? 0 : gNumsysNames->size(); } NumsysNameEnumeration::~NumsysNameEnumeration() { - delete fNumsysNames; } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/numsys_impl.h b/deps/icu-small/source/i18n/numsys_impl.h index 733e102365369d..c0690b47d78802 100644 --- a/deps/icu-small/source/i18n/numsys_impl.h +++ b/deps/icu-small/source/i18n/numsys_impl.h @@ -26,18 +26,16 @@ U_NAMESPACE_BEGIN class NumsysNameEnumeration : public StringEnumeration { public: - // NumsysNameEnumeration instance adopts numsysNames - NumsysNameEnumeration(UVector *numsysNames, UErrorCode& status); + NumsysNameEnumeration(UErrorCode& status); virtual ~NumsysNameEnumeration(); static UClassID U_EXPORT2 getStaticClassID(void); - virtual UClassID getDynamicClassID(void) const; - virtual const UnicodeString* snext(UErrorCode& status); - virtual void reset(UErrorCode& status); - virtual int32_t count(UErrorCode& status) const; + virtual UClassID getDynamicClassID(void) const override; + virtual const UnicodeString* snext(UErrorCode& status) override; + virtual void reset(UErrorCode& status) override; + virtual int32_t count(UErrorCode& status) const override; private: int32_t pos; - UVector *fNumsysNames = nullptr; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index c3500574662585..95fc56bcd71b54 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -25,7 +25,7 @@ #include "uassert.h" #include "uvector.h" #include // DBL_MAX -#include "uresimp.h" // struct UResourceBundle +#include "uresimp.h" #include "zonemeta.h" #include "umutex.h" @@ -134,12 +134,11 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // setID(ures_getKey((UResourceBundle*) res)); // cast away const int32_t len; - UResourceBundle r; - ures_initStackObject(&r); + StackUResourceBundle r; // Pre-32bit second transitions - ures_getByKey(res, kTRANSPRE32, &r, &ec); - transitionTimesPre32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANSPRE32, r.getAlias(), &ec); + transitionTimesPre32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCountPre32 = static_cast(len >> 1); if (ec == U_MISSING_RESOURCE_ERROR) { // No pre-32bit transitions @@ -151,8 +150,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // 32bit second transitions - ures_getByKey(res, kTRANS, &r, &ec); - transitionTimes32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANS, r.getAlias(), &ec); + transitionTimes32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCount32 = static_cast(len); if (ec == U_MISSING_RESOURCE_ERROR) { // No 32bit transitions @@ -164,8 +163,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // Post-32bit second transitions - ures_getByKey(res, kTRANSPOST32, &r, &ec); - transitionTimesPost32 = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTRANSPOST32, r.getAlias(), &ec); + transitionTimesPost32 = ures_getIntVector(r.getAlias(), &len, &ec); transitionCountPost32 = static_cast(len >> 1); if (ec == U_MISSING_RESOURCE_ERROR) { // No pre-32bit transitions @@ -177,8 +176,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, } // Type offsets list must be of even size, with size >= 2 - ures_getByKey(res, kTYPEOFFSETS, &r, &ec); - typeOffsets = ures_getIntVector(&r, &len, &ec); + ures_getByKey(res, kTYPEOFFSETS, r.getAlias(), &ec); + typeOffsets = ures_getIntVector(r.getAlias(), &len, &ec); if (U_SUCCESS(ec) && (len < 2 || len > 0x7FFE || (len & 1) != 0)) { ec = U_INVALID_FORMAT_ERROR; } @@ -187,8 +186,8 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // Type map data must be of the same size as the transition count typeMapData = NULL; if (transitionCount() > 0) { - ures_getByKey(res, kTYPEMAP, &r, &ec); - typeMapData = ures_getBinary(&r, &len, &ec); + ures_getByKey(res, kTYPEMAP, r.getAlias(), &ec); + typeMapData = ures_getBinary(r.getAlias(), &len, &ec); if (ec == U_MISSING_RESOURCE_ERROR) { // no type mapping data ec = U_INVALID_FORMAT_ERROR; @@ -199,10 +198,10 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // Process final rule and data, if any const UChar *ruleIdUStr = ures_getStringByKey(res, kFINALRULE, &len, &ec); - ures_getByKey(res, kFINALRAW, &r, &ec); - int32_t ruleRaw = ures_getInt(&r, &ec); - ures_getByKey(res, kFINALYEAR, &r, &ec); - int32_t ruleYear = ures_getInt(&r, &ec); + ures_getByKey(res, kFINALRAW, r.getAlias(), &ec); + int32_t ruleRaw = ures_getInt(r.getAlias(), &ec); + ures_getByKey(res, kFINALYEAR, r.getAlias(), &ec); + int32_t ruleYear = ures_getInt(r.getAlias(), &ec); if (U_SUCCESS(ec)) { UnicodeString ruleID(TRUE, ruleIdUStr, len); UResourceBundle *rule = TimeZone::loadRule(top, ruleID, NULL, ec); @@ -251,7 +250,6 @@ OlsonTimeZone::OlsonTimeZone(const UResourceBundle* top, // No final zone ec = U_ZERO_ERROR; } - ures_close(&r); // initialize canonical ID canonicalID = ZoneMeta::getCanonicalCLDRID(tzid, ec); diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 2775766d32df80..678d91b9c824bc 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -278,7 +278,7 @@ PluralFormat::format(const Formattable& numberObject, double number, auto *decFmt = dynamic_cast(numberFormat); if(decFmt != nullptr) { decFmt->toNumberFormatter().formatImpl(&data, status); // mutates &data - numberString = data.string.toUnicodeString(); + numberString = data.getStringRef().toUnicodeString(); } else { if (offset == 0) { numberFormat->format(numberObject, numberString, status); diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 3caa48a57bb700..aa950a51f0f0c6 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -35,6 +35,7 @@ #include "sharedpluralrules.h" #include "unifiedcache.h" #include "number_decimalquantity.h" +#include "util.h" #if !UCONFIG_NO_FORMATTING @@ -264,6 +265,16 @@ PluralRules::select(double number) const { return select(FixedDecimal(number)); } +UnicodeString +PluralRules::select(const number::FormattedNumber& number, UErrorCode& status) const { + DecimalQuantity dq; + number.getDecimalQuantity(dq, status); + if (U_FAILURE(status)) { + return ICU_Utility::makeBogusString(); + } + return select(dq); +} + UnicodeString PluralRules::select(const IFixedDecimal &number) const { if (mRules == nullptr) { @@ -692,14 +703,14 @@ PluralRules::getRuleFromResource(const Locale& locale, UPluralType type, UErrorC return emptyStr; } int32_t resLen=0; - const char *curLocaleName=locale.getName(); + const char *curLocaleName=locale.getBaseName(); const UChar* s = ures_getStringByKey(locRes.getAlias(), curLocaleName, &resLen, &errCode); if (s == nullptr) { // Check parent locales. UErrorCode status = U_ZERO_ERROR; char parentLocaleName[ULOC_FULLNAME_CAPACITY]; - const char *curLocaleName2=locale.getName(); + const char *curLocaleName2=locale.getBaseName(); uprv_strcpy(parentLocaleName, curLocaleName2); while (uloc_getParent(parentLocaleName, parentLocaleName, @@ -1471,8 +1482,7 @@ PluralOperand tokenTypeToPluralOperand(tokenType tt) { case tVariableT: return PLURAL_OPERAND_T; default: - U_ASSERT(FALSE); // unexpected. - return PLURAL_OPERAND_N; + UPRV_UNREACHABLE; // unexpected. } } @@ -1684,8 +1694,7 @@ double FixedDecimal::getPluralOperand(PluralOperand operand) const { case PLURAL_OPERAND_T: return static_cast(decimalDigitsWithoutTrailingZeros); case PLURAL_OPERAND_V: return visibleDecimalDigitCount; default: - U_ASSERT(FALSE); // unexpected. - return source; + UPRV_UNREACHABLE; // unexpected. } } diff --git a/deps/icu-small/source/i18n/quantityformatter.cpp b/deps/icu-small/source/i18n/quantityformatter.cpp index ba06ba06b97013..9182f9e7d379a8 100644 --- a/deps/icu-small/source/i18n/quantityformatter.cpp +++ b/deps/icu-small/source/i18n/quantityformatter.cpp @@ -25,6 +25,8 @@ #include "standardplural.h" #include "uassert.h" #include "number_decimalquantity.h" +#include "number_utypes.h" +#include "number_stringbuilder.h" U_NAMESPACE_BEGIN @@ -174,6 +176,39 @@ StandardPlural::Form QuantityFormatter::selectPlural( return StandardPlural::orOtherFromString(pluralKeyword); } +void QuantityFormatter::formatAndSelect( + double quantity, + const NumberFormat& fmt, + const PluralRules& rules, + number::impl::NumberStringBuilder& output, + StandardPlural::Form& pluralForm, + UErrorCode& status) { + UnicodeString pluralKeyword; + const DecimalFormat* df = dynamic_cast(&fmt); + if (df != nullptr) { + number::impl::UFormattedNumberData fn; + fn.quantity.setToDouble(quantity); + df->toNumberFormatter().formatImpl(&fn, status); + if (U_FAILURE(status)) { + return; + } + output = std::move(fn.getStringRef()); + pluralKeyword = rules.select(fn.quantity); + } else { + UnicodeString result; + fmt.format(quantity, result, status); + if (U_FAILURE(status)) { + return; + } + output.append(result, UNUM_FIELD_COUNT, status); + if (U_FAILURE(status)) { + return; + } + pluralKeyword = rules.select(quantity); + } + pluralForm = StandardPlural::orOtherFromString(pluralKeyword); +} + UnicodeString &QuantityFormatter::format( const SimpleFormatter &pattern, const UnicodeString &value, diff --git a/deps/icu-small/source/i18n/quantityformatter.h b/deps/icu-small/source/i18n/quantityformatter.h index 6698b7a8a028fd..3e3f29de57323d 100644 --- a/deps/icu-small/source/i18n/quantityformatter.h +++ b/deps/icu-small/source/i18n/quantityformatter.h @@ -27,6 +27,12 @@ class NumberFormat; class Formattable; class FieldPosition; +namespace number { +namespace impl { +class NumberStringBuilder; +} +} + /** * A plural aware formatter that is good for expressing a single quantity and * a unit. @@ -111,6 +117,7 @@ class U_I18N_API QuantityFormatter : public UMemory { /** * Selects the standard plural form for the number/formatter/rules. + * TODO(13591): Remove this method. */ static StandardPlural::Form selectPlural( const Formattable &number, @@ -120,8 +127,30 @@ class U_I18N_API QuantityFormatter : public UMemory { FieldPosition &pos, UErrorCode &status); + /** + * Formats a quantity and selects its plural form. The output is appended + * to a NumberStringBuilder in order to retain field information. + * + * @param quantity The number to format. + * @param fmt The formatter to use to format the number. + * @param rules The rules to use to select the plural form of the + * formatted number. + * @param output Where to append the result of the format operation. + * @param pluralForm Output variable populated with the plural form of the + * formatted number. + * @param status Set if an error occurs. + */ + static void formatAndSelect( + double quantity, + const NumberFormat& fmt, + const PluralRules& rules, + number::impl::NumberStringBuilder& output, + StandardPlural::Form& pluralForm, + UErrorCode& status); + /** * Formats the pattern with the value and adjusts the FieldPosition. + * TODO: Remove? */ static UnicodeString &format( const SimpleFormatter &pattern, diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp index 0444729b252412..8ba6a60ff42218 100644 --- a/deps/icu-small/source/i18n/rbt.cpp +++ b/deps/icu-small/source/i18n/rbt.cpp @@ -27,7 +27,6 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedTransliterator) -static UMutex transliteratorDataMutex = U_MUTEX_INITIALIZER; static Replaceable *gLockedText = NULL; void RuleBasedTransliterator::_construct(const UnicodeString& rules, @@ -253,6 +252,8 @@ RuleBasedTransliterator::handleTransliterate(Replaceable& text, UTransPosition& // Shared RBT data protected by transliteratorDataMutex. // // TODO(andy): Need a better scheme for handling this. + + static UMutex transliteratorDataMutex = U_MUTEX_INITIALIZER; UBool needToLock; { Mutex m; diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp index 951073abc51ddf..b8dca395fc0403 100644 --- a/deps/icu-small/source/i18n/rbtz.cpp +++ b/deps/icu-small/source/i18n/rbtz.cpp @@ -146,10 +146,10 @@ RuleBasedTimeZone::addTransitionRule(TimeZoneRule* rule, UErrorCode& status) { fUpToDate = FALSE; } -static UMutex gLock = U_MUTEX_INITIALIZER; void RuleBasedTimeZone::completeConst(UErrorCode& status) const { + static UMutex gLock = U_MUTEX_INITIALIZER; if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp index 0c5fca6f67b3f9..8d60986fd32ca6 100644 --- a/deps/icu-small/source/i18n/regexcmp.cpp +++ b/deps/icu-small/source/i18n/regexcmp.cpp @@ -1465,7 +1465,7 @@ UBool RegexCompile::doParseActions(int32_t action) case 0x78: /* 'x' */ bit = UREGEX_COMMENTS; break; case 0x2d: /* '-' */ fSetModeFlag = FALSE; break; default: - U_ASSERT(FALSE); // Should never happen. Other chars are filtered out + UPRV_UNREACHABLE; // Should never happen. Other chars are filtered out // by the scanner. } if (fSetModeFlag) { @@ -1840,9 +1840,7 @@ UBool RegexCompile::doParseActions(int32_t action) } default: - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - break; + UPRV_UNREACHABLE; } if (U_FAILURE(*fStatus)) { @@ -1949,25 +1947,17 @@ int32_t RegexCompile::buildOp(int32_t type, int32_t val) { return 0; } if (type < 0 || type > 255) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - type = URX_RESERVED_OP; + UPRV_UNREACHABLE; } if (val > 0x00ffffff) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - val = 0; + UPRV_UNREACHABLE; } if (val < 0) { if (!(type == URX_RESERVED_OP_N || type == URX_RESERVED_OP)) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - return -1; + UPRV_UNREACHABLE; } if (URX_TYPE(val) != 0xff) { - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); - return -1; + UPRV_UNREACHABLE; } type = URX_RESERVED_OP_N; } @@ -2295,6 +2285,13 @@ void RegexCompile::handleCloseParen() { error(U_REGEX_LOOK_BEHIND_LIMIT); break; } + if (minML == INT32_MAX && maxML == 0) { + // This condition happens when no match is possible, such as with a + // [set] expression containing no elements. + // In principle, the generated code to evaluate the expression could be deleted, + // but it's probably not worth the complication. + minML = 0; + } U_ASSERT(minML <= maxML); // Insert the min and max match len bounds into the URX_LB_CONT op that @@ -2331,6 +2328,14 @@ void RegexCompile::handleCloseParen() { error(U_REGEX_LOOK_BEHIND_LIMIT); break; } + if (minML == INT32_MAX && maxML == 0) { + // This condition happens when no match is possible, such as with a + // [set] expression containing no elements. + // In principle, the generated code to evaluate the expression could be deleted, + // but it's probably not worth the complication. + minML = 0; + } + U_ASSERT(minML <= maxML); // Insert the min and max match len bounds into the URX_LB_CONT op that @@ -2348,7 +2353,7 @@ void RegexCompile::handleCloseParen() { default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } // remember the next location in the compiled pattern. @@ -2608,8 +2613,7 @@ void RegexCompile::findCaseInsensitiveStarters(UChar32 c, UnicodeSet *starterCh if (c < UCHAR_MIN_VALUE || c > UCHAR_MAX_VALUE) { // This function should never be called with an invalid input character. - U_ASSERT(FALSE); - starterChars->clear(); + UPRV_UNREACHABLE; } else if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) { UChar32 caseFoldedC = u_foldCase(c, U_FOLD_CASE_DEFAULT); starterChars->set(caseFoldedC, caseFoldedC); @@ -3103,13 +3107,10 @@ void RegexCompile::matchStartType() { case URX_LB_END: case URX_LBN_CONT: case URX_LBN_END: - U_ASSERT(FALSE); // Shouldn't get here. These ops should be + UPRV_UNREACHABLE; // Shouldn't get here. These ops should be // consumed by the scan in URX_LA_START and LB_START - - break; - default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } @@ -3429,7 +3430,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } @@ -3673,8 +3674,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { case URX_CTR_LOOP_NG: // These opcodes will be skipped over by code for URX_CRT_INIT. // We shouldn't encounter them here. - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; case URX_LOOP_SR_I: case URX_LOOP_DOT_I: @@ -3694,8 +3694,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { // End of look-ahead ops should always be consumed by the processing at // the URX_LA_START op. - // U_ASSERT(FALSE); - // break; + // UPRV_UNREACHABLE; case URX_LB_START: { @@ -3720,7 +3719,7 @@ int32_t RegexCompile::maxMatchLength(int32_t start, int32_t end) { break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } @@ -3875,8 +3874,7 @@ void RegexCompile::stripNOPs() { default: // Some op is unaccounted for. - U_ASSERT(FALSE); - error(U_REGEX_INTERNAL_ERROR); + UPRV_UNREACHABLE; } } @@ -4012,7 +4010,7 @@ UChar32 RegexCompile::peekCharLL() { // //------------------------------------------------------------------------------ void RegexCompile::nextChar(RegexPatternChar &c) { - + tailRecursion: fScanIndex = UTEXT_GETNATIVEINDEX(fRXPat->fPattern); c.fChar = nextCharLL(); c.fQuoted = FALSE; @@ -4023,7 +4021,9 @@ void RegexCompile::nextChar(RegexPatternChar &c) { c.fChar == (UChar32)-1) { fQuoteMode = FALSE; // Exit quote mode, nextCharLL(); // discard the E - nextChar(c); // recurse to get the real next char + // nextChar(c); // recurse to get the real next char + goto tailRecursion; // Note: fuzz testing produced testcases that + // resulted in stack overflow here. } } else if (fInBackslashQuote) { @@ -4141,8 +4141,10 @@ void RegexCompile::nextChar(RegexPatternChar &c) { else if (peekCharLL() == chQ) { // "\Q" enter quote mode, which will continue until "\E" fQuoteMode = TRUE; - nextCharLL(); // discard the 'Q'. - nextChar(c); // recurse to get the real next char. + nextCharLL(); // discard the 'Q'. + // nextChar(c); // recurse to get the real next char. + goto tailRecursion; // Note: fuzz testing produced test cases that + // resulted in stack overflow here. } else { @@ -4622,8 +4624,7 @@ void RegexCompile::setEval(int32_t nextOp) { delete rightOperand; break; default: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } } diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index ae251ed20b46a3..cda2564b9a0539 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION #include +#include #include "unicode/dtfmtsym.h" #include "unicode/ucasemap.h" #include "unicode/ureldatefmt.h" @@ -41,11 +42,15 @@ #include "sharednumberformat.h" #include "standardplural.h" #include "unifiedcache.h" +#include "util.h" +#include "number_stringbuilder.h" +#include "number_utypes.h" +#include "number_modifiers.h" +#include "formattedval_impl.h" +#include "number_utils.h" // Copied from uscript_props.cpp -static UMutex gBrkIterMutex = U_MUTEX_INITIALIZER; - U_NAMESPACE_BEGIN // RelativeDateTimeFormatter specific data for a single locale @@ -162,13 +167,20 @@ const UnicodeString& RelativeDateTimeCacheData::getAbsoluteUnitString( URelativeDateTimeUnit unit, int32_t pastFutureIndex, int32_t pluralUnit) const { - int32_t style = fStyle; - do { - if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) { - return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit]; + while (true) { + int32_t style = fStyle; + do { + if (relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit] != nullptr) { + return relativeUnitsFormatters[style][unit][pastFutureIndex][pluralUnit]; + } + style = fallBackCache[style]; + } while (style != -1); + + if (pluralUnit == StandardPlural::OTHER) { + break; } - style = fallBackCache[style]; - } while (style != -1); + pluralUnit = StandardPlural::OTHER; + } return nullptr; // No formatter found. } @@ -710,6 +722,26 @@ const RelativeDateTimeCacheData *LocaleCacheKey::crea return result.orphan(); } + + +static constexpr number::impl::Field kRDTNumericField + = number::impl::NumFieldUtils::compress(); + +static constexpr number::impl::Field kRDTLiteralField + = number::impl::NumFieldUtils::compress(); + +class FormattedRelativeDateTimeData : public FormattedValueNumberStringBuilderImpl { +public: + FormattedRelativeDateTimeData() : FormattedValueNumberStringBuilderImpl(kRDTNumericField) {} + virtual ~FormattedRelativeDateTimeData(); +}; + +FormattedRelativeDateTimeData::~FormattedRelativeDateTimeData() = default; + + +UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedRelativeDateTime) + + RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status) : fCache(nullptr), fNumberFormat(nullptr), @@ -834,43 +866,142 @@ UDateRelativeDateTimeFormatterStyle RelativeDateTimeFormatter::getFormatStyle() return fStyle; } -UnicodeString& RelativeDateTimeFormatter::format( - double quantity, UDateDirection direction, UDateRelativeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + +// To reduce boilerplate code, we use a helper function that forwards variadic +// arguments to the formatImpl function. + +template +UnicodeString& RelativeDateTimeFormatter::doFormat( + F callback, + UnicodeString& appendTo, + UErrorCode& status, + Args... args) const { + FormattedRelativeDateTimeData output; + (this->*callback)(std::forward(args)..., output, status); if (U_FAILURE(status)) { return appendTo; } + UnicodeString result = output.getStringRef().toUnicodeString(); + return appendTo.append(adjustForContext(result)); +} + +template +FormattedRelativeDateTime RelativeDateTimeFormatter::doFormatToValue( + F callback, + UErrorCode& status, + Args... args) const { + if (!checkNoAdjustForContext(status)) { + return FormattedRelativeDateTime(status); + } + LocalPointer output( + new FormattedRelativeDateTimeData(), status); + if (U_FAILURE(status)) { + return FormattedRelativeDateTime(status); + } + (this->*callback)(std::forward(args)..., *output, status); + output->getStringRef().writeTerminator(status); + return FormattedRelativeDateTime(output.orphan()); +} + +UnicodeString& RelativeDateTimeFormatter::format( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatImpl, + appendTo, + status, + quantity, + direction, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatImpl, + status, + quantity, + direction, + unit); +} + +void RelativeDateTimeFormatter::formatImpl( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return; + } if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0; - FieldPosition pos(FieldPosition::DONT_CARE); - UnicodeString result; - UnicodeString formattedNumber; - - StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural( - quantity, **fNumberFormat, **fPluralRules, formattedNumber, pos, + StandardPlural::Form pluralForm; + QuantityFormatter::formatAndSelect( + quantity, + **fNumberFormat, + **fPluralRules, + output.getStringRef(), + pluralForm, status); + if (U_FAILURE(status)) { + return; + } const SimpleFormatter* formatter = - fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralIndex); + fCache->getRelativeUnitFormatter(fStyle, unit, bFuture, pluralForm); if (formatter == nullptr) { // TODO: WARN - look at quantity formatter's action with an error. status = U_INVALID_FORMAT_ERROR; - return appendTo; + return; } - formatter->format(formattedNumber, result, status); - adjustForContext(result); - return appendTo.append(result); + + number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false); + modifier.formatAsPrefixSuffix( + output.getStringRef(), 0, output.getStringRef().length(), status); } UnicodeString& RelativeDateTimeFormatter::formatNumeric( - double offset, URelativeDateTimeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + double offset, + URelativeDateTimeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatNumericImpl, + appendTo, + status, + offset, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatNumericToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatNumericImpl, + status, + offset, + unit); +} + +void RelativeDateTimeFormatter::formatNumericImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } UDateDirection direction = UDAT_DIRECTION_NEXT; if (std::signbit(offset)) { // needed to handle -0.0 @@ -879,55 +1010,110 @@ UnicodeString& RelativeDateTimeFormatter::formatNumeric( } if (direction != UDAT_DIRECTION_LAST && direction != UDAT_DIRECTION_NEXT) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0; - FieldPosition pos(FieldPosition::DONT_CARE); - - UnicodeString result; - UnicodeString formattedNumber; - StandardPlural::Form pluralIndex = QuantityFormatter::selectPlural( - offset, **fNumberFormat, **fPluralRules, formattedNumber, pos, + StandardPlural::Form pluralForm; + QuantityFormatter::formatAndSelect( + offset, + **fNumberFormat, + **fPluralRules, + output.getStringRef(), + pluralForm, status); + if (U_FAILURE(status)) { + return; + } const SimpleFormatter* formatter = - fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralIndex); + fCache->getRelativeDateTimeUnitFormatter(fStyle, unit, bFuture, pluralForm); if (formatter == nullptr) { // TODO: WARN - look at quantity formatter's action with an error. status = U_INVALID_FORMAT_ERROR; - return appendTo; + return; } - formatter->format(formattedNumber, result, status); - adjustForContext(result); - return appendTo.append(result); + + number::impl::SimpleModifier modifier(*formatter, kRDTLiteralField, false); + modifier.formatAsPrefixSuffix( + output.getStringRef(), 0, output.getStringRef().length(), status); } UnicodeString& RelativeDateTimeFormatter::format( - UDateDirection direction, UDateAbsoluteUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + UDateDirection direction, + UDateAbsoluteUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatAbsoluteImpl, + appendTo, + status, + direction, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + UDateDirection direction, + UDateAbsoluteUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatAbsoluteImpl, + status, + direction, + unit); +} + +void RelativeDateTimeFormatter::formatAbsoluteImpl( + UDateDirection direction, + UDateAbsoluteUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } if (unit == UDAT_ABSOLUTE_NOW && direction != UDAT_DIRECTION_PLAIN) { status = U_ILLEGAL_ARGUMENT_ERROR; - return appendTo; + return; } // Get string using fallback. - UnicodeString result; - result.fastCopyFrom(fCache->getAbsoluteUnitString(fStyle, unit, direction)); - if (fOptBreakIterator != nullptr) { - adjustForContext(result); - } - return appendTo.append(result); + output.getStringRef().append( + fCache->getAbsoluteUnitString(fStyle, unit, direction), + kRDTLiteralField, + status); } UnicodeString& RelativeDateTimeFormatter::format( - double offset, URelativeDateTimeUnit unit, - UnicodeString& appendTo, UErrorCode& status) const { + double offset, + URelativeDateTimeUnit unit, + UnicodeString& appendTo, + UErrorCode& status) const { + return doFormat( + &RelativeDateTimeFormatter::formatRelativeImpl, + appendTo, + status, + offset, + unit); +} + +FormattedRelativeDateTime RelativeDateTimeFormatter::formatToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const { + return doFormatToValue( + &RelativeDateTimeFormatter::formatRelativeImpl, + status, + offset, + unit); +} + +void RelativeDateTimeFormatter::formatRelativeImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const { if (U_FAILURE(status)) { - return appendTo; + return; } // TODO: // The full implementation of this depends on CLDR data that is not yet available, @@ -974,20 +1160,13 @@ UnicodeString& RelativeDateTimeFormatter::format( default: break; } if (direction != UDAT_DIRECTION_COUNT && absunit != UDAT_ABSOLUTE_UNIT_COUNT) { - const UnicodeString &unitFormatString = - fCache->getAbsoluteUnitString(fStyle, absunit, direction); - if (!unitFormatString.isEmpty()) { - if (fOptBreakIterator != nullptr) { - UnicodeString result(unitFormatString); - adjustForContext(result); - return appendTo.append(result); - } else { - return appendTo.append(unitFormatString); - } + formatAbsoluteImpl(direction, absunit, output, status); + if (output.getStringRef().length() != 0) { + return; } } // otherwise fallback to formatNumeric - return formatNumeric(offset, unit, appendTo, status); + formatNumericImpl(offset, unit, output, status); } UnicodeString& RelativeDateTimeFormatter::combineDateAndTime( @@ -997,19 +1176,31 @@ UnicodeString& RelativeDateTimeFormatter::combineDateAndTime( timeString, relativeDateString, appendTo, status); } -void RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const { +UnicodeString& RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const { if (fOptBreakIterator == nullptr || str.length() == 0 || !u_islower(str.char32At(0))) { - return; + return str; } // Must guarantee that one thread at a time accesses the shared break // iterator. + static icu::UMutex gBrkIterMutex = U_MUTEX_INITIALIZER; Mutex lock(&gBrkIterMutex); str.toTitle( fOptBreakIterator->get(), fLocale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + return str; +} + +UBool RelativeDateTimeFormatter::checkNoAdjustForContext(UErrorCode& status) const { + // This is unsupported because it's hard to keep fields in sync with title + // casing. The code could be written and tested if there is demand. + if (fOptBreakIterator != nullptr) { + status = U_UNSUPPORTED_ERROR; + return FALSE; + } + return TRUE; } void RelativeDateTimeFormatter::init( @@ -1065,6 +1256,17 @@ U_NAMESPACE_END U_NAMESPACE_USE + +// Magic number: "FRDT" (FormattedRelativeDateTime) in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedRelativeDateTime, + UFormattedRelativeDateTime, + UFormattedRelativeDateTimeImpl, + UFormattedRelativeDateTimeApiHelper, + ureldatefmt, + 0x46524454) + + U_CAPI URelativeDateTimeFormatter* U_EXPORT2 ureldatefmt_open( const char* locale, UNumberFormat* nfToAdopt, @@ -1118,6 +1320,21 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, return res.extract(result, resultCapacity, *status); } +U_STABLE void U_EXPORT2 +ureldatefmt_formatNumericToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* fmt = reinterpret_cast(reldatefmt); + auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); + resultImpl->fImpl = fmt->formatNumericToValue(offset, unit, *status); +} + U_CAPI int32_t U_EXPORT2 ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, double offset, @@ -1146,6 +1363,21 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, return res.extract(result, resultCapacity, *status); } +U_DRAFT void U_EXPORT2 +ureldatefmt_formatToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* fmt = reinterpret_cast(reldatefmt); + auto* resultImpl = UFormattedRelativeDateTimeApiHelper::validate(result, *status); + resultImpl->fImpl = fmt->formatToValue(offset, unit, *status); +} + U_CAPI int32_t U_EXPORT2 ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt, const UChar * relativeDateString, diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index 95fd0d2240af95..3b8d2333d82098 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -717,7 +717,7 @@ UBool RegexMatcher::find(UErrorCode &status) { if (findProgressInterrupt(startPos, status)) return FALSE; } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_START: // Matches are only possible at the start of the input string @@ -765,7 +765,7 @@ UBool RegexMatcher::find(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_STRING: case START_CHAR: @@ -797,7 +797,7 @@ UBool RegexMatcher::find(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_LINE: { @@ -877,11 +877,10 @@ UBool RegexMatcher::find(UErrorCode &status) { } default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } - U_ASSERT(FALSE); - return FALSE; + UPRV_UNREACHABLE; } @@ -992,7 +991,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { if (findProgressInterrupt(startPos, status)) return FALSE; } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_START: // Matches are only possible at the start of the input string @@ -1034,7 +1033,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_STRING: case START_CHAR: @@ -1063,7 +1062,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { return FALSE; } } - U_ASSERT(FALSE); + UPRV_UNREACHABLE; case START_LINE: { @@ -1134,11 +1133,10 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) { } default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } - U_ASSERT(FALSE); - return FALSE; + UPRV_UNREACHABLE; } @@ -4278,7 +4276,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { default: // Trouble. The compiled pattern contains an entry with an // unrecognized type tag. - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } if (U_FAILURE(status)) { @@ -5778,7 +5776,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu default: // Trouble. The compiled pattern contains an entry with an // unrecognized type tag. - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } if (U_FAILURE(status)) { diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index b057b6bbd5a12f..92fa5385971889 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -1554,11 +1554,7 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, "collation", locale, NULL, &errorCode); if(U_FAILURE(errorCode)) { return 0; } - if(length == 0) { - uprv_strcpy(resultLocale, "root"); - } else { - resultLocale[length] = 0; - } + resultLocale[length] = 0; // Append items in alphabetic order of their short definition letters. CharString result; @@ -1585,7 +1581,11 @@ RuleBasedCollator::internalGetShortDefinitionString(const char *locale, length = uloc_getKeywordValue(resultLocale, "collation", subtag, UPRV_LENGTHOF(subtag), &errorCode); appendSubtag(result, 'K', subtag, length, errorCode); length = uloc_getLanguage(resultLocale, subtag, UPRV_LENGTHOF(subtag), &errorCode); - appendSubtag(result, 'L', subtag, length, errorCode); + if (length == 0) { + appendSubtag(result, 'L', "root", 4, errorCode); + } else { + appendSubtag(result, 'L', subtag, length, errorCode); + } if(attributeHasBeenSetExplicitly(UCOL_NORMALIZATION_MODE)) { appendAttribute(result, 'N', getAttribute(UCOL_NORMALIZATION_MODE, errorCode), errorCode); } diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h index 385c3e3e534086..99a71ec803f36d 100644 --- a/deps/icu-small/source/i18n/scriptset.h +++ b/deps/icu-small/source/i18n/scriptset.h @@ -40,7 +40,7 @@ class U_I18N_API ScriptSet: public UMemory { ~ScriptSet(); UBool operator == (const ScriptSet &other) const; - UBool operator != (const ScriptSet &other) const {return !(*this == other);}; + UBool operator != (const ScriptSet &other) const {return !(*this == other);} ScriptSet & operator = (const ScriptSet &other); UBool test(UScriptCode script, UErrorCode &status) const; diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp index 9bce8ed55705ee..1af5292a823324 100644 --- a/deps/icu-small/source/i18n/simpletz.cpp +++ b/deps/icu-small/source/i18n/simpletz.cpp @@ -1077,13 +1077,13 @@ SimpleTimeZone::deleteTransitionRules(void) { * allocate it in the constructors. This would be a more intrusive change, but doable * if performance turns out to be an issue. */ -static UMutex gLock = U_MUTEX_INITIALIZER; void SimpleTimeZone::checkTransitionRules(UErrorCode& status) const { if (U_FAILURE(status)) { return; } + static UMutex gLock = U_MUTEX_INITIALIZER; umtx_lock(&gLock); if (!transitionRulesInitialized) { SimpleTimeZone *ncThis = const_cast(this); diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 2bc8e49625fe29..e67c4538287b9e 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -230,7 +230,10 @@ static const int32_t gFieldRangeBias[] = { static const int32_t HEBREW_CAL_CUR_MILLENIUM_START_YEAR = 5000; static const int32_t HEBREW_CAL_CUR_MILLENIUM_END_YEAR = 6000; -static UMutex LOCK = U_MUTEX_INITIALIZER; +static UMutex *LOCK() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SimpleDateFormat) @@ -856,6 +859,17 @@ SimpleDateFormat::initialize(const Locale& locale, { if (U_FAILURE(status)) return; + parsePattern(); // Need this before initNumberFormatters(), to set fHasHanYearChar + + // Simple-minded hack to force Gannen year numbering for ja@calendar=japanese + // if format is non-numeric (includes 年) and fDateOverride is not already specified. + // Now this does get updated if applyPattern subsequently changes the pattern type. + if (fDateOverride.isBogus() && fHasHanYearChar && + fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { + fDateOverride.setTo(u"y=jpanyear", -1); + } + // We don't need to check that the row count is >= 1, since all 2d arrays have at // least one row fNumberFormat = NumberFormat::createInstance(locale, status); @@ -872,8 +886,6 @@ SimpleDateFormat::initialize(const Locale& locale, { status = U_MISSING_RESOURCE_ERROR; } - - parsePattern(); } /* Initialize the fields we use to disambiguate ambiguous years. Separate @@ -1254,14 +1266,14 @@ SimpleDateFormat::initNumberFormatters(const Locale &locale,UErrorCode &status) if ( fDateOverride.isBogus() && fTimeOverride.isBogus() ) { return; } - umtx_lock(&LOCK); + umtx_lock(LOCK()); if (fSharedNumberFormatters == NULL) { fSharedNumberFormatters = allocSharedNumberFormatters(); if (fSharedNumberFormatters == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } } - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); if (U_FAILURE(status)) { return; @@ -1778,7 +1790,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } } else { - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } appendTo += zoneString; @@ -1950,7 +1962,8 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } #if !UCONFIG_NO_BREAK_ITERATION // if first field, check to see whether we need to and are able to titlecase it - if (fieldNum == 0 && u_islower(appendTo.char32At(beginOffset)) && fCapitalizationBrkIter != NULL) { + if (fieldNum == 0 && fCapitalizationBrkIter != NULL && appendTo.length() > beginOffset && + u_islower(appendTo.char32At(beginOffset))) { UBool titlecase = FALSE; switch (capitalizationContext) { case UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE: @@ -2079,7 +2092,7 @@ SimpleDateFormat::zeroPaddingNumber( if (U_FAILURE(localStatus)) { return; } - appendTo.append(result.string.toTempUnicodeString()); + appendTo.append(result.getStringRef().toTempUnicodeString()); return; } @@ -3872,6 +3885,42 @@ SimpleDateFormat::applyPattern(const UnicodeString& pattern) { fPattern = pattern; parsePattern(); + + // Hack to update use of Gannen year numbering for ja@calendar=japanese - + // use only if format is non-numeric (includes 年) and no other fDateOverride. + if (fCalendar != nullptr && uprv_strcmp(fCalendar->getType(),"japanese") == 0 && + uprv_strcmp(fLocale.getLanguage(),"ja") == 0) { + if (fDateOverride==UnicodeString(u"y=jpanyear") && !fHasHanYearChar) { + // Gannen numbering is set but new pattern should not use it, unset; + // use procedure from adoptNumberFormat to clear overrides + if (fSharedNumberFormatters) { + freeSharedNumberFormatters(fSharedNumberFormatters); + fSharedNumberFormatters = NULL; + } + fDateOverride.setToBogus(); // record status + } else if (fDateOverride.isBogus() && fHasHanYearChar) { + // No current override (=> no Gannen numbering) but new pattern needs it; + // use procedures from initNUmberFormatters / adoptNumberFormat + umtx_lock(LOCK()); + if (fSharedNumberFormatters == NULL) { + fSharedNumberFormatters = allocSharedNumberFormatters(); + } + umtx_unlock(LOCK()); + if (fSharedNumberFormatters != NULL) { + Locale ovrLoc(fLocale.getLanguage(),fLocale.getCountry(),fLocale.getVariant(),"numbers=jpanyear"); + UErrorCode status = U_ZERO_ERROR; + const SharedNumberFormat *snf = createSharedNumberFormat(ovrLoc, status); + if (U_SUCCESS(status)) { + // Now that we have an appropriate number formatter, fill in the + // appropriate slot in the number formatters table. + UDateFormatField patternCharIndex = DateFormatSymbols::getPatternCharIndex(u'y'); + SharedObject::copyPtr(snf, fSharedNumberFormatters[patternCharIndex]); + snf->deleteIfZeroRefCount(); + fDateOverride.setTo(u"y=jpanyear", -1); // record status + } + } + } + } } //---------------------------------------------------------------------- @@ -4188,7 +4237,7 @@ SimpleDateFormat::skipUWhiteSpace(const UnicodeString& text, int32_t pos) const TimeZoneFormat * SimpleDateFormat::tzFormat(UErrorCode &status) const { if (fTimeZoneFormat == NULL) { - umtx_lock(&LOCK); + umtx_lock(LOCK()); { if (fTimeZoneFormat == NULL) { TimeZoneFormat *tzfmt = TimeZoneFormat::createInstance(fLocale, status); @@ -4199,7 +4248,7 @@ SimpleDateFormat::tzFormat(UErrorCode &status) const { const_cast(this)->fTimeZoneFormat = tzfmt; } } - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); } return fTimeZoneFormat; } @@ -4207,6 +4256,7 @@ SimpleDateFormat::tzFormat(UErrorCode &status) const { void SimpleDateFormat::parsePattern() { fHasMinute = FALSE; fHasSecond = FALSE; + fHasHanYearChar = FALSE; int len = fPattern.length(); UBool inQuote = FALSE; @@ -4215,6 +4265,9 @@ void SimpleDateFormat::parsePattern() { if (ch == QUOTE) { inQuote = !inQuote; } + if (ch == 0x5E74) { // don't care whether this is inside quotes + fHasHanYearChar = TRUE; + } if (!inQuote) { if (ch == 0x6D) { // 0x6D == 'm' fHasMinute = TRUE; diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index dbf614469e8311..70169b5c1f576d 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -115,9 +115,14 @@ static const int32_t UNKNOWN_ZONE_ID_LENGTH = 11; static icu::TimeZone* DEFAULT_ZONE = NULL; static icu::UInitOnce gDefaultZoneInitOnce = U_INITONCE_INITIALIZER; -static icu::TimeZone* _GMT = NULL; -static icu::TimeZone* _UNKNOWN_ZONE = NULL; +alignas(icu::SimpleTimeZone) +static char gRawGMT[sizeof(icu::SimpleTimeZone)]; + +alignas(icu::SimpleTimeZone) +static char gRawUNKNOWN[sizeof(icu::SimpleTimeZone)]; + static icu::UInitOnce gStaticZonesInitOnce = U_INITONCE_INITIALIZER; +static UBool gStaticZonesInitialized = FALSE; // Whether the static zones are initialized and ready to use. static char TZDATA_VERSION[16]; static icu::UInitOnce gTZDataVersionInitOnce = U_INITONCE_INITIALIZER; @@ -142,11 +147,12 @@ static UBool U_CALLCONV timeZone_cleanup(void) DEFAULT_ZONE = NULL; gDefaultZoneInitOnce.reset(); - delete _GMT; - _GMT = NULL; - delete _UNKNOWN_ZONE; - _UNKNOWN_ZONE = NULL; - gStaticZonesInitOnce.reset(); + if (gStaticZonesInitialized) { + reinterpret_cast(gRawGMT)->~SimpleTimeZone(); + reinterpret_cast(gRawUNKNOWN)->~SimpleTimeZone(); + gStaticZonesInitialized = FALSE; + gStaticZonesInitOnce.reset(); + } uprv_memset(TZDATA_VERSION, 0, sizeof(TZDATA_VERSION)); gTZDataVersionInitOnce.reset(); @@ -272,7 +278,7 @@ static UResourceBundle* openOlsonResource(const UnicodeString& id, UResourceBundle& res, UErrorCode& ec) { -#if U_DEBUG_TZ +#ifdef U_DEBUG_TZ char buf[128]; id.extract(0, sizeof(buf)-1, buf, sizeof(buf), ""); #endif @@ -304,8 +310,12 @@ void U_CALLCONV initStaticTimeZones() { // Initialize _GMT independently of other static data; it should // be valid even if we can't load the time zone UDataMemory. ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); - _UNKNOWN_ZONE = new SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)); - _GMT = new SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH)); + + // new can't fail below, as we use placement new into staticly allocated space. + new(gRawGMT) SimpleTimeZone(0, UnicodeString(TRUE, GMT_ID, GMT_ID_LENGTH)); + new(gRawUNKNOWN) SimpleTimeZone(0, UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH)); + + gStaticZonesInitialized = TRUE; } } // anonymous namespace @@ -314,14 +324,14 @@ const TimeZone& U_EXPORT2 TimeZone::getUnknown() { umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); - return *_UNKNOWN_ZONE; + return *reinterpret_cast(gRawUNKNOWN); } const TimeZone* U_EXPORT2 TimeZone::getGMT(void) { umtx_initOnce(gStaticZonesInitOnce, &initStaticTimeZones); - return _GMT; + return reinterpret_cast(gRawGMT); } // ***************************************************************************** @@ -382,23 +392,22 @@ createSystemTimeZone(const UnicodeString& id, UErrorCode& ec) { return NULL; } TimeZone* z = 0; - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; U_DEBUG_TZ_MSG(("pre-err=%s\n", u_errorName(ec))); - UResourceBundle *top = openOlsonResource(id, res, ec); + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); U_DEBUG_TZ_MSG(("post-err=%s\n", u_errorName(ec))); if (U_SUCCESS(ec)) { - z = new OlsonTimeZone(top, &res, id, ec); + z = new OlsonTimeZone(top, res.getAlias(), id, ec); if (z == NULL) { - U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); + ec = U_MEMORY_ALLOCATION_ERROR; + U_DEBUG_TZ_MSG(("cstz: olson time zone failed to initialize - err %s\n", u_errorName(ec))); } } - ures_close(&res); ures_close(top); if (U_FAILURE(ec)) { U_DEBUG_TZ_MSG(("cstz: failed to create, err %s\n", u_errorName(ec))); delete z; - z = 0; + z = NULL; } return z; } @@ -436,11 +445,8 @@ TimeZone::createTimeZone(const UnicodeString& ID) if (result == NULL) { U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unknown(GMT)")); const TimeZone& unknown = getUnknown(); - if (_UNKNOWN_ZONE == NULL) { // Cannot test (&unknown == NULL) because the - U_DEBUG_TZ_MSG(("failed to getUnknown()")); // behavior of NULL references is undefined. - } else { - result = unknown.clone(); - } + // Unknown zone uses staticly allocated memory, so creation of it can never fail due to OOM. + result = unknown.clone(); } return result; } @@ -450,10 +456,11 @@ TimeZone::createTimeZone(const UnicodeString& ID) TimeZone* U_EXPORT2 TimeZone::detectHostTimeZone() { - // We access system timezone data through TPlatformUtilities, - // including tzset(), timezone, and tzname[]. + // We access system timezone data through uprv_tzset(), uprv_tzname(), and others, + // which have platform specific implementations in putil.cpp int32_t rawOffset = 0; const char *hostID; + UBool hostDetectionSucceeded = TRUE; // First, try to create a system timezone, based // on the string ID in tzname[0]. @@ -464,8 +471,7 @@ TimeZone::detectHostTimeZone() // Get the timezone ID from the host. This function should do // any required host-specific remapping; e.g., on Windows this - // function maps the Date and Time control panel setting to an - // ICU timezone ID. + // function maps the Windows Time Zone name to an ICU timezone ID. hostID = uprv_tzname(0); // Invert sign because UNIX semantics are backwards @@ -473,10 +479,15 @@ TimeZone::detectHostTimeZone() TimeZone* hostZone = NULL; - /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */ UnicodeString hostStrID(hostID, -1, US_INV); - hostStrID.append((UChar)0); - hostStrID.truncate(hostStrID.length()-1); + + if (hostStrID.length() == 0) { + // The host time zone detection (or remapping) above has failed and + // we have no name at all. Fallback to using the Unknown zone. + hostStrID = UnicodeString(TRUE, UNKNOWN_ZONE_ID, UNKNOWN_ZONE_ID_LENGTH); + hostDetectionSucceeded = FALSE; + } + hostZone = createSystemTimeZone(hostStrID); #if U_PLATFORM_USES_ONLY_WIN32_API @@ -496,22 +507,19 @@ TimeZone::detectHostTimeZone() // Construct a fixed standard zone with the host's ID // and raw offset. - if (hostZone == NULL) { + if (hostZone == NULL && hostDetectionSucceeded) { hostZone = new SimpleTimeZone(rawOffset, hostStrID); } - // If we _still_ don't have a time zone, use GMT. + // If we _still_ don't have a time zone, use the Unknown zone. // // Note: This is extremely unlikely situation. If // new SimpleTimeZone(...) above fails, the following // code may also fail. if (hostZone == NULL) { - const TimeZone* temptz = TimeZone::getGMT(); - // If we can't use GMT, get out. - if (temptz == NULL) { - return NULL; - } - hostZone = temptz->clone(); + // Unknown zone uses static allocated memory, so it must always exist. + // However, clone() allocates memory and can fail. + hostZone = TimeZone::getUnknown().clone(); } return hostZone; @@ -986,18 +994,14 @@ int32_t U_EXPORT2 TimeZone::countEquivalentIDs(const UnicodeString& id) { int32_t result = 0; UErrorCode ec = U_ZERO_ERROR; - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; U_DEBUG_TZ_MSG(("countEquivalentIDs..\n")); - UResourceBundle *top = openOlsonResource(id, res, ec); + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); if (U_SUCCESS(ec)) { - UResourceBundle r; - ures_initStackObject(&r); - ures_getByKey(&res, kLINKS, &r, &ec); - ures_getIntVector(&r, &result, &ec); - ures_close(&r); + StackUResourceBundle r; + ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec); + ures_getIntVector(r.getAlias(), &result, &ec); } - ures_close(&res); ures_close(top); return result; } @@ -1009,24 +1013,20 @@ TimeZone::getEquivalentID(const UnicodeString& id, int32_t index) { U_DEBUG_TZ_MSG(("gEI(%d)\n", index)); UnicodeString result; UErrorCode ec = U_ZERO_ERROR; - UResourceBundle res; - ures_initStackObject(&res); - UResourceBundle *top = openOlsonResource(id, res, ec); + StackUResourceBundle res; + UResourceBundle *top = openOlsonResource(id, res.ref(), ec); int32_t zone = -1; if (U_SUCCESS(ec)) { - UResourceBundle r; - ures_initStackObject(&r); + StackUResourceBundle r; int32_t size; - ures_getByKey(&res, kLINKS, &r, &ec); - const int32_t* v = ures_getIntVector(&r, &size, &ec); + ures_getByKey(res.getAlias(), kLINKS, r.getAlias(), &ec); + const int32_t *v = ures_getIntVector(r.getAlias(), &size, &ec); if (U_SUCCESS(ec)) { if (index >= 0 && index < size) { zone = v[index]; } } - ures_close(&r); } - ures_close(&res); if (zone >= 0) { UResourceBundle *ares = ures_getByKey(top, kNAMES, NULL, &ec); // dereference Zones section if (U_SUCCESS(ec)) { @@ -1181,9 +1181,9 @@ TimeZone::getDisplayName(const Locale& locale, UnicodeString& result) const } UnicodeString& -TimeZone::getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const +TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, UnicodeString& result) const { - return getDisplayName(daylight,style, Locale::getDefault(), result); + return getDisplayName(inDaylight,style, Locale::getDefault(), result); } //-------------------------------------- int32_t @@ -1195,7 +1195,7 @@ TimeZone::getDSTSavings()const { } //--------------------------------------- UnicodeString& -TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const +TimeZone::getDisplayName(UBool inDaylight, EDisplayType style, const Locale& locale, UnicodeString& result) const { UErrorCode status = U_ZERO_ERROR; UDate date = Calendar::getNow(); @@ -1220,13 +1220,13 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local tzfmt->format(UTZFMT_STYLE_GENERIC_SHORT, *this, date, result, &timeType); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } // Generic format many use Localized GMT as the final fallback. // When Localized GMT format is used, the result might not be // appropriate for the requested daylight value. - if ((daylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!daylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) { - offset = daylight ? getRawOffset() + getDSTSavings() : getRawOffset(); + if ((inDaylight && timeType == UTZFMT_TIME_TYPE_STANDARD) || (!inDaylight && timeType == UTZFMT_TIME_TYPE_DAYLIGHT)) { + offset = inDaylight ? getRawOffset() + getDSTSavings() : getRawOffset(); if (style == SHORT_GENERIC) { tzfmt->formatOffsetShortLocalizedGMT(offset, result, status); } else { @@ -1239,7 +1239,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local result.remove(); return result; } - offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); + offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); switch (style) { case LONG_GMT: tzfmt->formatOffsetLocalizedGMT(offset, result, status); @@ -1248,7 +1248,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local tzfmt->formatOffsetISO8601Basic(offset, FALSE, FALSE, FALSE, result, status); break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } } else { @@ -1256,14 +1256,14 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local UTimeZoneNameType nameType = UTZNM_UNKNOWN; switch (style) { case LONG: - nameType = daylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD; + nameType = inDaylight ? UTZNM_LONG_DAYLIGHT : UTZNM_LONG_STANDARD; break; case SHORT: case SHORT_COMMONLY_USED: - nameType = daylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD; + nameType = inDaylight ? UTZNM_SHORT_DAYLIGHT : UTZNM_SHORT_STANDARD; break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } LocalPointer tznames(TimeZoneNames::createInstance(locale, status)); if (U_FAILURE(status)) { @@ -1275,7 +1275,7 @@ TimeZone::getDisplayName(UBool daylight, EDisplayType style, const Locale& local if (result.isEmpty()) { // Fallback to localized GMT LocalPointer tzfmt(TimeZoneFormat::createInstance(locale, status)); - offset = daylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); + offset = inDaylight && useDaylightTime() ? getRawOffset() + getDSTSavings() : getRawOffset(); if (style == LONG) { tzfmt->formatOffsetLocalizedGMT(offset, result, status); } else { @@ -1496,8 +1496,9 @@ TimeZone::hasSameRules(const TimeZone& other) const static void U_CALLCONV initTZDataVersion(UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); int32_t len = 0; - UResourceBundle *bundle = ures_openDirect(NULL, kZONEINFO, &status); - const UChar *tzver = ures_getStringByKey(bundle, kTZVERSION, &len, &status); + StackUResourceBundle bundle; + ures_openDirectFillIn(bundle.getAlias(), NULL, kZONEINFO, &status); + const UChar *tzver = ures_getStringByKey(bundle.getAlias(), kTZVERSION, &len, &status); if (U_SUCCESS(status)) { if (len >= (int32_t)sizeof(TZDATA_VERSION)) { @@ -1506,8 +1507,6 @@ static void U_CALLCONV initTZDataVersion(UErrorCode &status) { } u_UCharsToChars(tzver, TZDATA_VERSION, len); } - ures_close(bundle); - } const char* diff --git a/deps/icu-small/source/i18n/tmunit.cpp b/deps/icu-small/source/i18n/tmunit.cpp index ca308cca225972..3e980105153da5 100644 --- a/deps/icu-small/source/i18n/tmunit.cpp +++ b/deps/icu-small/source/i18n/tmunit.cpp @@ -94,8 +94,7 @@ TimeUnit::TimeUnit(TimeUnit::UTimeUnitFields timeUnitField) { initTime("second"); break; default: - U_ASSERT(false); - break; + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index 50dac8b7cef8c0..dad8825e70ff33 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -224,7 +224,7 @@ TimeUnitFormat::parseObject(const UnicodeString& source, if (temp.getType() == Formattable::kString) { UnicodeString tmpString; UErrorCode pStatus = U_ZERO_ERROR; - getNumberFormat().parse(temp.getString(tmpString), tmpNumber, pStatus); + getNumberFormatInternal().parse(temp.getString(tmpString), tmpNumber, pStatus); if (U_FAILURE(pStatus)) { continue; } diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp index de54e952dcb570..9f5563b4796c19 100644 --- a/deps/icu-small/source/i18n/translit.cpp +++ b/deps/icu-small/source/i18n/translit.cpp @@ -91,7 +91,10 @@ static const char RB_RULE_BASED_IDS[] = "RuleBasedTransliteratorIDs"; /** * The mutex controlling access to registry object. */ -static UMutex registryMutex = U_MUTEX_INITIALIZER; +static icu::UMutex *registryMutex() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} /** * System transliterator registry; non-null when initialized. @@ -978,11 +981,11 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, TransliteratorAlias* alias = 0; Transliterator* t = 0; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { t = registry->get(id, alias, ec); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); if (U_FAILURE(ec)) { delete t; @@ -1010,11 +1013,11 @@ Transliterator* Transliterator::createBasicInstance(const UnicodeString& id, alias = 0; // Step 2. reget - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { t = registry->reget(id, parser, alias, ec); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); // Step 3. Loop back around! } else { @@ -1212,7 +1215,7 @@ UnicodeSet& Transliterator::getTargetSet(UnicodeSet& result) const { void U_EXPORT2 Transliterator::registerFactory(const UnicodeString& id, Transliterator::Factory factory, Transliterator::Token context) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerFactory(id, factory, context); @@ -1251,7 +1254,7 @@ void Transliterator::_registerSpecialInverse(const UnicodeString& target, * @see #unregister */ void U_EXPORT2 Transliterator::registerInstance(Transliterator* adoptedPrototype) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerInstance(adoptedPrototype); @@ -1265,7 +1268,7 @@ void Transliterator::_registerInstance(Transliterator* adoptedPrototype) { void U_EXPORT2 Transliterator::registerAlias(const UnicodeString& aliasID, const UnicodeString& realID) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _registerAlias(aliasID, realID); @@ -1287,7 +1290,7 @@ void Transliterator::_registerAlias(const UnicodeString& aliasID, */ void U_EXPORT2 Transliterator::unregister(const UnicodeString& ID) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { registry->remove(ID); @@ -1302,7 +1305,7 @@ void U_EXPORT2 Transliterator::unregister(const UnicodeString& ID) { */ int32_t U_EXPORT2 Transliterator::countAvailableIDs(void) { int32_t retVal = 0; - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { retVal = registry->countAvailableIDs(); @@ -1318,12 +1321,12 @@ int32_t U_EXPORT2 Transliterator::countAvailableIDs(void) { */ const UnicodeString& U_EXPORT2 Transliterator::getAvailableID(int32_t index) { const UnicodeString* result = NULL; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { result = ®istry->getAvailableID(index); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); U_ASSERT(result != NULL); // fail if no registry return *result; } @@ -1331,11 +1334,11 @@ const UnicodeString& U_EXPORT2 Transliterator::getAvailableID(int32_t index) { StringEnumeration* U_EXPORT2 Transliterator::getAvailableIDs(UErrorCode& ec) { if (U_FAILURE(ec)) return NULL; StringEnumeration* result = NULL; - umtx_lock(®istryMutex); + umtx_lock(registryMutex()); if (HAVE_REGISTRY(ec)) { result = registry->getAvailableIDs(); } - umtx_unlock(®istryMutex); + umtx_unlock(registryMutex()); if (result == NULL) { ec = U_INTERNAL_TRANSLITERATOR_ERROR; } @@ -1343,14 +1346,14 @@ StringEnumeration* U_EXPORT2 Transliterator::getAvailableIDs(UErrorCode& ec) { } int32_t U_EXPORT2 Transliterator::countAvailableSources(void) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableSources() : 0; } UnicodeString& U_EXPORT2 Transliterator::getAvailableSource(int32_t index, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableSource(index, result); @@ -1359,7 +1362,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableSource(int32_t index, } int32_t U_EXPORT2 Transliterator::countAvailableTargets(const UnicodeString& source) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableTargets(source) : 0; } @@ -1367,7 +1370,7 @@ int32_t U_EXPORT2 Transliterator::countAvailableTargets(const UnicodeString& sou UnicodeString& U_EXPORT2 Transliterator::getAvailableTarget(int32_t index, const UnicodeString& source, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableTarget(index, source, result); @@ -1377,7 +1380,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableTarget(int32_t index, int32_t U_EXPORT2 Transliterator::countAvailableVariants(const UnicodeString& source, const UnicodeString& target) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; return HAVE_REGISTRY(ec) ? _countAvailableVariants(source, target) : 0; } @@ -1386,7 +1389,7 @@ UnicodeString& U_EXPORT2 Transliterator::getAvailableVariant(int32_t index, const UnicodeString& source, const UnicodeString& target, UnicodeString& result) { - Mutex lock(®istryMutex); + Mutex lock(registryMutex()); UErrorCode ec = U_ZERO_ERROR; if (HAVE_REGISTRY(ec)) { _getAvailableVariant(index, source, target, result); diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index 4884773faf5ac3..032a73fd146559 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -186,8 +186,7 @@ Transliterator* TransliteratorAlias::create(UParseError& pe, } break; case RULES: - U_ASSERT(FALSE); // don't call create() if isRuleBased() returns TRUE! - break; + UPRV_UNREACHABLE; // don't call create() if isRuleBased() returns TRUE! } return t; } @@ -1396,8 +1395,7 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID } return 0; default: - U_ASSERT(FALSE); // can't get here - return 0; + UPRV_UNREACHABLE; // can't get here } } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/tridpars.cpp b/deps/icu-small/source/i18n/tridpars.cpp index 68bbd2d0407a7c..cbfdf03c427850 100644 --- a/deps/icu-small/source/i18n/tridpars.cpp +++ b/deps/icu-small/source/i18n/tridpars.cpp @@ -50,7 +50,10 @@ static UInitOnce gSpecialInversesInitOnce = U_INITONCE_INITIALIZER; /** * The mutex controlling access to SPECIAL_INVERSES */ -static UMutex LOCK = U_MUTEX_INITIALIZER; +static UMutex *LOCK() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} TransliteratorIDParser::Specs::Specs(const UnicodeString& s, const UnicodeString& t, const UnicodeString& v, UBool sawS, @@ -659,7 +662,7 @@ void TransliteratorIDParser::registerSpecialInverse(const UnicodeString& target, bidirectional = FALSE; } - Mutex lock(&LOCK); + Mutex lock(LOCK()); UnicodeString *tempus = new UnicodeString(inverseTarget); // Used for null pointer check before usage. if (tempus == NULL) { @@ -863,9 +866,9 @@ TransliteratorIDParser::specsToSpecialInverse(const Specs& specs, UErrorCode &st UnicodeString* inverseTarget; - umtx_lock(&LOCK); + umtx_lock(LOCK()); inverseTarget = (UnicodeString*) SPECIAL_INVERSES->get(specs.target); - umtx_unlock(&LOCK); + umtx_unlock(LOCK()); if (inverseTarget != NULL) { // If the original ID contained "Any-" then make the diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index df4dec1febf60a..c948c5f5e7b07c 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -147,7 +147,10 @@ static icu::UInitOnce gZoneIdTrieInitOnce = U_INITONCE_INITIALIZER; static TextTrieMap *gShortZoneIdTrie = NULL; static icu::UInitOnce gShortZoneIdTrieInitOnce = U_INITONCE_INITIALIZER; -static UMutex gLock = U_MUTEX_INITIALIZER; +static UMutex *gLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} U_CDECL_BEGIN /** @@ -267,7 +270,7 @@ GMTOffsetField::isValid(FieldType type, int32_t width) { case SECOND: return (width == 2); default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } return (width > 0); } @@ -589,8 +592,7 @@ TimeZoneFormat::setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, co required = FIELDS_HMS; break; default: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } UVector* patternItems = parseOffsetPattern(pattern, required, status); @@ -1028,7 +1030,7 @@ TimeZoneFormat::parse(UTimeZoneFormatStyle style, const UnicodeString& text, Par break; default: - U_ASSERT(FALSE); + UPRV_UNREACHABLE; } int32_t len = 0; @@ -1383,12 +1385,12 @@ TimeZoneFormat::getTimeZoneGenericNames(UErrorCode& status) const { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); if (fTimeZoneGenericNames == NULL) { TimeZoneFormat *nonConstThis = const_cast(this); nonConstThis->fTimeZoneGenericNames = TimeZoneGenericNames::createInstance(fLocale, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); return fTimeZoneGenericNames; } @@ -1399,7 +1401,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); if (fTZDBTimeZoneNames == NULL) { TZDBTimeZoneNames *tzdbNames = new TZDBTimeZoneNames(fLocale); if (tzdbNames == NULL) { @@ -1409,7 +1411,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { nonConstThis->fTZDBTimeZoneNames = tzdbNames; } } - umtx_unlock(&gLock); + umtx_unlock(gLock()); return fTZDBTimeZoneNames; } diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index 5f5b7db30227cc..4e3ecb4c6073b8 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -269,7 +269,10 @@ GNameSearchHandler::getMatches(int32_t& maxMatchLen) { return results; } -static UMutex gLock = U_MUTEX_INITIALIZER; +static UMutex *gLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} class TZGNCore : public UMemory { public: @@ -485,11 +488,11 @@ TZGNCore::getGenericLocationName(const UnicodeString& tzCanonicalID, UnicodeStri const UChar *locname = NULL; TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { locname = nonConstThis->getGenericLocationName(tzCanonicalID); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (locname == NULL) { name.setToBogus(); @@ -740,11 +743,11 @@ TZGNCore::getPartialLocationName(const UnicodeString& tzCanonicalID, const UChar *uplname = NULL; TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { uplname = nonConstThis->getPartialLocationName(tzCanonicalID, mzID, isLong, mzDisplayName); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (uplname == NULL) { name.setToBogus(); @@ -1007,11 +1010,11 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE TZGNCore *nonConstThis = const_cast(this); - umtx_lock(&gLock); + umtx_lock(gLock()); { fGNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (U_FAILURE(status)) { return NULL; @@ -1038,7 +1041,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE // All names are not yet loaded into the local trie. // Load all available names into the trie. This could be very heavy. - umtx_lock(&gLock); + umtx_lock(gLock()); { if (!fGNamesTrieFullyLoaded) { StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); @@ -1060,18 +1063,18 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE } } } - umtx_unlock(&gLock); + umtx_unlock(gLock()); if (U_FAILURE(status)) { return NULL; } - umtx_lock(&gLock); + umtx_lock(gLock()); { // now try it again fGNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); } - umtx_unlock(&gLock); + umtx_unlock(gLock()); results = handler.getMatches(maxLen); if (results != NULL && maxLen > 0) { @@ -1112,7 +1115,10 @@ typedef struct TZGNCoreRef { } TZGNCoreRef; // TZGNCore object cache handling -static UMutex gTZGNLock = U_MUTEX_INITIALIZER; +static UMutex *gTZGNLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gTZGNCoreCache = NULL; static UBool gTZGNCoreCacheInitialized = FALSE; @@ -1178,13 +1184,13 @@ TimeZoneGenericNames::TimeZoneGenericNames() } TimeZoneGenericNames::~TimeZoneGenericNames() { - umtx_lock(&gTZGNLock); + umtx_lock(gTZGNLock()); { U_ASSERT(fRef->refCount > 0); // Just decrement the reference count fRef->refCount--; } - umtx_unlock(&gTZGNLock); + umtx_unlock(gTZGNLock()); } TimeZoneGenericNames* @@ -1200,7 +1206,7 @@ TimeZoneGenericNames::createInstance(const Locale& locale, UErrorCode& status) { TZGNCoreRef *cacheEntry = NULL; { - Mutex lock(&gTZGNLock); + Mutex lock(gTZGNLock()); if (!gTZGNCoreCacheInitialized) { // Create empty hashtable @@ -1292,13 +1298,13 @@ TimeZoneGenericNames* TimeZoneGenericNames::clone() const { TimeZoneGenericNames* other = new TimeZoneGenericNames(); if (other) { - umtx_lock(&gTZGNLock); + umtx_lock(gTZGNLock()); { // Just increments the reference count fRef->refCount++; other->fRef = fRef; } - umtx_unlock(&gTZGNLock); + umtx_unlock(gTZGNLock()); } return other; } diff --git a/deps/icu-small/source/i18n/tzgnames.h b/deps/icu-small/source/i18n/tzgnames.h index d896af8ba82f1b..bcdf0f399ba8a1 100644 --- a/deps/icu-small/source/i18n/tzgnames.h +++ b/deps/icu-small/source/i18n/tzgnames.h @@ -46,7 +46,7 @@ class U_I18N_API TimeZoneGenericNames : public UMemory { static TimeZoneGenericNames* createInstance(const Locale& locale, UErrorCode& status); virtual UBool operator==(const TimeZoneGenericNames& other) const; - virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);}; + virtual UBool operator!=(const TimeZoneGenericNames& other) const {return !operator==(other);} virtual TimeZoneGenericNames* clone() const; UnicodeString& getDisplayName(const TimeZone& tz, UTimeZoneGenericNameType type, diff --git a/deps/icu-small/source/i18n/tznames.cpp b/deps/icu-small/source/i18n/tznames.cpp index 5a79c22aacf8f9..acd6aecdc0ce7e 100644 --- a/deps/icu-small/source/i18n/tznames.cpp +++ b/deps/icu-small/source/i18n/tznames.cpp @@ -29,7 +29,10 @@ U_NAMESPACE_BEGIN // TimeZoneNames object cache handling -static UMutex gTimeZoneNamesLock = U_MUTEX_INITIALIZER; +static UMutex *gTimeZoneNamesLock() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable *gTimeZoneNamesCache = NULL; static UBool gTimeZoneNamesCacheInitialized = FALSE; @@ -105,7 +108,7 @@ class TimeZoneNamesDelegate : public TimeZoneNames { virtual ~TimeZoneNamesDelegate(); virtual UBool operator==(const TimeZoneNames& other) const; - virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);}; + virtual UBool operator!=(const TimeZoneNames& other) const {return !operator==(other);} virtual TimeZoneNames* clone() const; StringEnumeration* getAvailableMetaZoneIDs(UErrorCode& status) const; @@ -132,7 +135,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate() } TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& status) { - Mutex lock(&gTimeZoneNamesLock); + Mutex lock(gTimeZoneNamesLock()); if (!gTimeZoneNamesCacheInitialized) { // Create empty hashtable if it is not already initialized. gTimeZoneNamesCache = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); @@ -208,7 +211,7 @@ TimeZoneNamesDelegate::TimeZoneNamesDelegate(const Locale& locale, UErrorCode& s } TimeZoneNamesDelegate::~TimeZoneNamesDelegate() { - umtx_lock(&gTimeZoneNamesLock); + umtx_lock(gTimeZoneNamesLock()); { if (fTZnamesCacheEntry) { U_ASSERT(fTZnamesCacheEntry->refCount > 0); @@ -216,7 +219,7 @@ TimeZoneNamesDelegate::~TimeZoneNamesDelegate() { fTZnamesCacheEntry->refCount--; } } - umtx_unlock(&gTimeZoneNamesLock); + umtx_unlock(gTimeZoneNamesLock()); } UBool @@ -237,13 +240,13 @@ TimeZoneNames* TimeZoneNamesDelegate::clone() const { TimeZoneNamesDelegate* other = new TimeZoneNamesDelegate(); if (other != NULL) { - umtx_lock(&gTimeZoneNamesLock); + umtx_lock(gTimeZoneNamesLock()); { // Just increment the reference count fTZnamesCacheEntry->refCount++; other->fTZnamesCacheEntry = fTZnamesCacheEntry; } - umtx_unlock(&gTimeZoneNamesLock); + umtx_unlock(gTimeZoneNamesLock()); } return other; } diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index 6a303ea4a0110f..d6e0ee2fbb637a 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -49,8 +49,10 @@ static const UChar NO_NAME[] = { 0 }; // for empty no-fallback time static const char* TZDBNAMES_KEYS[] = {"ss", "sd"}; static const int32_t TZDBNAMES_KEYS_SIZE = UPRV_LENGTHOF(TZDBNAMES_KEYS); -static UMutex gTZDBNamesMapLock = U_MUTEX_INITIALIZER; -static UMutex gDataMutex = U_MUTEX_INITIALIZER; +static UMutex *gDataMutex() { + static UMutex m = U_MUTEX_INITIALIZER; + return &m; +} static UHashtable* gTZDBNamesMap = NULL; static icu::UInitOnce gTZDBNamesMapInitOnce = U_INITONCE_INITIALIZER; @@ -357,8 +359,6 @@ TextTrieMap::getChildNode(CharacterNode *parent, UChar c) const { return NULL; } -// Mutex for protecting the lazy creation of the Trie node structure on the first call to search(). -static UMutex TextTrieMutex = U_MUTEX_INITIALIZER; // buildTrie() - The Trie node structure is needed. Create it from the data that was // saved at the time the ZoneStringFormatter was created. The Trie is only @@ -386,6 +386,10 @@ TextTrieMap::search(const UnicodeString &text, int32_t start, // the ICU atomic safe functions for assigning and testing. // Don't test the pointer fLazyContents. // Don't do unless it's really required. + + // Mutex for protecting the lazy creation of the Trie node structure on the first call to search(). + static UMutex TextTrieMutex = U_MUTEX_INITIALIZER; + Mutex lock(&TextTrieMutex); if (fLazyContents != NULL) { TextTrieMap *nonConstThis = const_cast(this); @@ -1210,7 +1214,7 @@ TimeZoneNamesImpl::getMetaZoneDisplayName(const UnicodeString& mzID, TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; znames = nonConstThis->loadMetaZoneNames(mzID, status); if (U_FAILURE(status)) { return name; } @@ -1236,7 +1240,7 @@ TimeZoneNamesImpl::getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNa TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; tznames = nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return name; } @@ -1259,7 +1263,7 @@ TimeZoneNamesImpl::getExemplarLocationName(const UnicodeString& tzID, UnicodeStr TimeZoneNamesImpl *nonConstThis = const_cast(this); { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); UErrorCode status = U_ZERO_ERROR; tznames = nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return name; } @@ -1354,7 +1358,7 @@ TimeZoneNamesImpl::find(const UnicodeString& text, int32_t start, uint32_t types // Synchronize so that data is not loaded multiple times. // TODO: Consider more fine-grained synchronization. { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); // First try of lookup. matches = doFind(handler, text, start, status); @@ -1581,7 +1585,7 @@ void TimeZoneNamesImpl::loadAllDisplayNames(UErrorCode& status) { if (U_FAILURE(status)) return; { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); internalLoadAllDisplayNames(status); } } @@ -1598,7 +1602,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, // Load the time zone strings { - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); tznames = (void*) nonConstThis->loadTimeZoneNames(tzID, status); if (U_FAILURE(status)) { return; } } @@ -1618,7 +1622,7 @@ void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, } else { // Load the meta zone strings // Mutex is scoped to the "else" statement - Mutex lock(&gDataMutex); + Mutex lock(gDataMutex()); mznames = (void*) nonConstThis->loadMetaZoneNames(mzID, status); if (U_FAILURE(status)) { return; } // Note: when the metazone doesn't exist, in Java, loadMetaZoneNames returns @@ -2243,6 +2247,7 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu U_ASSERT(status == U_ZERO_ERROR); // already checked length above mzIDKey[mzID.length()] = 0; + static UMutex gTZDBNamesMapLock = U_MUTEX_INITIALIZER; umtx_lock(&gTZDBNamesMapLock); { void *cacheVal = uhash_get(gTZDBNamesMap, mzIDKey); diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 4c13b9ffcb539a..2f70a8500e1c09 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -60,6 +60,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_CDFINFO, UCLN_I18N_REGION, UCLN_I18N_LIST_FORMATTER, + UCLN_I18N_NUMSYS, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index 56ed5b3c19caca..aa4027eb87212b 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -348,7 +348,7 @@ CollationLoader::loadFromCollations(UErrorCode &errorCode) { const char *actualLocale = ures_getLocaleByType(data, ULOC_ACTUAL_LOCALE, &errorCode); if(U_FAILURE(errorCode)) { return NULL; } const char *vLocale = validLocale.getBaseName(); - UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0; + UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale); // Set the collation types on the informational locales, // except when they match the default types (for brevity and backwards compatibility). @@ -410,7 +410,7 @@ CollationLoader::loadFromData(UErrorCode &errorCode) { const char *actualLocale = locale.getBaseName(); // without type const char *vLocale = validLocale.getBaseName(); - UBool actualAndValidLocalesAreDifferent = uprv_strcmp(actualLocale, vLocale) != 0; + UBool actualAndValidLocalesAreDifferent = Locale(actualLocale) != Locale(vLocale); // For the actual locale, suppress the default type *according to the actual locale*. // For example, zh has default=pinyin and contains all of the Chinese tailorings. diff --git a/deps/icu-small/source/i18n/udateintervalformat.cpp b/deps/icu-small/source/i18n/udateintervalformat.cpp index 44ba6b9fb1df38..d9eaae4d3e23cf 100644 --- a/deps/icu-small/source/i18n/udateintervalformat.cpp +++ b/deps/icu-small/source/i18n/udateintervalformat.cpp @@ -18,10 +18,21 @@ #include "unicode/timezone.h" #include "unicode/locid.h" #include "unicode/unistr.h" +#include "formattedval_impl.h" U_NAMESPACE_USE +// Magic number: FDIV in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedDateInterval, + UFormattedDateInterval, + UFormattedDateIntervalImpl, + UFormattedDateIntervalApiHelper, + udtitvfmt, + 0x46444956) + + U_CAPI UDateIntervalFormat* U_EXPORT2 udtitvfmt_open(const char* locale, const UChar* skeleton, @@ -105,4 +116,21 @@ udtitvfmt_format(const UDateIntervalFormat* formatter, } +U_DRAFT void U_EXPORT2 +udtitvfmt_formatToResult( + const UDateIntervalFormat* formatter, + UFormattedDateInterval* result, + UDate fromDate, + UDate toDate, + UErrorCode* status) { + if (U_FAILURE(*status)) { + return; + } + auto* resultImpl = UFormattedDateIntervalApiHelper::validate(result, *status); + DateInterval interval = DateInterval(fromDate,toDate); + resultImpl->fImpl = reinterpret_cast(formatter) + ->formatToValue(interval, *status); +} + + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/ulistformatter.cpp b/deps/icu-small/source/i18n/ulistformatter.cpp index c140c784b520cd..f7ad6751d338c0 100644 --- a/deps/icu-small/source/i18n/ulistformatter.cpp +++ b/deps/icu-small/source/i18n/ulistformatter.cpp @@ -15,6 +15,7 @@ #include "unicode/listformatter.h" #include "unicode/localpointer.h" #include "cmemory.h" +#include "formattedval_impl.h" U_NAMESPACE_USE @@ -40,6 +41,49 @@ ulistfmt_close(UListFormatter *listfmt) } +// Magic number: FLST in ASCII +UPRV_FORMATTED_VALUE_CAPI_AUTO_IMPL( + FormattedList, + UFormattedList, + UFormattedListImpl, + UFormattedListApiHelper, + ulistfmt, + 0x464C5354) + + +static UnicodeString* getUnicodeStrings( + const UChar* const strings[], + const int32_t* stringLengths, + int32_t stringCount, + UnicodeString* length4StackBuffer, + LocalArray& maybeOwner, + UErrorCode& status) { + U_ASSERT(U_SUCCESS(status)); + if (stringCount < 0 || (strings == NULL && stringCount > 0)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + UnicodeString* ustrings = length4StackBuffer; + if (stringCount > 4) { + maybeOwner.adoptInsteadAndCheckErrorCode(new UnicodeString[stringCount], status); + if (U_FAILURE(status)) { + return nullptr; + } + ustrings = maybeOwner.getAlias(); + } + if (stringLengths == NULL) { + for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { + ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1); + } + } else { + for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { + ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]); + } + } + return ustrings; +} + + U_CAPI int32_t U_EXPORT2 ulistfmt_format(const UListFormatter* listfmt, const UChar* const strings[], @@ -52,27 +96,16 @@ ulistfmt_format(const UListFormatter* listfmt, if (U_FAILURE(*status)) { return -1; } - if (stringCount < 0 || (strings == NULL && stringCount > 0) || ((result == NULL)? resultCapacity != 0 : resultCapacity < 0)) { + if ((result == NULL) ? resultCapacity != 0 : resultCapacity < 0) { *status = U_ILLEGAL_ARGUMENT_ERROR; return -1; } - UnicodeString ustringsStackBuf[4]; - UnicodeString* ustrings = ustringsStackBuf; - if (stringCount > UPRV_LENGTHOF(ustringsStackBuf)) { - ustrings = new UnicodeString[stringCount]; - if (ustrings == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return -1; - } - } - if (stringLengths == NULL) { - for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { - ustrings[stringIndex].setTo(TRUE, strings[stringIndex], -1); - } - } else { - for (int32_t stringIndex = 0; stringIndex < stringCount; stringIndex++) { - ustrings[stringIndex].setTo(stringLengths[stringIndex] < 0, strings[stringIndex], stringLengths[stringIndex]); - } + UnicodeString length4StackBuffer[4]; + LocalArray maybeOwner; + UnicodeString* ustrings = getUnicodeStrings( + strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status); + if (U_FAILURE(*status)) { + return -1; } UnicodeString res; if (result != NULL) { @@ -80,12 +113,33 @@ ulistfmt_format(const UListFormatter* listfmt, // otherwise, alias the destination buffer (copied from udat_format) res.setTo(result, 0, resultCapacity); } - ((const ListFormatter*)listfmt)->format( ustrings, stringCount, res, *status ); - if (ustrings != ustringsStackBuf) { - delete[] ustrings; - } + reinterpret_cast(listfmt)->format( ustrings, stringCount, res, *status ); return res.extract(result, resultCapacity, *status); } +U_CAPI void U_EXPORT2 +ulistfmt_formatStringsToResult( + const UListFormatter* listfmt, + const UChar* const strings[], + const int32_t * stringLengths, + int32_t stringCount, + UFormattedList* uresult, + UErrorCode* status) { + auto* result = UFormattedListApiHelper::validate(uresult, *status); + if (U_FAILURE(*status)) { + return; + } + UnicodeString length4StackBuffer[4]; + LocalArray maybeOwner; + UnicodeString* ustrings = getUnicodeStrings( + strings, stringLengths, stringCount, length4StackBuffer, maybeOwner, *status); + if (U_FAILURE(*status)) { + return; + } + result->fImpl = reinterpret_cast(listfmt) + ->formatStringsToValue(ustrings, stringCount, *status); +} + + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index 7f6ba9532feebe..2aae3a4d4393e3 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -463,9 +463,7 @@ umsg_vformat( const UMessageFormat *fmt, default: // Unknown/unsupported argument type. - U_ASSERT(FALSE); - *status=U_ILLEGAL_ARGUMENT_ERROR; - break; + UPRV_UNREACHABLE; } } UnicodeString resultStr; @@ -592,13 +590,11 @@ umsg_vparse(const UMessageFormat *fmt, // support kObject. When MessageFormat is changed to // understand MeasureFormats, modify this code to do the // right thing. [alan] - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; // better not happen! case Formattable::kArray: - U_ASSERT(FALSE); - break; + UPRV_UNREACHABLE; } } diff --git a/deps/icu-small/source/i18n/unicode/alphaindex.h b/deps/icu-small/source/i18n/unicode/alphaindex.h index 4ebdf1cc56a1a8..dfb6110a36cf11 100644 --- a/deps/icu-small/source/i18n/unicode/alphaindex.h +++ b/deps/icu-small/source/i18n/unicode/alphaindex.h @@ -651,7 +651,7 @@ class U_I18N_API AlphabeticIndex: public UObject { /** * No assignment. */ - AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;}; + AlphabeticIndex &operator =(const AlphabeticIndex & /*other*/) { return *this;} /** * No Equality operators. diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index 48cadc10b704af..63739c37fd569b 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -44,6 +44,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { /** * Construct an object with the given ISO currency code. + * * @param isoCode the 3-letter ISO 4217 currency code; must have * length 3 and need not be NUL-terminated. If NULL, the currency * is initialized to the unknown currency XXX. @@ -53,6 +54,19 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { */ CurrencyUnit(ConstChar16Ptr isoCode, UErrorCode &ec); +#ifndef U_HIDE_DRAFT_API + /** + * Construct an object with the given ISO currency code. + * + * @param isoCode the 3-letter ISO 4217 currency code; must have + * length 3. If invalid, the currency is initialized to XXX. + * @param ec input-output error code. If the isoCode is invalid, + * then this will be set to a failing value. + * @draft ICU 64 + */ + CurrencyUnit(StringPiece isoCode, UErrorCode &ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Copy constructor * @stable ICU 3.0 diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index b3a5cc0495f144..097a38fb88f6b2 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -63,18 +63,6 @@ class NumberParserImpl; } } -/** - * \cond - * explicit template instantiation. see digitlst.h - * (When building DLLs for Windows this is required.) - */ -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) -template class U_I18N_API EnumSet; -#endif -/** \endcond */ - /** * **IMPORTANT:** New users are strongly encouraged to see if * numberformatter.h fits their use case. Although not deprecated, this header @@ -288,7 +276,7 @@ template class U_I18N_API EnumSetPad escape, precedes pad character * * - *

A DecimalFormat pattern contains a postive and negative + *

A DecimalFormat pattern contains a positive and negative * subpattern, for example, "#,##0.00;(#,##0.00)". Each subpattern has a * prefix, a numeric part, and a suffix. If there is no explicit negative * subpattern, the negative subpattern is the localized minus sign prefixed to the @@ -423,7 +411,7 @@ template class U_I18N_API EnumSetIf the number of actual fraction digits is less than the * minimum fraction digits, then trailing zeros are added. - * For example, 0.125 is formatted as "0.1250" if the mimimum fraction + * For example, 0.125 is formatted as "0.1250" if the minimum fraction * digits is set to 4. * *

  • Trailing fractional zeros are not displayed if they occur @@ -588,9 +576,9 @@ template class U_I18N_API EnumSetgetMaximumSignificantDigits() - 1. For example, the * pattern "@@###E0" is equivalent to "0.0###E0". * - *
  • If signficant digits are in use, then the integer and fraction + *
  • If significant digits are in use, then the integer and fraction * digit counts, as set via the API, are ignored. If significant - * digits are not in use, then the signficant digit counts, as set via + * digits are not in use, then the significant digit counts, as set via * the API, are ignored. * * @@ -644,7 +632,7 @@ template class U_I18N_API EnumSetIn the absense of an explicit rounding increment numbers are + *

    In the absence of an explicit rounding increment numbers are * rounded to their formatted width. * *

      @@ -849,7 +837,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @param pattern a non-localized pattern string * @param symbolsToAdopt the set of symbols to be used. The caller should not * delete this object after making this call. - * @param parseError Output param to receive errors occured during parsing + * @param parseError Output param to receive errors occurred during parsing * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable ICU 2.0 @@ -1127,7 +1115,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { * does string comparisons to try to find an optimal match. * If no object can be parsed, index is unchanged, and NULL is * returned. The result is returned as the most parsimonious - * type of Formattable that will accomodate all of the + * type of Formattable that will accommodate all of the * necessary precision. For example, if the result is exactly 12, * it will be returned as a long. However, if it is 1.5, it will * be returned as a double. @@ -1292,20 +1280,27 @@ class U_I18N_API DecimalFormat : public NumberFormat { */ virtual void setNegativeSuffix(const UnicodeString& newValue); -#ifndef U_HIDE_INTERNAL_API +#ifndef U_HIDE_DRAFT_API /** * Whether to show the plus sign on positive (non-negative) numbers; for example, "+12" - * @internal Technical Preview + * + * For more control over sign display, use NumberFormatter. + * + * @return Whether the sign is shown on positive numbers and zero. + * @draft ICU 64 */ UBool isSignAlwaysShown() const; -#endif /* U_HIDE_INTERNAL_API */ /** - * Set whether to show the plus sign on positive (non-negative) numbers; for example, "+12" - * @param value The new setting for whether to show plus sign on positive numbers - * @internal Technical Preview + * Set whether to show the plus sign on positive (non-negative) numbers; for example, "+12". + * + * For more control over sign display, use NumberFormatter. + * + * @param value true to always show a sign; false to hide the sign on positive numbers and zero. + * @draft ICU 64 */ - virtual void setSignAlwaysShown(UBool value); + void setSignAlwaysShown(UBool value); +#endif /* U_HIDE_DRAFT_API */ /** * Get the multiplier for use in percent, permill, etc. @@ -1350,7 +1345,6 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @draft ICU 62 */ int32_t getMultiplierScale(void) const; -#endif /* U_HIDE_DRAFT_API */ /** * Sets a power of ten by which number should be multiplied before formatting, which @@ -1371,7 +1365,8 @@ class U_I18N_API DecimalFormat : public NumberFormat { * @param newValue the new value of the power-of-ten multiplier. * @draft ICU 62 */ - virtual void setMultiplierScale(int32_t newValue); + void setMultiplierScale(int32_t newValue); +#endif /* U_HIDE_DRAFT_API */ /** * Get the rounding increment. @@ -1464,8 +1459,8 @@ class U_I18N_API DecimalFormat : public NumberFormat { * Set the character used to pad to the format width. If padding * is not enabled, then this will take effect if padding is later * enabled. - * @param padChar a string containing the pad charcter. If the string - * has length 0, then the pad characer is set to ' '. Otherwise + * @param padChar a string containing the pad character. If the string + * has length 0, then the pad character is set to ' '. Otherwise * padChar.char32At(0) will be used as the pad character. * @see #setFormatWidth * @see #getFormatWidth @@ -1654,8 +1649,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { */ virtual void setSecondaryGroupingSize(int32_t newValue); -#ifndef U_HIDE_INTERNAL_API - +#ifndef U_HIDE_DRAFT_API /** * Returns the minimum number of grouping digits. * Grouping separators are output if there are at least this many @@ -1666,31 +1660,33 @@ class U_I18N_API DecimalFormat : public NumberFormat { * For example, if this value is 2, and the grouping size is 3, then * 9999 -> "9999" and 10000 -> "10,000" * - * This is a technology preview. This API may change behavior or may be removed. - * * The default value for this attribute is 0. * A value of 1, 0, or lower, means that the use of grouping separators * only depends on the grouping size (and on isGroupingUsed()). - * Currently, the corresponding CLDR data is not used; this is likely to change. + * + * NOTE: The CLDR data is used in NumberFormatter but not in DecimalFormat. + * This is for backwards compatibility reasons. + * + * For more control over grouping strategies, use NumberFormatter. * * @see setMinimumGroupingDigits * @see getGroupingSize - * @internal technology preview + * @draft ICU 64 */ int32_t getMinimumGroupingDigits() const; -#endif /* U_HIDE_INTERNAL_API */ - - /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following draft method since it is virtual. */ /** * Sets the minimum grouping digits. Setting to a value less than or * equal to 1 turns off minimum grouping digits. * + * For more control over grouping strategies, use NumberFormatter. + * * @param newValue the new value of minimum grouping digits. * @see getMinimumGroupingDigits - * @internal technology preview + * @draft ICU 64 */ - virtual void setMinimumGroupingDigits(int32_t newValue); + void setMinimumGroupingDigits(int32_t newValue); +#endif /* U_HIDE_DRAFT_API */ /** @@ -1732,13 +1728,15 @@ class U_I18N_API DecimalFormat : public NumberFormat { */ virtual void setDecimalPatternMatchRequired(UBool newValue); +#ifndef U_HIDE_DRAFT_API /** * Returns whether to ignore exponents when parsing. * + * @return Whether to ignore exponents when parsing. * @see #setParseNoExponent - * @internal This API is a technical preview. It may change in an upcoming release. + * @draft ICU 64 */ - virtual UBool isParseNoExponent() const; + UBool isParseNoExponent() const; /** * Specifies whether to stop parsing when an exponent separator is encountered. For @@ -1746,17 +1744,18 @@ class U_I18N_API DecimalFormat : public NumberFormat { * 5). * * @param value true to prevent exponents from being parsed; false to allow them to be parsed. - * @internal This API is a technical preview. It may change in an upcoming release. + * @draft ICU 64 */ - virtual void setParseNoExponent(UBool value); + void setParseNoExponent(UBool value); /** * Returns whether parsing is sensitive to case (lowercase/uppercase). * + * @return Whether parsing is case-sensitive. * @see #setParseCaseSensitive - * @internal This API is a technical preview. It may change in an upcoming release. + * @draft ICU 64 */ - virtual UBool isParseCaseSensitive() const; + UBool isParseCaseSensitive() const; /** * Whether to pay attention to case when parsing; default is to ignore case (perform @@ -1765,26 +1764,31 @@ class U_I18N_API DecimalFormat : public NumberFormat { * Currency symbols are never case-folded. For example, "us$1.00" will not parse in case-insensitive * mode, even though "US$1.00" parses. * - * @internal This API is a technical preview. It may change in an upcoming release. + * @param value true to enable case-sensitive parsing (the default); false to force + * case-sensitive parsing behavior. + * @draft ICU 64 */ - virtual void setParseCaseSensitive(UBool value); + void setParseCaseSensitive(UBool value); /** * Returns whether truncation of high-order integer digits should result in an error. * By default, setMaximumIntegerDigits truncates high-order digits silently. * + * @return Whether an error code is set if high-order digits are truncated. * @see setFormatFailIfMoreThanMaxDigits - * @internal This API is a technical preview. It may change in an upcoming release. + * @draft ICU 64 */ - virtual UBool isFormatFailIfMoreThanMaxDigits() const; + UBool isFormatFailIfMoreThanMaxDigits() const; /** * Sets whether truncation of high-order integer digits should result in an error. * By default, setMaximumIntegerDigits truncates high-order digits silently. * - * @internal This API is a technical preview. It may change in an upcoming release. + * @param value Whether to set an error code if high-order digits are truncated. + * @draft ICU 64 */ - virtual void setFormatFailIfMoreThanMaxDigits(UBool value); + void setFormatFailIfMoreThanMaxDigits(UBool value); +#endif /* U_HIDE_DRAFT_API */ /** @@ -2062,8 +2066,32 @@ class U_I18N_API DecimalFormat : public NumberFormat { #ifndef U_HIDE_DRAFT_API /** - * Converts this DecimalFormat to a NumberFormatter. Starting in ICU 60, - * NumberFormatter is the recommended way to format numbers. + * Converts this DecimalFormat to a (Localized)NumberFormatter. Starting + * in ICU 60, NumberFormatter is the recommended way to format numbers. + * You can use the returned LocalizedNumberFormatter to format numbers and + * get a FormattedNumber, which contains a string as well as additional + * annotations about the formatted value. + * + * If a memory allocation failure occurs, the return value of this method + * might be null. If you are concerned about correct recovery from + * out-of-memory situations, use this pattern: + * + *
      +     * FormattedNumber result;
      +     * if (auto* ptr = df->toNumberFormatter(status)) {
      +     *     result = ptr->formatDouble(123, status);
      +     * }
      +     * 
      + * + * If you are not concerned about out-of-memory situations, or if your + * environment throws exceptions when memory allocation failure occurs, + * you can chain the methods, like this: + * + *
      +     * FormattedNumber result = df
      +     *     ->toNumberFormatter(status)
      +     *     ->formatDouble(123, status);
      +     * 
      * * NOTE: The returned LocalizedNumberFormatter is owned by this DecimalFormat. * If a non-const method is called on the DecimalFormat, or if the DecimalFormat @@ -2071,20 +2099,35 @@ class U_I18N_API DecimalFormat : public NumberFormat { * beyond the lifetime of the DecimalFormat, copy it to a local variable: * *
      -     * LocalizedNumberFormatter f = df->toNumberFormatter();
      +     * LocalizedNumberFormatter lnf;
      +     * if (auto* ptr = df->toNumberFormatter(status)) {
      +     *     lnf = *ptr;
      +     * }
            * 
      * - * It is, however, safe to use the return value for chaining: + * @param status Set on failure, like U_MEMORY_ALLOCATION_ERROR. + * @return A pointer to an internal object, or nullptr on failure. + * Do not delete the return value! + * @draft ICU 64 + */ + const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DEPRECATED_API + /** + * Deprecated: Like {@link #toNumberFormatter(UErrorCode&) const}, + * but does not take an error code. * - *
      -     * FormattedNumber result = df->toNumberFormatter().formatDouble(123, status);
      -     * 
      + * The new signature should be used in case an error occurs while returning the + * LocalizedNumberFormatter. * - * @return The output variable, for chaining. - * @draft ICU 62 + * This old signature will be removed in ICU 65. + * + * @return A reference to an internal object. + * @deprecated ICU 64 */ const number::LocalizedNumberFormatter& toNumberFormatter() const; -#endif /* U_HIDE_DRAFT_API */ +#endif /* U_HIDE_DEPRECATED_API */ /** * Return the class ID for this class. This is useful only for @@ -2117,7 +2160,7 @@ class U_I18N_API DecimalFormat : public NumberFormat { /** Rebuilds the formatter object from the property bag. */ void touch(UErrorCode& status); - /** Rebuilds the formatter object, hiding the error code. */ + /** Rebuilds the formatter object, ignoring any error code. */ void touchNoError(); /** @@ -2156,12 +2199,17 @@ class U_I18N_API DecimalFormat : public NumberFormat { // INSTANCE FIELDS // //=====================================================================================// - // Only one instance field: keep all fields inside of an implementation class defined in number_mapper.h - number::impl::DecimalFormatFields* fields; + + // One instance field for the implementation, keep all fields inside of an implementation + // class defined in number_mapper.h + number::impl::DecimalFormatFields* fields = nullptr; // Allow child class CompactDecimalFormat to access fProperties: friend class CompactDecimalFormat; + // Allow MeasureFormat to use fieldPositionHelper: + friend class MeasureFormat; + }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/dtitvfmt.h b/deps/icu-small/source/i18n/unicode/dtitvfmt.h index 5eaa559d0eaf48..42d77d041f8b28 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvfmt.h +++ b/deps/icu-small/source/i18n/unicode/dtitvfmt.h @@ -28,10 +28,87 @@ #include "unicode/dtintrv.h" #include "unicode/dtitvinf.h" #include "unicode/dtptngen.h" +#include "unicode/formattedvalue.h" U_NAMESPACE_BEGIN +class FormattedDateIntervalData; +class DateIntervalFormat; + +#ifndef U_HIDE_DRAFT_API +/** + * An immutable class containing the result of a date interval formatting operation. + * + * Instances of this class are immutable and thread-safe. + * + * When calling nextPosition(): + * The fields are returned from left to right. The special field category + * UFIELD_CATEGORY_DATE_INTERVAL_SPAN is used to indicate which datetime + * primitives came from which arguments: 0 means fromCalendar, and 1 means + * toCalendar. The span category will always occur before the + * corresponding fields in UFIELD_CATEGORY_DATE + * in the nextPosition() iterator. + * + * Not intended for public subclassing. + * + * @draft ICU 64 + */ +class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue { + public: + /** + * Default constructor; makes an empty FormattedDateInterval. + * @draft ICU 64 + */ + FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} + + /** + * Move constructor: Leaves the source FormattedDateInterval in an undefined state. + * @draft ICU 64 + */ + FormattedDateInterval(FormattedDateInterval&& src) U_NOEXCEPT; + + /** + * Destruct an instance of FormattedDateInterval. + * @draft ICU 64 + */ + virtual ~FormattedDateInterval() U_OVERRIDE; + + /** Copying not supported; use move constructor instead. */ + FormattedDateInterval(const FormattedDateInterval&) = delete; + + /** Copying not supported; use move assignment instead. */ + FormattedDateInterval& operator=(const FormattedDateInterval&) = delete; + + /** + * Move assignment: Leaves the source FormattedDateInterval in an undefined state. + * @draft ICU 64 + */ + FormattedDateInterval& operator=(FormattedDateInterval&& src) U_NOEXCEPT; + + /** @copydoc FormattedValue::toString() */ + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::toTempString() */ + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::appendTo() */ + Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::nextPosition() */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + private: + FormattedDateIntervalData *fData; + UErrorCode fErrorCode; + explicit FormattedDateInterval(FormattedDateIntervalData *results) + : fData(results), fErrorCode(U_ZERO_ERROR) {} + explicit FormattedDateInterval(UErrorCode errorCode) + : fData(nullptr), fErrorCode(errorCode) {} + friend class DateIntervalFormat; +}; +#endif /* U_HIDE_DRAFT_API */ + /** * DateIntervalFormat is a class for formatting and parsing date @@ -218,7 +295,6 @@ U_NAMESPACE_BEGIN * \endcode * */ - class U_I18N_API DateIntervalFormat : public Format { public: @@ -425,6 +501,21 @@ class U_I18N_API DateIntervalFormat : public Format { FieldPosition& fieldPosition, UErrorCode& status) const ; +#ifndef U_HIDE_DRAFT_API + /** + * Format a DateInterval to produce a FormattedDateInterval. + * + * The FormattedDateInterval exposes field information about the formatted string. + * + * @param dtInterval DateInterval to be formatted. + * @param status Set if an error occurs. + * @return A FormattedDateInterval containing the format result. + * @draft ICU 64 + */ + FormattedDateInterval formatToValue( + const DateInterval& dtInterval, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ /** * Format 2 Calendars to produce a string. @@ -455,6 +546,29 @@ class U_I18N_API DateIntervalFormat : public Format { FieldPosition& fieldPosition, UErrorCode& status) const ; +#ifndef U_HIDE_DRAFT_API + /** + * Format 2 Calendars to produce a FormattedDateInterval. + * + * The FormattedDateInterval exposes field information about the formatted string. + * + * Note: "fromCalendar" and "toCalendar" are not const, + * since calendar is not const in SimpleDateFormat::format(Calendar&), + * + * @param fromCalendar calendar set to the from date in date interval + * to be formatted into date interval string + * @param toCalendar calendar set to the to date in date interval + * to be formatted into date interval string + * @param status Set if an error occurs. + * @return A FormattedDateInterval containing the format result. + * @draft ICU 64 + */ + FormattedDateInterval formatToValue( + Calendar& fromCalendar, + Calendar& toCalendar, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Date interval parsing is not supported. Please do not use. *

      @@ -664,28 +778,14 @@ class U_I18N_API DateIntervalFormat : public Format { * Below are for generating interval patterns local to the formatter */ - /** - * Provide an updated FieldPosition posResult based on two formats, - * the FieldPosition values for each of them, and the pattern used - * to combine them. The idea is for posResult to indicate the first - * instance (if any) of the specified field in the combined result, - * with correct offsets. - * - * @param combiningPattern Pattern used to combine pat0 and pat1 - * @param pat0 Formatted date/time value to replace {0} - * @param pos0 FieldPosition within pat0 - * @param pat1 Formatted date/time value to replace {1} - * @param pos1 FieldPosition within pat1 - * @param posResult FieldPosition to be set to the correct - * position of the first field instance when - * pat0 and pat1 are combined using combiningPattern - */ - static void - adjustPosition(UnicodeString& combiningPattern, // has {0} and {1} in it - UnicodeString& pat0, FieldPosition& pos0, // pattern and pos corresponding to {0} - UnicodeString& pat1, FieldPosition& pos1, // pattern and pos corresponding to {1} - FieldPosition& posResult); - + /** Like fallbackFormat, but only formats the range part of the fallback. */ + void fallbackFormatRange( + Calendar& fromCalendar, + Calendar& toCalendar, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const; /** * Format 2 Calendars using fall-back interval pattern @@ -703,8 +803,8 @@ class U_I18N_API DateIntervalFormat : public Format { * (any difference is in ampm/hours or below) * @param appendTo Output parameter to receive result. * Result is appended to existing contents. - * @param pos On input: an alignment field, if desired. - * On output: the offsets of the alignment field. + * @param firstIndex See formatImpl for more information. + * @param fphandler See formatImpl for more information. * @param status output param set to success/failure code on exit * @return Reference to 'appendTo' parameter. * @internal (private) @@ -713,7 +813,8 @@ class U_I18N_API DateIntervalFormat : public Format { Calendar& toCalendar, UBool fromToOnSameDay, UnicodeString& appendTo, - FieldPosition& pos, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const; @@ -977,11 +1078,11 @@ class U_I18N_API DateIntervalFormat : public Format { * to be formatted into date interval string * @param appendTo Output parameter to receive result. * Result is appended to existing contents. - * @param fieldPosition On input: an alignment field, if desired. - * On output: the offsets of the alignment field. - * There may be multiple instances of a given field type - * in an interval format; in this case the fieldPosition - * offsets refer to the first instance. + * @param firstIndex 0 if the first output date is fromCalendar; + * 1 if it corresponds to toCalendar; + * -1 if there is only one date printed. + * @param fphandler Handler for field position information. + * The fields will be from the UDateFormatField enum. * @param status Output param filled with success/failure status. * Caller needs to make sure it is SUCCESS * at the function entrance @@ -991,9 +1092,17 @@ class U_I18N_API DateIntervalFormat : public Format { UnicodeString& formatImpl(Calendar& fromCalendar, Calendar& toCalendar, UnicodeString& appendTo, - FieldPosition& fieldPosition, + int8_t& firstIndex, + FieldPositionHandler& fphandler, UErrorCode& status) const ; + /** Version of formatImpl for DateInterval. */ + UnicodeString& formatIntervalImpl(const DateInterval& dtInterval, + UnicodeString& appendTo, + int8_t& firstIndex, + FieldPositionHandler& fphandler, + UErrorCode& status) const; + // from calendar field to pattern letter static const char16_t fgCalendarFieldToPatternLetter[]; diff --git a/deps/icu-small/source/i18n/unicode/dtitvinf.h b/deps/icu-small/source/i18n/unicode/dtitvinf.h index fac88581a227d4..65f568c0700218 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvinf.h +++ b/deps/icu-small/source/i18n/unicode/dtitvinf.h @@ -149,7 +149,6 @@ U_NAMESPACE_BEGIN * calendar; non-Gregorian calendars are supported from ICU 4.4.1. * @stable ICU 4.0 **/ - class U_I18N_API DateIntervalInfo U_FINAL : public UObject { public: /** diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index 26ccc64060f15a..e50c01b4e360c9 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -273,7 +273,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { */ const UnicodeString& getAppendItemName(UDateTimePatternField field) const; -#ifndef U_HIDE_DRAFT_API /** * The general interface to get a display name for a particular date/time field, * in one of several possible display widths. @@ -281,10 +280,9 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param field The desired UDateTimePatternField, such as UDATPG_ERA_FIELD. * @param width The desired UDateTimePGDisplayWidth, such as UDATPG_ABBREVIATED. * @return. The display name for field - * @draft ICU 61 + * @stable ICU 61 */ UnicodeString getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const; -#endif // U_HIDE_DRAFT_API /** * The DateTimeFormat is a message format pattern used to compose date and @@ -564,6 +562,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { void setDecimalSymbols(const Locale& locale, UErrorCode& status); UDateTimePatternField getAppendFormatNumber(const char* field) const; #ifndef U_HIDE_DRAFT_API + // The following three have to be U_HIDE_DRAFT_API (though private) because UDateTimePGDisplayWidth is UDateTimePatternField getFieldAndWidthIndices(const char* key, UDateTimePGDisplayWidth* widthP) const; void setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value); UnicodeString& getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width); diff --git a/deps/icu-small/source/i18n/unicode/formattedvalue.h b/deps/icu-small/source/i18n/unicode/formattedvalue.h new file mode 100644 index 00000000000000..2e24c8d99e624b --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/formattedvalue.h @@ -0,0 +1,317 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __FORMATTEDVALUE_H__ +#define __FORMATTEDVALUE_H__ + +#include "unicode/utypes.h" +#if !UCONFIG_NO_FORMATTING +#ifndef U_HIDE_DRAFT_API + +#include "unicode/appendable.h" +#include "unicode/fpositer.h" +#include "unicode/unistr.h" +#include "unicode/uformattedvalue.h" + +U_NAMESPACE_BEGIN + +/** + * \file + * \brief C++ API: Abstract operations for localized strings. + * + * This file contains declarations for classes that deal with formatted strings. A number + * of APIs throughout ICU use these classes for expressing their localized output. + */ + + +/** + * Represents a span of a string containing a given field. + * + * This class differs from FieldPosition in the following ways: + * + * 1. It has information on the field category. + * 2. It allows you to set constraints to use when iterating over field positions. + * 3. It is used for the newer FormattedValue APIs. + * + * This class is not intended for public subclassing. + * + * @draft ICU 64 + */ +class U_I18N_API ConstrainedFieldPosition : public UMemory { + public: + + /** + * Initializes a ConstrainedFieldPosition. + * + * By default, the ConstrainedFieldPosition has no iteration constraints. + * + * @draft ICU 64 + */ + ConstrainedFieldPosition(); + + /** @draft ICU 64 */ + ~ConstrainedFieldPosition(); + + /** + * Resets this ConstrainedFieldPosition to its initial state, as if it were newly created: + * + * - Removes any constraints that may have been set on the instance. + * - Resets the iteration position. + * + * @draft ICU 64 + */ + void reset(); + + /** + * Sets a constraint on the field category. + * + * When this instance of ConstrainedFieldPosition is passed to FormattedValue#nextPosition, + * positions are skipped unless they have the given category. + * + * Any previously set constraints are cleared. + * + * For example, to loop over only the number-related fields: + * + * ConstrainedFieldPosition cfpos; + * cfpos.constrainCategory(UFIELDCATEGORY_NUMBER_FORMAT); + * while (fmtval.nextPosition(cfpos, status)) { + * // handle the number-related field position + * } + * + * Changing the constraint while in the middle of iterating over a FormattedValue + * does not generally have well-defined behavior. + * + * @param category The field category to fix when iterating. + * @draft ICU 64 + */ + void constrainCategory(int32_t category); + + /** + * Sets a constraint on the category and field. + * + * When this instance of ConstrainedFieldPosition is passed to FormattedValue#nextPosition, + * positions are skipped unless they have the given category and field. + * + * Any previously set constraints are cleared. + * + * For example, to loop over all grouping separators: + * + * ConstrainedFieldPosition cfpos; + * cfpos.constrainField(UFIELDCATEGORY_NUMBER_FORMAT, UNUM_GROUPING_SEPARATOR_FIELD); + * while (fmtval.nextPosition(cfpos, status)) { + * // handle the grouping separator position + * } + * + * Changing the constraint while in the middle of iterating over a FormattedValue + * does not generally have well-defined behavior. + * + * @param category The field category to fix when iterating. + * @param field The field to fix when iterating. + * @draft ICU 64 + */ + void constrainField(int32_t category, int32_t field); + + /** + * Gets the field category for the current position. + * + * The return value is well-defined only after + * FormattedValue#nextPosition returns TRUE. + * + * @return The field category saved in the instance. + * @draft ICU 64 + */ + inline int32_t getCategory() const { + return fCategory; + } + + /** + * Gets the field for the current position. + * + * The return value is well-defined only after + * FormattedValue#nextPosition returns TRUE. + * + * @return The field saved in the instance. + * @draft ICU 64 + */ + inline int32_t getField() const { + return fField; + } + + /** + * Gets the INCLUSIVE start index for the current position. + * + * The return value is well-defined only after FormattedValue#nextPosition returns TRUE. + * + * @return The start index saved in the instance. + * @draft ICU 64 + */ + inline int32_t getStart() const { + return fStart; + } + + /** + * Gets the EXCLUSIVE end index stored for the current position. + * + * The return value is well-defined only after FormattedValue#nextPosition returns TRUE. + * + * @return The end index saved in the instance. + * @draft ICU 64 + */ + inline int32_t getLimit() const { + return fLimit; + } + + //////////////////////////////////////////////////////////////////// + //// The following methods are for FormattedValue implementers; //// + //// most users can ignore them. //// + //////////////////////////////////////////////////////////////////// + + /** + * Gets an int64 that FormattedValue implementations may use for storage. + * + * The initial value is zero. + * + * Users of FormattedValue should not need to call this method. + * + * @return The current iteration context from {@link #setInt64IterationContext}. + * @draft ICU 64 + */ + inline int64_t getInt64IterationContext() const { + return fContext; + } + + /** + * Sets an int64 that FormattedValue implementations may use for storage. + * + * Intended to be used by FormattedValue implementations. + * + * @param context The new iteration context. + * @draft ICU 64 + */ + void setInt64IterationContext(int64_t context); + + /** + * Determines whether a given field should be included given the + * constraints. + * + * Intended to be used by FormattedValue implementations. + * + * @param category The category to test. + * @param field The field to test. + * @draft ICU 64 + */ + UBool matchesField(int32_t category, int32_t field) const; + + /** + * Sets new values for the primary public getters. + * + * Intended to be used by FormattedValue implementations. + * + * It is up to the implementation to ensure that the user-requested + * constraints are satisfied. This method does not check! + * + * @param category The new field category. + * @param field The new field. + * @param start The new inclusive start index. + * @param limit The new exclusive end index. + * @draft ICU 64 + */ + void setState( + int32_t category, + int32_t field, + int32_t start, + int32_t limit); + + private: + int64_t fContext = 0LL; + int32_t fField = 0; + int32_t fStart = 0; + int32_t fLimit = 0; + int32_t fCategory = UFIELD_CATEGORY_UNDEFINED; + int8_t fConstraint = 0; +}; + + +/** + * An abstract formatted value: a string with associated field attributes. + * Many formatters format to classes implementing FormattedValue. + * + * @draft ICU 64 + */ +class U_I18N_API FormattedValue /* not : public UObject because this is an interface/mixin class */ { + public: + /** @draft ICU 64 */ + virtual ~FormattedValue(); + + /** + * Returns the formatted string as a self-contained UnicodeString. + * + * If you need the string within the current scope only, consider #toTempString. + * + * @param status Set if an error occurs. + * @return a UnicodeString containing the formatted string. + * + * @draft ICU 64 + */ + virtual UnicodeString toString(UErrorCode& status) const = 0; + + /** + * Returns the formatted string as a read-only alias to memory owned by the FormattedValue. + * + * The return value is valid only as long as this FormattedValue is present and unchanged in + * memory. If you need the string outside the current scope, consider #toString. + * + * The buffer returned by calling UnicodeString#getBuffer() on the return value is + * guaranteed to be NUL-terminated. + * + * @param status Set if an error occurs. + * @return a temporary UnicodeString containing the formatted string. + * + * @draft ICU 64 + */ + virtual UnicodeString toTempString(UErrorCode& status) const = 0; + + /** + * Appends the formatted string to an Appendable. + * + * @param appendable + * The Appendable to which to append the string output. + * @param status Set if an error occurs. + * @return The same Appendable, for chaining. + * + * @draft ICU 64 + * @see Appendable + */ + virtual Appendable& appendTo(Appendable& appendable, UErrorCode& status) const = 0; + + /** + * Iterates over field positions in the FormattedValue. This lets you determine the position + * of specific types of substrings, like a month or a decimal separator. + * + * To loop over all field positions: + * + * ConstrainedFieldPosition cfpos; + * while (fmtval.nextPosition(cfpos, status)) { + * // handle the field position; get information from cfpos + * } + * + * @param cfpos + * The object used for iteration state. This can provide constraints to iterate over + * only one specific category or field; + * see ConstrainedFieldPosition#constrainCategory + * and ConstrainedFieldPosition#constrainField. + * @param status Set if an error occurs. + * @return TRUE if a new occurrence of the field was found; + * FALSE otherwise or if an error was set. + * + * @draft ICU 64 + */ + virtual UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const = 0; +}; + + +U_NAMESPACE_END + +#endif /* U_HIDE_DRAFT_API */ +#endif /* #if !UCONFIG_NO_FORMATTING */ +#endif // __FORMATTEDVALUE_H__ diff --git a/deps/icu-small/source/i18n/unicode/listformatter.h b/deps/icu-small/source/i18n/unicode/listformatter.h index 5e36cf71cc54b7..9ce8ec8617ce80 100644 --- a/deps/icu-small/source/i18n/unicode/listformatter.h +++ b/deps/icu-small/source/i18n/unicode/listformatter.h @@ -23,11 +23,14 @@ #include "unicode/unistr.h" #include "unicode/locid.h" +#include "unicode/formattedvalue.h" U_NAMESPACE_BEGIN class FieldPositionIterator; class FieldPositionHandler; +class FormattedListData; +class ListFormatter; /** @internal */ class Hashtable; @@ -58,6 +61,81 @@ struct ListFormatData : public UMemory { */ +#if !UCONFIG_NO_FORMATTING +#ifndef U_HIDE_DRAFT_API +/** + * An immutable class containing the result of a list formatting operation. + * + * Instances of this class are immutable and thread-safe. + * + * When calling nextPosition(): + * The fields are returned from start to end. The special field category + * UFIELD_CATEGORY_LIST_SPAN is used to indicate which argument + * was inserted at the given position. The span category will + * always occur before the corresponding instance of UFIELD_CATEGORY_LIST + * in the nextPosition() iterator. + * + * Not intended for public subclassing. + * + * @draft ICU 64 + */ +class U_I18N_API FormattedList : public UMemory, public FormattedValue { + public: + /** + * Default constructor; makes an empty FormattedList. + * @draft ICU 64 + */ + FormattedList() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} + + /** + * Move constructor: Leaves the source FormattedList in an undefined state. + * @draft ICU 64 + */ + FormattedList(FormattedList&& src) U_NOEXCEPT; + + /** + * Destruct an instance of FormattedList. + * @draft ICU 64 + */ + virtual ~FormattedList() U_OVERRIDE; + + /** Copying not supported; use move constructor instead. */ + FormattedList(const FormattedList&) = delete; + + /** Copying not supported; use move assignment instead. */ + FormattedList& operator=(const FormattedList&) = delete; + + /** + * Move assignment: Leaves the source FormattedList in an undefined state. + * @draft ICU 64 + */ + FormattedList& operator=(FormattedList&& src) U_NOEXCEPT; + + /** @copydoc FormattedValue::toString() */ + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::toTempString() */ + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::appendTo() */ + Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::nextPosition() */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + private: + FormattedListData *fData; + UErrorCode fErrorCode; + explicit FormattedList(FormattedListData *results) + : fData(results), fErrorCode(U_ZERO_ERROR) {} + explicit FormattedList(UErrorCode errorCode) + : fData(nullptr), fErrorCode(errorCode) {} + friend class ListFormatter; +}; +#endif /* U_HIDE_DRAFT_API */ +#endif // !UCONFIG_NO_FORMATTING + + /** * An immutable class for formatting a list, using data from CLDR (or supplied * separately). @@ -110,7 +188,7 @@ class U_I18N_API ListFormatter : public UObject{ * Creates a ListFormatter appropriate for a locale and style. * * @param locale The locale. - * @param style the style, either "standard", "duration", or "duration-short" + * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short" * @param errorCode ICU error code, set if no data available for the given locale. * @return A ListFormatter object created from internal data derived from * CLDR data. @@ -161,6 +239,26 @@ class U_I18N_API ListFormatter : public UObject{ UErrorCode& errorCode) const; #endif /* U_HIDE_DRAFT_API */ +#if !UCONFIG_NO_FORMATTING +#ifndef U_HIDE_DRAFT_API + /** + * Formats a list of strings to a FormattedList, which exposes field + * position information. The FormattedList contains more information than + * a FieldPositionIterator. + * + * @param items An array of strings to be combined and formatted. + * @param n_items Length of the array items. + * @param errorCode ICU error code returned here. + * @return A FormattedList containing field information. + * @draft ICU 64 + */ + FormattedList formatStringsToValue( + const UnicodeString items[], + int32_t n_items, + UErrorCode& errorCode) const; +#endif /* U_HIDE_DRAFT_API */ +#endif // !UCONFIG_NO_FORMATTING + #ifndef U_HIDE_INTERNAL_API /** @internal for MeasureFormat @@ -200,4 +298,4 @@ class U_I18N_API ListFormatter : public UObject{ U_NAMESPACE_END -#endif +#endif // __LISTFORMATTER_H__ diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index bbdd2364bdd997..d518665e1448b5 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -322,7 +322,14 @@ class U_I18N_API MeasureFormat : public Format { * ICU use only. * @internal. */ - const NumberFormat &getNumberFormat() const; + const NumberFormat &getNumberFormatInternal() const; + + /** + * ICU use only. + * Always returns the short form currency formatter. + * @internal. + */ + const NumberFormat& getCurrencyFormatInternal() const; /** * ICU use only. @@ -355,27 +362,6 @@ class U_I18N_API MeasureFormat : public Format { // shared across instances. ListFormatter *listFormatter; - const SimpleFormatter *getFormatterOrNull( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const; - - const SimpleFormatter *getFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const; - - const SimpleFormatter *getPluralFormatter( - const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index, - UErrorCode &errorCode) const; - - const SimpleFormatter *getPerFormatter( - UMeasureFormatWidth width, - UErrorCode &status) const; - - int32_t withPerUnitAndAppend( - const UnicodeString &formatted, - const MeasureUnit &perUnit, - UnicodeString &appendTo, - UErrorCode &status) const; - UnicodeString &formatMeasure( const Measure &measure, const NumberFormat &nf, diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 676fdeb9c8cd8a..d8e3c73956f9c3 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -209,160 +209,387 @@ class U_I18N_API MeasureUnit: public UObject { // Start generated createXXX methods /** - * Returns unit of acceleration: g-force. + * Returns by pointer, unit of acceleration: g-force. * Caller owns returned value and must free it. + * Also see {@link #getGForce()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createGForce(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of acceleration: g-force. + * Also see {@link #createGForce()}. + * @draft ICU 64 + */ + static MeasureUnit getGForce(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of acceleration: meter-per-second-squared. + * Returns by pointer, unit of acceleration: meter-per-second-squared. * Caller owns returned value and must free it. + * Also see {@link #getMeterPerSecondSquared()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMeterPerSecondSquared(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of acceleration: meter-per-second-squared. + * Also see {@link #createMeterPerSecondSquared()}. + * @draft ICU 64 + */ + static MeasureUnit getMeterPerSecondSquared(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of angle: arc-minute. + * Returns by pointer, unit of angle: arc-minute. * Caller owns returned value and must free it. + * Also see {@link #getArcMinute()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createArcMinute(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of angle: arc-minute. + * Also see {@link #createArcMinute()}. + * @draft ICU 64 + */ + static MeasureUnit getArcMinute(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of angle: arc-second. + * Returns by pointer, unit of angle: arc-second. * Caller owns returned value and must free it. + * Also see {@link #getArcSecond()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createArcSecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of angle: arc-second. + * Also see {@link #createArcSecond()}. + * @draft ICU 64 + */ + static MeasureUnit getArcSecond(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of angle: degree. + * Returns by pointer, unit of angle: degree. * Caller owns returned value and must free it. + * Also see {@link #getDegree()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createDegree(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of angle: degree. + * Also see {@link #createDegree()}. + * @draft ICU 64 + */ + static MeasureUnit getDegree(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of angle: radian. + * Returns by pointer, unit of angle: radian. * Caller owns returned value and must free it. + * Also see {@link #getRadian()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createRadian(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of angle: radian. + * Also see {@link #createRadian()}. + * @draft ICU 64 + */ + static MeasureUnit getRadian(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of angle: revolution. + * Returns by pointer, unit of angle: revolution. * Caller owns returned value and must free it. + * Also see {@link #getRevolutionAngle()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createRevolutionAngle(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of angle: revolution. + * Also see {@link #createRevolutionAngle()}. + * @draft ICU 64 + */ + static MeasureUnit getRevolutionAngle(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: acre. + * Returns by pointer, unit of area: acre. * Caller owns returned value and must free it. + * Also see {@link #getAcre()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createAcre(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: acre. + * Also see {@link #createAcre()}. + * @draft ICU 64 + */ + static MeasureUnit getAcre(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of area: dunam. + * Caller owns returned value and must free it. + * Also see {@link #getDunam()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createDunam(UErrorCode &status); + + /** + * Returns by value, unit of area: dunam. + * Also see {@link #createDunam()}. + * @draft ICU 64 + */ + static MeasureUnit getDunam(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: hectare. + * Returns by pointer, unit of area: hectare. * Caller owns returned value and must free it. + * Also see {@link #getHectare()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createHectare(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: hectare. + * Also see {@link #createHectare()}. + * @draft ICU 64 + */ + static MeasureUnit getHectare(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-centimeter. + * Returns by pointer, unit of area: square-centimeter. * Caller owns returned value and must free it. + * Also see {@link #getSquareCentimeter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createSquareCentimeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-centimeter. + * Also see {@link #createSquareCentimeter()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareCentimeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-foot. + * Returns by pointer, unit of area: square-foot. * Caller owns returned value and must free it. + * Also see {@link #getSquareFoot()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createSquareFoot(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-foot. + * Also see {@link #createSquareFoot()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareFoot(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-inch. + * Returns by pointer, unit of area: square-inch. * Caller owns returned value and must free it. + * Also see {@link #getSquareInch()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createSquareInch(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-inch. + * Also see {@link #createSquareInch()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareInch(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-kilometer. + * Returns by pointer, unit of area: square-kilometer. * Caller owns returned value and must free it. + * Also see {@link #getSquareKilometer()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createSquareKilometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-kilometer. + * Also see {@link #createSquareKilometer()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareKilometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-meter. + * Returns by pointer, unit of area: square-meter. * Caller owns returned value and must free it. + * Also see {@link #getSquareMeter()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createSquareMeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-meter. + * Also see {@link #createSquareMeter()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareMeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-mile. + * Returns by pointer, unit of area: square-mile. * Caller owns returned value and must free it. + * Also see {@link #getSquareMile()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createSquareMile(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-mile. + * Also see {@link #createSquareMile()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareMile(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of area: square-yard. + * Returns by pointer, unit of area: square-yard. * Caller owns returned value and must free it. + * Also see {@link #getSquareYard()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createSquareYard(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of area: square-yard. + * Also see {@link #createSquareYard()}. + * @draft ICU 64 + */ + static MeasureUnit getSquareYard(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of concentr: karat. + * Returns by pointer, unit of concentr: karat. * Caller owns returned value and must free it. + * Also see {@link #getKarat()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKarat(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of concentr: karat. + * Also see {@link #createKarat()}. + * @draft ICU 64 + */ + static MeasureUnit getKarat(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of concentr: milligram-per-deciliter. + * Returns by pointer, unit of concentr: milligram-per-deciliter. * Caller owns returned value and must free it. + * Also see {@link #getMilligramPerDeciliter()}. * @param status ICU error code. * @stable ICU 57 */ static MeasureUnit *createMilligramPerDeciliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of concentr: milligram-per-deciliter. + * Also see {@link #createMilligramPerDeciliter()}. + * @draft ICU 64 + */ + static MeasureUnit getMilligramPerDeciliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of concentr: millimole-per-liter. + * Returns by pointer, unit of concentr: millimole-per-liter. * Caller owns returned value and must free it. + * Also see {@link #getMillimolePerLiter()}. * @param status ICU error code. * @stable ICU 57 */ static MeasureUnit *createMillimolePerLiter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of concentr: millimole-per-liter. + * Also see {@link #createMillimolePerLiter()}. + * @draft ICU 64 + */ + static MeasureUnit getMillimolePerLiter(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: mole. + * Caller owns returned value and must free it. + * Also see {@link #getMole()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createMole(UErrorCode &status); + + /** + * Returns by value, unit of concentr: mole. + * Also see {@link #createMole()}. + * @draft ICU 64 + */ + static MeasureUnit getMole(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of concentr: part-per-million. + * Returns by pointer, unit of concentr: part-per-million. * Caller owns returned value and must free it. + * Also see {@link #getPartPerMillion()}. * @param status ICU error code. * @stable ICU 57 */ @@ -370,115 +597,273 @@ class U_I18N_API MeasureUnit: public UObject { #ifndef U_HIDE_DRAFT_API /** - * Returns unit of concentr: percent. + * Returns by value, unit of concentr: part-per-million. + * Also see {@link #createPartPerMillion()}. + * @draft ICU 64 + */ + static MeasureUnit getPartPerMillion(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: percent. * Caller owns returned value and must free it. + * Also see {@link #getPercent()}. * @param status ICU error code. * @draft ICU 63 */ static MeasureUnit *createPercent(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of concentr: percent. + * Also see {@link #createPercent()}. + * @draft ICU 64 + */ + static MeasureUnit getPercent(); #endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_DRAFT_API /** - * Returns unit of concentr: permille. + * Returns by pointer, unit of concentr: permille. * Caller owns returned value and must free it. + * Also see {@link #getPermille()}. * @param status ICU error code. * @draft ICU 63 */ static MeasureUnit *createPermille(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of concentr: permille. + * Also see {@link #createPermille()}. + * @draft ICU 64 + */ + static MeasureUnit getPermille(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of concentr: permyriad. + * Caller owns returned value and must free it. + * Also see {@link #getPermyriad()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createPermyriad(UErrorCode &status); + + /** + * Returns by value, unit of concentr: permyriad. + * Also see {@link #createPermyriad()}. + * @draft ICU 64 + */ + static MeasureUnit getPermyriad(); #endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of consumption: liter-per-100kilometers. + * Returns by pointer, unit of consumption: liter-per-100kilometers. * Caller owns returned value and must free it. + * Also see {@link #getLiterPer100Kilometers()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createLiterPer100Kilometers(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of consumption: liter-per-100kilometers. + * Also see {@link #createLiterPer100Kilometers()}. + * @draft ICU 64 + */ + static MeasureUnit getLiterPer100Kilometers(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of consumption: liter-per-kilometer. + * Returns by pointer, unit of consumption: liter-per-kilometer. * Caller owns returned value and must free it. + * Also see {@link #getLiterPerKilometer()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createLiterPerKilometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of consumption: liter-per-kilometer. + * Also see {@link #createLiterPerKilometer()}. + * @draft ICU 64 + */ + static MeasureUnit getLiterPerKilometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of consumption: mile-per-gallon. + * Returns by pointer, unit of consumption: mile-per-gallon. * Caller owns returned value and must free it. + * Also see {@link #getMilePerGallon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMilePerGallon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of consumption: mile-per-gallon. + * Also see {@link #createMilePerGallon()}. + * @draft ICU 64 + */ + static MeasureUnit getMilePerGallon(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of consumption: mile-per-gallon-imperial. + * Returns by pointer, unit of consumption: mile-per-gallon-imperial. * Caller owns returned value and must free it. + * Also see {@link #getMilePerGallonImperial()}. * @param status ICU error code. * @stable ICU 57 */ static MeasureUnit *createMilePerGallonImperial(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of consumption: mile-per-gallon-imperial. + * Also see {@link #createMilePerGallonImperial()}. + * @draft ICU 64 + */ + static MeasureUnit getMilePerGallonImperial(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: bit. + * Returns by pointer, unit of digital: bit. * Caller owns returned value and must free it. + * Also see {@link #getBit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createBit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: bit. + * Also see {@link #createBit()}. + * @draft ICU 64 + */ + static MeasureUnit getBit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: byte. + * Returns by pointer, unit of digital: byte. * Caller owns returned value and must free it. + * Also see {@link #getByte()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createByte(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: byte. + * Also see {@link #createByte()}. + * @draft ICU 64 + */ + static MeasureUnit getByte(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: gigabit. + * Returns by pointer, unit of digital: gigabit. * Caller owns returned value and must free it. + * Also see {@link #getGigabit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createGigabit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: gigabit. + * Also see {@link #createGigabit()}. + * @draft ICU 64 + */ + static MeasureUnit getGigabit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: gigabyte. + * Returns by pointer, unit of digital: gigabyte. * Caller owns returned value and must free it. + * Also see {@link #getGigabyte()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createGigabyte(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: gigabyte. + * Also see {@link #createGigabyte()}. + * @draft ICU 64 + */ + static MeasureUnit getGigabyte(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: kilobit. + * Returns by pointer, unit of digital: kilobit. * Caller owns returned value and must free it. + * Also see {@link #getKilobit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKilobit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: kilobit. + * Also see {@link #createKilobit()}. + * @draft ICU 64 + */ + static MeasureUnit getKilobit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: kilobyte. + * Returns by pointer, unit of digital: kilobyte. * Caller owns returned value and must free it. + * Also see {@link #getKilobyte()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKilobyte(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: kilobyte. + * Also see {@link #createKilobyte()}. + * @draft ICU 64 + */ + static MeasureUnit getKilobyte(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: megabit. + * Returns by pointer, unit of digital: megabit. * Caller owns returned value and must free it. + * Also see {@link #getMegabit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMegabit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: megabit. + * Also see {@link #createMegabit()}. + * @draft ICU 64 + */ + static MeasureUnit getMegabit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: megabyte. + * Returns by pointer, unit of digital: megabyte. * Caller owns returned value and must free it. + * Also see {@link #getMegabyte()}. * @param status ICU error code. * @stable ICU 54 */ @@ -486,529 +871,1431 @@ class U_I18N_API MeasureUnit: public UObject { #ifndef U_HIDE_DRAFT_API /** - * Returns unit of digital: petabyte. + * Returns by value, unit of digital: megabyte. + * Also see {@link #createMegabyte()}. + * @draft ICU 64 + */ + static MeasureUnit getMegabyte(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of digital: petabyte. * Caller owns returned value and must free it. + * Also see {@link #getPetabyte()}. * @param status ICU error code. * @draft ICU 63 */ static MeasureUnit *createPetabyte(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: petabyte. + * Also see {@link #createPetabyte()}. + * @draft ICU 64 + */ + static MeasureUnit getPetabyte(); #endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of digital: terabit. + * Returns by pointer, unit of digital: terabit. * Caller owns returned value and must free it. + * Also see {@link #getTerabit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createTerabit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: terabit. + * Also see {@link #createTerabit()}. + * @draft ICU 64 + */ + static MeasureUnit getTerabit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of digital: terabyte. + * Returns by pointer, unit of digital: terabyte. * Caller owns returned value and must free it. + * Also see {@link #getTerabyte()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createTerabyte(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of digital: terabyte. + * Also see {@link #createTerabyte()}. + * @draft ICU 64 + */ + static MeasureUnit getTerabyte(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of duration: century. + * Returns by pointer, unit of duration: century. * Caller owns returned value and must free it. + * Also see {@link #getCentury()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createCentury(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of duration: century. + * Also see {@link #createCentury()}. + * @draft ICU 64 + */ + static MeasureUnit getCentury(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of duration: day. + * Returns by pointer, unit of duration: day. * Caller owns returned value and must free it. + * Also see {@link #getDay()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createDay(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: hour. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of duration: day. + * Also see {@link #createDay()}. + * @draft ICU 64 */ - static MeasureUnit *createHour(UErrorCode &status); + static MeasureUnit getDay(); +#endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: microsecond. + * Returns by pointer, unit of duration: day-person. * Caller owns returned value and must free it. + * Also see {@link #getDayPerson()}. * @param status ICU error code. - * @stable ICU 54 + * @draft ICU 64 */ - static MeasureUnit *createMicrosecond(UErrorCode &status); + static MeasureUnit *createDayPerson(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: millisecond. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of duration: day-person. + * Also see {@link #createDayPerson()}. + * @draft ICU 64 */ - static MeasureUnit *createMillisecond(UErrorCode &status); + static MeasureUnit getDayPerson(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of duration: minute. + * Returns by pointer, unit of duration: hour. * Caller owns returned value and must free it. + * Also see {@link #getHour()}. * @param status ICU error code. * @stable ICU 53 */ - static MeasureUnit *createMinute(UErrorCode &status); + static MeasureUnit *createHour(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: month. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of duration: hour. + * Also see {@link #createHour()}. + * @draft ICU 64 */ - static MeasureUnit *createMonth(UErrorCode &status); + static MeasureUnit getHour(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of duration: nanosecond. + * Returns by pointer, unit of duration: microsecond. * Caller owns returned value and must free it. + * Also see {@link #getMicrosecond()}. * @param status ICU error code. * @stable ICU 54 */ - static MeasureUnit *createNanosecond(UErrorCode &status); + static MeasureUnit *createMicrosecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: second. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of duration: microsecond. + * Also see {@link #createMicrosecond()}. + * @draft ICU 64 */ - static MeasureUnit *createSecond(UErrorCode &status); + static MeasureUnit getMicrosecond(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of duration: week. + * Returns by pointer, unit of duration: millisecond. * Caller owns returned value and must free it. + * Also see {@link #getMillisecond()}. * @param status ICU error code. * @stable ICU 53 */ - static MeasureUnit *createWeek(UErrorCode &status); + static MeasureUnit *createMillisecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of duration: year. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of duration: millisecond. + * Also see {@link #createMillisecond()}. + * @draft ICU 64 */ - static MeasureUnit *createYear(UErrorCode &status); + static MeasureUnit getMillisecond(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of electric: ampere. + * Returns by pointer, unit of duration: minute. * Caller owns returned value and must free it. + * Also see {@link #getMinute()}. * @param status ICU error code. - * @stable ICU 54 + * @stable ICU 53 */ - static MeasureUnit *createAmpere(UErrorCode &status); + static MeasureUnit *createMinute(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of electric: milliampere. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 54 + * Returns by value, unit of duration: minute. + * Also see {@link #createMinute()}. + * @draft ICU 64 */ - static MeasureUnit *createMilliampere(UErrorCode &status); + static MeasureUnit getMinute(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of electric: ohm. + * Returns by pointer, unit of duration: month. * Caller owns returned value and must free it. + * Also see {@link #getMonth()}. * @param status ICU error code. - * @stable ICU 54 + * @stable ICU 53 */ - static MeasureUnit *createOhm(UErrorCode &status); + static MeasureUnit *createMonth(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of electric: volt. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 54 + * Returns by value, unit of duration: month. + * Also see {@link #createMonth()}. + * @draft ICU 64 */ - static MeasureUnit *createVolt(UErrorCode &status); + static MeasureUnit getMonth(); +#endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of energy: calorie. + * Returns by pointer, unit of duration: month-person. * Caller owns returned value and must free it. + * Also see {@link #getMonthPerson()}. * @param status ICU error code. - * @stable ICU 54 + * @draft ICU 64 */ - static MeasureUnit *createCalorie(UErrorCode &status); + static MeasureUnit *createMonthPerson(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of energy: foodcalorie. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 54 + * Returns by value, unit of duration: month-person. + * Also see {@link #createMonthPerson()}. + * @draft ICU 64 */ - static MeasureUnit *createFoodcalorie(UErrorCode &status); + static MeasureUnit getMonthPerson(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of energy: joule. + * Returns by pointer, unit of duration: nanosecond. * Caller owns returned value and must free it. + * Also see {@link #getNanosecond()}. * @param status ICU error code. * @stable ICU 54 */ - static MeasureUnit *createJoule(UErrorCode &status); + static MeasureUnit *createNanosecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of energy: kilocalorie. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 54 + * Returns by value, unit of duration: nanosecond. + * Also see {@link #createNanosecond()}. + * @draft ICU 64 */ - static MeasureUnit *createKilocalorie(UErrorCode &status); + static MeasureUnit getNanosecond(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of energy: kilojoule. + * Returns by pointer, unit of duration: second. * Caller owns returned value and must free it. + * Also see {@link #getSecond()}. * @param status ICU error code. - * @stable ICU 54 + * @stable ICU 53 */ - static MeasureUnit *createKilojoule(UErrorCode &status); + static MeasureUnit *createSecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of energy: kilowatt-hour. + * Returns by value, unit of duration: second. + * Also see {@link #createSecond()}. + * @draft ICU 64 + */ + static MeasureUnit getSecond(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of duration: week. + * Caller owns returned value and must free it. + * Also see {@link #getWeek()}. + * @param status ICU error code. + * @stable ICU 53 + */ + static MeasureUnit *createWeek(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of duration: week. + * Also see {@link #createWeek()}. + * @draft ICU 64 + */ + static MeasureUnit getWeek(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of duration: week-person. + * Caller owns returned value and must free it. + * Also see {@link #getWeekPerson()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createWeekPerson(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of duration: week-person. + * Also see {@link #createWeekPerson()}. + * @draft ICU 64 + */ + static MeasureUnit getWeekPerson(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of duration: year. + * Caller owns returned value and must free it. + * Also see {@link #getYear()}. + * @param status ICU error code. + * @stable ICU 53 + */ + static MeasureUnit *createYear(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of duration: year. + * Also see {@link #createYear()}. + * @draft ICU 64 + */ + static MeasureUnit getYear(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of duration: year-person. + * Caller owns returned value and must free it. + * Also see {@link #getYearPerson()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createYearPerson(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of duration: year-person. + * Also see {@link #createYearPerson()}. + * @draft ICU 64 + */ + static MeasureUnit getYearPerson(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of electric: ampere. + * Caller owns returned value and must free it. + * Also see {@link #getAmpere()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createAmpere(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of electric: ampere. + * Also see {@link #createAmpere()}. + * @draft ICU 64 + */ + static MeasureUnit getAmpere(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of electric: milliampere. + * Caller owns returned value and must free it. + * Also see {@link #getMilliampere()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createMilliampere(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of electric: milliampere. + * Also see {@link #createMilliampere()}. + * @draft ICU 64 + */ + static MeasureUnit getMilliampere(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of electric: ohm. + * Caller owns returned value and must free it. + * Also see {@link #getOhm()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createOhm(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of electric: ohm. + * Also see {@link #createOhm()}. + * @draft ICU 64 + */ + static MeasureUnit getOhm(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of electric: volt. + * Caller owns returned value and must free it. + * Also see {@link #getVolt()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createVolt(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of electric: volt. + * Also see {@link #createVolt()}. + * @draft ICU 64 + */ + static MeasureUnit getVolt(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: british-thermal-unit. + * Caller owns returned value and must free it. + * Also see {@link #getBritishThermalUnit()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createBritishThermalUnit(UErrorCode &status); + + /** + * Returns by value, unit of energy: british-thermal-unit. + * Also see {@link #createBritishThermalUnit()}. + * @draft ICU 64 + */ + static MeasureUnit getBritishThermalUnit(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: calorie. + * Caller owns returned value and must free it. + * Also see {@link #getCalorie()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createCalorie(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: calorie. + * Also see {@link #createCalorie()}. + * @draft ICU 64 + */ + static MeasureUnit getCalorie(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of energy: electronvolt. + * Caller owns returned value and must free it. + * Also see {@link #getElectronvolt()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createElectronvolt(UErrorCode &status); + + /** + * Returns by value, unit of energy: electronvolt. + * Also see {@link #createElectronvolt()}. + * @draft ICU 64 + */ + static MeasureUnit getElectronvolt(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: foodcalorie. + * Caller owns returned value and must free it. + * Also see {@link #getFoodcalorie()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createFoodcalorie(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: foodcalorie. + * Also see {@link #createFoodcalorie()}. + * @draft ICU 64 + */ + static MeasureUnit getFoodcalorie(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: joule. * Caller owns returned value and must free it. + * Also see {@link #getJoule()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createJoule(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: joule. + * Also see {@link #createJoule()}. + * @draft ICU 64 + */ + static MeasureUnit getJoule(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: kilocalorie. + * Caller owns returned value and must free it. + * Also see {@link #getKilocalorie()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createKilocalorie(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: kilocalorie. + * Also see {@link #createKilocalorie()}. + * @draft ICU 64 + */ + static MeasureUnit getKilocalorie(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: kilojoule. + * Caller owns returned value and must free it. + * Also see {@link #getKilojoule()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createKilojoule(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: kilojoule. + * Also see {@link #createKilojoule()}. + * @draft ICU 64 + */ + static MeasureUnit getKilojoule(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of energy: kilowatt-hour. + * Caller owns returned value and must free it. + * Also see {@link #getKilowattHour()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKilowattHour(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of energy: kilowatt-hour. + * Also see {@link #createKilowattHour()}. + * @draft ICU 64 + */ + static MeasureUnit getKilowattHour(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of force: newton. + * Caller owns returned value and must free it. + * Also see {@link #getNewton()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createNewton(UErrorCode &status); + + /** + * Returns by value, unit of force: newton. + * Also see {@link #createNewton()}. + * @draft ICU 64 + */ + static MeasureUnit getNewton(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of force: pound-force. + * Caller owns returned value and must free it. + * Also see {@link #getPoundForce()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createPoundForce(UErrorCode &status); + + /** + * Returns by value, unit of force: pound-force. + * Also see {@link #createPoundForce()}. + * @draft ICU 64 + */ + static MeasureUnit getPoundForce(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of frequency: gigahertz. + * Returns by pointer, unit of frequency: gigahertz. * Caller owns returned value and must free it. + * Also see {@link #getGigahertz()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createGigahertz(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of frequency: gigahertz. + * Also see {@link #createGigahertz()}. + * @draft ICU 64 + */ + static MeasureUnit getGigahertz(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of frequency: hertz. + * Returns by pointer, unit of frequency: hertz. * Caller owns returned value and must free it. + * Also see {@link #getHertz()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createHertz(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of frequency: hertz. + * Also see {@link #createHertz()}. + * @draft ICU 64 + */ + static MeasureUnit getHertz(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of frequency: kilohertz. + * Returns by pointer, unit of frequency: kilohertz. * Caller owns returned value and must free it. + * Also see {@link #getKilohertz()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKilohertz(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of frequency: kilohertz. + * Also see {@link #createKilohertz()}. + * @draft ICU 64 + */ + static MeasureUnit getKilohertz(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of frequency: megahertz. + * Returns by pointer, unit of frequency: megahertz. * Caller owns returned value and must free it. + * Also see {@link #getMegahertz()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMegahertz(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of frequency: megahertz. + * Also see {@link #createMegahertz()}. + * @draft ICU 64 + */ + static MeasureUnit getMegahertz(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: astronomical-unit. + * Returns by pointer, unit of length: astronomical-unit. * Caller owns returned value and must free it. + * Also see {@link #getAstronomicalUnit()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createAstronomicalUnit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: astronomical-unit. + * Also see {@link #createAstronomicalUnit()}. + * @draft ICU 64 + */ + static MeasureUnit getAstronomicalUnit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: centimeter. + * Returns by pointer, unit of length: centimeter. * Caller owns returned value and must free it. + * Also see {@link #getCentimeter()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createCentimeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: centimeter. + * Also see {@link #createCentimeter()}. + * @draft ICU 64 + */ + static MeasureUnit getCentimeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: decimeter. + * Returns by pointer, unit of length: decimeter. * Caller owns returned value and must free it. + * Also see {@link #getDecimeter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createDecimeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: decimeter. + * Also see {@link #createDecimeter()}. + * @draft ICU 64 + */ + static MeasureUnit getDecimeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: fathom. + * Returns by pointer, unit of length: fathom. * Caller owns returned value and must free it. + * Also see {@link #getFathom()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createFathom(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: fathom. + * Also see {@link #createFathom()}. + * @draft ICU 64 + */ + static MeasureUnit getFathom(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: foot. + * Returns by pointer, unit of length: foot. * Caller owns returned value and must free it. + * Also see {@link #getFoot()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createFoot(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: foot. + * Also see {@link #createFoot()}. + * @draft ICU 64 + */ + static MeasureUnit getFoot(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: furlong. + * Returns by pointer, unit of length: furlong. * Caller owns returned value and must free it. + * Also see {@link #getFurlong()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createFurlong(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: furlong. + * Also see {@link #createFurlong()}. + * @draft ICU 64 + */ + static MeasureUnit getFurlong(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: inch. + * Returns by pointer, unit of length: inch. * Caller owns returned value and must free it. + * Also see {@link #getInch()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createInch(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: inch. + * Also see {@link #createInch()}. + * @draft ICU 64 + */ + static MeasureUnit getInch(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: kilometer. + * Returns by pointer, unit of length: kilometer. * Caller owns returned value and must free it. + * Also see {@link #getKilometer()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createKilometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: kilometer. + * Also see {@link #createKilometer()}. + * @draft ICU 64 + */ + static MeasureUnit getKilometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: light-year. + * Returns by pointer, unit of length: light-year. * Caller owns returned value and must free it. + * Also see {@link #getLightYear()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createLightYear(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: light-year. + * Also see {@link #createLightYear()}. + * @draft ICU 64 + */ + static MeasureUnit getLightYear(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: meter. + * Returns by pointer, unit of length: meter. * Caller owns returned value and must free it. + * Also see {@link #getMeter()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: meter. + * Also see {@link #createMeter()}. + * @draft ICU 64 + */ + static MeasureUnit getMeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: micrometer. + * Returns by pointer, unit of length: micrometer. * Caller owns returned value and must free it. + * Also see {@link #getMicrometer()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMicrometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: micrometer. + * Also see {@link #createMicrometer()}. + * @draft ICU 64 + */ + static MeasureUnit getMicrometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: mile. + * Returns by pointer, unit of length: mile. * Caller owns returned value and must free it. + * Also see {@link #getMile()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMile(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: mile. + * Also see {@link #createMile()}. + * @draft ICU 64 + */ + static MeasureUnit getMile(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: mile-scandinavian. + * Returns by pointer, unit of length: mile-scandinavian. * Caller owns returned value and must free it. + * Also see {@link #getMileScandinavian()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createMileScandinavian(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: mile-scandinavian. + * Also see {@link #createMileScandinavian()}. + * @draft ICU 64 + */ + static MeasureUnit getMileScandinavian(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: millimeter. + * Returns by pointer, unit of length: millimeter. * Caller owns returned value and must free it. + * Also see {@link #getMillimeter()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMillimeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: millimeter. + * Also see {@link #createMillimeter()}. + * @draft ICU 64 + */ + static MeasureUnit getMillimeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: nanometer. + * Returns by pointer, unit of length: nanometer. * Caller owns returned value and must free it. + * Also see {@link #getNanometer()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createNanometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: nanometer. + * Also see {@link #createNanometer()}. + * @draft ICU 64 + */ + static MeasureUnit getNanometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: nautical-mile. + * Returns by pointer, unit of length: nautical-mile. * Caller owns returned value and must free it. + * Also see {@link #getNauticalMile()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createNauticalMile(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: nautical-mile. + * Also see {@link #createNauticalMile()}. + * @draft ICU 64 + */ + static MeasureUnit getNauticalMile(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: parsec. + * Returns by pointer, unit of length: parsec. * Caller owns returned value and must free it. + * Also see {@link #getParsec()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createParsec(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: parsec. + * Also see {@link #createParsec()}. + * @draft ICU 64 + */ + static MeasureUnit getParsec(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: picometer. + * Returns by pointer, unit of length: picometer. * Caller owns returned value and must free it. + * Also see {@link #getPicometer()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createPicometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: picometer. + * Also see {@link #createPicometer()}. + * @draft ICU 64 + */ + static MeasureUnit getPicometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: point. + * Returns by pointer, unit of length: point. * Caller owns returned value and must free it. + * Also see {@link #getPoint()}. * @param status ICU error code. * @stable ICU 59 */ static MeasureUnit *createPoint(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: point. + * Also see {@link #createPoint()}. + * @draft ICU 64 + */ + static MeasureUnit getPoint(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: solar-radius. + * Caller owns returned value and must free it. + * Also see {@link #getSolarRadius()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createSolarRadius(UErrorCode &status); + + /** + * Returns by value, unit of length: solar-radius. + * Also see {@link #createSolarRadius()}. + * @draft ICU 64 + */ + static MeasureUnit getSolarRadius(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of length: yard. + * Returns by pointer, unit of length: yard. * Caller owns returned value and must free it. + * Also see {@link #getYard()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createYard(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of length: yard. + * Also see {@link #createYard()}. + * @draft ICU 64 + */ + static MeasureUnit getYard(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of light: lux. + * Returns by pointer, unit of light: lux. * Caller owns returned value and must free it. + * Also see {@link #getLux()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createLux(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of light: lux. + * Also see {@link #createLux()}. + * @draft ICU 64 + */ + static MeasureUnit getLux(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of light: solar-luminosity. + * Caller owns returned value and must free it. + * Also see {@link #getSolarLuminosity()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createSolarLuminosity(UErrorCode &status); + + /** + * Returns by value, unit of light: solar-luminosity. + * Also see {@link #createSolarLuminosity()}. + * @draft ICU 64 + */ + static MeasureUnit getSolarLuminosity(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: carat. + * Returns by pointer, unit of mass: carat. * Caller owns returned value and must free it. + * Also see {@link #getCarat()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCarat(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: carat. + * Also see {@link #createCarat()}. + * @draft ICU 64 + */ + static MeasureUnit getCarat(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of mass: dalton. + * Caller owns returned value and must free it. + * Also see {@link #getDalton()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createDalton(UErrorCode &status); + + /** + * Returns by value, unit of mass: dalton. + * Also see {@link #createDalton()}. + * @draft ICU 64 + */ + static MeasureUnit getDalton(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of mass: gram. + * Returns by pointer, unit of mass: earth-mass. * Caller owns returned value and must free it. + * Also see {@link #getEarthMass()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createEarthMass(UErrorCode &status); + + /** + * Returns by value, unit of mass: earth-mass. + * Also see {@link #createEarthMass()}. + * @draft ICU 64 + */ + static MeasureUnit getEarthMass(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of mass: gram. + * Caller owns returned value and must free it. + * Also see {@link #getGram()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createGram(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: gram. + * Also see {@link #createGram()}. + * @draft ICU 64 + */ + static MeasureUnit getGram(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: kilogram. + * Returns by pointer, unit of mass: kilogram. * Caller owns returned value and must free it. + * Also see {@link #getKilogram()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createKilogram(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: kilogram. + * Also see {@link #createKilogram()}. + * @draft ICU 64 + */ + static MeasureUnit getKilogram(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: metric-ton. + * Returns by pointer, unit of mass: metric-ton. * Caller owns returned value and must free it. + * Also see {@link #getMetricTon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMetricTon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: metric-ton. + * Also see {@link #createMetricTon()}. + * @draft ICU 64 + */ + static MeasureUnit getMetricTon(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: microgram. + * Returns by pointer, unit of mass: microgram. * Caller owns returned value and must free it. + * Also see {@link #getMicrogram()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMicrogram(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: microgram. + * Also see {@link #createMicrogram()}. + * @draft ICU 64 + */ + static MeasureUnit getMicrogram(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: milligram. + * Returns by pointer, unit of mass: milligram. * Caller owns returned value and must free it. + * Also see {@link #getMilligram()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMilligram(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: milligram. + * Also see {@link #createMilligram()}. + * @draft ICU 64 + */ + static MeasureUnit getMilligram(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: ounce. + * Returns by pointer, unit of mass: ounce. * Caller owns returned value and must free it. + * Also see {@link #getOunce()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createOunce(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: ounce. + * Also see {@link #createOunce()}. + * @draft ICU 64 + */ + static MeasureUnit getOunce(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of mass: ounce-troy. + * Caller owns returned value and must free it. + * Also see {@link #getOunceTroy()}. + * @param status ICU error code. + * @stable ICU 54 + */ + static MeasureUnit *createOunceTroy(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: ounce-troy. + * Also see {@link #createOunceTroy()}. + * @draft ICU 64 + */ + static MeasureUnit getOunceTroy(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of mass: pound. + * Caller owns returned value and must free it. + * Also see {@link #getPound()}. + * @param status ICU error code. + * @stable ICU 53 + */ + static MeasureUnit *createPound(UErrorCode &status); + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: pound. + * Also see {@link #createPound()}. + * @draft ICU 64 + */ + static MeasureUnit getPound(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API /** - * Returns unit of mass: ounce-troy. + * Returns by pointer, unit of mass: solar-mass. * Caller owns returned value and must free it. + * Also see {@link #getSolarMass()}. * @param status ICU error code. - * @stable ICU 54 + * @draft ICU 64 */ - static MeasureUnit *createOunceTroy(UErrorCode &status); + static MeasureUnit *createSolarMass(UErrorCode &status); /** - * Returns unit of mass: pound. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @stable ICU 53 + * Returns by value, unit of mass: solar-mass. + * Also see {@link #createSolarMass()}. + * @draft ICU 64 */ - static MeasureUnit *createPound(UErrorCode &status); + static MeasureUnit getSolarMass(); +#endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of mass: stone. + * Returns by pointer, unit of mass: stone. * Caller owns returned value and must free it. + * Also see {@link #getStone()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createStone(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: stone. + * Also see {@link #createStone()}. + * @draft ICU 64 + */ + static MeasureUnit getStone(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of mass: ton. + * Returns by pointer, unit of mass: ton. * Caller owns returned value and must free it. + * Also see {@link #getTon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createTon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of mass: ton. + * Also see {@link #createTon()}. + * @draft ICU 64 + */ + static MeasureUnit getTon(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: gigawatt. + * Returns by pointer, unit of power: gigawatt. * Caller owns returned value and must free it. + * Also see {@link #getGigawatt()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createGigawatt(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of power: gigawatt. + * Also see {@link #createGigawatt()}. + * @draft ICU 64 + */ + static MeasureUnit getGigawatt(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: horsepower. + * Returns by pointer, unit of power: horsepower. * Caller owns returned value and must free it. + * Also see {@link #getHorsepower()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createHorsepower(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of power: horsepower. + * Also see {@link #createHorsepower()}. + * @draft ICU 64 + */ + static MeasureUnit getHorsepower(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: kilowatt. + * Returns by pointer, unit of power: kilowatt. * Caller owns returned value and must free it. + * Also see {@link #getKilowatt()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createKilowatt(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of power: kilowatt. + * Also see {@link #createKilowatt()}. + * @draft ICU 64 + */ + static MeasureUnit getKilowatt(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: megawatt. + * Returns by pointer, unit of power: megawatt. * Caller owns returned value and must free it. + * Also see {@link #getMegawatt()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMegawatt(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of power: megawatt. + * Also see {@link #createMegawatt()}. + * @draft ICU 64 + */ + static MeasureUnit getMegawatt(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: milliwatt. + * Returns by pointer, unit of power: milliwatt. * Caller owns returned value and must free it. + * Also see {@link #getMilliwatt()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMilliwatt(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of power: milliwatt. + * Also see {@link #createMilliwatt()}. + * @draft ICU 64 + */ + static MeasureUnit getMilliwatt(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of power: watt. + * Returns by pointer, unit of power: watt. * Caller owns returned value and must free it. + * Also see {@link #getWatt()}. * @param status ICU error code. * @stable ICU 53 */ @@ -1016,318 +2303,825 @@ class U_I18N_API MeasureUnit: public UObject { #ifndef U_HIDE_DRAFT_API /** - * Returns unit of pressure: atmosphere. + * Returns by value, unit of power: watt. + * Also see {@link #createWatt()}. + * @draft ICU 64 + */ + static MeasureUnit getWatt(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of pressure: atmosphere. * Caller owns returned value and must free it. + * Also see {@link #getAtmosphere()}. * @param status ICU error code. * @draft ICU 63 */ static MeasureUnit *createAtmosphere(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: atmosphere. + * Also see {@link #createAtmosphere()}. + * @draft ICU 64 + */ + static MeasureUnit getAtmosphere(); #endif /* U_HIDE_DRAFT_API */ /** - * Returns unit of pressure: hectopascal. + * Returns by pointer, unit of pressure: hectopascal. * Caller owns returned value and must free it. + * Also see {@link #getHectopascal()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createHectopascal(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: hectopascal. + * Also see {@link #createHectopascal()}. + * @draft ICU 64 + */ + static MeasureUnit getHectopascal(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of pressure: inch-hg. + * Returns by pointer, unit of pressure: inch-hg. * Caller owns returned value and must free it. + * Also see {@link #getInchHg()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createInchHg(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: inch-hg. + * Also see {@link #createInchHg()}. + * @draft ICU 64 + */ + static MeasureUnit getInchHg(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of pressure: kilopascal. + * Caller owns returned value and must free it. + * Also see {@link #getKilopascal()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createKilopascal(UErrorCode &status); + + /** + * Returns by value, unit of pressure: kilopascal. + * Also see {@link #createKilopascal()}. + * @draft ICU 64 + */ + static MeasureUnit getKilopascal(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of pressure: megapascal. + * Caller owns returned value and must free it. + * Also see {@link #getMegapascal()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createMegapascal(UErrorCode &status); + + /** + * Returns by value, unit of pressure: megapascal. + * Also see {@link #createMegapascal()}. + * @draft ICU 64 + */ + static MeasureUnit getMegapascal(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of pressure: millibar. + * Returns by pointer, unit of pressure: millibar. * Caller owns returned value and must free it. + * Also see {@link #getMillibar()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMillibar(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: millibar. + * Also see {@link #createMillibar()}. + * @draft ICU 64 + */ + static MeasureUnit getMillibar(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of pressure: millimeter-of-mercury. + * Returns by pointer, unit of pressure: millimeter-of-mercury. * Caller owns returned value and must free it. + * Also see {@link #getMillimeterOfMercury()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMillimeterOfMercury(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: millimeter-of-mercury. + * Also see {@link #createMillimeterOfMercury()}. + * @draft ICU 64 + */ + static MeasureUnit getMillimeterOfMercury(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of pressure: pound-per-square-inch. + * Returns by pointer, unit of pressure: pound-per-square-inch. * Caller owns returned value and must free it. + * Also see {@link #getPoundPerSquareInch()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createPoundPerSquareInch(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of pressure: pound-per-square-inch. + * Also see {@link #createPoundPerSquareInch()}. + * @draft ICU 64 + */ + static MeasureUnit getPoundPerSquareInch(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of speed: kilometer-per-hour. + * Returns by pointer, unit of speed: kilometer-per-hour. * Caller owns returned value and must free it. + * Also see {@link #getKilometerPerHour()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createKilometerPerHour(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of speed: kilometer-per-hour. + * Also see {@link #createKilometerPerHour()}. + * @draft ICU 64 + */ + static MeasureUnit getKilometerPerHour(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of speed: knot. + * Returns by pointer, unit of speed: knot. * Caller owns returned value and must free it. + * Also see {@link #getKnot()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createKnot(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of speed: knot. + * Also see {@link #createKnot()}. + * @draft ICU 64 + */ + static MeasureUnit getKnot(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of speed: meter-per-second. + * Returns by pointer, unit of speed: meter-per-second. * Caller owns returned value and must free it. + * Also see {@link #getMeterPerSecond()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMeterPerSecond(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of speed: meter-per-second. + * Also see {@link #createMeterPerSecond()}. + * @draft ICU 64 + */ + static MeasureUnit getMeterPerSecond(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of speed: mile-per-hour. + * Returns by pointer, unit of speed: mile-per-hour. * Caller owns returned value and must free it. + * Also see {@link #getMilePerHour()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createMilePerHour(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of speed: mile-per-hour. + * Also see {@link #createMilePerHour()}. + * @draft ICU 64 + */ + static MeasureUnit getMilePerHour(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of temperature: celsius. + * Returns by pointer, unit of temperature: celsius. * Caller owns returned value and must free it. + * Also see {@link #getCelsius()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createCelsius(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of temperature: celsius. + * Also see {@link #createCelsius()}. + * @draft ICU 64 + */ + static MeasureUnit getCelsius(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of temperature: fahrenheit. + * Returns by pointer, unit of temperature: fahrenheit. * Caller owns returned value and must free it. + * Also see {@link #getFahrenheit()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createFahrenheit(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of temperature: fahrenheit. + * Also see {@link #createFahrenheit()}. + * @draft ICU 64 + */ + static MeasureUnit getFahrenheit(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of temperature: generic. + * Returns by pointer, unit of temperature: generic. * Caller owns returned value and must free it. + * Also see {@link #getGenericTemperature()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createGenericTemperature(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of temperature: generic. + * Also see {@link #createGenericTemperature()}. + * @draft ICU 64 + */ + static MeasureUnit getGenericTemperature(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of temperature: kelvin. + * Returns by pointer, unit of temperature: kelvin. * Caller owns returned value and must free it. + * Also see {@link #getKelvin()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createKelvin(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of temperature: kelvin. + * Also see {@link #createKelvin()}. + * @draft ICU 64 + */ + static MeasureUnit getKelvin(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of torque: newton-meter. + * Caller owns returned value and must free it. + * Also see {@link #getNewtonMeter()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createNewtonMeter(UErrorCode &status); + + /** + * Returns by value, unit of torque: newton-meter. + * Also see {@link #createNewtonMeter()}. + * @draft ICU 64 + */ + static MeasureUnit getNewtonMeter(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of torque: pound-foot. + * Caller owns returned value and must free it. + * Also see {@link #getPoundFoot()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createPoundFoot(UErrorCode &status); + + /** + * Returns by value, unit of torque: pound-foot. + * Also see {@link #createPoundFoot()}. + * @draft ICU 64 + */ + static MeasureUnit getPoundFoot(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: acre-foot. + * Returns by pointer, unit of volume: acre-foot. * Caller owns returned value and must free it. + * Also see {@link #getAcreFoot()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createAcreFoot(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: acre-foot. + * Also see {@link #createAcreFoot()}. + * @draft ICU 64 + */ + static MeasureUnit getAcreFoot(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: barrel. + * Caller owns returned value and must free it. + * Also see {@link #getBarrel()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createBarrel(UErrorCode &status); + + /** + * Returns by value, unit of volume: barrel. + * Also see {@link #createBarrel()}. + * @draft ICU 64 + */ + static MeasureUnit getBarrel(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: bushel. + * Returns by pointer, unit of volume: bushel. * Caller owns returned value and must free it. + * Also see {@link #getBushel()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createBushel(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: bushel. + * Also see {@link #createBushel()}. + * @draft ICU 64 + */ + static MeasureUnit getBushel(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: centiliter. + * Returns by pointer, unit of volume: centiliter. * Caller owns returned value and must free it. + * Also see {@link #getCentiliter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCentiliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: centiliter. + * Also see {@link #createCentiliter()}. + * @draft ICU 64 + */ + static MeasureUnit getCentiliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-centimeter. + * Returns by pointer, unit of volume: cubic-centimeter. * Caller owns returned value and must free it. + * Also see {@link #getCubicCentimeter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCubicCentimeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-centimeter. + * Also see {@link #createCubicCentimeter()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicCentimeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-foot. + * Returns by pointer, unit of volume: cubic-foot. * Caller owns returned value and must free it. + * Also see {@link #getCubicFoot()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCubicFoot(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-foot. + * Also see {@link #createCubicFoot()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicFoot(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-inch. + * Returns by pointer, unit of volume: cubic-inch. * Caller owns returned value and must free it. + * Also see {@link #getCubicInch()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCubicInch(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-inch. + * Also see {@link #createCubicInch()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicInch(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-kilometer. + * Returns by pointer, unit of volume: cubic-kilometer. * Caller owns returned value and must free it. + * Also see {@link #getCubicKilometer()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createCubicKilometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-kilometer. + * Also see {@link #createCubicKilometer()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicKilometer(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-meter. + * Returns by pointer, unit of volume: cubic-meter. * Caller owns returned value and must free it. + * Also see {@link #getCubicMeter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCubicMeter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-meter. + * Also see {@link #createCubicMeter()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicMeter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-mile. + * Returns by pointer, unit of volume: cubic-mile. * Caller owns returned value and must free it. + * Also see {@link #getCubicMile()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createCubicMile(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-mile. + * Also see {@link #createCubicMile()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicMile(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cubic-yard. + * Returns by pointer, unit of volume: cubic-yard. * Caller owns returned value and must free it. + * Also see {@link #getCubicYard()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCubicYard(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cubic-yard. + * Also see {@link #createCubicYard()}. + * @draft ICU 64 + */ + static MeasureUnit getCubicYard(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cup. + * Returns by pointer, unit of volume: cup. * Caller owns returned value and must free it. + * Also see {@link #getCup()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createCup(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cup. + * Also see {@link #createCup()}. + * @draft ICU 64 + */ + static MeasureUnit getCup(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: cup-metric. + * Returns by pointer, unit of volume: cup-metric. * Caller owns returned value and must free it. + * Also see {@link #getCupMetric()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createCupMetric(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: cup-metric. + * Also see {@link #createCupMetric()}. + * @draft ICU 64 + */ + static MeasureUnit getCupMetric(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: deciliter. + * Returns by pointer, unit of volume: deciliter. * Caller owns returned value and must free it. + * Also see {@link #getDeciliter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createDeciliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: deciliter. + * Also see {@link #createDeciliter()}. + * @draft ICU 64 + */ + static MeasureUnit getDeciliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: fluid-ounce. + * Returns by pointer, unit of volume: fluid-ounce. * Caller owns returned value and must free it. + * Also see {@link #getFluidOunce()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createFluidOunce(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: fluid-ounce. + * Also see {@link #createFluidOunce()}. + * @draft ICU 64 + */ + static MeasureUnit getFluidOunce(); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of volume: fluid-ounce-imperial. + * Caller owns returned value and must free it. + * Also see {@link #getFluidOunceImperial()}. + * @param status ICU error code. + * @draft ICU 64 + */ + static MeasureUnit *createFluidOunceImperial(UErrorCode &status); + /** - * Returns unit of volume: gallon. + * Returns by value, unit of volume: fluid-ounce-imperial. + * Also see {@link #createFluidOunceImperial()}. + * @draft ICU 64 + */ + static MeasureUnit getFluidOunceImperial(); +#endif /* U_HIDE_DRAFT_API */ + + /** + * Returns by pointer, unit of volume: gallon. * Caller owns returned value and must free it. + * Also see {@link #getGallon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createGallon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: gallon. + * Also see {@link #createGallon()}. + * @draft ICU 64 + */ + static MeasureUnit getGallon(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: gallon-imperial. + * Returns by pointer, unit of volume: gallon-imperial. * Caller owns returned value and must free it. + * Also see {@link #getGallonImperial()}. * @param status ICU error code. * @stable ICU 57 */ static MeasureUnit *createGallonImperial(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: gallon-imperial. + * Also see {@link #createGallonImperial()}. + * @draft ICU 64 + */ + static MeasureUnit getGallonImperial(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: hectoliter. + * Returns by pointer, unit of volume: hectoliter. * Caller owns returned value and must free it. + * Also see {@link #getHectoliter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createHectoliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: hectoliter. + * Also see {@link #createHectoliter()}. + * @draft ICU 64 + */ + static MeasureUnit getHectoliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: liter. + * Returns by pointer, unit of volume: liter. * Caller owns returned value and must free it. + * Also see {@link #getLiter()}. * @param status ICU error code. * @stable ICU 53 */ static MeasureUnit *createLiter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: liter. + * Also see {@link #createLiter()}. + * @draft ICU 64 + */ + static MeasureUnit getLiter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: megaliter. + * Returns by pointer, unit of volume: megaliter. * Caller owns returned value and must free it. + * Also see {@link #getMegaliter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMegaliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: megaliter. + * Also see {@link #createMegaliter()}. + * @draft ICU 64 + */ + static MeasureUnit getMegaliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: milliliter. + * Returns by pointer, unit of volume: milliliter. * Caller owns returned value and must free it. + * Also see {@link #getMilliliter()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createMilliliter(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: milliliter. + * Also see {@link #createMilliliter()}. + * @draft ICU 64 + */ + static MeasureUnit getMilliliter(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: pint. + * Returns by pointer, unit of volume: pint. * Caller owns returned value and must free it. + * Also see {@link #getPint()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createPint(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: pint. + * Also see {@link #createPint()}. + * @draft ICU 64 + */ + static MeasureUnit getPint(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: pint-metric. + * Returns by pointer, unit of volume: pint-metric. * Caller owns returned value and must free it. + * Also see {@link #getPintMetric()}. * @param status ICU error code. * @stable ICU 56 */ static MeasureUnit *createPintMetric(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: pint-metric. + * Also see {@link #createPintMetric()}. + * @draft ICU 64 + */ + static MeasureUnit getPintMetric(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: quart. + * Returns by pointer, unit of volume: quart. * Caller owns returned value and must free it. + * Also see {@link #getQuart()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createQuart(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: quart. + * Also see {@link #createQuart()}. + * @draft ICU 64 + */ + static MeasureUnit getQuart(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: tablespoon. + * Returns by pointer, unit of volume: tablespoon. * Caller owns returned value and must free it. + * Also see {@link #getTablespoon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createTablespoon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: tablespoon. + * Also see {@link #createTablespoon()}. + * @draft ICU 64 + */ + static MeasureUnit getTablespoon(); +#endif /* U_HIDE_DRAFT_API */ + /** - * Returns unit of volume: teaspoon. + * Returns by pointer, unit of volume: teaspoon. * Caller owns returned value and must free it. + * Also see {@link #getTeaspoon()}. * @param status ICU error code. * @stable ICU 54 */ static MeasureUnit *createTeaspoon(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by value, unit of volume: teaspoon. + * Also see {@link #createTeaspoon()}. + * @draft ICU 64 + */ + static MeasureUnit getTeaspoon(); +#endif /* U_HIDE_DRAFT_API */ + // End generated createXXX methods diff --git a/deps/icu-small/source/i18n/unicode/msgfmt.h b/deps/icu-small/source/i18n/unicode/msgfmt.h index 074d93354000ef..8e1bf9b45f9184 100644 --- a/deps/icu-small/source/i18n/unicode/msgfmt.h +++ b/deps/icu-small/source/i18n/unicode/msgfmt.h @@ -69,9 +69,8 @@ class NumberFormat; * if the pattern has named arguments (see {@link #usesNamedArguments()}). * *

      An argument might not specify any format type. In this case, - * a Number value is formatted with a default (for the locale) NumberFormat, - * a Date value is formatted with a default (for the locale) DateFormat, - * and for any other value its toString() value is used. + * a numeric value is formatted with a default (for the locale) NumberFormat, + * and a date/time value is formatted with a default (for the locale) DateFormat. * *

      An argument might specify a "simple" type for which the specified * Format object is created, cached and used. @@ -204,6 +203,9 @@ class NumberFormat; * argStyleText * new SimpleDateFormat(argStyleText, getLocale(), status) * + * argSkeletonText + * DateFormat::createInstanceForSkeleton(argSkeletonText, getLocale(), status) + * * time * (none) * DateFormat.createTimeInstance(kDefault, getLocale(), status) @@ -240,6 +242,19 @@ class NumberFormat; * *

      * + *

      Argument formatting

      + * + *

      Arguments are formatted according to their type, using the default + * ICU formatters for those types, unless otherwise specified.

      + * + *

      There are also several ways to control the formatting.

      + * + *

      We recommend you use default styles, predefined style values, skeletons, + * or preformatted values, but not pattern strings or custom format objects.

      + * + *

      For more details, see the + * ICU User Guide.

      + * *

      Usage Information

      * *

      Here are some examples of usage: @@ -257,11 +272,11 @@ class NumberFormat; * * UnicodeString result; * MessageFormat::format( - * "At {1,time} on {1,date}, there was {2} on planet {0,number}.", + * "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {0,number}.", * arguments, 3, result, success ); * * cout << "result: " << result << endl; - * //: At 4:34:20 PM on 23-Mar-98, there was a disturbance + * //: At 4:34 PM on March 23, there was a disturbance * // in the Force on planet 7. * \endcode * @@ -994,6 +1009,8 @@ class U_I18N_API MessageFormat : public Format { void cacheExplicitFormats(UErrorCode& status); + int32_t skipLeadingSpaces(UnicodeString& style); + Format* createAppropriateFormat(UnicodeString& type, UnicodeString& style, Formattable::Type& formattableType, diff --git a/deps/icu-small/source/i18n/unicode/nounit.h b/deps/icu-small/source/i18n/unicode/nounit.h index 288f268d66d658..879849b16bd8e0 100644 --- a/deps/icu-small/source/i18n/unicode/nounit.h +++ b/deps/icu-small/source/i18n/unicode/nounit.h @@ -13,6 +13,7 @@ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING +#ifndef U_HIDE_DRAFT_API #include "unicode/measunit.h" @@ -23,7 +24,6 @@ U_NAMESPACE_BEGIN -#ifndef U_HIDE_DRAFT_API /** * Dimensionless unit for percent and permille. * @see NumberFormatter @@ -100,10 +100,10 @@ class U_I18N_API NoUnit: public MeasureUnit { NoUnit(const char* subtype); }; -#endif /* U_HIDE_DRAFT_API */ U_NAMESPACE_END +#endif /* U_HIDE_DRAFT_API */ #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // __NOUNIT_H__ diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h index 469949a2878eb4..e9fe39a9316665 100644 --- a/deps/icu-small/source/i18n/unicode/numberformatter.h +++ b/deps/icu-small/source/i18n/unicode/numberformatter.h @@ -11,9 +11,11 @@ #include "unicode/dcfmtsym.h" #include "unicode/currunit.h" #include "unicode/fieldpos.h" +#include "unicode/formattedvalue.h" #include "unicode/fpositer.h" #include "unicode/measunit.h" #include "unicode/nounit.h" +#include "unicode/parseerr.h" #include "unicode/plurrule.h" #include "unicode/ucurr.h" #include "unicode/unum.h" @@ -42,25 +44,27 @@ * .format(1234) * .toString(); // €1.2K in en-US * - * // Create a formatter in a singleton for use later: + * // Create a formatter in a singleton by value for use later: * static const LocalizedNumberFormatter formatter = NumberFormatter::withLocale(...) * .unit(NoUnit::percent()) * .precision(Precision::fixedFraction(3)); * formatter.format(5.9831).toString(); // 5.983% in en-US * - * // Create a "template" in a singleton but without setting a locale until the call site: - * static const UnlocalizedNumberFormatter template = NumberFormatter::with() + * // Create a "template" in a singleton unique_ptr but without setting a locale until the call site: + * std::unique_ptr template = NumberFormatter::with() * .sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS) - * .adoptUnit(MeasureUnit::createMeter(status)) - * .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME); - * template.locale(...).format(1234).toString(); // +1,234 meters in en-US + * .unit(MeasureUnit::getMeter()) + * .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME) + * .clone(); + * template->locale(...).format(1234).toString(); // +1,234 meters in en-US * * *

      * This API offers more features than DecimalFormat and is geared toward new users of ICU. * *

      - * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no + * NumberFormatter instances (i.e., LocalizedNumberFormatter and UnlocalizedNumberFormatter) + * are immutable and thread safe. This means that invoking a configuration method has no * effect on the receiving instance; you must store and use the new number formatter instance it returns instead. * *

      @@ -108,6 +112,7 @@ class IntegerWidth;
       
       namespace impl {
       
      +// can't be #ifndef U_HIDE_INTERNAL_API; referenced throughout this file in public classes
       /**
        * Datatype for minimum/maximum fraction digits. Must be able to hold kMaxIntFracSig.
        *
      @@ -115,20 +120,21 @@ namespace impl {
        */
       typedef int16_t digits_t;
       
      +// can't be #ifndef U_HIDE_INTERNAL_API; needed for struct initialization
       /**
        * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built
        * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path.
        *
        * @internal
        */
      -static constexpr int32_t DEFAULT_THRESHOLD = 3;
      +static constexpr int32_t kInternalDefaultThreshold = 3;
       
       // Forward declarations:
       class Padder;
       struct MacroProps;
       struct MicroProps;
       class DecimalQuantity;
      -struct UFormattedNumberData;
      +class UFormattedNumberData;
       class NumberFormatterImpl;
       struct ParsedPatternInfo;
       class ScientificModifier;
      @@ -146,6 +152,7 @@ class GeneratorHelpers;
       class DecNum;
       class NumberRangeFormatterImpl;
       struct RangeMacroProps;
      +struct UFormattedNumberImpl;
       
       /**
        * Used for NumberRangeFormatter and implemented in numrange_fluent.cpp.
      @@ -439,34 +446,6 @@ class U_I18N_API ScientificNotation : public Notation {
        */
       typedef Precision SignificantDigitsPrecision;
       
      -// Typedefs for ICU 60/61 compatibility.
      -// These will be removed in ICU 64.
      -// See http://bugs.icu-project.org/trac/ticket/13746
      -
      -/**
      - * This will be removed in ICU 64.  See ICU-13746.
      - * @deprecated ICU 63
      - */
      -typedef Precision Rounder;
      -
      -/**
      - * This will be removed in ICU 64.  See ICU-13746.
      - * @deprecated ICU 63
      - */
      -typedef FractionPrecision FractionRounder;
      -
      -/**
      - * This will be removed in ICU 64.  See ICU-13746.
      - * @deprecated ICU 63
      - */
      -typedef IncrementPrecision IncrementRounder;
      -
      -/**
      - * This will be removed in ICU 64.  See ICU-13746.
      - * @deprecated ICU 63
      - */
      -typedef CurrencyPrecision CurrencyRounder;
      -
       /**
        * A class that defines the rounding precision to be used when formatting numbers in NumberFormatter.
        *
      @@ -483,10 +462,11 @@ class U_I18N_API Precision : public UMemory {
            *
            * 

      * NOTE: When formatting a double, this method, along with {@link #minFraction} and - * {@link #minDigits}, will trigger complex algorithm similar to Dragon4 to determine the low-order digits - * and the number of digits to display based on the value of the double. If the number of fraction places or - * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize - * performance. For more information, read the following blog post. + * {@link #minSignificantDigits}, will trigger complex algorithm similar to Dragon4 to determine the + * low-order digits and the number of digits to display based on the value of the double. + * If the number of fraction places or significant digits can be bounded, consider using {@link #maxFraction} + * or {@link #maxSignificantDigits} instead to maximize performance. + * For more information, read the following blog post. * *

      * http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/ @@ -580,7 +560,7 @@ class U_I18N_API Precision : public UMemory { * pad with zeros to ensure that this number of significant digits/figures are always shown. * *

      - * This method is equivalent to {@link #minMaxDigits} with both arguments equal. + * This method is equivalent to {@link #minMaxSignificantDigits} with both arguments equal. * * @param minMaxSignificantDigits * The minimum and maximum number of significant digits to display (rounding if too long or padding with @@ -628,31 +608,6 @@ class U_I18N_API Precision : public UMemory { static SignificantDigitsPrecision minMaxSignificantDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits); -#ifndef U_HIDE_DEPRECATED_API - // Compatiblity methods that will be removed in ICU 64. - // See http://bugs.icu-project.org/trac/ticket/13746 - - /** @deprecated ICU 62 */ - static inline SignificantDigitsPrecision fixedDigits(int32_t a) { - return fixedSignificantDigits(a); - } - - /** @deprecated ICU 62 */ - static inline SignificantDigitsPrecision minDigits(int32_t a) { - return minSignificantDigits(a); - } - - /** @deprecated ICU 62 */ - static inline SignificantDigitsPrecision maxDigits(int32_t a) { - return maxSignificantDigits(a); - } - - /** @deprecated ICU 62 */ - static inline SignificantDigitsPrecision minMaxDigits(int32_t a, int32_t b) { - return minMaxSignificantDigits(a, b); - } -#endif /* U_HIDE_DEPRECATED_API */ - /** * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the * rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5. @@ -693,21 +648,6 @@ class U_I18N_API Precision : public UMemory { */ static CurrencyPrecision currency(UCurrencyUsage currencyUsage); -#ifndef U_HIDE_DEPRECATED_API - /** - * Sets the rounding mode to use when picking the direction to round (up or down). Common values - * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN. - * - * @param roundingMode - * The RoundingMode to use. - * @return A Precision for passing to the NumberFormatter precision() setter. - * @deprecated ICU 62 Use the top-level roundingMode() setting instead. - * This method will be removed in ICU 64. - * See http://bugs.icu-project.org/trac/ticket/13746 - */ - Precision withMode(UNumberFormatRoundingMode roundingMode) const; -#endif /* U_HIDE_DEPRECATED_API */ - private: enum PrecisionType { RND_BOGUS, @@ -715,7 +655,18 @@ class U_I18N_API Precision : public UMemory { RND_FRACTION, RND_SIGNIFICANT, RND_FRACTION_SIGNIFICANT, + + // Used for strange increments like 3.14. RND_INCREMENT, + + // Used for increments with 1 as the only digit. This is different than fraction + // rounding because it supports having additional trailing zeros. For example, this + // class is used to round with the increment 0.010. + RND_INCREMENT_ONE, + + // Used for increments with 5 as the only digit (nickel rounding). + RND_INCREMENT_FIVE, + RND_CURRENCY, RND_ERROR } fType; @@ -735,13 +686,14 @@ class U_I18N_API Precision : public UMemory { } fracSig; /** @internal */ struct IncrementSettings { + // For RND_INCREMENT, RND_INCREMENT_ONE, and RND_INCREMENT_FIVE /** @internal */ double fIncrement; /** @internal */ impl::digits_t fMinFrac; /** @internal */ impl::digits_t fMaxFrac; - } increment; // For RND_INCREMENT + } increment; UCurrencyUsage currencyUsage; // For RND_CURRENCY UErrorCode errorCode; // For RND_ERROR } fUnion; @@ -1314,7 +1266,7 @@ class U_I18N_API Grouper : public UMemory { */ UNumberGroupingStrategy fStrategy; - Grouper() : fGrouping1(-3) {}; + Grouper() : fGrouping1(-3) {} bool isBogus() const { return fGrouping1 == -3; @@ -1459,7 +1411,7 @@ struct U_I18N_API MacroProps : public UMemory { const CurrencySymbols* currencySymbols = nullptr; // no ownership /** @internal */ - int32_t threshold = DEFAULT_THRESHOLD; + int32_t threshold = kInternalDefaultThreshold; /** @internal */ Locale locale; @@ -1540,11 +1492,10 @@ class U_I18N_API NumberFormatterSettings { * All units will be properly localized with locale data, and all units are compatible with notation styles, * rounding precisions, and other number formatter settings. * - * Pass this method any instance of {@link MeasureUnit}. For units of measure (which often involve the - * factory methods that return a pointer): + * Pass this method any instance of {@link MeasureUnit}. For units of measure: * *

      -     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
      +     * NumberFormatter::with().unit(MeasureUnit::getMeter())
            * 
      * * Currency: @@ -1587,11 +1538,9 @@ class U_I18N_API NumberFormatterSettings { /** * Like unit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory - * methods, which return pointers that need ownership. Example: + * methods that return pointers that need ownership. * - *
      -     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
      -     * 
      + * Note: consider using the MeasureFormat factory methods that return by value. * * @param unit * The unit to render. @@ -1617,8 +1566,13 @@ class U_I18N_API NumberFormatterSettings { * Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit and SECOND to * the perUnit. * - * Pass this method any instance of {@link MeasureUnit}. Since MeasureUnit factory methods return pointers, the - * {@link #adoptPerUnit} version of this method is often more useful. + * Pass this method any instance of {@link MeasureUnit}. Example: + * + *
      +     * NumberFormatter::with()
      +     *      .unit(MeasureUnit::getMeter())
      +     *      .perUnit(MeasureUnit::getSecond())
      +     * 
      * * The default is not to display any unit in the denominator. * @@ -1645,13 +1599,9 @@ class U_I18N_API NumberFormatterSettings { /** * Like perUnit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory - * methods, which return pointers that need ownership. Example: + * methods that return pointers that need ownership. * - *
      -     * NumberFormatter::with()
      -     *      .adoptUnit(MeasureUnit::createMeter(status))
      -     *      .adoptPerUnit(MeasureUnit::createSecond(status))
      -     * 
      + * Note: consider using the MeasureFormat factory methods that return by value. * * @param perUnit * The unit to render in the denominator. @@ -1716,16 +1666,6 @@ class U_I18N_API NumberFormatterSettings { */ Derived precision(const Precision& precision) &&; -#ifndef U_HIDE_DEPRECATED_API - // Compatibility method that will be removed in ICU 64. - // Use precision() instead. - // See http://bugs.icu-project.org/trac/ticket/13746 - /** @deprecated ICU 62 */ - Derived rounding(const Rounder& rounder) const & { - return precision(rounder); - } -#endif /* U_HIDE_DEPRECATED_API */ - /** * Specifies how to determine the direction to round a number when it has more digits than fit in the * desired precision. When formatting 1.235: @@ -2140,6 +2080,28 @@ class U_I18N_API NumberFormatterSettings { */ UnicodeString toSkeleton(UErrorCode& status) const; + /** + * Returns the current (Un)LocalizedNumberFormatter as a LocalPointer + * wrapping a heap-allocated copy of the current object. + * + * This is equivalent to new-ing the move constructor with a value object + * as the argument. + * + * @return A wrapped (Un)LocalizedNumberFormatter pointer, or a wrapped + * nullptr on failure. + * @draft ICU 64 + */ + LocalPointer clone() const &; + + /** + * Overload of clone for use on an rvalue reference. + * + * @return A wrapped (Un)LocalizedNumberFormatter pointer, or a wrapped + * nullptr on failure. + * @draft ICU 64 + */ + LocalPointer clone() &&; + /** * Sets the UErrorCode if an error occurred in the fluent chain. * Preserves older error codes in the outErrorCode. @@ -2153,7 +2115,7 @@ class U_I18N_API NumberFormatterSettings { } fMacros.copyErrorTo(outErrorCode); return U_FAILURE(outErrorCode); - }; + } // NOTE: Uses default copy and move constructors. @@ -2174,6 +2136,8 @@ class U_I18N_API NumberFormatterSettings { /** * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified. * + * Instances of this class are immutable and thread-safe. + * * @see NumberFormatter * @draft ICU 60 */ @@ -2252,6 +2216,8 @@ class U_I18N_API UnlocalizedNumberFormatter /** * A NumberFormatter that has a locale associated with it; this means .format() methods are available. * + * Instances of this class are immutable and thread-safe. + * * @see NumberFormatter * @draft ICU 60 */ @@ -2433,89 +2399,79 @@ class U_I18N_API LocalizedNumberFormatter * The result of a number formatting operation. This class allows the result to be exported in several data types, * including a UnicodeString and a FieldPositionIterator. * + * Instances of this class are immutable and thread-safe. + * * @draft ICU 60 */ -class U_I18N_API FormattedNumber : public UMemory { +class U_I18N_API FormattedNumber : public UMemory, public FormattedValue { public: -#ifndef U_HIDE_DEPRECATED_API + /** - * Returns a UnicodeString representation of the formatted number. - * - * @return a UnicodeString containing the localized number. - * @deprecated ICU 62 Use the version of this method with an error code instead. - * This method was never @stable and will be removed in a future release. - * See http://bugs.icu-project.org/trac/ticket/13746 + * Default constructor; makes an empty FormattedNumber. + * @draft ICU 64 */ - UnicodeString toString() const; -#endif /* U_HIDE_DEPRECATED_API */ + FormattedNumber() + : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} /** - * Returns a UnicodeString representation of the formatted number. - * - * @param status - * Set if an error occurs while formatting the number to the UnicodeString. - * @return a UnicodeString containing the localized number. + * Move constructor: Leaves the source FormattedNumber in an undefined state. * @draft ICU 62 */ - UnicodeString toString(UErrorCode& status) const; + FormattedNumber(FormattedNumber&& src) U_NOEXCEPT; -#ifndef U_HIDE_DEPRECATED_API /** - * Appends the formatted number to an Appendable. - * - * @param appendable - * The Appendable to which to append the formatted number string. - * @return The same Appendable, for chaining. - * @deprecated ICU 62 Use the version of this method with an error code instead. - * This method was never @stable and will be removed in a future release. - * See http://bugs.icu-project.org/trac/ticket/13746 - * @see Appendable + * Destruct an instance of FormattedNumber. + * @draft ICU 60 */ - Appendable &appendTo(Appendable &appendable); -#endif /* U_HIDE_DEPRECATED_API */ + virtual ~FormattedNumber() U_OVERRIDE; + + /** Copying not supported; use move constructor instead. */ + FormattedNumber(const FormattedNumber&) = delete; + + /** Copying not supported; use move assignment instead. */ + FormattedNumber& operator=(const FormattedNumber&) = delete; /** - * Appends the formatted number to an Appendable. - * - * @param appendable - * The Appendable to which to append the formatted number string. - * @param status - * Set if an error occurs while formatting the number to the Appendable. - * @return The same Appendable, for chaining. + * Move assignment: Leaves the source FormattedNumber in an undefined state. * @draft ICU 62 - * @see Appendable */ - Appendable &appendTo(Appendable &appendable, UErrorCode& status) const; + FormattedNumber& operator=(FormattedNumber&& src) U_NOEXCEPT; -#ifndef U_HIDE_DEPRECATED_API + // Copybrief: this method is older than the parent method /** - * Determine the start and end indices of the first occurrence of the given field in the output string. - * This allows you to determine the locations of the integer part, fraction part, and sign. + * @copybrief FormattedValue::toString() * - *

      - * If multiple different field attributes are needed, this method can be called repeatedly, or if all field - * attributes are needed, consider using populateFieldPositionIterator(). + * For more information, see FormattedValue::toString() * - *

      - * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever - * return the first occurrence. Use populateFieldPositionIterator() to access all occurrences of an attribute. + * @draft ICU 62 + */ + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + + // Copydoc: this method is new in ICU 64 + /** @copydoc FormattedValue::toTempString() */ + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + + // Copybrief: this method is older than the parent method + /** + * @copybrief FormattedValue::appendTo() * - * @param fieldPosition - * The FieldPosition to populate with the start and end indices of the desired field. - * @param status - * Set if an error occurs while populating the FieldPosition. - * @deprecated ICU 62 Use {@link #nextFieldPosition} instead. This method will be removed in a future - * release. See http://bugs.icu-project.org/trac/ticket/13746 - * @see UNumberFormatFields + * For more information, see FormattedValue::appendTo() + * + * @draft ICU 62 */ - void populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status); -#endif /* U_HIDE_DEPRECATED_API */ + Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + + // Copydoc: this method is new in ICU 64 + /** @copydoc FormattedValue::nextPosition() */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; /** * Determines the start (inclusive) and end (exclusive) indices of the next occurrence of the given * field in the output string. This allows you to determine the locations of, for example, * the integer part, fraction part, or symbols. * + * This is a simpler but less powerful alternative to {@link #nextPosition}. + * * If a field occurs just once, calling this method will find that occurrence and return it. If a * field occurs multiple times, this method may be called repeatedly with the following pattern: * @@ -2527,7 +2483,7 @@ class U_I18N_API FormattedNumber : public UMemory { *

      * * This method is useful if you know which field to query. If you want all available field position - * information, use #getAllFieldPositions(). + * information, use {@link #nextPosition} or {@link #getAllFieldPositions}. * * @param fieldPosition * Input+output variable. On input, the "field" property determines which field to look @@ -2544,30 +2500,13 @@ class U_I18N_API FormattedNumber : public UMemory { */ UBool nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const; -#ifndef U_HIDE_DEPRECATED_API /** * Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in * the output string correspond to which fields, such as the integer part, fraction part, and sign. * - *

      - * If information on only one field is needed, consider using populateFieldPosition() instead. - * - * @param iterator - * The FieldPositionIterator to populate with all of the fields present in the formatted number. - * @param status - * Set if an error occurs while populating the FieldPositionIterator. - * @deprecated ICU 62 Use {@link #getAllFieldPositions} instead. This method will be removed in a - * future release. See http://bugs.icu-project.org/trac/ticket/13746 - * @see UNumberFormatFields - */ - void populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status); -#endif /* U_HIDE_DEPRECATED_API */ - - /** - * Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in - * the output string correspond to which fields, such as the integer part, fraction part, and sign. + * This is an alternative to the more powerful #nextPosition() API. * - * If information on only one field is needed, use #nextFieldPosition() instead. + * If information on only one field is needed, use #nextPosition() or #nextFieldPosition() instead. * * @param iterator * The FieldPositionIterator to populate with all of the fields present in the formatted number. @@ -2594,39 +2533,9 @@ class U_I18N_API FormattedNumber : public UMemory { #endif /* U_HIDE_INTERNAL_API */ - /** - * Copying not supported; use move constructor instead. - */ - FormattedNumber(const FormattedNumber&) = delete; - - /** - * Copying not supported; use move assignment instead. - */ - FormattedNumber& operator=(const FormattedNumber&) = delete; - - /** - * Move constructor: - * Leaves the source FormattedNumber in an undefined state. - * @draft ICU 62 - */ - FormattedNumber(FormattedNumber&& src) U_NOEXCEPT; - - /** - * Move assignment: - * Leaves the source FormattedNumber in an undefined state. - * @draft ICU 62 - */ - FormattedNumber& operator=(FormattedNumber&& src) U_NOEXCEPT; - - /** - * Destruct an instance of FormattedNumber, cleaning up any memory it might own. - * @draft ICU 60 - */ - ~FormattedNumber(); - private: // Can't use LocalPointer because UFormattedNumberData is forward-declared - const impl::UFormattedNumberData *fResults; + const impl::UFormattedNumberData *fData; // Error code for the terminal methods UErrorCode fErrorCode; @@ -2636,13 +2545,16 @@ class U_I18N_API FormattedNumber : public UMemory { * @internal */ explicit FormattedNumber(impl::UFormattedNumberData *results) - : fResults(results), fErrorCode(U_ZERO_ERROR) {}; + : fData(results), fErrorCode(U_ZERO_ERROR) {} explicit FormattedNumber(UErrorCode errorCode) - : fResults(nullptr), fErrorCode(errorCode) {}; + : fData(nullptr), fErrorCode(errorCode) {} // To give LocalizedNumberFormatter format methods access to this class's constructor: friend class LocalizedNumberFormatter; + + // To give C API access to internals + friend struct impl::UFormattedNumberImpl; }; /** @@ -2676,6 +2588,9 @@ class U_I18N_API NumberFormatter final { * Call this method at the beginning of a NumberFormatter fluent chain to create an instance based * on a given number skeleton string. * + * It is possible for an error to occur while parsing. See the overload of this method if you are + * interested in the location of a possible parse error. + * * @param skeleton * The skeleton string off of which to base this NumberFormatter. * @param status @@ -2685,6 +2600,26 @@ class U_I18N_API NumberFormatter final { */ static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton, UErrorCode& status); + /** + * Call this method at the beginning of a NumberFormatter fluent chain to create an instance based + * on a given number skeleton string. + * + * If an error occurs while parsing the skeleton string, the offset into the skeleton string at + * which the error occurred will be saved into the UParseError, if provided. + * + * @param skeleton + * The skeleton string off of which to base this NumberFormatter. + * @param perror + * A parse error struct populated if an error occurs when parsing. + * If no error occurs, perror.offset will be set to -1. + * @param status + * Set to U_NUMBER_SKELETON_SYNTAX_ERROR if the skeleton was invalid. + * @return An UnlocalizedNumberFormatter, to be used for chaining. + * @draft ICU 64 + */ + static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton, + UParseError& perror, UErrorCode& status); + /** * Use factory methods instead of the constructor to create a NumberFormatter. */ diff --git a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h index 3e6248d934de61..47c4bfe3f5ef76 100644 --- a/deps/icu-small/source/i18n/unicode/numberrangeformatter.h +++ b/deps/icu-small/source/i18n/unicode/numberrangeformatter.h @@ -8,6 +8,7 @@ #include #include "unicode/appendable.h" #include "unicode/fieldpos.h" +#include "unicode/formattedvalue.h" #include "unicode/fpositer.h" #include "unicode/numberformatter.h" @@ -32,7 +33,8 @@ * // => "750 m - 1.2 km" * *

      - * Like NumberFormatter, NumberRangeFormatter instances are immutable and thread-safe. This API is based on the + * Like NumberFormatter, NumberRangeFormatter instances (i.e., LocalizedNumberRangeFormatter + * and UnlocalizedNumberRangeFormatter) are immutable and thread-safe. This API is based on the * fluent design pattern popularized by libraries such as Google's Guava. * * @author Shane Carr @@ -175,7 +177,7 @@ namespace impl { // Forward declarations: struct RangeMacroProps; class DecimalQuantity; -struct UFormattedNumberRangeData; +class UFormattedNumberRangeData; class NumberRangeFormatterImpl; } // namespace impl @@ -185,8 +187,14 @@ class NumberRangeFormatterImpl; * Export an explicit template instantiation. See datefmt.h * (When building DLLs for Windows this is required.) */ -#if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN) -template struct U_I18N_API std::atomic; +#if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN) +} // namespace icu::number +U_NAMESPACE_END + +template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>; + +U_NAMESPACE_BEGIN +namespace number { // icu::number #endif /** \endcond */ @@ -438,6 +446,28 @@ class U_I18N_API NumberRangeFormatterSettings { */ Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&; + /** + * Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer + * wrapping a heap-allocated copy of the current object. + * + * This is equivalent to new-ing the move constructor with a value object + * as the argument. + * + * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped + * nullptr on failure. + * @draft ICU 64 + */ + LocalPointer clone() const &; + + /** + * Overload of clone for use on an rvalue reference. + * + * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped + * nullptr on failure. + * @draft ICU 64 + */ + LocalPointer clone() &&; + /** * Sets the UErrorCode if an error occurred in the fluent chain. * Preserves older error codes in the outErrorCode. @@ -451,7 +481,7 @@ class U_I18N_API NumberRangeFormatterSettings { } fMacros.copyErrorTo(outErrorCode); return U_FAILURE(outErrorCode); - }; + } // NOTE: Uses default copy and move constructors. @@ -468,6 +498,8 @@ class U_I18N_API NumberRangeFormatterSettings { /** * A NumberRangeFormatter that does not yet have a locale. In order to format, a locale must be specified. * + * Instances of this class are immutable and thread-safe. + * * @see NumberRangeFormatter * @draft ICU 63 */ @@ -547,6 +579,8 @@ class U_I18N_API UnlocalizedNumberRangeFormatter /** * A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are available. * + * Instances of this class are immutable and thread-safe. + * * @see NumberFormatter * @draft ICU 63 */ @@ -654,32 +688,39 @@ class U_I18N_API LocalizedNumberRangeFormatter * The result of a number range formatting operation. This class allows the result to be exported in several data types, * including a UnicodeString and a FieldPositionIterator. * + * Instances of this class are immutable and thread-safe. + * * @draft ICU 63 */ -class U_I18N_API FormattedNumberRange : public UMemory { +class U_I18N_API FormattedNumberRange : public UMemory, public FormattedValue { public: + // Copybrief: this method is older than the parent method /** - * Returns a UnicodeString representation of the formatted number range. + * @copybrief FormattedValue::toString() + * + * For more information, see FormattedValue::toString() * - * @param status - * Set if an error occurs while formatting the number to the UnicodeString. - * @return a UnicodeString containing the localized number range. * @draft ICU 63 */ - UnicodeString toString(UErrorCode& status) const; + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + + // Copydoc: this method is new in ICU 64 + /** @copydoc FormattedValue::toTempString() */ + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + // Copybrief: this method is older than the parent method /** - * Appends the formatted number range to an Appendable. + * @copybrief FormattedValue::appendTo() + * + * For more information, see FormattedValue::appendTo() * - * @param appendable - * The Appendable to which to append the formatted number range string. - * @param status - * Set if an error occurs while formatting the number range to the Appendable. - * @return The same Appendable, for chaining. * @draft ICU 63 - * @see Appendable */ - Appendable &appendTo(Appendable &appendable, UErrorCode& status) const; + Appendable &appendTo(Appendable &appendable, UErrorCode& status) const U_OVERRIDE; + + // Copydoc: this method is new in ICU 64 + /** @copydoc FormattedValue::nextPosition() */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; /** * Determines the start (inclusive) and end (exclusive) indices of the next occurrence of the given @@ -802,7 +843,7 @@ class U_I18N_API FormattedNumberRange : public UMemory { private: // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared - const impl::UFormattedNumberRangeData *fResults; + const impl::UFormattedNumberRangeData *fData; // Error code for the terminal methods UErrorCode fErrorCode; @@ -812,10 +853,10 @@ class U_I18N_API FormattedNumberRange : public UMemory { * @internal */ explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results) - : fResults(results), fErrorCode(U_ZERO_ERROR) {}; + : fData(results), fErrorCode(U_ZERO_ERROR) {} explicit FormattedNumberRange(UErrorCode errorCode) - : fResults(nullptr), fErrorCode(errorCode) {}; + : fData(nullptr), fErrorCode(errorCode) {} void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const; diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index 871fbd93e15e2e..d8704754dc79c2 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -237,6 +237,12 @@ class U_I18N_API NumberFormat : public Format { kPermillField = UNUM_PERMILL_FIELD, /** @stable ICU 2.0 */ kSignField = UNUM_SIGN_FIELD, +#ifndef U_HIDE_DRAFT_API + /** @draft ICU 64 */ + kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD, + /** @draft ICU 64 */ + kCompactField = UNUM_COMPACT_FIELD, +#endif // U_HIDE_DRAFT_API /** * These constants are provided for backwards compatibility only. diff --git a/deps/icu-small/source/i18n/unicode/numsys.h b/deps/icu-small/source/i18n/unicode/numsys.h index 5f527212783ccd..9e32478cf8de73 100644 --- a/deps/icu-small/source/i18n/unicode/numsys.h +++ b/deps/icu-small/source/i18n/unicode/numsys.h @@ -20,14 +20,6 @@ #include "unicode/utypes.h" -/** - * \def NUMSYS_NAME_CAPACITY - * Size of a numbering system name. - * @internal - */ -#define NUMSYS_NAME_CAPACITY 8 - - /** * \file * \brief C++ API: NumberingSystem object @@ -35,12 +27,18 @@ #if !UCONFIG_NO_FORMATTING - #include "unicode/format.h" #include "unicode/uobject.h" U_NAMESPACE_BEGIN +// can't be #ifndef U_HIDE_INTERNAL_API; needed for char[] field size +/** + * Size of a numbering system name. + * @internal + */ +constexpr const size_t kInternalNumSysNameCapacity = 8; + /** * Defines numbering systems. A numbering system describes the scheme by which * numbers are to be presented to the end user. In its simplest form, a numbering @@ -106,9 +104,13 @@ class U_I18N_API NumberingSystem : public UObject { /** * Return a StringEnumeration over all the names of numbering systems known to ICU. + * The numbering system names will be in alphabetical (invariant) order. + * + * The returned StringEnumeration is owned by the caller, who must delete it when + * finished with it. + * * @stable ICU 4.2 */ - static StringEnumeration * U_EXPORT2 getAvailableNames(UErrorCode& status); /** @@ -119,8 +121,10 @@ class U_I18N_API NumberingSystem : public UObject { * default, native, traditional, finance - do not identify specific numbering systems, * but rather key values that may only be used as part of a locale, which in turn * defines how they are mapped to a specific numbering system such as "latn" or "hant". + * * @param name The name of the numbering system. - * @param status ICU status + * @param status ICU status; set to U_UNSUPPORTED_ERROR if numbering system not found. + * @return The NumberingSystem instance, or nullptr if not found. * @stable ICU 4.2 */ static NumberingSystem* U_EXPORT2 createInstanceByName(const char* name, UErrorCode& status); @@ -187,7 +191,7 @@ class U_I18N_API NumberingSystem : public UObject { UnicodeString desc; int32_t radix; UBool algorithmic; - char name[NUMSYS_NAME_CAPACITY+1]; + char name[kInternalNumSysNameCapacity+1]; void setRadix(int32_t radix); diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index daeed52bee632e..04bf3970ba0825 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -50,6 +50,10 @@ class PluralKeywordEnumeration; class AndConstraint; class SharedPluralRules; +namespace number { +class FormattedNumber; +} + /** * Defines rules for mapping non-negative numeric values onto a small set of * keywords. Rules are constructed from a text description, consisting @@ -323,9 +327,9 @@ class U_I18N_API PluralRules : public UObject { #endif /* U_HIDE_INTERNAL_API */ /** - * Given a number, returns the keyword of the first rule that applies to - * the number. This function can be used with isKeyword* functions to - * determine the keyword for default plural rules. + * Given an integer, returns the keyword of the first rule + * that applies to the number. This function can be used with + * isKeyword* functions to determine the keyword for default plural rules. * * @param number The number for which the rule has to be determined. * @return The keyword of the selected rule. @@ -334,9 +338,9 @@ class U_I18N_API PluralRules : public UObject { UnicodeString select(int32_t number) const; /** - * Given a number, returns the keyword of the first rule that applies to - * the number. This function can be used with isKeyword* functions to - * determine the keyword for default plural rules. + * Given a floating-point number, returns the keyword of the first rule + * that applies to the number. This function can be used with + * isKeyword* functions to determine the keyword for default plural rules. * * @param number The number for which the rule has to be determined. * @return The keyword of the selected rule. @@ -344,6 +348,25 @@ class U_I18N_API PluralRules : public UObject { */ UnicodeString select(double number) const; +#ifndef U_HIDE_DRAFT_API + /** + * Given a formatted number, returns the keyword of the first rule + * that applies to the number. This function can be used with + * isKeyword* functions to determine the keyword for default plural rules. + * + * A FormattedNumber allows you to specify an exponent or trailing zeros, + * which can affect the plural category. To get a FormattedNumber, see + * NumberFormatter. + * + * @param number The number for which the rule has to be determined. + * @param status Set if an error occurs while selecting plural keyword. + * This could happen if the FormattedNumber is invalid. + * @return The keyword of the selected rule. + * @draft ICU 64 + */ + UnicodeString select(const number::FormattedNumber& number, UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_INTERNAL_API /** * @internal diff --git a/deps/icu-small/source/i18n/unicode/regex.h b/deps/icu-small/source/i18n/unicode/regex.h index 7a68039fe80ab1..a0f9839fe75311 100644 --- a/deps/icu-small/source/i18n/unicode/regex.h +++ b/deps/icu-small/source/i18n/unicode/regex.h @@ -24,24 +24,22 @@ * \file * \brief C++ API: Regular Expressions * - *

      Regular Expression API

      - * - *

      The ICU API for processing regular expressions consists of two classes, - * RegexPattern and RegexMatcher. - * RegexPattern objects represent a pre-processed, or compiled + * The ICU API for processing regular expressions consists of two classes, + * `RegexPattern` and `RegexMatcher`. + * `RegexPattern` objects represent a pre-processed, or compiled * regular expression. They are created from a regular expression pattern string, - * and can be used to create RegexMatcher objects for the pattern.

      + * and can be used to create `RegexMatcher` objects for the pattern. * - *

      Class RegexMatcher bundles together a regular expression + * Class `RegexMatcher` bundles together a regular expression * pattern and a target string to which the search pattern will be applied. - * RegexMatcher includes API for doing plain find or search + * `RegexMatcher` includes API for doing plain find or search * operations, for search and replace operations, and for obtaining detailed - * information about bounds of a match.

      + * information about bounds of a match. * - *

      Note that by constructing RegexMatcher objects directly from regular + * Note that by constructing `RegexMatcher` objects directly from regular * expression pattern strings application code can be simplified and the explicit - * need for RegexPattern objects can usually be eliminated. - *

      + * need for `RegexPattern` objects can usually be eliminated. + * */ #include "unicode/utypes.h" @@ -74,13 +72,13 @@ class UVector64; /** - * Class RegexPattern represents a compiled regular expression. It includes + * Class `RegexPattern` represents a compiled regular expression. It includes * factory methods for creating a RegexPattern object from the source (string) form * of a regular expression, methods for creating RegexMatchers that allow the pattern * to be applied to input text, and a few convenience methods for simple common * uses of regular expressions. * - *

      Class RegexPattern is not intended to be subclassed.

      + * Class RegexPattern is not intended to be subclassed. * * @stable ICU 2.4 */ @@ -90,7 +88,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * default constructor. Create a RegexPattern object that refers to no actual * pattern. Not normally needed; RegexPattern objects are usually - * created using the factory method compile(). + * created using the factory method `compile()`. * * @stable ICU 2.4 */ @@ -113,7 +111,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Comparison operator. Two RegexPattern objects are considered equal if they - * were constructed from identical source patterns using the same match flag + * were constructed from identical source patterns using the same #URegexpFlag * settings. * @param that a RegexPattern object to compare with "this". * @return TRUE if the objects are equivalent. @@ -123,7 +121,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Comparison operator. Two RegexPattern objects are considered equal if they - * were constructed from identical source patterns using the same match flag + * were constructed from identical source patterns using the same #URegexpFlag * settings. * @param that a RegexPattern object to compare with "this". * @return TRUE if the objects are different. @@ -153,16 +151,16 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { * object. These compile methods, rather than the constructors, are the usual * way that RegexPattern objects are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      All pattern match mode flags are set to their default values.

      + * All #URegexpFlag pattern match mode flags are set to their default values. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string rather than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. * @param pe Receives the position (line and column nubers) of any error @@ -181,16 +179,16 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { * object. These compile methods, rather than the constructors, are the usual * way that RegexPattern objects are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      All pattern match mode flags are set to their default values.

      + * All #URegexpFlag pattern match mode flags are set to their default values. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string rather than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. Note, the text referred * to by this UText must not be deleted during the lifetime of the @@ -208,21 +206,21 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, + * object using the specified #URegexpFlag match mode flags. These compile methods, * rather than the constructors, are the usual way that RegexPattern objects * are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string instead of than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. - * @param flags The match mode flags to be used. + * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE. * @param pe Receives the position (line and column numbers) of any error * within the regular expression.) * @param status A reference to a UErrorCode to receive any errors. @@ -237,23 +235,23 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, + * object using the specified #URegexpFlag match mode flags. These compile methods, * rather than the constructors, are the usual way that RegexPattern objects * are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string instead of than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. Note, the text referred * to by this UText must not be deleted during the lifetime of the * RegexPattern object or any RegexMatcher object created from it. - * @param flags The match mode flags to be used. + * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE. * @param pe Receives the position (line and column numbers) of any error * within the regular expression.) * @param status A reference to a UErrorCode to receive any errors. @@ -268,21 +266,21 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, + * object using the specified #URegexpFlag match mode flags. These compile methods, * rather than the constructors, are the usual way that RegexPattern objects * are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string instead of than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. - * @param flags The match mode flags to be used. + * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE. * @param status A reference to a UErrorCode to receive any errors. * @return A regexPattern object for the compiled pattern. * @@ -294,23 +292,23 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** * Compiles the regular expression in string form into a RegexPattern - * object using the specified match mode flags. These compile methods, + * object using the specified #URegexpFlag match mode flags. These compile methods, * rather than the constructors, are the usual way that RegexPattern objects * are created. * - *

      Note that RegexPattern objects must not be deleted while RegexMatcher + * Note that RegexPattern objects must not be deleted while RegexMatcher * objects created from the pattern are active. RegexMatchers keep a pointer * back to their pattern, so premature deletion of the pattern is a - * catastrophic error.

      + * catastrophic error. * - *

      Note that it is often more convenient to construct a RegexMatcher directly + * Note that it is often more convenient to construct a RegexMatcher directly * from a pattern string instead of than separately compiling the pattern and - * then creating a RegexMatcher object from the pattern.

      + * then creating a RegexMatcher object from the pattern. * * @param regex The regular expression to be compiled. Note, the text referred * to by this UText must not be deleted during the lifetime of the * RegexPattern object or any RegexMatcher object created from it. - * @param flags The match mode flags to be used. + * @param flags The #URegexpFlag match mode flags to be used, e.g. #UREGEX_CASE_INSENSITIVE. * @param status A reference to a UErrorCode to receive any errors. * @return A regexPattern object for the compiled pattern. * @@ -321,8 +319,8 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { UErrorCode &status); /** - * Get the match mode flags that were used when compiling this pattern. - * @return the match mode flags + * Get the #URegexpFlag match mode flags that were used when compiling this pattern. + * @return the #URegexpFlag match mode flags * @stable ICU 2.4 */ virtual uint32_t flags() const; @@ -332,7 +330,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { * RegexMatcher can then be used to perform match, find or replace operations * on the input. Note that a RegexPattern object must not be deleted while * RegexMatchers created from it still exist and might possibly be used again. - *

      + * * The matcher will retain a reference to the supplied input string, and all regexp * pattern matching operations happen directly on this original string. It is * critical that the string not be altered or deleted before use by the regular @@ -352,12 +350,12 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { * Cause a compilation error if an application accidentally attempts to * create a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. - *

      + * * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); + * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);` * or in a UText, using - * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); + * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);` * */ RegexMatcher *matcher(const char16_t *input, @@ -521,7 +519,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { /** - * Split a string into fields. Somewhat like split() from Perl or Java. + * Split a string into fields. Somewhat like %split() from Perl or Java. * Pattern matches identify delimiters that separate the input * into fields. The input data between the delimiters becomes the * fields themselves. @@ -540,7 +538,7 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { * This behavior differs from Java, which ignores capture groups. * * For the best performance on split() operations, - * RegexMatcher::split is preferable to this function + * `RegexMatcher::split()` is preferable to this function * * @param input The string to be split into fields. The field delimiters * match the pattern (in the "this" object) @@ -673,8 +671,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * its matcher() method to create the RegexMatcher objects. * * @param regexp The Regular Expression to be compiled. - * @param flags Regular expression options, such as case insensitive matching. - * @see UREGEX_CASE_INSENSITIVE + * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE. * @param status Any errors are reported by setting this UErrorCode variable. * @stable ICU 2.6 */ @@ -689,8 +686,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * its matcher() method to create the RegexMatcher objects. * * @param regexp The regular expression to be compiled. - * @param flags Regular expression options, such as case insensitive matching. - * @see UREGEX_CASE_INSENSITIVE + * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE. * @param status Any errors are reported by setting this UErrorCode variable. * * @stable ICU 4.6 @@ -704,7 +700,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * created for the same expression, it will be more efficient to * separately create and cache a RegexPattern object, and use * its matcher() method to create the RegexMatcher objects. - *

      + * * The matcher will retain a reference to the supplied input string, and all regexp * pattern matching operations happen directly on the original string. It is * critical that the string not be altered or deleted before use by the regular @@ -713,8 +709,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * @param regexp The Regular Expression to be compiled. * @param input The string to match. The matcher retains a reference to the * caller's string; mo copy is made. - * @param flags Regular expression options, such as case insensitive matching. - * @see UREGEX_CASE_INSENSITIVE + * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE. * @param status Any errors are reported by setting this UErrorCode variable. * @stable ICU 2.6 */ @@ -728,7 +723,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * created for the same expression, it will be more efficient to * separately create and cache a RegexPattern object, and use * its matcher() method to create the RegexMatcher objects. - *

      + * * The matcher will make a shallow clone of the supplied input text, and all regexp * pattern matching operations happen on this clone. While read-only operations on * the supplied text are permitted, it is critical that the underlying string not be @@ -736,8 +731,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * * @param regexp The Regular Expression to be compiled. * @param input The string to match. The matcher retains a shallow clone of the text. - * @param flags Regular expression options, such as case insensitive matching. - * @see UREGEX_CASE_INSENSITIVE + * @param flags #URegexpFlag options, such as #UREGEX_CASE_INSENSITIVE. * @param status Any errors are reported by setting this UErrorCode variable. * * @stable ICU 4.6 @@ -750,13 +744,12 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Cause a compilation error if an application accidentally attempts to * create a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. - *

      + * * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); + * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);` * or in a UText, using - * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); - * + * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);` */ RegexMatcher(const UnicodeString ®exp, const char16_t *input, uint32_t flags, UErrorCode &status); @@ -799,8 +792,8 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * always starts at the beginning of the input region; * unlike that function, it does not require that the entire region be matched. * - *

      If the match succeeds then more information can be obtained via the start(), - * end(), and group() functions.

      + * If the match succeeds then more information can be obtained via the start(), + * end(), and group() functions. * * @param status A reference to a UErrorCode to receive any errors. * @return TRUE if there is a match at the start of the input string. @@ -814,8 +807,8 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * The match may be of any length, and is not required to extend to the end * of the input string. Contrast with match(). * - *

      If the match succeeds then more information can be obtained via the start(), - * end(), and group() functions.

      + * If the match succeeds then more information can be obtained via the start(), + * end(), and group() functions. * * @param startIndex The input string (native) index at which to begin matching. * @param status A reference to a UErrorCode to receive any errors. @@ -829,11 +822,11 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Find the next pattern match in the input string. * The find begins searching the input at the location following the end of * the previous match, or at the start of the string if there is no previous match. - * If a match is found, start(), end() and group() + * If a match is found, `start()`, `end()` and `group()` * will provide more information regarding the match. - *

      Note that if the input string is changed by the application, + * Note that if the input string is changed by the application, * use find(startPos, status) instead of find(), because the saved starting - * position may not be valid with the altered input string.

      + * position may not be valid with the altered input string. * @return TRUE if a match is found. * @stable ICU 2.4 */ @@ -844,11 +837,12 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Find the next pattern match in the input string. * The find begins searching the input at the location following the end of * the previous match, or at the start of the string if there is no previous match. - * If a match is found, start(), end() and group() + * If a match is found, `start()`, `end()` and `group()` * will provide more information regarding the match. - *

      Note that if the input string is changed by the application, - * use find(startPos, status) instead of find(), because the saved starting - * position may not be valid with the altered input string.

      + * + * Note that if the input string is changed by the application, + * use find(startPos, status) instead of find(), because the saved starting + * position may not be valid with the altered input string. * @param status A reference to a UErrorCode to receive any errors. * @return TRUE if a match is found. * @stable ICU 55 @@ -1078,10 +1072,10 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * The effect is to remove any memory of previous matches, * and to cause subsequent find() operations to begin at * the specified (native) position in the input string. - *

      + * * The matcher's region is reset to its default, which is the entire * input string. - *

      + * * An alternative to this function is to set a match region * beginning at the desired index. * @@ -1158,12 +1152,12 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Cause a compilation error if an application accidentally attempts to * reset a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. - *

      + * * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); + * `UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength);` * or in a UText, using - * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); + * `utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status);` * */ RegexMatcher &reset(const char16_t *input); @@ -1412,15 +1406,15 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * the pattern with the replacement string. This is a convenience * function that provides a complete find-and-replace operation. * - *

      This function first resets this RegexMatcher. It then scans the input string + * This function first resets this RegexMatcher. It then scans the input string * looking for a match of the pattern. Input that is not part * of the match is appended directly to the result string; the match is replaced * in the result by the replacement string. The replacement string may contain - * references to captured groups.

      + * references to captured groups. * - *

      The state of the matcher (the position at which a subsequent find() + * The state of the matcher (the position at which a subsequent find() * would begin) after completing a replaceFirst() is not specified. The - * RegexMatcher should be reset before doing additional find() operations.

      + * RegexMatcher should be reset before doing additional find() operations. * * @param replacement a string containing the replacement text. * @param status a reference to a UErrorCode to receive any errors. @@ -1435,15 +1429,15 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * the pattern with the replacement string. This is a convenience * function that provides a complete find-and-replace operation. * - *

      This function first resets this RegexMatcher. It then scans the input string + * This function first resets this RegexMatcher. It then scans the input string * looking for a match of the pattern. Input that is not part * of the match is appended directly to the result string; the match is replaced * in the result by the replacement string. The replacement string may contain - * references to captured groups.

      + * references to captured groups. * - *

      The state of the matcher (the position at which a subsequent find() + * The state of the matcher (the position at which a subsequent find() * would begin) after completing a replaceFirst() is not specified. The - * RegexMatcher should be reset before doing additional find() operations.

      + * RegexMatcher should be reset before doing additional find() operations. * * @param replacement a string containing the replacement text. * @param dest a mutable UText in which the results are placed. @@ -1461,13 +1455,13 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Implements a replace operation intended to be used as part of an * incremental find-and-replace. * - *

      The input string, starting from the end of the previous replacement and ending at + * The input string, starting from the end of the previous replacement and ending at * the start of the current match, is appended to the destination string. Then the * replacement string is appended to the output string, - * including handling any substitutions of captured text.

      + * including handling any substitutions of captured text. * - *

      For simple, prepackaged, non-incremental find-and-replace - * operations, see replaceFirst() or replaceAll().

      + * For simple, prepackaged, non-incremental find-and-replace + * operations, see replaceFirst() or replaceAll(). * * @param dest A UnicodeString to which the results of the find-and-replace are appended. * @param replacement A UnicodeString that provides the text to be substituted for @@ -1492,13 +1486,13 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * Implements a replace operation intended to be used as part of an * incremental find-and-replace. * - *

      The input string, starting from the end of the previous replacement and ending at + * The input string, starting from the end of the previous replacement and ending at * the start of the current match, is appended to the destination string. Then the * replacement string is appended to the output string, - * including handling any substitutions of captured text.

      + * including handling any substitutions of captured text. * - *

      For simple, prepackaged, non-incremental find-and-replace - * operations, see replaceFirst() or replaceAll().

      + * For simple, prepackaged, non-incremental find-and-replace + * operations, see replaceFirst() or replaceAll(). * * @param dest A mutable UText to which the results of the find-and-replace are appended. * Must not be NULL. @@ -1522,8 +1516,8 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { /** * As the final step in a find-and-replace operation, append the remainder * of the input string, starting at the position following the last appendReplacement(), - * to the destination string. appendTail() is intended to be invoked after one - * or more invocations of the RegexMatcher::appendReplacement(). + * to the destination string. `appendTail()` is intended to be invoked after one + * or more invocations of the `RegexMatcher::appendReplacement()`. * * @param dest A UnicodeString to which the results of the find-and-replace are appended. * @return the destination string. @@ -1535,8 +1529,8 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { /** * As the final step in a find-and-replace operation, append the remainder * of the input string, starting at the position following the last appendReplacement(), - * to the destination string. appendTail() is intended to be invoked after one - * or more invocations of the RegexMatcher::appendReplacement(). + * to the destination string. `appendTail()` is intended to be invoked after one + * or more invocations of the `RegexMatcher::appendReplacement()`. * * @param dest A mutable UText to which the results of the find-and-replace are appended. * Must not be NULL. @@ -1549,7 +1543,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { /** - * Split a string into fields. Somewhat like split() from Perl. + * Split a string into fields. Somewhat like %split() from Perl. * The pattern matches identify delimiters that separate the input * into fields. The input data between the matches becomes the * fields themselves. @@ -1578,7 +1572,7 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { /** - * Split a string into fields. Somewhat like split() from Perl. + * Split a string into fields. Somewhat like %split() from Perl. * The pattern matches identify delimiters that separate the input * into fields. The input data between the matches becomes the * fields themselves. @@ -1613,14 +1607,14 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { * infinite loop. * When a limit is set a match operation will fail with an error if the * limit is exceeded. - *

      + * * The units of the limit are steps of the match engine. * Correspondence with actual processor time will depend on the speed * of the processor and the details of the specific pattern, but will * typically be on the order of milliseconds. - *

      + * * By default, the matching time is not limited. - *

      + * * * @param limit The limit value, or 0 for no limit. * @param status A reference to a UErrorCode to receive any errors. @@ -1639,16 +1633,16 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { /** * Set the amount of heap storage available for use by the match backtracking stack. * The matcher is also reset, discarding any results from previous matches. - *

      + * * ICU uses a backtracking regular expression engine, with the backtrack stack * maintained on the heap. This function sets the limit to the amount of memory - * that can be used for this purpose. A backtracking stack overflow will + * that can be used for this purpose. A backtracking stack overflow will * result in an error from the match operation that caused it. - *

      + * * A limit is desirable because a malicious or poorly designed pattern can use * excessive memory, potentially crashing the process. A limit is enabled * by default. - *

      + * * @param limit The maximum size, in bytes, of the matching backtrack stack. * A value of zero means no limit. * The limit must be greater or equal to zero. diff --git a/deps/icu-small/source/i18n/unicode/reldatefmt.h b/deps/icu-small/source/i18n/unicode/reldatefmt.h index dd8bc53d55f500..cfcba0902675cc 100644 --- a/deps/icu-small/source/i18n/unicode/reldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/reldatefmt.h @@ -19,6 +19,7 @@ #include "unicode/udisplaycontext.h" #include "unicode/ureldatefmt.h" #include "unicode/locid.h" +#include "unicode/formattedvalue.h" /** * \file @@ -245,6 +246,72 @@ class SharedPluralRules; class SharedBreakIterator; class NumberFormat; class UnicodeString; +class FormattedRelativeDateTimeData; + +#ifndef U_HIDE_DRAFT_API +/** + * An immutable class containing the result of a relative datetime formatting operation. + * + * Instances of this class are immutable and thread-safe. + * + * Not intended for public subclassing. + * + * @draft ICU 64 + */ +class U_I18N_API FormattedRelativeDateTime : public UMemory, public FormattedValue { + public: + /** + * Default constructor; makes an empty FormattedRelativeDateTime. + * @draft ICU 64 + */ + FormattedRelativeDateTime() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {} + + /** + * Move constructor: Leaves the source FormattedRelativeDateTime in an undefined state. + * @draft ICU 64 + */ + FormattedRelativeDateTime(FormattedRelativeDateTime&& src) U_NOEXCEPT; + + /** + * Destruct an instance of FormattedRelativeDateTime. + * @draft ICU 64 + */ + virtual ~FormattedRelativeDateTime() U_OVERRIDE; + + /** Copying not supported; use move constructor instead. */ + FormattedRelativeDateTime(const FormattedRelativeDateTime&) = delete; + + /** Copying not supported; use move assignment instead. */ + FormattedRelativeDateTime& operator=(const FormattedRelativeDateTime&) = delete; + + /** + * Move assignment: Leaves the source FormattedRelativeDateTime in an undefined state. + * @draft ICU 64 + */ + FormattedRelativeDateTime& operator=(FormattedRelativeDateTime&& src) U_NOEXCEPT; + + /** @copydoc FormattedValue::toString() */ + UnicodeString toString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::toTempString() */ + UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::appendTo() */ + Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE; + + /** @copydoc FormattedValue::nextPosition() */ + UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE; + + private: + FormattedRelativeDateTimeData *fData; + UErrorCode fErrorCode; + explicit FormattedRelativeDateTime(FormattedRelativeDateTimeData *results) + : fData(results), fErrorCode(U_ZERO_ERROR) {} + explicit FormattedRelativeDateTime(UErrorCode errorCode) + : fData(nullptr), fErrorCode(errorCode) {} + friend class RelativeDateTimeFormatter; +}; +#endif /* U_HIDE_DRAFT_API */ /** * Formats simple relative dates. There are two types of relative dates that @@ -386,6 +453,10 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { /** * Formats a relative date with a quantity such as "in 5 days" or * "3 months ago" + * + * This method returns a String. To get more information about the + * formatting result, use formatToValue(). + * * @param quantity The numerical amount e.g 5. This value is formatted * according to this object's NumberFormat object. * @param direction NEXT means a future relative date; LAST means a past @@ -405,8 +476,37 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { UnicodeString& appendTo, UErrorCode& status) const; +#ifndef U_HIDE_DRAFT_API + /** + * Formats a relative date with a quantity such as "in 5 days" or + * "3 months ago" + * + * This method returns a FormattedRelativeDateTime, which exposes more + * information than the String returned by format(). + * + * @param quantity The numerical amount e.g 5. This value is formatted + * according to this object's NumberFormat object. + * @param direction NEXT means a future relative date; LAST means a past + * relative date. If direction is anything else, this method sets + * status to U_ILLEGAL_ARGUMENT_ERROR. + * @param unit the unit e.g day? month? year? + * @param status ICU error code returned here. + * @return The formatted relative datetime + * @draft ICU 64 + */ + FormattedRelativeDateTime formatToValue( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Formats a relative date without a quantity. + * + * This method returns a String. To get more information about the + * formatting result, use formatToValue(). + * * @param direction NEXT, LAST, THIS, etc. * @param unit e.g SATURDAY, DAY, MONTH * @param appendTo The string to which the formatted result will be @@ -423,11 +523,36 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { UnicodeString& appendTo, UErrorCode& status) const; +#ifndef U_HIDE_DRAFT_API + /** + * Formats a relative date without a quantity. + * + * This method returns a FormattedRelativeDateTime, which exposes more + * information than the String returned by format(). + * + * If the string is not available in the requested locale, the return + * value will be empty (calling toString will give an empty string). + * + * @param direction NEXT, LAST, THIS, etc. + * @param unit e.g SATURDAY, DAY, MONTH + * @param status ICU error code returned here. + * @return The formatted relative datetime + * @draft ICU 64 + */ + FormattedRelativeDateTime formatToValue( + UDateDirection direction, + UDateAbsoluteUnit unit, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Format a combination of URelativeDateTimeUnit and numeric offset * using a numeric style, e.g. "1 week ago", "in 1 week", * "5 weeks ago", "in 5 weeks". * + * This method returns a String. To get more information about the + * formatting result, use formatNumericToValue(). + * * @param offset The signed offset for the specified unit. This * will be formatted according to this object's * NumberFormat object. @@ -446,6 +571,31 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { UnicodeString& appendTo, UErrorCode& status) const; +#ifndef U_HIDE_DRAFT_API + /** + * Format a combination of URelativeDateTimeUnit and numeric offset + * using a numeric style, e.g. "1 week ago", "in 1 week", + * "5 weeks ago", "in 5 weeks". + * + * This method returns a FormattedRelativeDateTime, which exposes more + * information than the String returned by formatNumeric(). + * + * @param offset The signed offset for the specified unit. This + * will be formatted according to this object's + * NumberFormat object. + * @param unit The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, + * UDAT_REL_UNIT_FRIDAY. + * @param status ICU error code returned here. + * @return The formatted relative datetime + * @draft ICU 64 + */ + FormattedRelativeDateTime formatNumericToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Format a combination of URelativeDateTimeUnit and numeric offset * using a text style if possible, e.g. "last week", "this week", @@ -453,6 +603,9 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * style if no appropriate text term is available for the specified * offset in the object's locale. * + * This method returns a String. To get more information about the + * formatting result, use formatToValue(). + * * @param offset The signed offset for the specified unit. * @param unit The unit to use when formatting the relative * date, e.g. UDAT_REL_UNIT_WEEK, @@ -469,6 +622,31 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { UnicodeString& appendTo, UErrorCode& status) const; +#ifndef U_HIDE_DRAFT_API + /** + * Format a combination of URelativeDateTimeUnit and numeric offset + * using a text style if possible, e.g. "last week", "this week", + * "next week", "yesterday", "tomorrow". Falls back to numeric + * style if no appropriate text term is available for the specified + * offset in the object's locale. + * + * This method returns a FormattedRelativeDateTime, which exposes more + * information than the String returned by format(). + * + * @param offset The signed offset for the specified unit. + * @param unit The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, + * UDAT_REL_UNIT_FRIDAY. + * @param status ICU error code returned here. + * @return The formatted relative datetime + * @draft ICU 64 + */ + FormattedRelativeDateTime formatToValue( + double offset, + URelativeDateTimeUnit unit, + UErrorCode& status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Combines a relative date string and a time string in this object's * locale. This is done with the same date-time separator used for the @@ -520,7 +698,45 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { NumberFormat *nfToAdopt, BreakIterator *brkIter, UErrorCode &status); - void adjustForContext(UnicodeString &) const; + UnicodeString& adjustForContext(UnicodeString &) const; + UBool checkNoAdjustForContext(UErrorCode& status) const; + + template + UnicodeString& doFormat( + F callback, + UnicodeString& appendTo, + UErrorCode& status, + Args... args) const; + +#ifndef U_HIDE_DRAFT_API // for FormattedRelativeDateTime + template + FormattedRelativeDateTime doFormatToValue( + F callback, + UErrorCode& status, + Args... args) const; +#endif // U_HIDE_DRAFT_API + + void formatImpl( + double quantity, + UDateDirection direction, + UDateRelativeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const; + void formatAbsoluteImpl( + UDateDirection direction, + UDateAbsoluteUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const; + void formatNumericImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const; + void formatRelativeImpl( + double offset, + URelativeDateTimeUnit unit, + FormattedRelativeDateTimeData& output, + UErrorCode& status) const; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index 929c1b4675b407..a015c5be5c877a 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -49,6 +49,7 @@ class FieldPositionHandler; class TimeZoneFormat; class SharedNumberFormat; class SimpleDateFormatMutableNFs; +class DateIntervalFormat; namespace number { class LocalizedNumberFormatter; @@ -1217,6 +1218,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { private: friend class DateFormat; + friend class DateIntervalFormat; void initializeDefaultCentury(void); @@ -1597,6 +1599,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { UBool fHasMinute; UBool fHasSecond; + UBool fHasHanYearChar; // pattern contains the Han year character \u5E74 /** * Sets fHasMinutes and fHasSeconds. diff --git a/deps/icu-small/source/i18n/unicode/timezone.h b/deps/icu-small/source/i18n/unicode/timezone.h index bbbb6b958e4514..237ed911d09211 100644 --- a/deps/icu-small/source/i18n/unicode/timezone.h +++ b/deps/icu-small/source/i18n/unicode/timezone.h @@ -277,17 +277,25 @@ class U_I18N_API TimeZone : public UObject { /** * Creates an instance of TimeZone detected from the current host - * system configuration. Note that ICU4C does not change the default - * time zone unless TimeZone::adoptDefault(TimeZone*) or - * TimeZone::setDefault(const TimeZone&) is explicitly called by a + * system configuration. If the host system detection routines fail, + * or if they specify a TimeZone or TimeZone offset which is not + * recognized, then the special TimeZone "Etc/Unknown" is returned. + * + * Note that ICU4C does not change the default time zone unless + * `TimeZone::adoptDefault(TimeZone*)` or + * `TimeZone::setDefault(const TimeZone&)` is explicitly called by a * user. This method does not update the current ICU's default, * and may return a different TimeZone from the one returned by - * TimeZone::createDefault(). + * `TimeZone::createDefault()`. * *

      This function is not thread safe.

      * * @return A new instance of TimeZone detected from the current host system * configuration. + * @see adoptDefault + * @see setDefault + * @see createDefault + * @see getUnknown * @stable ICU 55 */ static TimeZone* U_EXPORT2 detectHostTimeZone(); @@ -295,13 +303,14 @@ class U_I18N_API TimeZone : public UObject { /** * Creates a new copy of the default TimeZone for this host. Unless the default time * zone has already been set using adoptDefault() or setDefault(), the default is - * determined by querying the system using methods in TPlatformUtilities. If the - * system routines fail, or if they specify a TimeZone or TimeZone offset which is not - * recognized, the TimeZone indicated by the ID kLastResortID is instantiated - * and made the default. + * determined by querying the host system configuration. If the host system detection + * routines fail, or if they specify a TimeZone or TimeZone offset which is not + * recognized, then the special TimeZone "Etc/Unknown" is instantiated and made the + * default. * * @return A default TimeZone. Clients are responsible for deleting the time zone * object returned. + * @see getUnknown * @stable ICU 2.0 */ static TimeZone* U_EXPORT2 createDefault(void); @@ -657,13 +666,13 @@ class U_I18N_API TimeZone : public UObject { * If the display name is not available for the locale, * then this method returns a string in the localized GMT offset format * such as GMT[+-]HH:mm. - * @param daylight if true, return the daylight savings name. + * @param inDaylight if true, return the daylight savings name. * @param style * @param result the human-readable name of this time zone in the default locale. * @return A reference to 'result'. * @stable ICU 2.0 */ - UnicodeString& getDisplayName(UBool daylight, EDisplayType style, UnicodeString& result) const; + UnicodeString& getDisplayName(UBool inDaylight, EDisplayType style, UnicodeString& result) const; /** * Returns a name of this time zone suitable for presentation to the user @@ -671,15 +680,15 @@ class U_I18N_API TimeZone : public UObject { * If the display name is not available for the locale, * then this method returns a string in the localized GMT offset format * such as GMT[+-]HH:mm. - * @param daylight if true, return the daylight savings name. + * @param inDaylight if true, return the daylight savings name. * @param style * @param locale the locale in which to supply the display name. * @param result the human-readable name of this time zone in the given locale * or in the default locale if the given locale is not recognized. - * @return A refence to 'result'. + * @return A reference to 'result'. * @stable ICU 2.0 */ - UnicodeString& getDisplayName(UBool daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const; + UnicodeString& getDisplayName(UBool inDaylight, EDisplayType style, const Locale& locale, UnicodeString& result) const; /** * Queries if this time zone uses daylight savings time. @@ -926,7 +935,7 @@ class U_I18N_API TimeZone : public UObject { UErrorCode& status); /** - * Returns the normalized custome time zone ID for the given offset fields. + * Returns the normalized custom time zone ID for the given offset fields. * @param hour offset hours * @param min offset minutes * @param sec offset seconds diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h index 889a1ec51db52c..71120b7aed6d0f 100644 --- a/deps/icu-small/source/i18n/unicode/ucal.h +++ b/deps/icu-small/source/i18n/unicode/ucal.h @@ -105,7 +105,7 @@ *

      * Note: for some non-Gregorian calendars, different * fields may be necessary for complete disambiguation. For example, a full - * specification of the historial Arabic astronomical calendar requires year, + * specification of the historical Arabic astronomical calendar requires year, * month, day-of-month and day-of-week in some cases. * *

      @@ -157,6 +157,7 @@ /** * The time zone ID reserved for unknown time zone. + * It behaves like the GMT/UTC time zone but has the special ID "Etc/Unknown". * @stable ICU 4.8 */ #define UCAL_UNKNOWN_ZONE_ID "Etc/Unknown" @@ -620,8 +621,13 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec); /** * Return the default time zone. The default is determined initially - * by querying the host operating system. It may be changed with - * ucal_setDefaultTimeZone() or with the C++ TimeZone API. + * by querying the host operating system. If the host system detection + * routines fail, or if they specify a TimeZone or TimeZone offset + * which is not recognized, then the special TimeZone "Etc/Unknown" + * is returned. + * + * The default may be changed with `ucal_setDefaultTimeZone()` or with + * the C++ TimeZone API, `TimeZone::adoptDefault(TimeZone*)`. * * @param result A buffer to receive the result, or NULL * @@ -632,6 +638,8 @@ ucal_openCountryTimeZones(const char* country, UErrorCode* ec); * @return The result string length, not including the terminating * null * + * @see #UCAL_UNKNOWN_ZONE_ID + * * @stable ICU 2.6 */ U_STABLE int32_t U_EXPORT2 diff --git a/deps/icu-small/source/i18n/unicode/udat.h b/deps/icu-small/source/i18n/unicode/udat.h index 90aff20df2a122..c67a6d6d4b3a79 100644 --- a/deps/icu-small/source/i18n/unicode/udat.h +++ b/deps/icu-small/source/i18n/unicode/udat.h @@ -482,6 +482,27 @@ typedef enum UDateFormatStyle { #define UDAT_HOUR_TZ "jz" #endif /* U_HIDE_DEPRECATED_API */ +#ifndef U_HIDE_INTERNAL_API +/** + * Constant for Unicode string name of new (in 2019) Japanese calendar era, + * root/English abbreviated version (ASCII-range characters). + * @internal + */ +#define JP_ERA_2019_ROOT "Reiwa" +/** + * Constant for Unicode string name of new (in 2019) Japanese calendar era, + * Japanese abbreviated version (Han, or fullwidth Latin for testing). + * @internal + */ +#define JP_ERA_2019_JA "\\u4EE4\\u548C" +/** + * Constant for Unicode string name of new (in 2019) Japanese calendar era, + * root and Japanese narrow version (ASCII-range characters). + * @internal + */ +#define JP_ERA_2019_NARROW "R" +#endif // U_HIDE_INTERNAL_API + /** * FieldPosition and UFieldPosition selectors for format fields * defined by DateFormat and UDateFormat. diff --git a/deps/icu-small/source/i18n/unicode/udateintervalformat.h b/deps/icu-small/source/i18n/unicode/udateintervalformat.h index 70cbadeb575597..112f81b31e976b 100644 --- a/deps/icu-small/source/i18n/unicode/udateintervalformat.h +++ b/deps/icu-small/source/i18n/unicode/udateintervalformat.h @@ -16,6 +16,7 @@ #include "unicode/umisc.h" #include "unicode/localpointer.h" +#include "unicode/uformattedvalue.h" /** * \file @@ -81,6 +82,15 @@ struct UDateIntervalFormat; typedef struct UDateIntervalFormat UDateIntervalFormat; /**< C typedef for struct UDateIntervalFormat. @stable ICU 4.8 */ +#ifndef U_HIDE_DRAFT_API +struct UFormattedDateInterval; +/** + * Opaque struct to contain the results of a UDateIntervalFormat operation. + * @draft ICU 64 + */ +typedef struct UFormattedDateInterval UFormattedDateInterval; +#endif /* U_HIDE_DRAFT_API */ + /** * Open a new UDateIntervalFormat object using the predefined rules for a * given locale plus a specified skeleton. @@ -123,6 +133,55 @@ U_STABLE void U_EXPORT2 udtitvfmt_close(UDateIntervalFormat *formatter); +#ifndef U_HIDE_DRAFT_API +/** + * Creates an object to hold the result of a UDateIntervalFormat + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. + * + * @param ec Set if an error occurs. + * @return A pointer needing ownership. + * @draft ICU 64 + */ +U_CAPI UFormattedDateInterval* U_EXPORT2 +udtitvfmt_openResult(UErrorCode* ec); + +/** + * Returns a representation of a UFormattedDateInterval as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedDateInterval and is valid + * only as long as the UFormattedDateInterval is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * When calling ufmtval_nextPosition(): + * The fields are returned from left to right. The special field category + * UFIELD_CATEGORY_DATE_INTERVAL_SPAN is used to indicate which datetime + * primitives came from which arguments: 0 means fromCalendar, and 1 means + * toCalendar. The span category will always occur before the + * corresponding fields in UFIELD_CATEGORY_DATE + * in the ufmtval_nextPosition() iterator. + * + * @param uresult The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_CAPI const UFormattedValue* U_EXPORT2 +udtitvfmt_resultAsValue(const UFormattedDateInterval* uresult, UErrorCode* ec); + +/** + * Releases the UFormattedDateInterval created by udtitvfmt_openResult(). + * + * @param uresult The object to release. + * @draft ICU 64 + */ +U_CAPI void U_EXPORT2 +udtitvfmt_closeResult(UFormattedDateInterval* uresult); +#endif /* U_HIDE_DRAFT_API */ + + #if U_SHOW_CPLUSPLUS_API U_NAMESPACE_BEGIN @@ -138,6 +197,19 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUDateIntervalFormatPointer, UDateIntervalFormat, udtitvfmt_close); +#ifndef U_HIDE_DRAFT_API +/** + * \class LocalUFormattedDateIntervalPointer + * "Smart pointer" class, closes a UFormattedDateInterval via udtitvfmt_close(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 64 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedDateIntervalPointer, UFormattedDateInterval, udtitvfmt_closeResult); +#endif /* U_HIDE_DRAFT_API */ + U_NAMESPACE_END #endif @@ -181,6 +253,34 @@ udtitvfmt_format(const UDateIntervalFormat* formatter, UFieldPosition* position, UErrorCode* status); + +#ifndef U_HIDE_DRAFT_API +/** + * Formats a date/time range using the conventions established for the + * UDateIntervalFormat object. + * @param formatter + * The UDateIntervalFormat object specifying the format conventions. + * @param result + * The UFormattedDateInterval to contain the result of the + * formatting operation. + * @param fromDate + * The starting point of the range. + * @param toDate + * The ending point of the range. + * @param status + * A pointer to a UErrorCode to receive any errors. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +udtitvfmt_formatToResult( + const UDateIntervalFormat* formatter, + UFormattedDateInterval* result, + UDate fromDate, + UDate toDate, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/deps/icu-small/source/i18n/unicode/udatpg.h b/deps/icu-small/source/i18n/unicode/udatpg.h index 54f1254346d10d..238a27b4f44a35 100644 --- a/deps/icu-small/source/i18n/unicode/udatpg.h +++ b/deps/icu-small/source/i18n/unicode/udatpg.h @@ -95,20 +95,18 @@ typedef enum UDateTimePatternField { UDATPG_FIELD_COUNT } UDateTimePatternField; -#ifndef U_HIDE_DRAFT_API /** * Field display name width constants for udatpg_getFieldDisplayName(). - * @draft ICU 61 + * @stable ICU 61 */ typedef enum UDateTimePGDisplayWidth { - /** @draft ICU 61 */ + /** @stable ICU 61 */ UDATPG_WIDE, - /** @draft ICU 61 */ + /** @stable ICU 61 */ UDATPG_ABBREVIATED, - /** @draft ICU 61 */ + /** @stable ICU 61 */ UDATPG_NARROW } UDateTimePGDisplayWidth; -#endif // U_HIDE_DRAFT_API /** * Masks to control forcing the length of specified fields in the returned @@ -440,7 +438,6 @@ udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg, UDateTimePatternField field, int32_t *pLength); -#ifndef U_HIDE_DRAFT_API /** * The general interface to get a display name for a particular date/time field, * in one of several possible display widths. @@ -464,15 +461,14 @@ udatpg_getAppendItemName(const UDateTimePatternGenerator *dtpg, * @return * The full length of the name; if greater than capacity, fieldName contains a * truncated result. - * @draft ICU 61 + * @stable ICU 61 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 udatpg_getFieldDisplayName(const UDateTimePatternGenerator *dtpg, UDateTimePatternField field, UDateTimePGDisplayWidth width, UChar *fieldName, int32_t capacity, UErrorCode *pErrorCode); -#endif // U_HIDE_DRAFT_API /** * The DateTimeFormat is a message format pattern used to compose date and diff --git a/deps/icu-small/source/i18n/unicode/uformattedvalue.h b/deps/icu-small/source/i18n/unicode/uformattedvalue.h new file mode 100644 index 00000000000000..d1c2ad1e49f94d --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/uformattedvalue.h @@ -0,0 +1,440 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#ifndef __UFORMATTEDVALUE_H__ +#define __UFORMATTEDVALUE_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING +#ifndef U_HIDE_DRAFT_API + +#include "unicode/ufieldpositer.h" + +/** + * \file + * \brief C API: Abstract operations for localized strings. + * + * This file contains declarations for classes that deal with formatted strings. A number + * of APIs throughout ICU use these classes for expressing their localized output. + */ + + +/** + * All possible field categories in ICU. Every entry in this enum corresponds + * to another enum that exists in ICU. + * + * In the APIs that take a UFieldCategory, an int32_t type is used. Field + * categories having any of the top four bits turned on are reserved as + * private-use for external APIs implementing FormattedValue. This means that + * categories 2^28 and higher or below zero (with the highest bit turned on) + * are private-use and will not be used by ICU in the future. + * + * @draft ICU 64 + */ +typedef enum UFieldCategory { + /** + * For an undefined field category. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_UNDEFINED = 0, + + /** + * For fields in UDateFormatField (udat.h), from ICU 3.0. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_DATE, + + /** + * For fields in UNumberFormatFields (unum.h), from ICU 49. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_NUMBER, + + /** + * For fields in UListFormatterField (ulistformatter.h), from ICU 63. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_LIST, + + /** + * For fields in URelativeDateTimeFormatterField (ureldatefmt.h), from ICU 64. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_RELATIVE_DATETIME, + + /** + * Reserved for possible future fields in UDateIntervalFormatField. + * + * @internal + */ + UFIELD_CATEGORY_DATE_INTERVAL, + +#ifndef U_HIDE_INTERNAL_API + /** @internal */ + UFIELD_CATEGORY_COUNT, +#endif /* U_HIDE_INTERNAL_API */ + + /** + * Category for spans in a list. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_LIST_SPAN = 0x1000 + UFIELD_CATEGORY_LIST, + + /** + * Category for spans in a date interval. + * + * @draft ICU 64 + */ + UFIELD_CATEGORY_DATE_INTERVAL_SPAN = 0x1000 + UFIELD_CATEGORY_DATE_INTERVAL, + +} UFieldCategory; + + +struct UConstrainedFieldPosition; +/** + * Represents a span of a string containing a given field. + * + * This struct differs from UFieldPosition in the following ways: + * + * 1. It has information on the field category. + * 2. It allows you to set constraints to use when iterating over field positions. + * 3. It is used for the newer FormattedValue APIs. + * + * @draft ICU 64 + */ +typedef struct UConstrainedFieldPosition UConstrainedFieldPosition; + + +/** + * Creates a new UConstrainedFieldPosition. + * + * By default, the UConstrainedFieldPosition has no iteration constraints. + * + * @param ec Set if an error occurs. + * @return The new object, or NULL if an error occurs. + * @draft ICU 64 + */ +U_DRAFT UConstrainedFieldPosition* U_EXPORT2 +ucfpos_open(UErrorCode* ec); + + +/** + * Resets a UConstrainedFieldPosition to its initial state, as if it were newly created. + * + * Removes any constraints that may have been set on the instance. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_reset( + UConstrainedFieldPosition* ucfpos, + UErrorCode* ec); + + +/** + * Destroys a UConstrainedFieldPosition and releases its memory. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_close(UConstrainedFieldPosition* ucfpos); + + +/** + * Sets a constraint on the field category. + * + * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition, + * positions are skipped unless they have the given category. + * + * Any previously set constraints are cleared. + * + * For example, to loop over only the number-related fields: + * + * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); + * ucfpos_constrainCategory(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, ec); + * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { + * // handle the number-related field position + * } + * ucfpos_close(ucfpos); + * + * Changing the constraint while in the middle of iterating over a FormattedValue + * does not generally have well-defined behavior. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param category The field category to fix when iterating. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_constrainCategory( + UConstrainedFieldPosition* ucfpos, + int32_t category, + UErrorCode* ec); + + +/** + * Sets a constraint on the category and field. + * + * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition, + * positions are skipped unless they have the given category and field. + * + * Any previously set constraints are cleared. + * + * For example, to loop over all grouping separators: + * + * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); + * ucfpos_constrainField(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, UNUM_GROUPING_SEPARATOR_FIELD, ec); + * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { + * // handle the grouping separator position + * } + * ucfpos_close(ucfpos); + * + * Changing the constraint while in the middle of iterating over a FormattedValue + * does not generally have well-defined behavior. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param category The field category to fix when iterating. + * @param field The field to fix when iterating. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_constrainField( + UConstrainedFieldPosition* ucfpos, + int32_t category, + int32_t field, + UErrorCode* ec); + + +/** + * Gets the field category for the current position. + * + * If a category or field constraint was set, this function returns the constrained + * category. Otherwise, the return value is well-defined only after + * ufmtval_nextPosition returns TRUE. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param ec Set if an error occurs. + * @return The field category saved in the instance. + * @draft ICU 64 + */ +U_DRAFT int32_t U_EXPORT2 +ucfpos_getCategory( + const UConstrainedFieldPosition* ucfpos, + UErrorCode* ec); + + +/** + * Gets the field for the current position. + * + * If a field constraint was set, this function returns the constrained + * field. Otherwise, the return value is well-defined only after + * ufmtval_nextPosition returns TRUE. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param ec Set if an error occurs. + * @return The field saved in the instance. + * @draft ICU 64 + */ +U_DRAFT int32_t U_EXPORT2 +ucfpos_getField( + const UConstrainedFieldPosition* ucfpos, + UErrorCode* ec); + + +/** + * Gets the INCLUSIVE start and EXCLUSIVE end index stored for the current position. + * + * The output values are well-defined only after ufmtval_nextPosition returns TRUE. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param pStart Set to the start index saved in the instance. Ignored if nullptr. + * @param pLimit Set to the end index saved in the instance. Ignored if nullptr. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_getIndexes( + const UConstrainedFieldPosition* ucfpos, + int32_t* pStart, + int32_t* pLimit, + UErrorCode* ec); + + +/** + * Gets an int64 that FormattedValue implementations may use for storage. + * + * The initial value is zero. + * + * Users of FormattedValue should not need to call this method. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param ec Set if an error occurs. + * @return The current iteration context from ucfpos_setInt64IterationContext. + * @draft ICU 64 + */ +U_DRAFT int64_t U_EXPORT2 +ucfpos_getInt64IterationContext( + const UConstrainedFieldPosition* ucfpos, + UErrorCode* ec); + + +/** + * Sets an int64 that FormattedValue implementations may use for storage. + * + * Intended to be used by FormattedValue implementations. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param context The new iteration context. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_setInt64IterationContext( + UConstrainedFieldPosition* ucfpos, + int64_t context, + UErrorCode* ec); + + +/** + * Determines whether a given field should be included given the + * constraints. + * + * Intended to be used by FormattedValue implementations. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param category The category to test. + * @param field The field to test. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT UBool U_EXPORT2 +ucfpos_matchesField( + const UConstrainedFieldPosition* ucfpos, + int32_t category, + int32_t field, + UErrorCode* ec); + + +/** + * Sets new values for the primary public getters. + * + * Intended to be used by FormattedValue implementations. + * + * It is up to the implementation to ensure that the user-requested + * constraints are satisfied. This method does not check! + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param category The new field category. + * @param field The new field. + * @param start The new inclusive start index. + * @param limit The new exclusive end index. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ucfpos_setState( + UConstrainedFieldPosition* ucfpos, + int32_t category, + int32_t field, + int32_t start, + int32_t limit, + UErrorCode* ec); + + +struct UFormattedValue; +/** + * An abstract formatted value: a string with associated field attributes. + * Many formatters format to types compatible with UFormattedValue. + * + * @draft ICU 64 + */ +typedef struct UFormattedValue UFormattedValue; + + +/** + * Returns a pointer to the formatted string. The pointer is owned by the UFormattedValue. The + * return value is valid only as long as the UFormattedValue is present and unchanged in memory. + * + * The return value is NUL-terminated but could contain internal NULs. + * + * @param ufmtval + * The object containing the formatted string and attributes. + * @param pLength Output variable for the length of the string. Ignored if NULL. + * @param ec Set if an error occurs. + * @return A NUL-terminated char16 string owned by the UFormattedValue. + * @draft ICU 64 + */ +U_DRAFT const UChar* U_EXPORT2 +ufmtval_getString( + const UFormattedValue* ufmtval, + int32_t* pLength, + UErrorCode* ec); + + +/** + * Iterates over field positions in the UFormattedValue. This lets you determine the position + * of specific types of substrings, like a month or a decimal separator. + * + * To loop over all field positions: + * + * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); + * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { + * // handle the field position; get information from ucfpos + * } + * ucfpos_close(ucfpos); + * + * @param ufmtval + * The object containing the formatted string and attributes. + * @param ucfpos + * The object used for iteration state; can provide constraints to iterate over only + * one specific category or field; + * see ucfpos_constrainCategory + * and ucfpos_constrainField. + * @param ec Set if an error occurs. + * @return TRUE if another position was found; FALSE otherwise. + * @draft ICU 64 + */ +U_DRAFT UBool U_EXPORT2 +ufmtval_nextPosition( + const UFormattedValue* ufmtval, + UConstrainedFieldPosition* ucfpos, + UErrorCode* ec); + + +#if U_SHOW_CPLUSPLUS_API +U_NAMESPACE_BEGIN + +/** + * \class LocalUConstrainedFieldPositionPointer + * "Smart pointer" class; closes a UConstrainedFieldPosition via ucfpos_close(). + * For most methods see the LocalPointerBase base class. + * + * Usage: + * + * LocalUConstrainedFieldPositionPointer ucfpos(ucfpos_open(ec)); + * // no need to explicitly call ucfpos_close() + * + * @draft ICU 64 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUConstrainedFieldPositionPointer, + UConstrainedFieldPosition, + ucfpos_close); + +U_NAMESPACE_END +#endif // U_SHOW_CPLUSPLUS_API + + +#endif /* U_HIDE_DRAFT_API */ +#endif /* #if !UCONFIG_NO_FORMATTING */ +#endif // __UFORMATTEDVALUE_H__ diff --git a/deps/icu-small/source/i18n/unicode/ulistformatter.h b/deps/icu-small/source/i18n/unicode/ulistformatter.h index 242d7d21644762..4327fd5ec1bece 100644 --- a/deps/icu-small/source/i18n/unicode/ulistformatter.h +++ b/deps/icu-small/source/i18n/unicode/ulistformatter.h @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/localpointer.h" +#include "unicode/uformattedvalue.h" /** * \file @@ -33,6 +34,15 @@ struct UListFormatter; typedef struct UListFormatter UListFormatter; /**< C typedef for struct UListFormatter. @stable ICU 55 */ +#ifndef U_HIDE_DRAFT_API +struct UFormattedList; +/** + * Opaque struct to contain the results of a UListFormatter operation. + * @draft ICU 64 + */ +typedef struct UFormattedList UFormattedList; +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_DRAFT_API /** * FieldPosition and UFieldPosition selectors for format fields @@ -82,6 +92,53 @@ ulistfmt_open(const char* locale, U_CAPI void U_EXPORT2 ulistfmt_close(UListFormatter *listfmt); +#ifndef U_HIDE_DRAFT_API +/** + * Creates an object to hold the result of a UListFormatter + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. + * + * @param ec Set if an error occurs. + * @return A pointer needing ownership. + * @draft ICU 64 + */ +U_CAPI UFormattedList* U_EXPORT2 +ulistfmt_openResult(UErrorCode* ec); + +/** + * Returns a representation of a UFormattedList as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedList and is valid + * only as long as the UFormattedList is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * When calling ufmtval_nextPosition(): + * The fields are returned from start to end. The special field category + * UFIELD_CATEGORY_LIST_SPAN is used to indicate which argument + * was inserted at the given position. The span category will + * always occur before the corresponding instance of UFIELD_CATEGORY_LIST + * in the ufmtval_nextPosition() iterator. + * + * @param uresult The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_CAPI const UFormattedValue* U_EXPORT2 +ulistfmt_resultAsValue(const UFormattedList* uresult, UErrorCode* ec); + +/** + * Releases the UFormattedList created by ulistfmt_openResult(). + * + * @param uresult The object to release. + * @draft ICU 64 + */ +U_CAPI void U_EXPORT2 +ulistfmt_closeResult(UFormattedList* uresult); +#endif /* U_HIDE_DRAFT_API */ + #if U_SHOW_CPLUSPLUS_API @@ -98,6 +155,19 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUListFormatterPointer, UListFormatter, ulistfmt_close); +#ifndef U_HIDE_DRAFT_API +/** + * \class LocalUFormattedListPointer + * "Smart pointer" class, closes a UFormattedList via ulistfmt_closeResult(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 64 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedListPointer, UFormattedList, ulistfmt_closeResult); +#endif /* U_HIDE_DRAFT_API */ + U_NAMESPACE_END #endif @@ -145,6 +215,43 @@ ulistfmt_format(const UListFormatter* listfmt, int32_t resultCapacity, UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** + * Formats a list of strings to a UFormattedList, which exposes more + * information than the string exported by ulistfmt_format(). + * + * @param listfmt + * The UListFormatter object specifying the list conventions. + * @param strings + * An array of pointers to UChar strings; the array length is + * specified by stringCount. Must be non-NULL if stringCount > 0. + * @param stringLengths + * An array of string lengths corresponding to the strings[] + * parameter; any individual length value may be negative to indicate + * that the corresponding strings[] entry is 0-terminated, or + * stringLengths itself may be NULL if all of the strings are + * 0-terminated. If non-NULL, the stringLengths array must have + * stringCount entries. + * @param stringCount + * the number of entries in strings[], and the number of entries + * in the stringLengths array if it is not NULL. Must be >= 0. + * @param uresult + * The object in which to store the result of the list formatting + * operation. See ulistfmt_openResult(). + * @param status + * Error code set if an error occurred during formatting. + * @draft ICU 64 + */ +U_CAPI void U_EXPORT2 +ulistfmt_formatStringsToResult( + const UListFormatter* listfmt, + const UChar* const strings[], + const int32_t * stringLengths, + int32_t stringCount, + UFormattedList* uresult, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h index 8b76014b1683da..c03131f372b8ca 100644 --- a/deps/icu-small/source/i18n/unicode/unum.h +++ b/deps/icu-small/source/i18n/unicode/unum.h @@ -375,12 +375,19 @@ typedef enum UNumberFormatFields { UNUM_PERMILL_FIELD, /** @stable ICU 49 */ UNUM_SIGN_FIELD, +#ifndef U_HIDE_DRAFT_API + /** @draft ICU 64 */ + UNUM_MEASURE_UNIT_FIELD, + /** @draft ICU 64 */ + UNUM_COMPACT_FIELD, +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UNumberFormatFields value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UNUM_FIELD_COUNT + UNUM_FIELD_COUNT = UNUM_SIGN_FIELD + 3 #endif /* U_HIDE_DEPRECATED_API */ } UNumberFormatFields; @@ -1022,16 +1029,18 @@ typedef enum UNumberFormatAttribute { * * @stable ICU 51 */ UNUM_SCALE = 21, -#ifndef U_HIDE_INTERNAL_API + +#ifndef U_HIDE_DRAFT_API /** - * Minimum grouping digits, technology preview. + * Minimum grouping digits; most commonly set to 2 to print "1000" instead of "1,000". * See DecimalFormat::getMinimumGroupingDigits(). * - * @internal technology preview + * For better control over grouping strategies, use UNumberFormatter. + * + * @draft ICU 64 */ UNUM_MINIMUM_GROUPING_DIGITS = 22, - /* TODO: test C API when it becomes @draft */ -#endif /* U_HIDE_INTERNAL_API */ +#endif /* U_HIDE_DRAFT_API */ /** * if this attribute is set to 0, it is set to UNUM_CURRENCY_STANDARD purpose, @@ -1041,11 +1050,12 @@ typedef enum UNumberFormatAttribute { */ UNUM_CURRENCY_USAGE = 23, - /* The following cannot be #ifndef U_HIDE_INTERNAL_API, needed in .h file variable declararions */ +#ifndef U_HIDE_INTERNAL_API /** One below the first bitfield-boolean item. * All items after this one are stored in boolean form. * @internal */ UNUM_MAX_NONBOOLEAN_ATTRIBUTE = 0x0FFF, +#endif /* U_HIDE_INTERNAL_API */ /** If 1, specifies that if setting the "max integer digits" attribute would truncate a value, set an error status rather than silently truncating. * For example, formatting the value 1234 with 4 max int digits would succeed, but formatting 12345 would fail. There is no effect on parsing. @@ -1071,24 +1081,33 @@ typedef enum UNumberFormatAttribute { */ UNUM_PARSE_DECIMAL_MARK_REQUIRED = 0x1002, - /* The following cannot be #ifndef U_HIDE_INTERNAL_API, needed in .h file variable declararions */ - /** Limit of boolean attributes. - * @internal */ - UNUM_LIMIT_BOOLEAN_ATTRIBUTE = 0x1003, +#ifndef U_HIDE_DRAFT_API /** - * Whether parsing is sensitive to case (lowercase/uppercase). - * TODO: Add to the test suite. - * @internal This API is a technical preview. It may change in an upcoming release. + * Parsing: if set to 1, parsing is sensitive to case (lowercase/uppercase). + * + * @draft ICU 64 */ - UNUM_PARSE_CASE_SENSITIVE = 0x1004, + UNUM_PARSE_CASE_SENSITIVE = 0x1003, /** - * Formatting: whether to show the plus sign on non-negative numbers. - * TODO: Add to the test suite. - * @internal This API is a technical preview. It may change in an upcoming release. + * Formatting: if set to 1, whether to show the plus sign on non-negative numbers. + * + * For better control over sign display, use UNumberFormatter. + * + * @draft ICU 64 */ - UNUM_SIGN_ALWAYS_SHOWN = 0x1005, + UNUM_SIGN_ALWAYS_SHOWN = 0x1004, + +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_INTERNAL_API + /** Limit of boolean attributes. (value should + * not depend on U_HIDE conditionals) + * @internal */ + UNUM_LIMIT_BOOLEAN_ATTRIBUTE = 0x1005, +#endif /* U_HIDE_INTERNAL_API */ + } UNumberFormatAttribute; /** diff --git a/deps/icu-small/source/i18n/unicode/unumberformatter.h b/deps/icu-small/source/i18n/unicode/unumberformatter.h index d05b15cdeccafb..e4c21a4e4ab1d1 100644 --- a/deps/icu-small/source/i18n/unicode/unumberformatter.h +++ b/deps/icu-small/source/i18n/unicode/unumberformatter.h @@ -7,8 +7,10 @@ #ifndef __UNUMBERFORMATTER_H__ #define __UNUMBERFORMATTER_H__ +#include "unicode/parseerr.h" #include "unicode/ufieldpositer.h" #include "unicode/umisc.h" +#include "unicode/uformattedvalue.h" /** @@ -267,13 +269,6 @@ typedef enum UNumberGroupingStrategy { } UNumberGroupingStrategy; -#ifndef U_HIDE_DEPRECATED_API -/** - * Old name for compatibility: will be removed in ICU 64. - * @deprecated ICU 63 - */ -typedef UNumberGroupingStrategy UGroupingStrategy; -#endif /* U_HIDE_DEPRECATED_API */ #endif /* U_HIDE_DRAFT_API */ @@ -382,6 +377,8 @@ typedef enum UNumberSignDisplay { *

    • UNUM_DECIMAL_SEPARATOR_AUTO: "1", "1.1" *
    • UNUM_DECIMAL_SEPARATOR_ALWAYS: "1.", "1.1" *
    + * + * @draft ICU 60 */ typedef enum UNumberDecimalSeparatorDisplay { /** @@ -408,15 +405,13 @@ typedef enum UNumberDecimalSeparatorDisplay { } UNumberDecimalSeparatorDisplay; #endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API - struct UNumberFormatter; /** * C-compatible version of icu::number::LocalizedNumberFormatter. * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * - * @draft ICU 62 + * @stable ICU 62 */ typedef struct UNumberFormatter UNumberFormatter; @@ -426,7 +421,7 @@ struct UFormattedNumber; * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * - * @draft ICU 62 + * @stable ICU 62 */ typedef struct UFormattedNumber UFormattedNumber; @@ -446,24 +441,41 @@ typedef struct UFormattedNumber UFormattedNumber; * @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated. * @param locale The NUL-terminated locale ID. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UNumberFormatter* U_EXPORT2 +U_STABLE UNumberFormatter* U_EXPORT2 unumf_openForSkeletonAndLocale(const UChar* skeleton, int32_t skeletonLen, const char* locale, UErrorCode* ec); +#ifndef U_HIDE_DRAFT_API /** - * Creates a new UFormattedNumber for holding the result of a number formatting operation. + * Like unumf_openForSkeletonAndLocale, but accepts a UParseError, which will be populated with the + * location of a skeleton syntax error if such a syntax error exists. * - * Objects of type UFormattedNumber are not guaranteed to be threadsafe. - * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. + * @param skeleton The skeleton string, like u"percent precision-integer" + * @param skeletonLen The number of UChars in the skeleton string, or -1 it it is NUL-terminated. + * @param locale The NUL-terminated locale ID. + * @param perror A parse error struct populated if an error occurs when parsing. Can be NULL. + * If no error occurs, perror->offset will be set to -1. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT UNumberFormatter* U_EXPORT2 +unumf_openForSkeletonAndLocaleWithError( + const UChar* skeleton, int32_t skeletonLen, const char* locale, UParseError* perror, UErrorCode* ec); +#endif // U_HIDE_DRAFT_API + + +/** + * Creates an object to hold the result of a UNumberFormatter + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. * * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UFormattedNumber* U_EXPORT2 +U_STABLE UFormattedNumber* U_EXPORT2 unumf_openResult(UErrorCode* ec); @@ -480,9 +492,9 @@ unumf_openResult(UErrorCode* ec); * @param value The number to be formatted. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNumber* uresult, UErrorCode* ec); @@ -500,9 +512,9 @@ unumf_formatInt(const UNumberFormatter* uformatter, int64_t value, UFormattedNum * @param value The number to be formatted. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedNumber* uresult, UErrorCode* ec); @@ -524,18 +536,42 @@ unumf_formatDouble(const UNumberFormatter* uformatter, double value, UFormattedN * @param valueLen The length of the numeric string, or -1 if it is NUL-terminated. * @param uresult The object that will be mutated to store the result; see unumf_openResult. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32_t valueLen, UFormattedNumber* uresult, UErrorCode* ec); +#ifndef U_HIDE_DRAFT_API +/** + * Returns a representation of a UFormattedNumber as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedNumber and is valid + * only as long as the UFormattedNumber is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * @param uresult The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_DRAFT const UFormattedValue* U_EXPORT2 +unumf_resultAsValue(const UFormattedNumber* uresult, UErrorCode* ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Extracts the result number string out of a UFormattedNumber to a UChar buffer if possible. * If bufferCapacity is greater than the required length, a terminating NUL is written. * If bufferCapacity is less than the required length, an error code is set. * + * Also see ufmtval_getString, which returns a NUL-terminated string: + * + * int32_t len; + * const UChar* str = ufmtval_getString(unumf_resultAsValue(uresult, &ec), &len, &ec); + * * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. * * @param uresult The object containing the formatted number. @@ -543,9 +579,9 @@ unumf_formatDecimal(const UNumberFormatter* uformatter, const char* value, int32 * @param bufferCapacity The number of UChars available in the buffer. * @param ec Set if an error occurs. * @return The required length. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t bufferCapacity, UErrorCode* ec); @@ -555,6 +591,8 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf * output string. This allows you to determine the locations of, for example, the integer part, * fraction part, or symbols. * + * This is a simpler but less powerful alternative to {@link ufmtval_nextPosition}. + * * If a field occurs just once, calling this method will find that occurrence and return it. If a * field occurs multiple times, this method may be called repeatedly with the following pattern: * @@ -579,9 +617,9 @@ unumf_resultToString(const UFormattedNumber* uresult, UChar* buffer, int32_t buf * (exclusive index). If a field position is not found, the FieldPosition is not changed and * the method returns FALSE. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT UBool U_EXPORT2 +U_STABLE UBool U_EXPORT2 unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* ufpos, UErrorCode* ec); @@ -589,7 +627,10 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u * Populates the given iterator with all fields in the formatted output string. This allows you to * determine the locations of the integer part, fraction part, and sign. * - * If you need information on only one field, use unumf_resultNextFieldPosition(). + * This is an alternative to the more powerful {@link ufmtval_nextPosition} API. + * + * If you need information on only one field, use {@link ufmtval_nextPosition} or + * {@link unumf_resultNextFieldPosition}. * * @param uresult The object containing the formatted number. * @param ufpositer @@ -601,9 +642,9 @@ unumf_resultNextFieldPosition(const UFormattedNumber* uresult, UFieldPosition* u * overlap, but they may nest. For example, 1234 could format as "1,234" which might consist of a * grouping separator field for ',' and an integer field encompassing the entire string. * @param ec Set if an error occurs. - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPositionIterator* ufpositer, UErrorCode* ec); @@ -611,24 +652,20 @@ unumf_resultGetAllFieldPositions(const UFormattedNumber* uresult, UFieldPosition /** * Releases the UNumberFormatter created by unumf_openForSkeletonAndLocale(). * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. - * * @param uformatter An object created by unumf_openForSkeletonAndLocale(). - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_close(UNumberFormatter* uformatter); /** * Releases the UFormattedNumber created by unumf_openResult(). * - * NOTE: This is a C-compatible API; C++ users should build against numberformatter.h instead. - * * @param uresult An object created by unumf_openResult(). - * @draft ICU 62 + * @stable ICU 62 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 unumf_closeResult(UFormattedNumber* uresult); @@ -648,12 +685,12 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 62 + * @stable ICU 62 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unumf_close); /** - * \class LocalUNumberFormatterPointer + * \class LocalUFormattedNumberPointer * "Smart pointer" class; closes a UFormattedNumber via unumf_closeResult(). * For most methods see the LocalPointerBase base class. * @@ -665,14 +702,12 @@ U_DEFINE_LOCAL_OPEN_POINTER(LocalUNumberFormatterPointer, UNumberFormatter, unum * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 62 + * @stable ICU 62 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedNumberPointer, UFormattedNumber, unumf_closeResult); U_NAMESPACE_END #endif // U_SHOW_CPLUSPLUS_API -#endif /* U_HIDE_DRAFT_API */ - #endif //__UNUMBERFORMATTER_H__ #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/unicode/unumsys.h b/deps/icu-small/source/i18n/unicode/unumsys.h index 2c794c23d3c8a7..84ceddf84f73f9 100644 --- a/deps/icu-small/source/i18n/unicode/unumsys.h +++ b/deps/icu-small/source/i18n/unicode/unumsys.h @@ -105,6 +105,7 @@ U_NAMESPACE_END /** * Returns an enumeration over the names of all of the predefined numbering systems known * to ICU. + * The numbering system names will be in alphabetical (invariant) order. * @param status A pointer to a UErrorCode to receive any errors. * @return A pointer to a UEnumeration that must be closed with uenum_close(), * or NULL if an error occurred. diff --git a/deps/icu-small/source/i18n/unicode/upluralrules.h b/deps/icu-small/source/i18n/unicode/upluralrules.h index 690846bc89cd01..fc1b2fb57173b8 100644 --- a/deps/icu-small/source/i18n/unicode/upluralrules.h +++ b/deps/icu-small/source/i18n/unicode/upluralrules.h @@ -20,6 +20,9 @@ #include "unicode/unum.h" #endif /* U_HIDE_INTERNAL_API */ +// Forward-declaration +struct UFormattedNumber; + /** * \file * \brief C API: Plural rules, select plural keywords for numeric values. @@ -132,14 +135,15 @@ U_NAMESPACE_END /** - * Given a number, returns the keyword of the first rule that + * Given a floating-point number, returns the keyword of the first rule that * applies to the number, according to the supplied UPluralRules object. * @param uplrules The UPluralRules object specifying the rules. * @param number The number for which the rule has to be determined. - * @param keyword The keyword of the rule that applies to number. - * @param capacity The capacity of keyword. + * @param keyword An output buffer to write the keyword of the rule that + * applies to number. + * @param capacity The capacity of the keyword buffer. * @param status A pointer to a UErrorCode to receive any errors. - * @return The length of keyword. + * @return The length of the keyword. * @stable ICU 4.8 */ U_CAPI int32_t U_EXPORT2 @@ -148,6 +152,31 @@ uplrules_select(const UPluralRules *uplrules, UChar *keyword, int32_t capacity, UErrorCode *status); +#ifndef U_HIDE_DRAFT_API +/** + * Given a formatted number, returns the keyword of the first rule + * that applies to the number, according to the supplied UPluralRules object. + * + * A UFormattedNumber allows you to specify an exponent or trailing zeros, + * which can affect the plural category. To get a UFormattedNumber, see + * {@link UNumberFormatter}. + * + * @param uplrules The UPluralRules object specifying the rules. + * @param number The formatted number for which the rule has to be determined. + * @param keyword The destination buffer for the keyword of the rule that + * applies to number. + * @param capacity The capacity of the keyword buffer. + * @param status A pointer to a UErrorCode to receive any errors. + * @return The length of the keyword. + * @draft ICU 64 + */ +U_CAPI int32_t U_EXPORT2 +uplrules_selectFormatted(const UPluralRules *uplrules, + const struct UFormattedNumber* number, + UChar *keyword, int32_t capacity, + UErrorCode *status); +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_INTERNAL_API /** * Given a number, returns the keyword of the first rule that applies to the @@ -160,7 +189,8 @@ uplrules_select(const UPluralRules *uplrules, * @param fmt The UNumberFormat specifying how the number will be formatted * (this can affect the plural form, e.g. "1 dollar" vs "1.0 dollars"). * If this is NULL, the function behaves like uplrules_select. - * @param keyword The keyword of the rule that applies to number. + * @param keyword An output buffer to write the keyword of the rule that + * applies to number. * @param capacity The capacity of the keyword buffer. * @param status A pointer to a UErrorCode to receive any errors. * @return The length of keyword. diff --git a/deps/icu-small/source/i18n/unicode/uregex.h b/deps/icu-small/source/i18n/unicode/uregex.h index 69c0eead956fc9..cb5e51ef01e856 100644 --- a/deps/icu-small/source/i18n/unicode/uregex.h +++ b/deps/icu-small/source/i18n/unicode/uregex.h @@ -167,6 +167,7 @@ uregex_openUText(UText *pattern, UParseError *pe, UErrorCode *status); +#if !UCONFIG_NO_CONVERSION /** * Open (compile) an ICU regular expression. The resulting regular expression * handle can then be used to perform various matching operations. @@ -190,7 +191,6 @@ uregex_openUText(UText *pattern, * * @stable ICU 3.0 */ -#if !UCONFIG_NO_CONVERSION U_STABLE URegularExpression * U_EXPORT2 uregex_openC( const char *pattern, uint32_t flags, diff --git a/deps/icu-small/source/i18n/unicode/ureldatefmt.h b/deps/icu-small/source/i18n/unicode/ureldatefmt.h index 0eff80a16b2086..1aa554dc7c0d7a 100644 --- a/deps/icu-small/source/i18n/unicode/ureldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/ureldatefmt.h @@ -17,6 +17,7 @@ #include "unicode/unum.h" #include "unicode/udisplaycontext.h" #include "unicode/localpointer.h" +#include "unicode/uformattedvalue.h" /** * \file @@ -174,6 +175,27 @@ typedef enum URelativeDateTimeUnit { #endif /* U_HIDE_DEPRECATED_API */ } URelativeDateTimeUnit; +#ifndef U_HIDE_DRAFT_API +/** + * FieldPosition and UFieldPosition selectors for format fields + * defined by RelativeDateTimeFormatter. + * @draft ICU 64 + */ +typedef enum URelativeDateTimeFormatterField { + /** + * Represents a literal text string, like "tomorrow" or "days ago". + * @draft ICU 64 + */ + UDAT_REL_LITERAL_FIELD, + /** + * Represents a number quantity, like "3" in "3 days ago". + * @draft ICU 64 + */ + UDAT_REL_NUMERIC_FIELD, +} URelativeDateTimeFormatterField; +#endif // U_HIDE_DRAFT_API + + /** * Opaque URelativeDateTimeFormatter object for use in C programs. * @stable ICU 57 @@ -230,6 +252,54 @@ ureldatefmt_open( const char* locale, U_STABLE void U_EXPORT2 ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt); +#ifndef U_HIDE_DRAFT_API +struct UFormattedRelativeDateTime; +/** + * Opaque struct to contain the results of a URelativeDateTimeFormatter operation. + * @draft ICU 64 + */ +typedef struct UFormattedRelativeDateTime UFormattedRelativeDateTime; + +/** + * Creates an object to hold the result of a URelativeDateTimeFormatter + * operation. The object can be used repeatedly; it is cleared whenever + * passed to a format function. + * + * @param ec Set if an error occurs. + * @return A pointer needing ownership. + * @draft ICU 64 + */ +U_DRAFT UFormattedRelativeDateTime* U_EXPORT2 +ureldatefmt_openResult(UErrorCode* ec); + +/** + * Returns a representation of a UFormattedRelativeDateTime as a UFormattedValue, + * which can be subsequently passed to any API requiring that type. + * + * The returned object is owned by the UFormattedRelativeDateTime and is valid + * only as long as the UFormattedRelativeDateTime is present and unchanged in memory. + * + * You can think of this method as a cast between types. + * + * @param ufrdt The object containing the formatted string. + * @param ec Set if an error occurs. + * @return A UFormattedValue owned by the input object. + * @draft ICU 64 + */ +U_DRAFT const UFormattedValue* U_EXPORT2 +ureldatefmt_resultAsValue(const UFormattedRelativeDateTime* ufrdt, UErrorCode* ec); + +/** + * Releases the UFormattedRelativeDateTime created by ureldatefmt_openResult. + * + * @param ufrdt The object to release. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_closeResult(UFormattedRelativeDateTime* ufrdt); +#endif /* U_HIDE_DRAFT_API */ + + #if U_SHOW_CPLUSPLUS_API U_NAMESPACE_BEGIN @@ -245,6 +315,19 @@ U_NAMESPACE_BEGIN */ U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDateTimeFormatter, ureldatefmt_close); +#ifndef U_HIDE_DRAFT_API +/** + * \class LocalUFormattedRelativeDateTimePointer + * "Smart pointer" class, closes a UFormattedRelativeDateTime via ureldatefmt_closeResult(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 64 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattedRelativeDateTimePointer, UFormattedRelativeDateTime, ureldatefmt_closeResult); +#endif /* U_HIDE_DRAFT_API */ + U_NAMESPACE_END #endif @@ -285,6 +368,39 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, int32_t resultCapacity, UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** + * Format a combination of URelativeDateTimeUnit and numeric + * offset using a numeric style, e.g. "1 week ago", "in 1 week", + * "5 weeks ago", "in 5 weeks". + * + * @param reldatefmt + * The URelativeDateTimeFormatter object specifying the + * format conventions. + * @param offset + * The signed offset for the specified unit. This will + * be formatted according to this object's UNumberFormat + * object. + * @param unit + * The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY. + * @param result + * A pointer to a UFormattedRelativeDateTime to populate. + * @param status + * A pointer to a UErrorCode to receive any errors. In + * case of error status, the contents of result are + * undefined. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_formatNumericToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + /** * Format a combination of URelativeDateTimeUnit and numeric offset * using a text style if possible, e.g. "last week", "this week", @@ -321,6 +437,42 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, int32_t resultCapacity, UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** + * Format a combination of URelativeDateTimeUnit and numeric offset + * using a text style if possible, e.g. "last week", "this week", + * "next week", "yesterday", "tomorrow". Falls back to numeric + * style if no appropriate text term is available for the specified + * offset in the object's locale. + * + * This method populates a UFormattedRelativeDateTime, which exposes more + * information than the string populated by format(). + * + * @param reldatefmt + * The URelativeDateTimeFormatter object specifying the + * format conventions. + * @param offset + * The signed offset for the specified unit. + * @param unit + * The unit to use when formatting the relative + * date, e.g. UDAT_REL_UNIT_WEEK, UDAT_REL_UNIT_FRIDAY. + * @param result + * A pointer to a UFormattedRelativeDateTime to populate. + * @param status + * A pointer to a UErrorCode to receive any errors. In + * case of error status, the contents of result are + * undefined. + * @draft ICU 64 + */ +U_DRAFT void U_EXPORT2 +ureldatefmt_formatToResult( + const URelativeDateTimeFormatter* reldatefmt, + double offset, + URelativeDateTimeUnit unit, + UFormattedRelativeDateTime* result, + UErrorCode* status); +#endif /* U_HIDE_DRAFT_API */ + /** * Combines a relative date string and a time string in this object's * locale. This is done with the same date-time separator used for the diff --git a/deps/icu-small/source/i18n/upluralrules.cpp b/deps/icu-small/source/i18n/upluralrules.cpp index bba6dfe3101ec3..5119257fd804f7 100644 --- a/deps/icu-small/source/i18n/upluralrules.cpp +++ b/deps/icu-small/source/i18n/upluralrules.cpp @@ -17,7 +17,9 @@ #include "unicode/unistr.h" #include "unicode/unum.h" #include "unicode/numfmt.h" +#include "unicode/unumberformatter.h" #include "number_decimalquantity.h" +#include "number_utypes.h" U_NAMESPACE_USE @@ -91,6 +93,28 @@ uplrules_select(const UPluralRules *uplrules, return result.extract(keyword, capacity, *status); } +U_CAPI int32_t U_EXPORT2 +uplrules_selectFormatted(const UPluralRules *uplrules, + const UFormattedNumber* number, + UChar *keyword, int32_t capacity, + UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return 0; + } + if (keyword == NULL ? capacity != 0 : capacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + const number::impl::DecimalQuantity* dq = + number::impl::validateUFormattedNumberToDecimalQuantity(number, *status); + if (U_FAILURE(*status)) { + return 0; + } + UnicodeString result = ((PluralRules*)uplrules)->select(*dq); + return result.extract(keyword, capacity, *status); +} + U_CAPI int32_t U_EXPORT2 uplrules_selectWithFormat(const UPluralRules *uplrules, double number, diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index f504aec91bd7c3..ff6e65b38e2d60 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -767,7 +767,7 @@ uregex_start64(URegularExpression *regexp2, if (validateRE(regexp, TRUE, status) == FALSE) { return 0; } - int32_t result = regexp->fMatcher->start(groupNum, *status); + int64_t result = regexp->fMatcher->start64(groupNum, *status); return result; } @@ -791,7 +791,7 @@ uregex_end64(URegularExpression *regexp2, if (validateRE(regexp, TRUE, status) == FALSE) { return 0; } - int32_t result = regexp->fMatcher->end(groupNum, *status); + int64_t result = regexp->fMatcher->end64(groupNum, *status); return result; } diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index 0e4cca77a13ae0..0e9b876d2babb7 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -3544,9 +3544,7 @@ const CEI *CEIBuffer::get(int32_t index) { // Verify that it is the next one in sequence, which is all // that is allowed. if (index != limitIx) { - U_ASSERT(FALSE); - - return NULL; + UPRV_UNREACHABLE; } // Manage the circular CE buffer indexing @@ -3583,9 +3581,7 @@ const CEI *CEIBuffer::getPrevious(int32_t index) { // Verify that it is the next one in sequence, which is all // that is allowed. if (index != limitIx) { - U_ASSERT(FALSE); - - return NULL; + UPRV_UNREACHABLE; } // Manage the circular CE buffer indexing diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 710adcd08daeaf..c8fbec27bb9b6f 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -43,7 +43,9 @@ static UnicodeSet *gRecommendedSet = NULL; static const Normalizer2 *gNfdNormalizer = NULL; static UInitOnce gSpoofInitStaticsOnce = U_INITONCE_INITIALIZER; -static UBool U_CALLCONV +namespace { + +UBool U_CALLCONV uspoof_cleanup(void) { delete gInclusionSet; gInclusionSet = NULL; @@ -54,7 +56,7 @@ uspoof_cleanup(void) { return TRUE; } -static void U_CALLCONV initializeStatics(UErrorCode &status) { +void U_CALLCONV initializeStatics(UErrorCode &status) { static const char16_t *inclusionPat = u"['\\-.\\:\\u00B7\\u0375\\u058A\\u05F3\\u05F4\\u06FD\\u06FE\\u0F0B\\u200C" u"\\u200D\\u2010\\u2019\\u2027\\u30A0\\u30FB]"; @@ -69,7 +71,6 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { // There is tooling to generate this constant in the unicodetools project: // org.unicode.text.tools.RecommendedSetGenerator // It will print the Java and C++ code to the console for easy copy-paste into this file. - // Note: concatenated string constants do not work with UNICODE_STRING_SIMPLE on all platforms. static const char16_t *recommendedPat = u"[0-9A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u0131\\u0134-\\u013E" u"\\u0141-\\u0148\\u014A-\\u017E\\u018F\\u01A0\\u01A1\\u01AF\\u01B0\\u01CD-" @@ -107,37 +108,36 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { u"\\u0D8E\\u0D91-\\u0D96\\u0D9A-\\u0DA5\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD" u"\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDE\\u0DF2\\u0E01-" u"\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84" - u"\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3" - u"\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB2\\u0EB4-\\u0EB9\\u0EBB-\\u0EBD" - u"\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00" - u"\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C" - u"\\u0F4E-\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C" - u"\\u0F71\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-" - u"\\u0F97\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-" - u"\\u0FB8\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD" - u"\\u10D0-\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D" - u"\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-" - u"\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6" - u"\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F" - u"\\u1780-\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7" - u"\\u17DC\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-" - u"\\u1E99\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45" - u"\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72" - u"\\u1F74\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC" - u"\\u1FC2-\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA" - u"\\u1FE0-\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA" - u"\\u1FFC\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-" - u"\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-" - u"\\u2DDE\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-" - u"\\u30FA\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-" - u"\\u9FEF\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788" - u"\\uA78D\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8\\uA7B9" - u"\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06\\uAB09-" - u"\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAC00-\\uD7A3\\uFA0E" - u"\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29" - u"\\U0001133B\\U0001B002-\\U0001B11E\\U00020000-\\U0002A6D6\\U0002A700-" - u"\\U0002B734\\U0002B740-\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-" - u"\\U0002EBE0]"; + u"\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB2\\u0EB4-\\u0EBD\\u0EC0-" + u"\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00\\u0F20-" + u"\\u0F29\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-" + u"\\u0F51\\u0F53-\\u0F56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71" + u"\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97" + u"\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8" + u"\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10C7\\u10CD\\u10D0-" + u"\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D\\u1250-" + u"\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0" + u"\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-" + u"\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-" + u"\\u17A2\\u17A5-\\u17A7\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7\\u17DC" + u"\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1E00-\\u1E99" + u"\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-" + u"\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74" + u"\\u1F76\\u1F78\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-" + u"\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-" + u"\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA\\u1FFC" + u"\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6" + u"\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE" + u"\\u3005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-\\u30FA" + u"\\u30FC-\\u30FE\\u3105-\\u312F\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-\\u9FEF" + u"\\uA660\\uA661\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788\\uA78D" + u"\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE\\uA7AF\\uA7B8-\\uA7BF\\uA7C2-" + u"\\uA7C6\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06" + u"\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB66\\uAB67" + u"\\uAC00-\\uD7A3\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23" + u"\\uFA24\\uFA27-\\uFA29\\U0001133B\\U0001B150-\\U0001B152\\U0001B164-" + u"\\U0001B167\\U00020000-\\U0002A6D6\\U0002A700-\\U0002B734\\U0002B740-" + u"\\U0002B81D\\U0002B820-\\U0002CEA1\\U0002CEB0-\\U0002EBE0]"; gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat), status); if (gRecommendedSet == NULL) { @@ -150,6 +150,8 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup); } +} // namespace + U_CFUNC void uspoof_internalInitStatics(UErrorCode *status) { umtx_initOnce(gSpoofInitStaticsOnce, &initializeStatics, *status); } @@ -547,6 +549,8 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, return uspoof_check2UnicodeString(sc, id, NULL, status); } +namespace { + int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* checkResult, UErrorCode* status) { U_ASSERT(This != NULL); U_ASSERT(checkResult != NULL); @@ -639,6 +643,8 @@ int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* c return checkResult->toCombinedBitmask(This->fChecks); } +} // namespace + U_CAPI int32_t U_EXPORT2 uspoof_check2UnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index c1034c2e53f6e9..85a028bdfa02f2 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -52,7 +52,6 @@ SpoofImpl::SpoofImpl() { } void SpoofImpl::construct(UErrorCode& status) { - fMagic = USPOOF_MAGIC; fChecks = USPOOF_ALL_CHECKS; fSpoofData = NULL; fAllowedCharsSet = NULL; @@ -74,12 +73,11 @@ void SpoofImpl::construct(UErrorCode& status) { // Copy Constructor, used by the user level clone() function. SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : - fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , + fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , fAllowedLocales(NULL) { if (U_FAILURE(status)) { return; } - fMagic = src.fMagic; fChecks = src.fChecks; if (src.fSpoofData != NULL) { fSpoofData = src.fSpoofData->addReference(); @@ -93,8 +91,6 @@ SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : } SpoofImpl::~SpoofImpl() { - fMagic = 0; // head off application errors by preventing use of - // of deleted objects. if (fSpoofData != NULL) { fSpoofData->removeReference(); // Will delete if refCount goes to zero. } @@ -104,7 +100,7 @@ SpoofImpl::~SpoofImpl() { // Cast this instance as a USpoofChecker for the C API. USpoofChecker *SpoofImpl::asUSpoofChecker() { - return reinterpret_cast(this); + return exportForC(); } // @@ -112,18 +108,10 @@ USpoofChecker *SpoofImpl::asUSpoofChecker() { // received from the C API. // const SpoofImpl *SpoofImpl::validateThis(const USpoofChecker *sc, UErrorCode &status) { + auto* This = validate(sc, status); if (U_FAILURE(status)) { return NULL; } - if (sc == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - SpoofImpl *This = (SpoofImpl *)sc; - if (This->fMagic != USPOOF_MAGIC) { - status = U_INVALID_FORMAT_ERROR; - return NULL; - } if (This->fSpoofData != NULL && !This->fSpoofData->validateDataVersion(status)) { return NULL; } @@ -454,12 +442,12 @@ UChar32 SpoofImpl::ScanHex(const UChar *s, int32_t start, int32_t limit, UErrorC // //----------------------------------------- -CheckResult::CheckResult() : fMagic(USPOOF_CHECK_MAGIC) { +CheckResult::CheckResult() { clear(); } USpoofCheckResult* CheckResult::asUSpoofCheckResult() { - return reinterpret_cast(this); + return exportForC(); } // @@ -467,22 +455,11 @@ USpoofCheckResult* CheckResult::asUSpoofCheckResult() { // received from the C API. // const CheckResult* CheckResult::validateThis(const USpoofCheckResult *ptr, UErrorCode &status) { - if (U_FAILURE(status)) { return NULL; } - if (ptr == NULL) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; - } - CheckResult *This = (CheckResult*) ptr; - if (This->fMagic != USPOOF_CHECK_MAGIC) { - status = U_INVALID_FORMAT_ERROR; - return NULL; - } - return This; + return validate(ptr, status); } CheckResult* CheckResult::validateThis(USpoofCheckResult *ptr, UErrorCode &status) { - return const_cast - (CheckResult::validateThis(const_cast(ptr), status)); + return validate(ptr, status); } void CheckResult::clear() { @@ -752,9 +729,7 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) { return NULL; } if (!fDataOwned) { - U_ASSERT(FALSE); - status = U_INTERNAL_PROGRAM_ERROR; - return NULL; + UPRV_UNREACHABLE; } numBytes = (numBytes + 15) & ~15; // Round up to a multiple of 16 diff --git a/deps/icu-small/source/i18n/uspoof_impl.h b/deps/icu-small/source/i18n/uspoof_impl.h index 7d6d0f76e34275..8844a96446e2b5 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.h +++ b/deps/icu-small/source/i18n/uspoof_impl.h @@ -27,6 +27,8 @@ #ifdef __cplusplus +#include "capi_helper.h" + U_NAMESPACE_BEGIN // The maximium length (in UTF-16 UChars) of the skeleton replacement string resulting from @@ -52,7 +54,8 @@ class ConfusableDataUtils; * Class SpoofImpl corresponds directly to the plain C API opaque type * USpoofChecker. One can be cast to the other. */ -class SpoofImpl : public UObject { +class SpoofImpl : public UObject, + public IcuCApiHelper { public: SpoofImpl(SpoofData *data, UErrorCode& status); SpoofImpl(UErrorCode& status); @@ -96,7 +99,6 @@ class SpoofImpl : public UObject { // Data Members // - int32_t fMagic; // Internal sanity check. int32_t fChecks; // Bit vector of checks to perform. SpoofData *fSpoofData; @@ -112,7 +114,8 @@ class SpoofImpl : public UObject { * Class CheckResult corresponds directly to the plain C API opaque type * USpoofCheckResult. One can be cast to the other. */ -class CheckResult : public UObject { +class CheckResult : public UObject, + public IcuCApiHelper { public: CheckResult(); virtual ~CheckResult(); @@ -127,7 +130,6 @@ class CheckResult : public UObject { int32_t toCombinedBitmask(int32_t expectedChecks); // Data Members - int32_t fMagic; // Internal sanity check. int32_t fChecks; // Bit vector of checks that were failed. UnicodeSet fNumerics; // Set of numerics found in the string. URestrictionLevel fRestrictionLevel; // The restriction level of the string. diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index b7139a807b3fb7..0e3ee893161122 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -30,7 +30,10 @@ #include "olsontz.h" #include "uinvchar.h" -static UMutex gZoneMetaLock = U_MUTEX_INITIALIZER; +static icu::UMutex *gZoneMetaLock() { + static icu::UMutex m = U_MUTEX_INITIALIZER; + return &m; +} // CLDR Canonical ID mapping table static UHashtable *gCanonicalIDCache = NULL; @@ -263,11 +266,11 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { } // Check if it was already cached - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { canonicalID = (const UChar *)uhash_get(gCanonicalIDCache, utzid); } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (canonicalID != NULL) { return canonicalID; @@ -348,7 +351,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { U_ASSERT(canonicalID != NULL); // canocanilD must be non-NULL here // Put the resolved canonical ID to the cache - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { const UChar* idInCache = (const UChar *)uhash_get(gCanonicalIDCache, utzid); if (idInCache == NULL) { @@ -368,7 +371,7 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { } } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); } return canonicalID; @@ -446,14 +449,14 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, // Check if it was already cached UBool cached = FALSE; UBool singleZone = FALSE; - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { singleZone = cached = gSingleZoneCountries->contains((void*)region); if (!cached) { cached = gMultiZonesCountries->contains((void*)region); } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (!cached) { // We need to go through all zones associated with the region. @@ -472,7 +475,7 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, delete ids; // Cache the result - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { UErrorCode ec = U_ZERO_ERROR; if (singleZone) { @@ -485,7 +488,7 @@ ZoneMeta::getCanonicalCountry(const UnicodeString &tzid, UnicodeString &country, } } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); } if (singleZone) { @@ -572,11 +575,11 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { // get the mapping from cache const UVector *result = NULL; - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); if (result != NULL) { return result; @@ -590,7 +593,7 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { } // put the new one into the cache - umtx_lock(&gZoneMetaLock); + umtx_lock(gZoneMetaLock()); { // make sure it's already created result = (UVector*) uhash_get(gOlsonToMeta, tzidUChars); @@ -618,7 +621,7 @@ ZoneMeta::getMetazoneMappings(const UnicodeString &tzid) { delete tmpResult; } } - umtx_unlock(&gZoneMetaLock); + umtx_unlock(gZoneMetaLock()); return result; } @@ -784,14 +787,13 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { UResourceBundle *rb = ures_openDirect(NULL, gMetaZones, &status); UResourceBundle *bundle = ures_getByKey(rb, gMapTimezonesTag, NULL, &status); - UResourceBundle res; - ures_initStackObject(&res); + StackUResourceBundle res; while (U_SUCCESS(status) && ures_hasNext(bundle)) { - ures_getNextResource(bundle, &res, &status); + ures_getNextResource(bundle, res.getAlias(), &status); if (U_FAILURE(status)) { break; } - const char *mzID = ures_getKey(&res); + const char *mzID = ures_getKey(res.getAlias()); int32_t len = static_cast(uprv_strlen(mzID)); UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1)); if (uMzID == NULL) { @@ -809,7 +811,6 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { delete usMzID; } } - ures_close(&res); ures_close(bundle); ures_close(rb); diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index f51a86ea96fc1b..a056098ecebca6 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -327,6 +327,9 @@ bool fixLine(int /*no*/, std::string &linestr) { // start from the end and find all u" cases size_t pos = len = linestr.size(); + if(len>INT32_MAX/2) { + return true; + } while((pos>0) && (pos = linestr.rfind("u\"", pos)) != std::string::npos) { //printf("found doublequote at %d\n", pos); if(fixAt(linestr, pos)) return true; @@ -391,15 +394,19 @@ int convert(const std::string &infile, const std::string &outfile) { while( getline( inf, linestr)) { no++; if(fixLine(no, linestr)) { - outf.close(); - fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); - cleanup(outfile); - return 1; + goto fail; } outf << linestr << '\n'; } - return 0; + if(inf.eof()) { + return 0; + } +fail: + outf.close(); + fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); + cleanup(outfile); + return 1; } /** diff --git a/deps/icu-small/source/tools/genrb/filterrb.cpp b/deps/icu-small/source/tools/genrb/filterrb.cpp new file mode 100644 index 00000000000000..d62d185d773224 --- /dev/null +++ b/deps/icu-small/source/tools/genrb/filterrb.cpp @@ -0,0 +1,236 @@ +// © 2018 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include +#include + +#include "filterrb.h" +#include "errmsg.h" + + +const char* PathFilter::kEInclusionNames[] = { + "INCLUDE", + "PARTIAL", + "EXCLUDE" +}; + + +ResKeyPath::ResKeyPath() {} + +ResKeyPath::ResKeyPath(const std::string& path, UErrorCode& status) { + if (path.empty() || path[0] != '/') { + std::cerr << "genrb error: path must start with /: " << path << std::endl; + status = U_PARSE_ERROR; + return; + } + size_t i; + size_t j = 0; + while (true) { + i = j + 1; + j = path.find('/', i); + std::string key = path.substr(i, j - i); + if (key.empty()) { + std::cerr << "genrb error: empty subpaths and trailing slashes are not allowed: " << path << std::endl; + status = U_PARSE_ERROR; + return; + } + push(key); + if (j == std::string::npos) { + break; + } + } +} + +void ResKeyPath::push(const std::string& key) { + fPath.push_back(key); +} + +void ResKeyPath::pop() { + fPath.pop_back(); +} + +const std::list& ResKeyPath::pieces() const { + return fPath; +} + +std::ostream& operator<<(std::ostream& out, const ResKeyPath& value) { + if (value.pieces().empty()) { + out << "/"; + } else for (auto& key : value.pieces()) { + out << "/" << key; + } + return out; +} + + +PathFilter::~PathFilter() = default; + + +void SimpleRuleBasedPathFilter::addRule(const std::string& ruleLine, UErrorCode& status) { + if (ruleLine.empty()) { + std::cerr << "genrb error: empty filter rules are not allowed" << std::endl; + status = U_PARSE_ERROR; + return; + } + bool inclusionRule = false; + if (ruleLine[0] == '+') { + inclusionRule = true; + } else if (ruleLine[0] != '-') { + std::cerr << "genrb error: rules must start with + or -: " << ruleLine << std::endl; + status = U_PARSE_ERROR; + return; + } + ResKeyPath path(ruleLine.substr(1), status); + addRule(path, inclusionRule, status); +} + +void SimpleRuleBasedPathFilter::addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + fRoot.applyRule(path, path.pieces().begin(), inclusionRule, status); +} + +PathFilter::EInclusion SimpleRuleBasedPathFilter::match(const ResKeyPath& path) const { + const Tree* node = &fRoot; + + // defaultResult "bubbles up" the nearest "definite" inclusion/exclusion rule + EInclusion defaultResult = INCLUDE; + if (node->fIncluded != PARTIAL) { + // rules handled here: "+/" and "-/" + defaultResult = node->fIncluded; + } + + // isLeaf is whether the filter tree can provide no additional information + // even if additional subpaths are added to the given key + bool isLeaf = false; + + for (auto& key : path.pieces()) { + auto child = node->fChildren.find(key); + // Leaf case 1: input path descends outside the filter tree + if (child == node->fChildren.end()) { + if (node->fWildcard) { + // A wildcard pattern is present; continue checking + node = node->fWildcard.get(); + } else { + isLeaf = true; + break; + } + } else { + node = &child->second; + } + if (node->fIncluded != PARTIAL) { + defaultResult = node->fIncluded; + } + } + + // Leaf case 2: input path exactly matches a filter leaf + if (node->isLeaf()) { + isLeaf = true; + } + + // Always return PARTIAL if we are not at a leaf + if (!isLeaf) { + return PARTIAL; + } + + // If leaf node is PARTIAL, return the default + if (node->fIncluded == PARTIAL) { + return defaultResult; + } + + return node->fIncluded; +} + + +SimpleRuleBasedPathFilter::Tree::Tree(const Tree& other) + : fIncluded(other.fIncluded), fChildren(other.fChildren) { + // Note: can't use the default copy assignment because of the std::unique_ptr + if (other.fWildcard) { + fWildcard.reset(new Tree(*other.fWildcard)); + } +} + +bool SimpleRuleBasedPathFilter::Tree::isLeaf() const { + return fChildren.empty() && !fWildcard; +} + +void SimpleRuleBasedPathFilter::Tree::applyRule( + const ResKeyPath& path, + std::list::const_iterator it, + bool inclusionRule, + UErrorCode& status) { + + // Base Case + if (it == path.pieces().end()) { + if (isVerbose() && (fIncluded != PARTIAL || !isLeaf())) { + std::cout << "genrb info: rule on path " << path + << " overrides previous rules" << std::endl; + } + fIncluded = inclusionRule ? INCLUDE : EXCLUDE; + fChildren.clear(); + fWildcard.reset(); + return; + } + + // Recursive Step + auto& key = *it; + if (key == "*") { + // Case 1: Wildcard + if (!fWildcard) { + fWildcard.reset(new Tree()); + } + // Apply the rule to fWildcard and also to all existing children. + it++; + fWildcard->applyRule(path, it, inclusionRule, status); + for (auto& child : fChildren) { + child.second.applyRule(path, it, inclusionRule, status); + } + it--; + + } else { + // Case 2: Normal Key + auto search = fChildren.find(key); + if (search == fChildren.end()) { + if (fWildcard) { + // Deep-copy the existing wildcard tree into the new key + search = fChildren.emplace(key, Tree(*fWildcard)).first; + } else { + search = fChildren.emplace(key, Tree()).first; + } + } + it++; + search->second.applyRule(path, it, inclusionRule, status); + it--; + } +} + +void SimpleRuleBasedPathFilter::Tree::print(std::ostream& out, int32_t indent) const { + for (int32_t i=0; iprint(out, indent + 1); + for (int32_t i=0; i +#include +#include +#include +#include + +#include "unicode/utypes.h" + + +/** + * Represents an absolute path into a resource bundle. + * For example: "/units/length/meter" + */ +class ResKeyPath { +public: + /** Constructs an empty path (top of tree) */ + ResKeyPath(); + + /** Constructs from a string path */ + ResKeyPath(const std::string& path, UErrorCode& status); + + void push(const std::string& key); + void pop(); + + const std::list& pieces() const; + + private: + std::list fPath; +}; + +std::ostream& operator<<(std::ostream& out, const ResKeyPath& value); + + +/** + * Interface used to determine whether to include or reject pieces of a + * resource bundle based on their absolute path. + */ +class PathFilter { +public: + enum EInclusion { + INCLUDE, + PARTIAL, + EXCLUDE + }; + + static const char* kEInclusionNames[]; + + virtual ~PathFilter(); + + /** + * Returns an EInclusion on whether or not the given path should be included. + * + * INCLUDE = include the whole subtree + * PARTIAL = recurse into the subtree + * EXCLUDE = reject the whole subtree + */ + virtual EInclusion match(const ResKeyPath& path) const = 0; +}; + + +/** + * Implementation of PathFilter for a list of inclusion/exclusion rules. + * + * The wildcard pattern "*" means that the subsequent filters are applied to + * every other tree sharing the same parent. + * + * For example, given this list of filter rules: + */ +// -/alabama +// +/alabama/alaska/arizona +// -/fornia/hawaii +// -/mississippi +// +/mississippi/michigan +// +/mississippi/*/maine +// -/mississippi/*/iowa +// +/mississippi/louisiana/iowa +/* + * You get the following structure: + * + * SimpleRuleBasedPathFilter { + * included: PARTIAL + * alabama: { + * included: EXCLUDE + * alaska: { + * included: PARTIAL + * arizona: { + * included: INCLUDE + * } + * } + * } + * fornia: { + * included: PARTIAL + * hawaii: { + * included: EXCLUDE + * } + * } + * mississippi: { + * included: EXCLUDE + * louisiana: { + * included: PARTIAL + * iowa: { + * included: INCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * michigan: { + * included: INCLUDE + * iowa: { + * included: EXCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * * { + * included: PARTIAL + * iowa: { + * included: EXCLUDE + * } + * maine: { + * included: INCLUDE + * } + * } + * } + * } + */ +class SimpleRuleBasedPathFilter : public PathFilter { +public: + void addRule(const std::string& ruleLine, UErrorCode& status); + void addRule(const ResKeyPath& path, bool inclusionRule, UErrorCode& status); + + EInclusion match(const ResKeyPath& path) const override; + + void print(std::ostream& out) const; + +private: + struct Tree { + + Tree() = default; + + /** Copy constructor */ + Tree(const Tree& other); + + /** + * Information on the USER-SPECIFIED inclusion/exclusion. + * + * INCLUDE = this path exactly matches a "+" rule + * PARTIAL = this path does not match any rule, but subpaths exist + * EXCLUDE = this path exactly matches a "-" rule + */ + EInclusion fIncluded = PARTIAL; + std::map fChildren; + std::unique_ptr fWildcard; + + void applyRule( + const ResKeyPath& path, + std::list::const_iterator it, + bool inclusionRule, + UErrorCode& status); + + bool isLeaf() const; + + void print(std::ostream& out, int32_t indent) const; + }; + + Tree fRoot; +}; + +std::ostream& operator<<(std::ostream& out, const SimpleRuleBasedPathFilter& value); + + +#endif //__FILTERRB_H__ diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index c4fc462066a099..885f3039bf6d7b 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -18,6 +18,11 @@ ******************************************************************************* */ +#include +#include +#include +#include + #include #include "genrb.h" #include "unicode/localpointer.h" @@ -25,13 +30,15 @@ #include "unicode/utf16.h" #include "charstr.h" #include "cmemory.h" +#include "filterrb.h" #include "reslist.h" #include "ucmndata.h" /* TODO: for reading the pool bundle */ U_NAMESPACE_USE /* Protos */ -void processFile(const char *filename, const char* cp, const char *inputDir, const char *outputDir, +void processFile(const char *filename, const char* cp, + const char *inputDir, const char *outputDir, const char *filterDir, const char *packageName, SRBRoot *newPoolBundle, UBool omitBinaryCollation, UErrorCode &status); static char *make_res_filename(const char *filename, const char *outputDir, @@ -76,7 +83,8 @@ enum FORMAT_VERSION, WRITE_POOL_BUNDLE, USE_POOL_BUNDLE, - INCLUDE_UNIHAN_COLL + INCLUDE_UNIHAN_COLL, + FILTERDIR }; UOption options[]={ @@ -99,9 +107,10 @@ UOption options[]={ UOPTION_DEF("language", 'l', UOPT_REQUIRES_ARG), /* 16 */ UOPTION_DEF("omitCollationRules", 'R', UOPT_NO_ARG),/* 17 */ UOPTION_DEF("formatVersion", '\x01', UOPT_REQUIRES_ARG),/* 18 */ - UOPTION_DEF("writePoolBundle", '\x01', UOPT_NO_ARG),/* 19 */ + UOPTION_DEF("writePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 19 */ UOPTION_DEF("usePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 20 */ UOPTION_DEF("includeUnihanColl", '\x01', UOPT_NO_ARG),/* 21 */ /* temporary, don't display in usage info */ + UOPTION_DEF("filterDir", '\x01', UOPT_OPTIONAL_ARG), /* 22 */ }; static UBool write_java = FALSE; @@ -121,6 +130,7 @@ main(int argc, const char *arg = NULL; const char *outputDir = NULL; /* NULL = no output directory, use current */ const char *inputDir = NULL; + const char *filterDir = NULL; const char *encoding = ""; int i; UBool illegalArg = FALSE; @@ -224,10 +234,13 @@ main(int argc, "\t --formatVersion write a .res file compatible with the requested formatVersion (single digit);\n" "\t for example, --formatVersion 1\n"); fprintf(stderr, - "\t --writePoolBundle write a pool.res file with all of the keys of all input bundles\n" - "\t --usePoolBundle [path-to-pool.res] point to keys from the pool.res keys pool bundle if they are available there;\n" + "\t --writePoolBundle [directory] write a pool.res file with all of the keys of all input bundles\n" + "\t --usePoolBundle [directory] point to keys from the pool.res keys pool bundle if they are available there;\n" "\t makes .res files smaller but dependent on the pool bundle\n" "\t (--writePoolBundle and --usePoolBundle cannot be combined)\n"); + fprintf(stderr, + "\t --filterDir Input directory where filter files are available.\n" + "\t For more on filter files, see Python buildtool.\n"); return illegalArg ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; } @@ -254,6 +267,10 @@ main(int argc, outputDir = options[DESTDIR].value; } + if (options[FILTERDIR].doesOccur) { + filterDir = options[FILTERDIR].value; + } + if(options[ENCODING].doesOccur) { encoding = options[ENCODING].value; } @@ -524,7 +541,7 @@ main(int argc, if (isVerbose()) { printf("Processing file \"%s\"\n", theCurrentFileName.data()); } - processFile(arg, encoding, inputDir, outputDir, NULL, + processFile(arg, encoding, inputDir, outputDir, filterDir, NULL, newPoolBundle.getAlias(), options[NO_BINARY_COLLATION].doesOccur, status); } @@ -532,8 +549,14 @@ main(int argc, poolBundle.close(); if(U_SUCCESS(status) && options[WRITE_POOL_BUNDLE].doesOccur) { + const char* writePoolDir; + if (options[WRITE_POOL_BUNDLE].value!=NULL) { + writePoolDir = options[WRITE_POOL_BUNDLE].value; + } else { + writePoolDir = outputDir; + } char outputFileName[256]; - newPoolBundle->write(outputDir, NULL, outputFileName, sizeof(outputFileName), status); + newPoolBundle->write(writePoolDir, NULL, outputFileName, sizeof(outputFileName), status); if(U_FAILURE(status)) { fprintf(stderr, "unable to write the pool bundle: %s\n", u_errorName(status)); } @@ -552,19 +575,17 @@ main(int argc, /* Process a file */ void processFile(const char *filename, const char *cp, - const char *inputDir, const char *outputDir, const char *packageName, + const char *inputDir, const char *outputDir, const char *filterDir, + const char *packageName, SRBRoot *newPoolBundle, UBool omitBinaryCollation, UErrorCode &status) { LocalPointer data; - UCHARBUF *ucbuf = NULL; - char *rbname = NULL; - char *openFileName = NULL; - char *inputDirBuf = NULL; - - char outputFileName[256]; + LocalUCHARBUFPointer ucbuf; + CharString openFileName; + CharString inputDirBuf; + char outputFileName[256]; int32_t dirlen = 0; - int32_t filelen = 0; if (U_FAILURE(status)) { return; @@ -572,14 +593,10 @@ processFile(const char *filename, const char *cp, if(filename==NULL){ status=U_ILLEGAL_ARGUMENT_ERROR; return; - }else{ - filelen = (int32_t)uprv_strlen(filename); } if(inputDir == NULL) { const char *filenameBegin = uprv_strrchr(filename, U_FILE_SEP_CHAR); - openFileName = (char *) uprv_malloc(dirlen + filelen + 2); - openFileName[0] = '\0'; if (filenameBegin != NULL) { /* * When a filename ../../../data/root.txt is specified, @@ -588,31 +605,15 @@ processFile(const char *filename, const char *cp, * another file, like UCARules.txt or thaidict.brk. */ int32_t filenameSize = (int32_t)(filenameBegin - filename + 1); - inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize); - - /* test for NULL */ - if(inputDirBuf == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } + inputDirBuf.append(filename, filenameSize, status); - inputDirBuf[filenameSize - 1] = 0; - inputDir = inputDirBuf; - dirlen = (int32_t)uprv_strlen(inputDir); + inputDir = inputDirBuf.data(); + dirlen = inputDirBuf.length(); } }else{ dirlen = (int32_t)uprv_strlen(inputDir); if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) { - openFileName = (char *) uprv_malloc(dirlen + filelen + 2); - - /* test for NULL */ - if(openFileName == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } - - openFileName[0] = '\0'; /* * append the input dir to openFileName if the first char in * filename is not file seperation char and the last char input directory is not '.'. @@ -625,49 +626,80 @@ processFile(const char *filename, const char *cp, * genrb -s. icu/data --- start from CWD and look in icu/data dir */ if( (filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){ - uprv_strcpy(openFileName, inputDir); - openFileName[dirlen] = U_FILE_SEP_CHAR; + openFileName.append(inputDir, status); } - openFileName[dirlen + 1] = '\0'; } else { - openFileName = (char *) uprv_malloc(dirlen + filelen + 1); - - /* test for NULL */ - if(openFileName == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto finish; - } - - uprv_strcpy(openFileName, inputDir); - + openFileName.append(inputDir, status); } } + openFileName.appendPathPart(filename, status); - uprv_strcat(openFileName, filename); + // Test for CharString failure + if (U_FAILURE(status)) { + return; + } - ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, &status); + ucbuf.adoptInstead(ucbuf_open(openFileName.data(), &cp,getShowWarning(),TRUE, &status)); if(status == U_FILE_ACCESS_ERROR) { - fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName); - goto finish; + fprintf(stderr, "couldn't open file %s\n", openFileName.data()); + return; } - if (ucbuf == NULL || U_FAILURE(status)) { + if (ucbuf.isNull() || U_FAILURE(status)) { fprintf(stderr, "An error occurred processing file %s. Error: %s\n", - openFileName == NULL ? filename : openFileName, u_errorName(status)); - goto finish; + openFileName.data(), u_errorName(status)); + return; } /* auto detected popular encodings? */ if (cp!=NULL && isVerbose()) { printf("autodetected encoding %s\n", cp); } /* Parse the data into an SRBRoot */ - data.adoptInstead(parse(ucbuf, inputDir, outputDir, filename, + data.adoptInstead(parse(ucbuf.getAlias(), inputDir, outputDir, filename, !omitBinaryCollation, options[NO_COLLATION_RULES].doesOccur, &status)); if (data.isNull() || U_FAILURE(status)) { fprintf(stderr, "couldn't parse the file %s. Error:%s\n", filename, u_errorName(status)); - goto finish; + return; } + + // Run filtering before writing pool bundle + if (filterDir != nullptr) { + CharString filterFileName(filterDir, status); + filterFileName.appendPathPart(filename, status); + if (U_FAILURE(status)) { + return; + } + + // Open the file and read it into filter + SimpleRuleBasedPathFilter filter; + std::ifstream f(filterFileName.data()); + if (f.fail()) { + std::cerr << "genrb error: unable to open " << filterFileName.data() << std::endl; + status = U_FILE_ACCESS_ERROR; + return; + } + std::string currentLine; + while (std::getline(f, currentLine)) { + // Ignore # comments and empty lines + if (currentLine.empty() || currentLine[0] == '#') { + continue; + } + filter.addRule(currentLine, status); + if (U_FAILURE(status)) { + return; + } + } + + if (isVerbose()) { + filter.print(std::cout); + } + + // Apply the filter to the data + ResKeyPath path; + data->fRoot->applyFilter(filter, path, data.getAlias()); + } + if(options[WRITE_POOL_BUNDLE].doesOccur) { data->fWritePoolBundle = newPoolBundle; data->compactKeys(status); @@ -677,7 +709,7 @@ processFile(const char *filename, const char *cp, if(U_FAILURE(status)) { fprintf(stderr, "bundle_compactKeys(%s) or bundle_getKeyBytes() failed: %s\n", filename, u_errorName(status)); - goto finish; + return; } /* count the number of just-added key strings */ for(const char *newKeysLimit = newKeys + newKeysLength; newKeys < newKeysLimit; ++newKeys) { @@ -692,11 +724,11 @@ processFile(const char *filename, const char *cp, } /* Determine the target rb filename */ - rbname = make_res_filename(filename, outputDir, packageName, status); + uprv_free(make_res_filename(filename, outputDir, packageName, status)); if(U_FAILURE(status)) { fprintf(stderr, "couldn't make the res fileName for bundle %s. Error:%s\n", filename, u_errorName(status)); - goto finish; + return; } if(write_java== TRUE){ bundle_write_java(data.getAlias(), outputDir, outputEnc, @@ -713,24 +745,6 @@ processFile(const char *filename, const char *cp, if (U_FAILURE(status)) { fprintf(stderr, "couldn't write bundle %s. Error:%s\n", outputFileName, u_errorName(status)); } - -finish: - - if (inputDirBuf != NULL) { - uprv_free(inputDirBuf); - } - - if (openFileName != NULL) { - uprv_free(openFileName); - } - - if(ucbuf) { - ucbuf_close(ucbuf); - } - - if (rbname) { - uprv_free(rbname); - } } /* Generate the target .res file name from the input file name */ diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 1f6246d3cfbf46..884d5d5666081a 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -2000,6 +2000,8 @@ parse(UCHARBUF *buf, const char *inputDir, const char *outputDir, const char *fi if (state.bundle == NULL || U_FAILURE(*status)) { + delete state.bundle; + return NULL; } diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index 0493347ebe5194..bf57516047e901 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -28,13 +28,17 @@ #endif #include +#include +#include #include + #include "unicode/localpointer.h" #include "reslist.h" #include "unewdata.h" #include "unicode/ures.h" #include "unicode/putil.h" #include "errmsg.h" +#include "filterrb.h" #include "uarrsort.h" #include "uelement.h" @@ -42,6 +46,8 @@ #include "uinvchar.h" #include "ustr_imp.h" #include "unicode/utf16.h" +#include "uassert.h" + /* * Align binary data at a 16-byte offset from the start of the resource bundle, * to be safe for any data type it may contain. @@ -921,9 +927,6 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if (f16BitUnits.length() & 1) { f16BitUnits.append((UChar)0xaaaa); /* pad to multiple of 4 bytes */ } - /* all keys have been mapped */ - uprv_free(fKeyMap); - fKeyMap = NULL; byteOffset = fKeysTop + f16BitUnits.length() * 2; fRoot->preWrite(&byteOffset); @@ -1037,14 +1040,15 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, // Swap to big-endian so we get the same checksum on all platforms // (except for charset family, due to the key strings). UnicodeString s(f16BitUnits); - s.append((UChar)1); // Ensure that we own this buffer. assert(!s.isBogus()); - uint16_t *p = const_cast(reinterpret_cast(s.getBuffer())); + // .getBuffer(capacity) returns a mutable buffer + char16_t* p = s.getBuffer(f16BitUnits.length()); for (int32_t count = f16BitUnits.length(); count > 0; --count) { uint16_t x = *p; *p++ = (uint16_t)((x << 8) | (x >> 8)); } - checksum = computeCRC((const char *)p, + s.releaseBuffer(f16BitUnits.length()); + checksum = computeCRC((const char *)s.getBuffer(), (uint32_t)f16BitUnits.length() * 2, checksum); } indexes[URES_INDEX_POOL_CHECKSUM] = (int32_t)checksum; @@ -1127,7 +1131,8 @@ SRBRoot::SRBRoot(const UString *comment, UBool isPoolBundle, UErrorCode &errorCo : fRoot(NULL), fLocale(NULL), fIndexLength(0), fMaxTableLength(0), fNoFallback(FALSE), fStringsForm(STRINGS_UTF16_V1), fIsPoolBundle(isPoolBundle), fKeys(NULL), fKeyMap(NULL), - fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), fKeysCount(0), fLocalKeyLimit(0), + fKeysBottom(0), fKeysTop(0), fKeysCapacity(0), + fKeysCount(0), fLocalKeyLimit(0), f16BitUnits(), f16BitStringsLength(0), fUsePoolBundle(&kNoPoolBundle), fPoolStringIndexLimit(0), fPoolStringIndex16Limit(0), fLocalStringIndexLimit(0), @@ -1232,6 +1237,9 @@ int32_t SRBRoot::addKeyBytes(const char *keyBytes, int32_t length, UErrorCode &errorCode) { int32_t keypos; + // It is not legal to add new key bytes after compactKeys is run! + U_ASSERT(fKeyMap == nullptr); + if (U_FAILURE(errorCode)) { return -1; } @@ -1333,11 +1341,35 @@ compareKeyOldpos(const void * /*context*/, const void *l, const void *r) { return compareInt32(((const KeyMapEntry *)l)->oldpos, ((const KeyMapEntry *)r)->oldpos); } +void SResource::collectKeys(std::function collector) const { + collector(fKey); +} + +void ContainerResource::collectKeys(std::function collector) const { + collector(fKey); + for (SResource* curr = fFirst; curr != NULL; curr = curr->fNext) { + curr->collectKeys(collector); + } +} + void SRBRoot::compactKeys(UErrorCode &errorCode) { KeyMapEntry *map; char *keys; int32_t i; + + // Except for pool bundles, keys might not be used. + // Do not add unused keys to the final bundle. + std::set keysInUse; + if (!fIsPoolBundle) { + fRoot->collectKeys([&keysInUse](int32_t key) { + if (key >= 0) { + keysInUse.insert(key); + } + }); + fKeysCount = static_cast(keysInUse.size()); + } + int32_t keysCount = fUsePoolBundle->fKeysCount + fKeysCount; if (U_FAILURE(errorCode) || fKeysCount == 0 || fKeyMap != NULL) { return; @@ -1356,11 +1388,23 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { ++keys; /* skip the NUL */ } keys = fKeys + fKeysBottom; - for (; i < keysCount; ++i) { - map[i].oldpos = (int32_t)(keys - fKeys); - map[i].newpos = 0; - while (*keys != 0) { ++keys; } /* skip the key */ - ++keys; /* skip the NUL */ + while (i < keysCount) { + int32_t keyOffset = static_cast(keys - fKeys); + if (!fIsPoolBundle && keysInUse.count(keyOffset) == 0) { + // Mark the unused key as deleted + while (*keys != 0) { *keys++ = 1; } + *keys++ = 1; + } else { + map[i].oldpos = keyOffset; + map[i].newpos = 0; + while (*keys != 0) { ++keys; } /* skip the key */ + ++keys; /* skip the NUL */ + i++; + } + } + if (keys != fKeys + fKeysTop) { + // Throw away any unused keys from the end + fKeysTop = static_cast(keys - fKeys); } /* Sort the keys so that each one is immediately followed by all of its suffixes. */ uprv_sortArray(map, keysCount, (int32_t)sizeof(KeyMapEntry), @@ -1403,7 +1447,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { for (k = keyLimit; suffix < suffixLimit && *--k == *--suffixLimit;) {} if (suffix == suffixLimit && *k == *suffixLimit) { map[j].newpos = map[i].oldpos + offset; /* yes, point to the earlier key */ - /* mark the suffix as deleted */ + // Mark the suffix as deleted while (*suffix != 0) { *suffix++ = 1; } *suffix = 1; } else { @@ -1437,7 +1481,7 @@ SRBRoot::compactKeys(UErrorCode &errorCode) { keys[newpos++] = keys[oldpos++]; } } - assert(i == keysCount); + U_ASSERT(i == keysCount); } fKeysTop = newpos; /* Re-sort once more, by old offsets for binary searching. */ @@ -1691,3 +1735,55 @@ SRBRoot::compactStringsV2(UHashtable *stringSet, UErrorCode &errorCode) { // +1 to account for the initial zero in f16BitUnits assert(f16BitUnits.length() <= (f16BitStringsLength + 1)); } + +void SResource::applyFilter( + const PathFilter& /*filter*/, + ResKeyPath& /*path*/, + const SRBRoot* /*bundle*/) { + // Only a few resource types (tables) are capable of being filtered. +} + +void TableResource::applyFilter( + const PathFilter& filter, + ResKeyPath& path, + const SRBRoot* bundle) { + SResource* prev = nullptr; + SResource* curr = fFirst; + for (; curr != nullptr;) { + path.push(curr->getKeyString(bundle)); + auto inclusion = filter.match(path); + if (inclusion == PathFilter::EInclusion::INCLUDE) { + // Include whole subtree + // no-op + if (isVerbose()) { + std::cout << "genrb subtree: " << bundle->fLocale << ": INCLUDE: " << path << std::endl; + } + } else if (inclusion == PathFilter::EInclusion::EXCLUDE) { + // Reject the whole subtree + // Remove it from the linked list + if (isVerbose()) { + std::cout << "genrb subtree: " << bundle->fLocale << ": DELETE: " << path << std::endl; + } + if (prev == nullptr) { + fFirst = curr->fNext; + } else { + prev->fNext = curr->fNext; + } + fCount--; + delete curr; + curr = prev; + } else { + U_ASSERT(inclusion == PathFilter::EInclusion::PARTIAL); + // Recurse into the child + curr->applyFilter(filter, path, bundle); + } + path.pop(); + + prev = curr; + if (curr == nullptr) { + curr = fFirst; + } else { + curr = curr->fNext; + } + } +} diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h index 53ade5b82c07e8..34b710c4232670 100644 --- a/deps/icu-small/source/tools/genrb/reslist.h +++ b/deps/icu-small/source/tools/genrb/reslist.h @@ -23,6 +23,8 @@ #define KEY_SPACE_SIZE 65536 #define RESLIST_MAX_INT_VECTOR 2048 +#include + #include "unicode/utypes.h" #include "unicode/unistr.h" #include "unicode/ures.h" @@ -36,7 +38,9 @@ U_CDECL_BEGIN +class PathFilter; class PseudoListResource; +class ResKeyPath; struct ResFile { ResFile() @@ -212,6 +216,19 @@ struct SResource { void write(UNewDataMemory *mem, uint32_t *byteOffset); virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); + /** + * Applies the given filter with the given base path to this resource. + * Removes child resources rejected by the filter recursively. + * + * @param bundle Needed in order to access the key for this and child resources. + */ + virtual void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle); + + /** + * Calls the given function for every key ID present in this tree. + */ + virtual void collectKeys(std::function collector) const; + int8_t fType; /* nominal type: fRes (when != 0xffffffff) may use subtype */ UBool fWritten; /* res_write() can exit early */ uint32_t fRes; /* resource item word; RES_BOGUS=0xffffffff if not known yet */ @@ -231,7 +248,10 @@ class ContainerResource : public SResource { fCount(0), fFirst(NULL) {} virtual ~ContainerResource(); - virtual void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode); + void handlePreflightStrings(SRBRoot *bundle, UHashtable *stringSet, UErrorCode &errorCode) override; + + void collectKeys(std::function collector) const override; + protected: void writeAllRes16(SRBRoot *bundle); void preWriteAllRes(uint32_t *byteOffset); @@ -254,9 +274,11 @@ class TableResource : public ContainerResource { void add(SResource *res, int linenumber, UErrorCode &errorCode); - virtual void handleWrite16(SRBRoot *bundle); - virtual void handlePreWrite(uint32_t *byteOffset); - virtual void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset); + void handleWrite16(SRBRoot *bundle) override; + void handlePreWrite(uint32_t *byteOffset) override; + void handleWrite(UNewDataMemory *mem, uint32_t *byteOffset) override; + + void applyFilter(const PathFilter& filter, ResKeyPath& path, const SRBRoot* bundle) override; int8_t fTableType; // determined by table_write16() for table_preWrite() & table_write() SRBRoot *fRoot; diff --git a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp index d7e5721c2d0fab..9d512a3ae5b628 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp +++ b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp @@ -504,7 +504,6 @@ main(int argc, char* argv[]) { if (o.files != NULL) { pkg_deleteList(o.files); } - return result; } @@ -544,6 +543,7 @@ static int runCommand(const char* command, UBool specialHandling) { int result = system(cmd); if (result != 0) { fprintf(stderr, "-- return status = %d\n", result); + result = 1; // system() result code is platform specific. } if (cmd != cmdBuffer && cmd != command) { @@ -1350,8 +1350,8 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c if (IN_STATIC_MODE(mode)) { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + - uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE; + length = static_cast(uprv_strlen(pkgDataFlags[AR]) + uprv_strlen(pkgDataFlags[ARFLAGS]) + uprv_strlen(targetDir) + + uprv_strlen(libFileNames[LIB_FILE_VERSION]) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[RANLIB]) + BUFFER_PADDING_SIZE); if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); return -1; @@ -1376,15 +1376,15 @@ static int32_t pkg_generateLibraryFile(const char *targetDir, const char mode, c } } else /* if (IN_DLL_MODE(mode)) */ { if (cmd == NULL) { - length = uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB]) + uprv_strlen(pkgDataFlags[LDICUDTFLAGS]) + ((uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_VERSION_TMP])) * 2) + uprv_strlen(objectFile) + uprv_strlen(pkgDataFlags[LD_SONAME]) + uprv_strlen(pkgDataFlags[LD_SONAME][0] == 0 ? "" : libFileNames[LIB_FILE_VERSION_MAJOR]) + - uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE; + uprv_strlen(pkgDataFlags[RPATH_FLAGS]) + uprv_strlen(pkgDataFlags[BIR_FLAGS]) + BUFFER_PADDING_SIZE); #if U_PLATFORM == U_PF_CYGWIN - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION]); + length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_CYGWIN_VERSION])); #elif U_PLATFORM == U_PF_MINGW - length += uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW]); + length += static_cast(uprv_strlen(targetDir) + uprv_strlen(libFileNames[LIB_FILE_MINGW])); #endif if ((cmd = (char *)uprv_malloc(sizeof(char) * length)) == NULL) { fprintf(stderr, "Unable to allocate memory for command.\n"); @@ -1516,8 +1516,8 @@ static int32_t pkg_createWithAssemblyCode(const char *targetDir, const char mode uprv_strcpy(tempObjectFile, gencFilePath); tempObjectFile[uprv_strlen(tempObjectFile)-1] = 'o'; - length = uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) - + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE; + length = static_cast(uprv_strlen(pkgDataFlags[COMPILER]) + uprv_strlen(pkgDataFlags[LIBFLAGS]) + + uprv_strlen(tempObjectFile) + uprv_strlen(gencFilePath) + BUFFER_PADDING_SIZE); cmd = (char *)uprv_malloc(sizeof(char) * length); if (cmd == NULL) { @@ -1905,7 +1905,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { char *tmpGenlibFlagBuffer = NULL; int32_t i, offset; - length = uprv_strlen(flag) + 1; + length = static_cast(uprv_strlen(flag) + 1); tmpGenlibFlagBuffer = (char *)uprv_malloc(length); if (tmpGenlibFlagBuffer == NULL) { /* Memory allocation error */ @@ -1915,7 +1915,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { uprv_strcpy(tmpGenlibFlagBuffer, flag); - offset = uprv_strlen(rm_cmd); + offset = static_cast(uprv_strlen(rm_cmd)); for (i = 0; i < (length - offset); i++) { flag[i] = tmpGenlibFlagBuffer[offset + i]; @@ -1928,7 +1928,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { } flag = pkgDataFlags[BIR_FLAGS]; - length = uprv_strlen(pkgDataFlags[BIR_FLAGS]); + length = static_cast(uprv_strlen(pkgDataFlags[BIR_FLAGS])); for (int32_t i = 0; i < length; i++) { if (flag[i] == MAP_FILE_EXT[count]) { @@ -1988,7 +1988,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2006,7 +2006,7 @@ static UPKGOptions *pkg_checkFlag(UPKGOptions *o) { int32_t length = 0; flag = pkgDataFlags[GENLIB]; - length = uprv_strlen(pkgDataFlags[GENLIB]); + length = static_cast(uprv_strlen(pkgDataFlags[GENLIB])); int32_t position = length - 1; @@ -2117,8 +2117,8 @@ static void loadLists(UPKGOptions *o, UErrorCode *status) fprintf(stderr, "pkgdata: Error: absolute path encountered. Old style paths are not supported. Use relative paths such as 'fur.res' or 'translit%cfur.res'.\n\tBad path: '%s'\n", U_FILE_SEP_CHAR, s); exit(U_ILLEGAL_ARGUMENT_ERROR); } - tmpLength = uprv_strlen(o->srcDir) + - uprv_strlen(s) + 5; /* 5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + /* The +5 is to add a little extra space for, among other things, PKGDATA_FILE_SEP_STRING */ + tmpLength = static_cast(uprv_strlen(o->srcDir) + uprv_strlen(s) + 5); if((tmp = (char *)uprv_malloc(tmpLength)) == NULL) { fprintf(stderr, "pkgdata: Error: Unable to allocate tmp buffer size: %d\n", tmpLength); exit(U_MEMORY_ALLOCATION_ERROR); diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp index 5ab0d846302179..2a8425e334119e 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -309,16 +309,11 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr T_FileStream_writeLine(out, assemblyHeader[assemblyHeaderIndex].beginLine); for(;;) { + memset(buffer, 0, sizeof(buffer)); length=T_FileStream_read(in, buffer, sizeof(buffer)); if(length==0) { break; } - if (length != sizeof(buffer)) { - /* pad with extra 0's when at the end of the file */ - for(i=0; i < (length % sizeof(uint32_t)); ++i) { - buffer[length+i] = 0; - } - } for(i=0; i<(length/sizeof(buffer[0])); i++) { column = write32(out, buffer[i], column); } @@ -685,23 +680,30 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char *pBits=32; *pIsBigEndian=(UBool)(U_IS_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB); #elif U_PLATFORM_HAS_WIN32_API -/* _M_IA64 should be defined in windows.h */ -# if defined(_M_IA64) - *pCPU=IMAGE_FILE_MACHINE_IA64; - *pBits = 64; -# elif defined(_M_AMD64) -// link.exe does not really care about the .obj machine type and this will -// allow us to build a dll for both ARM & x64 with an amd64 built tool -// ARM is same as x64 except for first 2 bytes of object file - *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; - // *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit - // *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names - *pBits = 64; // Doesn't seem to be used for anything interesting? + // Windows always runs in little-endian mode. + *pIsBigEndian = FALSE; + + // Note: The various _M_ macros are predefined by the MSVC compiler based + // on the target compilation architecture. + // https://docs.microsoft.com/cpp/preprocessor/predefined-macros + + // link.exe will link an IMAGE_FILE_MACHINE_UNKNOWN data-only .obj file + // no matter what architecture it is targeting (though other values are + // required to match). Unfortunately, the variable name decoration/mangling + // is slightly different on x86, which means we can't use the UNKNOWN type + // for all architectures though. +# if defined(_M_IX86) + *pCPU = IMAGE_FILE_MACHINE_I386; # else - *pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names + *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; +# endif +# if defined(_M_IA64) || defined(_M_AMD64) || defined (_M_ARM64) + *pBits = 64; // Doesn't seem to be used for anything interesting though? +# elif defined(_M_IX86) || defined(_M_ARM) *pBits = 32; +# else +# error "Unknown platform for CAN_GENERATE_OBJECTS." # endif - *pIsBigEndian=FALSE; #else # error "Unknown platform for CAN_GENERATE_OBJECTS." #endif diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp index 423e4b7363c790..29a1f7bc1809d3 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.cpp @@ -379,14 +379,14 @@ createCommonDataFile(const char *destDir, const char *name, const char *entrypoi " {0, 0, 0, 0}\n" " },\n" " \"\", %lu, 0, {\n", - (unsigned long)32-4-sizeof(UDataInfo), - (unsigned long)fileCount, + static_cast(32-4-sizeof(UDataInfo)), + static_cast(fileCount), entrypointName, - (unsigned long)sizeof(UDataInfo), + static_cast(sizeof(UDataInfo)), U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, U_SIZEOF_UCHAR, - (unsigned long)fileCount + static_cast(fileCount) ); T_FileStream_writeLine(out, buffer); diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.cpp b/deps/icu-small/source/tools/toolutil/swapimpl.cpp index e8850cb9864168..926755a2aa8c36 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.cpp +++ b/deps/icu-small/source/tools/toolutil/swapimpl.cpp @@ -41,6 +41,7 @@ #include "uarrsort.h" #include "ucmndata.h" #include "udataswp.h" +#include "ulayout_props.h" /* swapping implementations in common */ @@ -640,6 +641,106 @@ unorm_swap(const UDataSwapper *ds, #endif +// Unicode text layout properties data swapping -------------------------------- + +static int32_t U_CALLCONV +ulayout_swap(const UDataSwapper *ds, + const void *inData, int32_t length, void *outData, + UErrorCode *pErrorCode) { + // udata_swapDataHeader checks the arguments. + int32_t headerSize = udata_swapDataHeader(ds, inData, length, outData, pErrorCode); + if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) { + return 0; + } + + // Check data format and format version. + const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4); + if (!( + pInfo->dataFormat[0] == ULAYOUT_FMT_0 && // dataFormat="Layo" + pInfo->dataFormat[1] == ULAYOUT_FMT_1 && + pInfo->dataFormat[2] == ULAYOUT_FMT_2 && + pInfo->dataFormat[3] == ULAYOUT_FMT_3 && + pInfo->formatVersion[0] == 1)) { + udata_printError(ds, + "ulayout_swap(): data format %02x.%02x.%02x.%02x (format version %02x) " + "is not recognized as text layout properties data\n", + pInfo->dataFormat[0], pInfo->dataFormat[1], + pInfo->dataFormat[2], pInfo->dataFormat[3], + pInfo->formatVersion[0]); + *pErrorCode = U_UNSUPPORTED_ERROR; + return 0; + } + + const uint8_t *inBytes = (const uint8_t *)inData + headerSize; + uint8_t *outBytes = (uint8_t *)outData + headerSize; + + const int32_t *inIndexes = (const int32_t *)inBytes; + + if (length >= 0) { + length -= headerSize; + if (length < 12 * 4) { + udata_printError(ds, + "ulayout_swap(): too few bytes (%d after header) for text layout properties data\n", + length); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } + + int32_t indexesLength = udata_readInt32(ds, inIndexes[ULAYOUT_IX_INDEXES_LENGTH]); + if (indexesLength < 12) { + udata_printError(ds, + "ulayout_swap(): too few indexes (%d) for text layout properties data\n", + indexesLength); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + // Read the data offsets before swapping anything. + int32_t indexes[ULAYOUT_IX_TRIES_TOP + 1]; + for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) { + indexes[i] = udata_readInt32(ds, inIndexes[i]); + } + int32_t size = indexes[ULAYOUT_IX_TRIES_TOP]; + + if (length >= 0) { + if (length < size) { + udata_printError(ds, + "ulayout_swap(): too few bytes (%d after header) " + "for all of text layout properties data\n", + length); + *pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + + // Copy the data for inaccessible bytes. + if (inBytes != outBytes) { + uprv_memcpy(outBytes, inBytes, size); + } + + // Swap the int32_t indexes[]. + int32_t offset = 0; + int32_t count = indexesLength * 4; + ds->swapArray32(ds, inBytes, count, outBytes, pErrorCode); + offset += count; + + // Swap each trie. + for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) { + int32_t top = indexes[i]; + count = top - offset; + U_ASSERT(count >= 0); + if (count >= 16) { + utrie_swapAnyVersion(ds, inBytes + offset, count, outBytes + offset, pErrorCode); + } + offset = top; + } + + U_ASSERT(offset == size); + } + + return headerSize + size; +} + /* Swap 'Test' data from gentest */ static int32_t U_CALLCONV test_swap(const UDataSwapper *ds, @@ -731,6 +832,10 @@ static const struct { { { 0x4e, 0x6f, 0x72, 0x6d }, unorm_swap }, /* dataFormat="Norm" */ { { 0x4e, 0x72, 0x6d, 0x32 }, unorm2_swap }, /* dataFormat="Nrm2" */ #endif + + { { ULAYOUT_FMT_0, ULAYOUT_FMT_1, ULAYOUT_FMT_2, ULAYOUT_FMT_3 }, + ulayout_swap }, // dataFormat="Layo" + #if !UCONFIG_NO_COLLATION { { 0x55, 0x43, 0x6f, 0x6c }, ucol_swap }, /* dataFormat="UCol" */ { { 0x49, 0x6e, 0x76, 0x43 }, ucol_swapInverseUCA },/* dataFormat="InvC" */ diff --git a/deps/icu-small/source/tools/toolutil/toolutil.cpp b/deps/icu-small/source/tools/toolutil/toolutil.cpp index 0f7d0984a8b232..21dca7fe5d6a82 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.cpp +++ b/deps/icu-small/source/tools/toolutil/toolutil.cpp @@ -143,7 +143,7 @@ findDirname(const char *path, char *buffer, int32_t bufLen, UErrorCode* status) resultLen = 0; } else { resultPtr = path; - resultLen = basename - path; + resultLen = static_cast(basename - path); if(resultLen<1) { resultLen = 1; /* '/' or '/a' -> '/' */ } diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp index 5269c8177cab7f..9b5e615d258c92 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp +++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp @@ -178,7 +178,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ memmove(buf->buffer,buf->currentPos,offset* sizeof(UChar)); } -#if UCBUF_DEBUG +#ifdef UCBUF_DEBUG memset(pTarget+offset,0xff,sizeof(UChar)*(MAX_IN_BUF-offset)); #endif if(buf->isBuffered){ @@ -295,7 +295,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ } outputWritten = (int32_t)(target - pTarget); -#if UCBUF_DEBUG +#ifdef UCBUF_DEBUG { int i; target = pTarget; diff --git a/deps/icu-small/source/tools/toolutil/ucmstate.cpp b/deps/icu-small/source/tools/toolutil/ucmstate.cpp index 277657522963fa..206c2f172eb1c5 100644 --- a/deps/icu-small/source/tools/toolutil/ucmstate.cpp +++ b/deps/icu-small/source/tools/toolutil/ucmstate.cpp @@ -653,7 +653,8 @@ compactToUnicode2(UCMStates *states, /* for each lead byte */ for(i=0; i<256; ++i) { entry=states->stateTable[leadState][i]; - if(MBCS_ENTRY_IS_TRANSITION(entry) && (MBCS_ENTRY_TRANSITION_STATE(entry))==trailState) { + if(MBCS_ENTRY_IS_TRANSITION(entry) && + (MBCS_ENTRY_TRANSITION_STATE(entry))==static_cast(trailState)) { /* the offset is different for each lead byte */ offset=MBCS_ENTRY_TRANSITION_OFFSET(entry); /* for each trail byte for this lead byte */ diff --git a/doc/api/errors.md b/doc/api/errors.md index a21b4ac852d1f8..79570ffb510ea9 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -1148,6 +1148,12 @@ is set for the `Http2Stream`. `http2.connect()` was passed a URL that uses any protocol other than `http:` or `https:`. + +### ERR_INTERNAL_ASSERTION + +There was a bug in Node.js or incorrect usage of Node.js internals. +To fix the error, open an issue at https://github.com/nodejs/node/issues. + ### ERR_INCOMPATIBLE_OPTION_PAIR diff --git a/doc/api/fs.md b/doc/api/fs.md index 0ce63f98ce2548..9e3b0df9a487b9 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -3592,8 +3592,12 @@ changes: * `callback` {Function} * `err` {Error} -Asynchronously writes data to a file, replacing the file if it already exists. -`data` can be a string or a buffer. +When `file` is a filename, asynchronously writes data to the file, replacing the +file if it already exists. `data` can be a string or a buffer. + +When `file` is a file descriptor, the behavior is similar to calling +`fs.write()` directly (which is recommended). See the notes below on using +a file descriptor. The `encoding` option is ignored if `data` is a buffer. @@ -3615,15 +3619,30 @@ It is unsafe to use `fs.writeFile()` multiple times on the same file without waiting for the callback. For this scenario, [`fs.createWriteStream()`][] is recommended. -### File Descriptors -1. Any specified file descriptor has to support writing. -2. If a file descriptor is specified as the `file`, it will not be closed -automatically. -3. The writing will begin at the current position. For example, if the string -`'Hello'` is written to the file descriptor, and if `', World'` is written with -`fs.writeFile()` to the same file descriptor, the contents of the file would -become `'Hello, World'`, instead of just `', World'`. +### Using `fs.writeFile()` with File Descriptors + +When `file` is a file descriptor, the behavior is almost identical to directly +calling `fs.write()` like: +```javascript +fs.write(fd, Buffer.from(data, options.encoding), callback); +``` +The difference from directly calling `fs.write()` is that under some unusual +conditions, `fs.write()` may write only part of the buffer and will need to be +retried to write the remaining data, whereas `fs.writeFile()` will retry until +the data is entirely written (or an error occurs). + +Since the implications of this are a common source of confusion, note that in +the file descriptor case the file is not replaced! The data is not necessarily +written to the beginning of the file, and the file's original data may remain +before and/or after the newly written data. + +For example, if `fs.writeFile()` is called twice in a row, first to write the +string `'Hello'`, then to write the string `', World'`, the file would contain +`'Hello, World'`, and might contain some of the file's original data (depending +on the size of the original file, and the position of the file descriptor). If +a file name had been used instead of a descriptor, the file would be guaranteed +to contain only `', World'`. ## fs.writeFileSync(file, data[, options]) default_loc codepage +-------------------------------------------------------- + ab.CD ab CD + ab@CD ab__CD - + ab@CD.EF ab__CD EF + + ab_CD.EF@GH ab_CD_GH EF + +Some 'improper' ways to do the same as above: + ! ab_CD@GH.EF ab_CD_GH EF + ! ab_CD.EF@GH.IJ ab_CD_GH EF + ! ab_CD@ZZ.EF@GH.IJ ab_CD_GH EF + + _CD@GH _CD_GH - + _CD.EF@GH _CD_GH EF + +The variant cannot have dots in it. +The 'rightmost' variant (@xxx) wins. +The leftmost codepage (.xxx) wins. +*/ + const char* posixID = uprv_getPOSIXIDForDefaultLocale(); + + /* Format: (no spaces) + ll [ _CC ] [ . MM ] [ @ VV] + + l = lang, C = ctry, M = charmap, V = variant + */ + + if (gCorrectedPOSIXLocale != nullptr) { + return gCorrectedPOSIXLocale; + } + + // Copy the ID into owned memory. + // Over-allocate in case we replace "C" with "en_US_POSIX" (+10), + null termination + char *correctedPOSIXLocale = static_cast(uprv_malloc(uprv_strlen(posixID) + 10 + 1)); + if (correctedPOSIXLocale == nullptr) { + return nullptr; + } + uprv_strcpy(correctedPOSIXLocale, posixID); + + char *limit; + if ((limit = uprv_strchr(correctedPOSIXLocale, '.')) != nullptr) { + *limit = 0; + } + if ((limit = uprv_strchr(correctedPOSIXLocale, '@')) != nullptr) { + *limit = 0; + } + + if ((uprv_strcmp("C", correctedPOSIXLocale) == 0) // no @ variant + || (uprv_strcmp("POSIX", correctedPOSIXLocale) == 0)) { + // Raw input was C.* or POSIX.*, Give it a nice POSIX default value. + // (The "C"/"POSIX" case is handled in uprv_getPOSIXIDForCategory()) + uprv_strcpy(correctedPOSIXLocale, "en_US_POSIX"); + } + + /* Note that we scan the *uncorrected* ID. */ + const char *p; + if ((p = uprv_strrchr(posixID, '@')) != nullptr) { + p++; + + /* Take care of any special cases here.. */ + if (!uprv_strcmp(p, "nynorsk")) { + p = "NY"; + /* Don't worry about no__NY. In practice, it won't appear. */ + } + + if (uprv_strchr(correctedPOSIXLocale,'_') == nullptr) { + uprv_strcat(correctedPOSIXLocale, "__"); /* aa@b -> aa__b (note this can make the new locale 1 char longer) */ + } + else { + uprv_strcat(correctedPOSIXLocale, "_"); /* aa_CC@b -> aa_CC_b */ + } + + const char *q; + if ((q = uprv_strchr(p, '.')) != nullptr) { + /* How big will the resulting string be? */ + int32_t len = (int32_t)(uprv_strlen(correctedPOSIXLocale) + (q-p)); + uprv_strncat(correctedPOSIXLocale, p, q-p); // do not include charset + correctedPOSIXLocale[len] = 0; + } + else { + /* Anything following the @ sign */ + uprv_strcat(correctedPOSIXLocale, p); + } + + /* Should there be a map from 'no@nynorsk' -> no_NO_NY here? + * How about 'russian' -> 'ru'? + * Many of the other locales using ISO codes will be handled by the + * canonicalization functions in uloc_getDefault. + */ + } + + if (gCorrectedPOSIXLocale == nullptr) { + gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); + correctedPOSIXLocale = nullptr; + } + posixID = gCorrectedPOSIXLocale; + + if (correctedPOSIXLocale != nullptr) { /* Was already set - clean up. */ + uprv_free(correctedPOSIXLocale); + } + + return posixID; + +#elif U_PLATFORM_USES_ONLY_WIN32_API +#define POSIX_LOCALE_CAPACITY 64 + UErrorCode status = U_ZERO_ERROR; + char *correctedPOSIXLocale = nullptr; + + // If we have already figured this out just use the cached value + if (gCorrectedPOSIXLocale != nullptr) { + return gCorrectedPOSIXLocale; + } + + // No cached value, need to determine the current value + static WCHAR windowsLocale[LOCALE_NAME_MAX_LENGTH] = {}; + int length = GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SNAME, windowsLocale, LOCALE_NAME_MAX_LENGTH); + + // Now we should have a Windows locale name that needs converted to the POSIX style. + if (length > 0) // If length is 0, then the GetLocaleInfoEx failed. + { + // First we need to go from UTF-16 to char (and also convert from _ to - while we're at it.) + char modifiedWindowsLocale[LOCALE_NAME_MAX_LENGTH] = {}; + + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(modifiedWindowsLocale); i++) + { + if (windowsLocale[i] == '_') + { + modifiedWindowsLocale[i] = '-'; + } + else + { + modifiedWindowsLocale[i] = static_cast(windowsLocale[i]); + } + + if (modifiedWindowsLocale[i] == '\0') + { + break; + } + } + + if (i >= UPRV_LENGTHOF(modifiedWindowsLocale)) + { + // Ran out of room, can't really happen, maybe we'll be lucky about a matching + // locale when tags are dropped + modifiedWindowsLocale[UPRV_LENGTHOF(modifiedWindowsLocale) - 1] = '\0'; + } + + // Now normalize the resulting name + correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); + /* TODO: Should we just exit on memory allocation failure? */ + if (correctedPOSIXLocale) + { + int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); + if (U_SUCCESS(status)) + { + *(correctedPOSIXLocale + posixLen) = 0; + gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); + } + else + { + uprv_free(correctedPOSIXLocale); + } + } + } + + // If unable to find a locale we can agree upon, use en-US by default + if (gCorrectedPOSIXLocale == nullptr) { + gCorrectedPOSIXLocale = "en_US"; + } + return gCorrectedPOSIXLocale; + +#elif U_PLATFORM == U_PF_OS400 + /* locales are process scoped and are by definition thread safe */ + static char correctedLocale[64]; + const char *localeID = getenv("LC_ALL"); + char *p; + + if (localeID == NULL) + localeID = getenv("LANG"); + if (localeID == NULL) + localeID = setlocale(LC_ALL, NULL); + /* Make sure we have something... */ + if (localeID == NULL) + return "en_US_POSIX"; + + /* Extract the locale name from the path. */ + if((p = uprv_strrchr(localeID, '/')) != NULL) + { + /* Increment p to start of locale name. */ + p++; + localeID = p; + } + + /* Copy to work location. */ + uprv_strcpy(correctedLocale, localeID); + + /* Strip off the '.locale' extension. */ + if((p = uprv_strchr(correctedLocale, '.')) != NULL) { + *p = 0; + } + + /* Upper case the locale name. */ + T_CString_toUpperCase(correctedLocale); + + /* See if we are using the POSIX locale. Any of the + * following are equivalent and use the same QLGPGCMA + * (POSIX) locale. + * QLGPGCMA2 means UCS2 + * QLGPGCMA_4 means UTF-32 + * QLGPGCMA_8 means UTF-8 + */ + if ((uprv_strcmp("C", correctedLocale) == 0) || + (uprv_strcmp("POSIX", correctedLocale) == 0) || + (uprv_strncmp("QLGPGCMA", correctedLocale, 8) == 0)) + { + uprv_strcpy(correctedLocale, "en_US_POSIX"); + } + else + { + int16_t LocaleLen; + + /* Lower case the lang portion. */ + for(p = correctedLocale; *p != 0 && *p != '_'; p++) + { + *p = uprv_tolower(*p); + } + + /* Adjust for Euro. After '_E' add 'URO'. */ + LocaleLen = uprv_strlen(correctedLocale); + if (correctedLocale[LocaleLen - 2] == '_' && + correctedLocale[LocaleLen - 1] == 'E') + { + uprv_strcat(correctedLocale, "URO"); + } + + /* If using Lotus-based locale then convert to + * equivalent non Lotus. + */ + else if (correctedLocale[LocaleLen - 2] == '_' && + correctedLocale[LocaleLen - 1] == 'L') + { + correctedLocale[LocaleLen - 2] = 0; + } + + /* There are separate simplified and traditional + * locales called zh_HK_S and zh_HK_T. + */ + else if (uprv_strncmp(correctedLocale, "zh_HK", 5) == 0) + { + uprv_strcpy(correctedLocale, "zh_HK"); + } + + /* A special zh_CN_GBK locale... + */ + else if (uprv_strcmp(correctedLocale, "zh_CN_GBK") == 0) + { + uprv_strcpy(correctedLocale, "zh_CN"); + } + + } + + return correctedLocale; +#endif + +} + +#if !U_CHARSET_IS_UTF8 +#if U_POSIX_LOCALE +/* +Due to various platform differences, one platform may specify a charset, +when they really mean a different charset. Remap the names so that they are +compatible with ICU. Only conflicting/ambiguous aliases should be resolved +here. Before adding anything to this function, please consider adding unique +names to the ICU alias table in the data directory. +*/ +static const char* +remapPlatformDependentCodepage(const char *locale, const char *name) { + if (locale != NULL && *locale == 0) { + /* Make sure that an empty locale is handled the same way. */ + locale = NULL; + } + if (name == NULL) { + return NULL; + } +#if U_PLATFORM == U_PF_AIX + if (uprv_strcmp(name, "IBM-943") == 0) { + /* Use the ASCII compatible ibm-943 */ + name = "Shift-JIS"; + } + else if (uprv_strcmp(name, "IBM-1252") == 0) { + /* Use the windows-1252 that contains the Euro */ + name = "IBM-5348"; + } +#elif U_PLATFORM == U_PF_SOLARIS + if (locale != NULL && uprv_strcmp(name, "EUC") == 0) { + /* Solaris underspecifies the "EUC" name. */ + if (uprv_strcmp(locale, "zh_CN") == 0) { + name = "EUC-CN"; + } + else if (uprv_strcmp(locale, "zh_TW") == 0) { + name = "EUC-TW"; + } + else if (uprv_strcmp(locale, "ko_KR") == 0) { + name = "EUC-KR"; + } + } + else if (uprv_strcmp(name, "eucJP") == 0) { + /* + ibm-954 is the best match. + ibm-33722 is the default for eucJP (similar to Windows). + */ + name = "eucjis"; + } + else if (uprv_strcmp(name, "646") == 0) { + /* + * The default codepage given by Solaris is 646 but the C library routines treat it as if it was + * ISO-8859-1 instead of US-ASCII(646). + */ + name = "ISO-8859-1"; + } +#elif U_PLATFORM_IS_DARWIN_BASED + if (locale == NULL && *name == 0) { + /* + No locale was specified, and an empty name was passed in. + This usually indicates that nl_langinfo didn't return valid information. + Mac OS X uses UTF-8 by default (especially the locale data and console). + */ + name = "UTF-8"; + } + else if (uprv_strcmp(name, "CP949") == 0) { + /* Remap CP949 to a similar codepage to avoid issues with backslash and won symbol. */ + name = "EUC-KR"; + } + else if (locale != NULL && uprv_strcmp(locale, "en_US_POSIX") != 0 && uprv_strcmp(name, "US-ASCII") == 0) { + /* + * For non C/POSIX locale, default the code page to UTF-8 instead of US-ASCII. + */ + name = "UTF-8"; + } +#elif U_PLATFORM == U_PF_BSD + if (uprv_strcmp(name, "CP949") == 0) { + /* Remap CP949 to a similar codepage to avoid issues with backslash and won symbol. */ + name = "EUC-KR"; + } +#elif U_PLATFORM == U_PF_HPUX + if (locale != NULL && uprv_strcmp(locale, "zh_HK") == 0 && uprv_strcmp(name, "big5") == 0) { + /* HP decided to extend big5 as hkbig5 even though it's not compatible :-( */ + /* zh_TW.big5 is not the same charset as zh_HK.big5! */ + name = "hkbig5"; + } + else if (uprv_strcmp(name, "eucJP") == 0) { + /* + ibm-1350 is the best match, but unavailable. + ibm-954 is mostly a superset of ibm-1350. + ibm-33722 is the default for eucJP (similar to Windows). + */ + name = "eucjis"; + } +#elif U_PLATFORM == U_PF_LINUX + if (locale != NULL && uprv_strcmp(name, "euc") == 0) { + /* Linux underspecifies the "EUC" name. */ + if (uprv_strcmp(locale, "korean") == 0) { + name = "EUC-KR"; + } + else if (uprv_strcmp(locale, "japanese") == 0) { + /* See comment below about eucJP */ + name = "eucjis"; + } + } + else if (uprv_strcmp(name, "eucjp") == 0) { + /* + ibm-1350 is the best match, but unavailable. + ibm-954 is mostly a superset of ibm-1350. + ibm-33722 is the default for eucJP (similar to Windows). + */ + name = "eucjis"; + } + else if (locale != NULL && uprv_strcmp(locale, "en_US_POSIX") != 0 && + (uprv_strcmp(name, "ANSI_X3.4-1968") == 0 || uprv_strcmp(name, "US-ASCII") == 0)) { + /* + * For non C/POSIX locale, default the code page to UTF-8 instead of US-ASCII. + */ + name = "UTF-8"; + } + /* + * Linux returns ANSI_X3.4-1968 for C/POSIX, but the call site takes care of + * it by falling back to 'US-ASCII' when NULL is returned from this + * function. So, we don't have to worry about it here. + */ +#endif + /* return NULL when "" is passed in */ + if (*name == 0) { + name = NULL; + } + return name; +} + +static const char* +getCodepageFromPOSIXID(const char *localeName, char * buffer, int32_t buffCapacity) +{ + char localeBuf[100]; + const char *name = NULL; + char *variant = NULL; + + if (localeName != NULL && (name = (uprv_strchr(localeName, '.'))) != NULL) { + size_t localeCapacity = uprv_min(sizeof(localeBuf), (name-localeName)+1); + uprv_strncpy(localeBuf, localeName, localeCapacity); + localeBuf[localeCapacity-1] = 0; /* ensure NULL termination */ + name = uprv_strncpy(buffer, name+1, buffCapacity); + buffer[buffCapacity-1] = 0; /* ensure NULL termination */ + if ((variant = const_cast(uprv_strchr(name, '@'))) != NULL) { + *variant = 0; + } + name = remapPlatformDependentCodepage(localeBuf, name); + } + return name; +} +#endif + +static const char* +int_getDefaultCodepage() +{ +#if U_PLATFORM == U_PF_OS400 + uint32_t ccsid = 37; /* Default to ibm-37 */ + static char codepage[64]; + Qwc_JOBI0400_t jobinfo; + Qus_EC_t error = { sizeof(Qus_EC_t) }; /* SPI error code */ + + EPT_CALL(QUSRJOBI)(&jobinfo, sizeof(jobinfo), "JOBI0400", + "* ", " ", &error); + + if (error.Bytes_Available == 0) { + if (jobinfo.Coded_Char_Set_ID != 0xFFFF) { + ccsid = (uint32_t)jobinfo.Coded_Char_Set_ID; + } + else if (jobinfo.Default_Coded_Char_Set_Id != 0xFFFF) { + ccsid = (uint32_t)jobinfo.Default_Coded_Char_Set_Id; + } + /* else use the default */ + } + sprintf(codepage,"ibm-%d", ccsid); + return codepage; + +#elif U_PLATFORM == U_PF_OS390 + static char codepage[64]; + + strncpy(codepage, nl_langinfo(CODESET),63-strlen(UCNV_SWAP_LFNL_OPTION_STRING)); + strcat(codepage,UCNV_SWAP_LFNL_OPTION_STRING); + codepage[63] = 0; /* NULL terminate */ + + return codepage; + +#elif U_PLATFORM_USES_ONLY_WIN32_API + static char codepage[64]; + DWORD codepageNumber = 0; + +#if U_PLATFORM_HAS_WINUWP_API > 0 + // UWP doesn't have a direct API to get the default ACP as Microsoft would rather + // have folks use Unicode than a "system" code page, however this is the same + // codepage as the system default locale codepage. (FWIW, the system locale is + // ONLY used for codepage, it should never be used for anything else) + GetLocaleInfoEx(LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, + (LPWSTR)&codepageNumber, sizeof(codepageNumber) / sizeof(WCHAR)); +#else + // Win32 apps can call GetACP + codepageNumber = GetACP(); +#endif + // Special case for UTF-8 + if (codepageNumber == 65001) + { + return "UTF-8"; + } + // Windows codepages can look like windows-1252, so format the found number + // the numbers are eclectic, however all valid system code pages, besides UTF-8 + // are between 3 and 19999 + if (codepageNumber > 0 && codepageNumber < 20000) + { + sprintf(codepage, "windows-%ld", codepageNumber); + return codepage; + } + // If the codepage number call failed then return UTF-8 + return "UTF-8"; + +#elif U_POSIX_LOCALE + static char codesetName[100]; + const char *localeName = NULL; + const char *name = NULL; + + localeName = uprv_getPOSIXIDForDefaultCodepage(); + uprv_memset(codesetName, 0, sizeof(codesetName)); + /* On Solaris nl_langinfo returns C locale values unless setlocale + * was called earlier. + */ +#if (U_HAVE_NL_LANGINFO_CODESET && U_PLATFORM != U_PF_SOLARIS) + /* When available, check nl_langinfo first because it usually gives more + useful names. It depends on LC_CTYPE. + nl_langinfo may use the same buffer as setlocale. */ + { + const char *codeset = nl_langinfo(U_NL_LANGINFO_CODESET); +#if U_PLATFORM_IS_DARWIN_BASED || U_PLATFORM_IS_LINUX_BASED + /* + * On Linux and MacOSX, ensure that default codepage for non C/POSIX locale is UTF-8 + * instead of ASCII. + */ + if (uprv_strcmp(localeName, "en_US_POSIX") != 0) { + codeset = remapPlatformDependentCodepage(localeName, codeset); + } else +#endif + { + codeset = remapPlatformDependentCodepage(NULL, codeset); + } + + if (codeset != NULL) { + uprv_strncpy(codesetName, codeset, sizeof(codesetName)); + codesetName[sizeof(codesetName)-1] = 0; + return codesetName; + } + } +#endif + + /* Use setlocale in a nice way, and then check some environment variables. + Maybe the application used setlocale already. + */ + uprv_memset(codesetName, 0, sizeof(codesetName)); + name = getCodepageFromPOSIXID(localeName, codesetName, sizeof(codesetName)); + if (name) { + /* if we can find the codeset name from setlocale, return that. */ + return name; + } + + if (*codesetName == 0) + { + /* Everything failed. Return US ASCII (ISO 646). */ + (void)uprv_strcpy(codesetName, "US-ASCII"); + } + return codesetName; +#else + return "US-ASCII"; +#endif +} + + +U_CAPI const char* U_EXPORT2 +uprv_getDefaultCodepage() +{ + static char const *name = NULL; + umtx_lock(NULL); + if (name == NULL) { + name = int_getDefaultCodepage(); + } + umtx_unlock(NULL); + return name; +} +#endif /* !U_CHARSET_IS_UTF8 */ + + +/* end of platform-specific implementation -------------- */ + +/* version handling --------------------------------------------------------- */ + +U_CAPI void U_EXPORT2 +u_versionFromString(UVersionInfo versionArray, const char *versionString) { + char *end; + uint16_t part=0; + + if(versionArray==NULL) { + return; + } + + if(versionString!=NULL) { + for(;;) { + versionArray[part]=(uint8_t)uprv_strtoul(versionString, &end, 10); + if(end==versionString || ++part==U_MAX_VERSION_LENGTH || *end!=U_VERSION_DELIMITER) { + break; + } + versionString=end+1; + } + } + + while(partU_MAX_VERSION_STRING_LENGTH) { + len = U_MAX_VERSION_STRING_LENGTH; + } + u_UCharsToChars(versionString, versionChars, len); + versionChars[len]=0; + u_versionFromString(versionArray, versionChars); + } +} + +U_CAPI void U_EXPORT2 +u_versionToString(const UVersionInfo versionArray, char *versionString) { + uint16_t count, part; + uint8_t field; + + if(versionString==NULL) { + return; + } + + if(versionArray==NULL) { + versionString[0]=0; + return; + } + + /* count how many fields need to be written */ + for(count=4; count>0 && versionArray[count-1]==0; --count) { + } + + if(count <= 1) { + count = 2; + } + + /* write the first part */ + /* write the decimal field value */ + field=versionArray[0]; + if(field>=100) { + *versionString++=(char)('0'+field/100); + field%=100; + } + if(field>=10) { + *versionString++=(char)('0'+field/10); + field%=10; + } + *versionString++=(char)('0'+field); + + /* write the following parts */ + for(part=1; part=100) { + *versionString++=(char)('0'+field/100); + field%=100; + } + if(field>=10) { + *versionString++=(char)('0'+field/10); + field%=10; + } + *versionString++=(char)('0'+field); + } + + /* NUL-terminate */ + *versionString=0; +} + +U_CAPI void U_EXPORT2 +u_getVersion(UVersionInfo versionArray) { + (void)copyright; // Suppress unused variable warning from clang. + u_versionFromString(versionArray, U_ICU_VERSION); +} + +/** + * icucfg.h dependent code + */ + +#if U_ENABLE_DYLOAD && HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API + +#if HAVE_DLFCN_H +#ifdef __MVS__ +#ifndef __SUSV3 +#define __SUSV3 1 +#endif +#endif +#include +#endif /* HAVE_DLFCN_H */ + +U_INTERNAL void * U_EXPORT2 +uprv_dl_open(const char *libName, UErrorCode *status) { + void *ret = NULL; + if(U_FAILURE(*status)) return ret; + ret = dlopen(libName, RTLD_NOW|RTLD_GLOBAL); + if(ret==NULL) { +#ifdef U_TRACE_DYLOAD + printf("dlerror on dlopen(%s): %s\n", libName, dlerror()); +#endif + *status = U_MISSING_RESOURCE_ERROR; + } + return ret; +} + +U_INTERNAL void U_EXPORT2 +uprv_dl_close(void *lib, UErrorCode *status) { + if(U_FAILURE(*status)) return; + dlclose(lib); +} + +U_INTERNAL UVoidFunction* U_EXPORT2 +uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { + union { + UVoidFunction *fp; + void *vp; + } uret; + uret.fp = NULL; + if(U_FAILURE(*status)) return uret.fp; + uret.vp = dlsym(lib, sym); + if(uret.vp == NULL) { +#ifdef U_TRACE_DYLOAD + printf("dlerror on dlsym(%p,%s): %s\n", lib,sym, dlerror()); +#endif + *status = U_MISSING_RESOURCE_ERROR; + } + return uret.fp; +} + +#elif U_ENABLE_DYLOAD && U_PLATFORM_USES_ONLY_WIN32_API && !U_PLATFORM_HAS_WINUWP_API + +/* Windows API implementation. */ +// Note: UWP does not expose/allow these APIs, so the UWP version gets the null implementation. */ + +U_INTERNAL void * U_EXPORT2 +uprv_dl_open(const char *libName, UErrorCode *status) { + HMODULE lib = NULL; + + if(U_FAILURE(*status)) return NULL; + + lib = LoadLibraryA(libName); + + if(lib==NULL) { + *status = U_MISSING_RESOURCE_ERROR; + } + + return (void*)lib; +} + +U_INTERNAL void U_EXPORT2 +uprv_dl_close(void *lib, UErrorCode *status) { + HMODULE handle = (HMODULE)lib; + if(U_FAILURE(*status)) return; + + FreeLibrary(handle); + + return; +} + +U_INTERNAL UVoidFunction* U_EXPORT2 +uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { + HMODULE handle = (HMODULE)lib; + UVoidFunction* addr = NULL; + + if(U_FAILURE(*status) || lib==NULL) return NULL; + + addr = (UVoidFunction*)GetProcAddress(handle, sym); + + if(addr==NULL) { + DWORD lastError = GetLastError(); + if(lastError == ERROR_PROC_NOT_FOUND) { + *status = U_MISSING_RESOURCE_ERROR; + } else { + *status = U_UNSUPPORTED_ERROR; /* other unknown error. */ + } + } + + return addr; +} + +#else + +/* No dynamic loading, null (nonexistent) implementation. */ + +U_INTERNAL void * U_EXPORT2 +uprv_dl_open(const char *libName, UErrorCode *status) { + (void)libName; + if(U_FAILURE(*status)) return NULL; + *status = U_UNSUPPORTED_ERROR; + return NULL; +} + +U_INTERNAL void U_EXPORT2 +uprv_dl_close(void *lib, UErrorCode *status) { + (void)lib; + if(U_FAILURE(*status)) return; + *status = U_UNSUPPORTED_ERROR; + return; +} + +U_INTERNAL UVoidFunction* U_EXPORT2 +uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { + (void)lib; + (void)sym; + if(U_SUCCESS(*status)) { + *status = U_UNSUPPORTED_ERROR; + } + return (UVoidFunction*)NULL; +} + +#endif + +/* + * Hey, Emacs, please set the following: + * + * Local Variables: + * indent-tabs-mode: nil + * End: + * + */ diff --git a/tools/icu/patches/64/source/i18n/dtptngen.cpp b/tools/icu/patches/64/source/i18n/dtptngen.cpp new file mode 100644 index 00000000000000..eb8bcfb971f427 --- /dev/null +++ b/tools/icu/patches/64/source/i18n/dtptngen.cpp @@ -0,0 +1,2778 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* +* Copyright (C) 2007-2016, International Business Machines Corporation and +* others. All Rights Reserved. +******************************************************************************* +* +* File DTPTNGEN.CPP +* +******************************************************************************* +*/ + +#include "unicode/utypes.h" +#if !UCONFIG_NO_FORMATTING + +#include "unicode/datefmt.h" +#include "unicode/decimfmt.h" +#include "unicode/dtfmtsym.h" +#include "unicode/dtptngen.h" +#include "unicode/localpointer.h" +#include "unicode/simpleformatter.h" +#include "unicode/smpdtfmt.h" +#include "unicode/udat.h" +#include "unicode/udatpg.h" +#include "unicode/uniset.h" +#include "unicode/uloc.h" +#include "unicode/ures.h" +#include "unicode/ustring.h" +#include "unicode/rep.h" +#include "cpputils.h" +#include "mutex.h" +#include "umutex.h" +#include "cmemory.h" +#include "cstring.h" +#include "locbased.h" +#include "hash.h" +#include "uhash.h" +#include "uresimp.h" +#include "dtptngen_impl.h" +#include "ucln_in.h" +#include "charstr.h" +#include "uassert.h" + +#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY +/** + * If we are on EBCDIC, use an iterator which will + * traverse the bundles in ASCII order. + */ +#define U_USE_ASCII_BUNDLE_ITERATOR +#define U_SORT_ASCII_BUNDLE_ITERATOR +#endif + +#if defined(U_USE_ASCII_BUNDLE_ITERATOR) + +#include "unicode/ustring.h" +#include "uarrsort.h" + +struct UResAEntry { + UChar *key; + UResourceBundle *item; +}; + +struct UResourceBundleAIterator { + UResourceBundle *bund; + UResAEntry *entries; + int32_t num; + int32_t cursor; +}; + +/* Must be C linkage to pass function pointer to the sort function */ + +U_CDECL_BEGIN + +static int32_t U_CALLCONV +ures_a_codepointSort(const void *context, const void *left, const void *right) { + //CompareContext *cmp=(CompareContext *)context; + return u_strcmp(((const UResAEntry *)left)->key, + ((const UResAEntry *)right)->key); +} + +U_CDECL_END + +static void ures_a_open(UResourceBundleAIterator *aiter, UResourceBundle *bund, UErrorCode *status) { + if(U_FAILURE(*status)) { + return; + } + aiter->bund = bund; + aiter->num = ures_getSize(aiter->bund); + aiter->cursor = 0; +#if !defined(U_SORT_ASCII_BUNDLE_ITERATOR) + aiter->entries = nullptr; +#else + aiter->entries = (UResAEntry*)uprv_malloc(sizeof(UResAEntry)*aiter->num); + for(int i=0;inum;i++) { + aiter->entries[i].item = ures_getByIndex(aiter->bund, i, nullptr, status); + const char *akey = ures_getKey(aiter->entries[i].item); + int32_t len = uprv_strlen(akey)+1; + aiter->entries[i].key = (UChar*)uprv_malloc(len*sizeof(UChar)); + u_charsToUChars(akey, aiter->entries[i].key, len); + } + uprv_sortArray(aiter->entries, aiter->num, sizeof(UResAEntry), ures_a_codepointSort, nullptr, TRUE, status); +#endif +} + +static void ures_a_close(UResourceBundleAIterator *aiter) { +#if defined(U_SORT_ASCII_BUNDLE_ITERATOR) + for(int i=0;inum;i++) { + uprv_free(aiter->entries[i].key); + ures_close(aiter->entries[i].item); + } +#endif +} + +static const UChar *ures_a_getNextString(UResourceBundleAIterator *aiter, int32_t *len, const char **key, UErrorCode *err) { +#if !defined(U_SORT_ASCII_BUNDLE_ITERATOR) + return ures_getNextString(aiter->bund, len, key, err); +#else + if(U_FAILURE(*err)) return nullptr; + UResourceBundle *item = aiter->entries[aiter->cursor].item; + const UChar* ret = ures_getString(item, len, err); + *key = ures_getKey(item); + aiter->cursor++; + return ret; +#endif +} + + +#endif + + +U_NAMESPACE_BEGIN + +// ***************************************************************************** +// class DateTimePatternGenerator +// ***************************************************************************** +static const UChar Canonical_Items[] = { + // GyQMwWEDFdaHmsSv + CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, + CAP_D, CAP_F, LOW_D, LOW_A, // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J + CAP_H, LOW_M, LOW_S, CAP_S, LOW_V, 0 +}; + +static const dtTypeElem dtTypes[] = { + // patternChar, field, type, minLen, weight + {CAP_G, UDATPG_ERA_FIELD, DT_SHORT, 1, 3,}, + {CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0}, + {CAP_G, UDATPG_ERA_FIELD, DT_NARROW, 5, 0}, + + {LOW_Y, UDATPG_YEAR_FIELD, DT_NUMERIC, 1, 20}, + {CAP_Y, UDATPG_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, + {LOW_U, UDATPG_YEAR_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 20}, + {LOW_R, UDATPG_YEAR_FIELD, DT_NUMERIC + 3*DT_DELTA, 1, 20}, + {CAP_U, UDATPG_YEAR_FIELD, DT_SHORT, 1, 3}, + {CAP_U, UDATPG_YEAR_FIELD, DT_LONG, 4, 0}, + {CAP_U, UDATPG_YEAR_FIELD, DT_NARROW, 5, 0}, + + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC, 1, 2}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_SHORT, 3, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_LONG, 4, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NARROW, 5, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT - DT_DELTA, 3, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + + {CAP_M, UDATPG_MONTH_FIELD, DT_NUMERIC, 1, 2}, + {CAP_M, UDATPG_MONTH_FIELD, DT_SHORT, 3, 0}, + {CAP_M, UDATPG_MONTH_FIELD, DT_LONG, 4, 0}, + {CAP_M, UDATPG_MONTH_FIELD, DT_NARROW, 5, 0}, + {CAP_L, UDATPG_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, + {CAP_L, UDATPG_MONTH_FIELD, DT_SHORT - DT_DELTA, 3, 0}, + {CAP_L, UDATPG_MONTH_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {CAP_L, UDATPG_MONTH_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {LOW_L, UDATPG_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 1}, + + {LOW_W, UDATPG_WEEK_OF_YEAR_FIELD, DT_NUMERIC, 1, 2}, + + {CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC, 1, 0}, + + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORT, 1, 3}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_LONG, 4, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_NARROW, 5, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER, 6, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 2}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORT - 2*DT_DELTA, 3, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NARROW - 2*DT_DELTA, 5, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORTER - 2*DT_DELTA, 6, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // LOW_E is currently not used in CLDR data, should not be canonical + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORT - DT_DELTA, 3, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER - DT_DELTA, 6, 0}, + + {LOW_D, UDATPG_DAY_FIELD, DT_NUMERIC, 1, 2}, + {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, // really internal use, so we don't care + + {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC, 1, 3}, + + {CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC, 1, 0}, + + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 3}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_LONG, 4, 0}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_NARROW, 5, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - DT_DELTA, 1, 3}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + // b needs to be closer to a than to B, so we make this 3*DT_DELTA + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - 3*DT_DELTA, 1, 3}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - 3*DT_DELTA, 4, 0}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - 3*DT_DELTA, 5, 0}, + + {CAP_H, UDATPG_HOUR_FIELD, DT_NUMERIC + 10*DT_DELTA, 1, 2}, // 24 hour + {LOW_K, UDATPG_HOUR_FIELD, DT_NUMERIC + 11*DT_DELTA, 1, 2}, // 24 hour + {LOW_H, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12 hour + {CAP_K, UDATPG_HOUR_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // 12 hour + // The C code has had versions of the following 3, keep & update. Should not need these, but... + // Without these, certain tests using e.g. staticGetSkeleton fail because j/J in patterns + // get skipped instead of mapped to the right hour chars, for example in + // DateFormatTest::TestPatternFromSkeleton + // IntlTestDateTimePatternGeneratorAPI:: testStaticGetSkeleton + // DateIntervalFormatTest::testTicket11985 + // Need to investigate better handling of jJC replacement e.g. in staticGetSkeleton. + {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 5*DT_DELTA, 1, 2}, // 12/24 hour no AM/PM + {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 6*DT_DELTA, 1, 6}, // 12/24 hour + {CAP_C, UDATPG_HOUR_FIELD, DT_NUMERIC + 7*DT_DELTA, 1, 6}, // 12/24 hour with preferred dayPeriods for 12 + + {LOW_M, UDATPG_MINUTE_FIELD, DT_NUMERIC, 1, 2}, + + {LOW_S, UDATPG_SECOND_FIELD, DT_NUMERIC, 1, 2}, + {CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000}, + + {CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC, 1, 1000}, + + {LOW_V, UDATPG_ZONE_FIELD, DT_SHORT - 2*DT_DELTA, 1, 0}, + {LOW_V, UDATPG_ZONE_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, + {LOW_Z, UDATPG_ZONE_FIELD, DT_SHORT, 1, 3}, + {LOW_Z, UDATPG_ZONE_FIELD, DT_LONG, 4, 0}, + {CAP_Z, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 3}, + {CAP_Z, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {CAP_Z, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 5, 0}, + {CAP_O, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 1, 0}, + {CAP_O, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 1, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 2, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-1 - DT_DELTA, 3, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-2 - DT_DELTA, 4, 0}, + {CAP_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, + {CAP_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, + {CAP_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, + {LOW_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, + {LOW_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, + + {0, UDATPG_FIELD_COUNT, 0, 0, 0} , // last row of dtTypes[] + }; + +static const char* const CLDR_FIELD_APPEND[] = { + "Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", + "*", "*", "Day", "*", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J + "Hour", "Minute", "Second", "*", "Timezone" +}; + +static const char* const CLDR_FIELD_NAME[UDATPG_FIELD_COUNT] = { + "era", "year", "quarter", "month", "week", "weekOfMonth", "weekday", + "dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J + "hour", "minute", "second", "*", "zone" +}; + +static const char* const CLDR_FIELD_WIDTH[] = { // [UDATPG_WIDTH_COUNT] + "", "-short", "-narrow" +}; + +// TODO(ticket:13619): remove when definition uncommented in dtptngen.h. +static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1; +static constexpr UDateTimePGDisplayWidth UDATPG_WIDTH_APPENDITEM = UDATPG_WIDE; +static constexpr int32_t UDATPG_FIELD_KEY_MAX = 24; // max length of CLDR field tag (type + width) + +// For appendItems +static const UChar UDATPG_ItemFormat[]= {0x7B, 0x30, 0x7D, 0x20, 0x251C, 0x7B, 0x32, 0x7D, 0x3A, + 0x20, 0x7B, 0x31, 0x7D, 0x2524, 0}; // {0} \u251C{2}: {1}\u2524 + +//static const UChar repeatedPatterns[6]={CAP_G, CAP_E, LOW_Z, LOW_V, CAP_Q, 0}; // "GEzvQ" + +static const char DT_DateTimePatternsTag[]="DateTimePatterns"; +static const char DT_DateTimeCalendarTag[]="calendar"; +static const char DT_DateTimeGregorianTag[]="gregorian"; +static const char DT_DateTimeAppendItemsTag[]="appendItems"; +static const char DT_DateTimeFieldsTag[]="fields"; +static const char DT_DateTimeAvailableFormatsTag[]="availableFormats"; +//static const UnicodeString repeatedPattern=UnicodeString(repeatedPatterns); + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateTimePatternGenerator) +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DTSkeletonEnumeration) +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DTRedundantEnumeration) + +DateTimePatternGenerator* U_EXPORT2 +DateTimePatternGenerator::createInstance(UErrorCode& status) { + return createInstance(Locale::getDefault(), status); +} + +DateTimePatternGenerator* U_EXPORT2 +DateTimePatternGenerator::createInstance(const Locale& locale, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer result( + new DateTimePatternGenerator(locale, status), status); + return U_SUCCESS(status) ? result.orphan() : nullptr; +} + +DateTimePatternGenerator* U_EXPORT2 +DateTimePatternGenerator::createEmptyInstance(UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + LocalPointer result( + new DateTimePatternGenerator(status), status); + return U_SUCCESS(status) ? result.orphan() : nullptr; +} + +DateTimePatternGenerator::DateTimePatternGenerator(UErrorCode &status) : + skipMatcher(nullptr), + fAvailableFormatKeyHash(nullptr), + internalErrorCode(U_ZERO_ERROR) +{ + fp = new FormatParser(); + dtMatcher = new DateTimeMatcher(); + distanceInfo = new DistanceInfo(); + patternMap = new PatternMap(); + if (fp == nullptr || dtMatcher == nullptr || distanceInfo == nullptr || patternMap == nullptr) { + internalErrorCode = status = U_MEMORY_ALLOCATION_ERROR; + } +} + +DateTimePatternGenerator::DateTimePatternGenerator(const Locale& locale, UErrorCode &status) : + skipMatcher(nullptr), + fAvailableFormatKeyHash(nullptr), + internalErrorCode(U_ZERO_ERROR) +{ + fp = new FormatParser(); + dtMatcher = new DateTimeMatcher(); + distanceInfo = new DistanceInfo(); + patternMap = new PatternMap(); + if (fp == nullptr || dtMatcher == nullptr || distanceInfo == nullptr || patternMap == nullptr) { + internalErrorCode = status = U_MEMORY_ALLOCATION_ERROR; + } + else { + initData(locale, status); + } +} + +DateTimePatternGenerator::DateTimePatternGenerator(const DateTimePatternGenerator& other) : + UObject(), + skipMatcher(nullptr), + fAvailableFormatKeyHash(nullptr), + internalErrorCode(U_ZERO_ERROR) +{ + fp = new FormatParser(); + dtMatcher = new DateTimeMatcher(); + distanceInfo = new DistanceInfo(); + patternMap = new PatternMap(); + if (fp == nullptr || dtMatcher == nullptr || distanceInfo == nullptr || patternMap == nullptr) { + internalErrorCode = U_MEMORY_ALLOCATION_ERROR; + } + *this=other; +} + +DateTimePatternGenerator& +DateTimePatternGenerator::operator=(const DateTimePatternGenerator& other) { + // reflexive case + if (&other == this) { + return *this; + } + internalErrorCode = other.internalErrorCode; + pLocale = other.pLocale; + fDefaultHourFormatChar = other.fDefaultHourFormatChar; + *fp = *(other.fp); + dtMatcher->copyFrom(other.dtMatcher->skeleton); + *distanceInfo = *(other.distanceInfo); + dateTimeFormat = other.dateTimeFormat; + decimal = other.decimal; + // NUL-terminate for the C API. + dateTimeFormat.getTerminatedBuffer(); + decimal.getTerminatedBuffer(); + delete skipMatcher; + if ( other.skipMatcher == nullptr ) { + skipMatcher = nullptr; + } + else { + skipMatcher = new DateTimeMatcher(*other.skipMatcher); + if (skipMatcher == nullptr) + { + internalErrorCode = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + } + for (int32_t i=0; i< UDATPG_FIELD_COUNT; ++i ) { + appendItemFormats[i] = other.appendItemFormats[i]; + appendItemFormats[i].getTerminatedBuffer(); // NUL-terminate for the C API. + for (int32_t j=0; j< UDATPG_WIDTH_COUNT; ++j ) { + fieldDisplayNames[i][j] = other.fieldDisplayNames[i][j]; + fieldDisplayNames[i][j].getTerminatedBuffer(); // NUL-terminate for the C API. + } + } + patternMap->copyFrom(*other.patternMap, internalErrorCode); + copyHashtable(other.fAvailableFormatKeyHash, internalErrorCode); + return *this; +} + + +UBool +DateTimePatternGenerator::operator==(const DateTimePatternGenerator& other) const { + if (this == &other) { + return TRUE; + } + if ((pLocale==other.pLocale) && (patternMap->equals(*other.patternMap)) && + (dateTimeFormat==other.dateTimeFormat) && (decimal==other.decimal)) { + for ( int32_t i=0 ; i list; + int32_t length = 0; + int32_t preferredFormat = ALLOWED_HOUR_FORMAT_UNKNOWN; + for (int32_t j = 0; formatList.getKeyAndValue(j, key, value); ++j) { + if (uprv_strcmp(key, "allowed") == 0) { + if (value.getType() == URES_STRING) { + length = 2; // 1 preferred to add later, 1 allowed to add now + if (list.allocateInsteadAndReset(length + 1) == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + list[1] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); + } + else { + ResourceArray allowedFormats = value.getArray(errorCode); + length = allowedFormats.getSize() + 1; // 1 preferred, getSize allowed + if (list.allocateInsteadAndReset(length + 1) == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + for (int32_t k = 1; k < length; ++k) { + allowedFormats.getValue(k-1, value); + list[k] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); + } + } + } else if (uprv_strcmp(key, "preferred") == 0) { + preferredFormat = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); + } + } + if (length > 1) { + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: list[1]; + } else { + // fallback handling for missing data + length = 2; // 1 preferred, 1 allowed + if (list.allocateInsteadAndReset(length + 1) == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + list[0] = (preferredFormat!=ALLOWED_HOUR_FORMAT_UNKNOWN)? preferredFormat: ALLOWED_HOUR_FORMAT_H; + list[1] = list[0]; + } + list[length] = ALLOWED_HOUR_FORMAT_UNKNOWN; + // At this point list[] will have at least two non-ALLOWED_HOUR_FORMAT_UNKNOWN entries, + // followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + uhash_put(localeToAllowedHourFormatsMap, const_cast(regionOrLocale), list.orphan(), &errorCode); + if (U_FAILURE(errorCode)) { return; } + } + } + + AllowedHourFormat getHourFormatFromUnicodeString(const UnicodeString &s) { + if (s.length() == 1) { + if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; } + if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; } + if (s[0] == CAP_K) { return ALLOWED_HOUR_FORMAT_K; } + if (s[0] == LOW_K) { return ALLOWED_HOUR_FORMAT_k; } + } else if (s.length() == 2) { + if (s[0] == LOW_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_hb; } + if (s[0] == LOW_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_hB; } + if (s[0] == CAP_K && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Kb; } + if (s[0] == CAP_K && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_KB; } + if (s[0] == CAP_H && s[1] == LOW_B) { return ALLOWED_HOUR_FORMAT_Hb; } + if (s[0] == CAP_H && s[1] == CAP_B) { return ALLOWED_HOUR_FORMAT_HB; } + } + + return ALLOWED_HOUR_FORMAT_UNKNOWN; + } +}; + +} // namespace + +AllowedHourFormatsSink::~AllowedHourFormatsSink() {} + +U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UErrorCode &status) { + if (U_FAILURE(status)) { return; } + localeToAllowedHourFormatsMap = uhash_open( + uhash_hashChars, uhash_compareChars, nullptr, &status); + if (U_FAILURE(status)) { return; } + + uhash_setValueDeleter(localeToAllowedHourFormatsMap, deleteAllowedHourFormats); + ucln_i18n_registerCleanup(UCLN_I18N_ALLOWED_HOUR_FORMATS, allowedHourFormatsCleanup); + + LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "supplementalData", &status)); + if (U_FAILURE(status)) { return; } + + AllowedHourFormatsSink sink; + // TODO: Currently in the enumeration each table allocates a new array. + // Try to reduce the number of memory allocations. Consider storing a + // UVector32 with the concatenation of all of the sub-arrays, put the start index + // into the hashmap, store 6 single-value sub-arrays right at the beginning of the + // vector (at index enum*2) for easy data sharing, copy sub-arrays into runtime + // object. Remember to clean up the vector, too. + ures_getAllItemsWithFallback(rb.getAlias(), "timeData", sink, status); +} + +void DateTimePatternGenerator::getAllowedHourFormats(const Locale &locale, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + Locale maxLocale(locale); + maxLocale.addLikelySubtags(status); + if (U_FAILURE(status)) { + return; + } + + const char *country = maxLocale.getCountry(); + if (*country == '\0') { country = "001"; } + const char *language = maxLocale.getLanguage(); + + CharString langCountry; + langCountry.append(language, static_cast(uprv_strlen(language)), status); + langCountry.append('_', status); + langCountry.append(country, static_cast(uprv_strlen(country)), status); + + int32_t *allowedFormats; + allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, langCountry.data()); + if (allowedFormats == nullptr) { + allowedFormats = (int32_t *)uhash_get(localeToAllowedHourFormatsMap, const_cast(country)); + } + + if (allowedFormats != nullptr) { // Lookup is successful + // Here allowedFormats points to a list consisting of key for preferredFormat, + // followed by one or more keys for allowedFormats, then followed by ALLOWED_HOUR_FORMAT_UNKNOWN. + switch (allowedFormats[0]) { + case ALLOWED_HOUR_FORMAT_h: fDefaultHourFormatChar = LOW_H; break; + case ALLOWED_HOUR_FORMAT_H: fDefaultHourFormatChar = CAP_H; break; + case ALLOWED_HOUR_FORMAT_K: fDefaultHourFormatChar = CAP_K; break; + case ALLOWED_HOUR_FORMAT_k: fDefaultHourFormatChar = LOW_K; break; + default: fDefaultHourFormatChar = CAP_H; break; + } + for (int32_t i = 0; i < UPRV_LENGTHOF(fAllowedHourFormats); ++i) { + fAllowedHourFormats[i] = allowedFormats[i + 1]; + if (fAllowedHourFormats[i] == ALLOWED_HOUR_FORMAT_UNKNOWN) { + break; + } + } + } else { // Lookup failed, twice + fDefaultHourFormatChar = CAP_H; + fAllowedHourFormats[0] = ALLOWED_HOUR_FORMAT_H; + fAllowedHourFormats[1] = ALLOWED_HOUR_FORMAT_UNKNOWN; + } +} + +UnicodeString +DateTimePatternGenerator::getSkeleton(const UnicodeString& pattern, UErrorCode& +/*status*/) { + FormatParser fp2; + DateTimeMatcher matcher; + PtnSkeleton localSkeleton; + matcher.set(pattern, &fp2, localSkeleton); + return localSkeleton.getSkeleton(); +} + +UnicodeString +DateTimePatternGenerator::staticGetSkeleton( + const UnicodeString& pattern, UErrorCode& /*status*/) { + FormatParser fp; + DateTimeMatcher matcher; + PtnSkeleton localSkeleton; + matcher.set(pattern, &fp, localSkeleton); + return localSkeleton.getSkeleton(); +} + +UnicodeString +DateTimePatternGenerator::getBaseSkeleton(const UnicodeString& pattern, UErrorCode& /*status*/) { + FormatParser fp2; + DateTimeMatcher matcher; + PtnSkeleton localSkeleton; + matcher.set(pattern, &fp2, localSkeleton); + return localSkeleton.getBaseSkeleton(); +} + +UnicodeString +DateTimePatternGenerator::staticGetBaseSkeleton( + const UnicodeString& pattern, UErrorCode& /*status*/) { + FormatParser fp; + DateTimeMatcher matcher; + PtnSkeleton localSkeleton; + matcher.set(pattern, &fp, localSkeleton); + return localSkeleton.getBaseSkeleton(); +} + +void +DateTimePatternGenerator::addICUPatterns(const Locale& locale, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + UnicodeString dfPattern; + UnicodeString conflictingString; + DateFormat* df; + + // Load with ICU patterns + for (int32_t i=DateFormat::kFull; i<=DateFormat::kShort; i++) { + DateFormat::EStyle style = (DateFormat::EStyle)i; + df = DateFormat::createDateInstance(style, locale); + SimpleDateFormat* sdf; + if (df != nullptr && (sdf = dynamic_cast(df)) != nullptr) { + sdf->toPattern(dfPattern); + addPattern(dfPattern, FALSE, conflictingString, status); + } + // TODO Maybe we should return an error when the date format isn't simple. + delete df; + if (U_FAILURE(status)) { return; } + + df = DateFormat::createTimeInstance(style, locale); + if (df != nullptr && (sdf = dynamic_cast(df)) != nullptr) { + sdf->toPattern(dfPattern); + addPattern(dfPattern, FALSE, conflictingString, status); + + // TODO: C++ and Java are inconsistent (see #12568). + // C++ uses MEDIUM, but Java uses SHORT. + if ( i==DateFormat::kShort && !dfPattern.isEmpty() ) { + consumeShortTimePattern(dfPattern, status); + } + } + // TODO Maybe we should return an error when the date format isn't simple. + delete df; + if (U_FAILURE(status)) { return; } + } +} + +void +DateTimePatternGenerator::hackTimes(const UnicodeString& hackPattern, UErrorCode& status) { + UnicodeString conflictingString; + + fp->set(hackPattern); + UnicodeString mmss; + UBool gotMm=FALSE; + for (int32_t i=0; iitemNumber; ++i) { + UnicodeString field = fp->items[i]; + if ( fp->isQuoteLiteral(field) ) { + if ( gotMm ) { + UnicodeString quoteLiteral; + fp->getQuoteLiteral(quoteLiteral, &i); + mmss += quoteLiteral; + } + } + else { + if (fp->isPatternSeparator(field) && gotMm) { + mmss+=field; + } + else { + UChar ch=field.charAt(0); + if (ch==LOW_M) { + gotMm=TRUE; + mmss+=field; + } + else { + if (ch==LOW_S) { + if (!gotMm) { + break; + } + mmss+= field; + addPattern(mmss, FALSE, conflictingString, status); + break; + } + else { + if (gotMm || ch==LOW_Z || ch==CAP_Z || ch==LOW_V || ch==CAP_V) { + break; + } + } + } + } + } + } +} + +#define ULOC_LOCALE_IDENTIFIER_CAPACITY (ULOC_FULLNAME_CAPACITY + 1 + ULOC_KEYWORD_AND_VALUES_CAPACITY) + +void +DateTimePatternGenerator::getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err) { + destination.clear().append(DT_DateTimeGregorianTag, -1, err); // initial default + if ( U_SUCCESS(err) ) { + UErrorCode localStatus = U_ZERO_ERROR; + char localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY]; + // obtain a locale that always has the calendar key value that should be used + ures_getFunctionalEquivalent( + localeWithCalendarKey, + ULOC_LOCALE_IDENTIFIER_CAPACITY, + nullptr, + "calendar", + "calendar", + locale.getName(), + nullptr, + FALSE, + &localStatus); + localeWithCalendarKey[ULOC_LOCALE_IDENTIFIER_CAPACITY-1] = 0; // ensure null termination + // now get the calendar key value from that locale + char calendarType[ULOC_KEYWORDS_CAPACITY]; + int32_t calendarTypeLen = uloc_getKeywordValue( + localeWithCalendarKey, + "calendar", + calendarType, + ULOC_KEYWORDS_CAPACITY, + &localStatus); + // If the input locale was invalid, don't fail with missing resource error, instead + // continue with default of Gregorian. + if (U_FAILURE(localStatus) && localStatus != U_MISSING_RESOURCE_ERROR) { + err = localStatus; + return; + } + if (calendarTypeLen < ULOC_KEYWORDS_CAPACITY) { + destination.clear().append(calendarType, -1, err); + if (U_FAILURE(err)) { return; } + } + } +} + +void +DateTimePatternGenerator::consumeShortTimePattern(const UnicodeString& shortTimePattern, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + // ICU-20383 No longer set fDefaultHourFormatChar to the hour format character from + // this pattern; instead it is set from localeToAllowedHourFormatsMap which now + // includes entries for both preferred and allowed formats. + + // HACK for hh:ss + hackTimes(shortTimePattern, status); +} + +struct DateTimePatternGenerator::AppendItemFormatsSink : public ResourceSink { + + // Destination for data, modified via setters. + DateTimePatternGenerator& dtpg; + + AppendItemFormatsSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {} + virtual ~AppendItemFormatsSink(); + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable itemsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) { + UDateTimePatternField field = dtpg.getAppendFormatNumber(key); + if (field == UDATPG_FIELD_COUNT) { continue; } + const UnicodeString& valueStr = value.getUnicodeString(errorCode); + if (dtpg.getAppendItemFormat(field).isEmpty() && !valueStr.isEmpty()) { + dtpg.setAppendItemFormat(field, valueStr); + } + } + } + + void fillInMissing() { + UnicodeString defaultItemFormat(TRUE, UDATPG_ItemFormat, UPRV_LENGTHOF(UDATPG_ItemFormat)-1); // Read-only alias. + for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) { + UDateTimePatternField field = (UDateTimePatternField)i; + if (dtpg.getAppendItemFormat(field).isEmpty()) { + dtpg.setAppendItemFormat(field, defaultItemFormat); + } + } + } +}; + +struct DateTimePatternGenerator::AppendItemNamesSink : public ResourceSink { + + // Destination for data, modified via setters. + DateTimePatternGenerator& dtpg; + + AppendItemNamesSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {} + virtual ~AppendItemNamesSink(); + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable itemsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) { + UDateTimePGDisplayWidth width; + UDateTimePatternField field = dtpg.getFieldAndWidthIndices(key, &width); + if (field == UDATPG_FIELD_COUNT) { continue; } + ResourceTable detailsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t j = 0; detailsTable.getKeyAndValue(j, key, value); ++j) { + if (uprv_strcmp(key, "dn") != 0) { continue; } + const UnicodeString& valueStr = value.getUnicodeString(errorCode); + if (dtpg.getFieldDisplayName(field,width).isEmpty() && !valueStr.isEmpty()) { + dtpg.setFieldDisplayName(field,width,valueStr); + } + break; + } + } + } + + void fillInMissing() { + for (int32_t i = 0; i < UDATPG_FIELD_COUNT; i++) { + UnicodeString& valueStr = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, UDATPG_WIDE); + if (valueStr.isEmpty()) { + valueStr = CAP_F; + U_ASSERT(i < 20); + if (i < 10) { + // F0, F1, ..., F9 + valueStr += (UChar)(i+0x30); + } else { + // F10, F11, ... + valueStr += (UChar)0x31; + valueStr += (UChar)(i-10 + 0x30); + } + // NUL-terminate for the C API. + valueStr.getTerminatedBuffer(); + } + for (int32_t j = 1; j < UDATPG_WIDTH_COUNT; j++) { + UnicodeString& valueStr2 = dtpg.getMutableFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)j); + if (valueStr2.isEmpty()) { + valueStr2 = dtpg.getFieldDisplayName((UDateTimePatternField)i, (UDateTimePGDisplayWidth)(j-1)); + } + } + } + } +}; + +struct DateTimePatternGenerator::AvailableFormatsSink : public ResourceSink { + + // Destination for data, modified via setters. + DateTimePatternGenerator& dtpg; + + // Temporary variable, required for calling addPatternWithSkeleton. + UnicodeString conflictingPattern; + + AvailableFormatsSink(DateTimePatternGenerator& _dtpg) : dtpg(_dtpg) {} + virtual ~AvailableFormatsSink(); + + virtual void put(const char *key, ResourceValue &value, UBool isRoot, + UErrorCode &errorCode) { + ResourceTable itemsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; itemsTable.getKeyAndValue(i, key, value); ++i) { + const UnicodeString formatKey(key, -1, US_INV); + if (!dtpg.isAvailableFormatSet(formatKey) ) { + dtpg.setAvailableFormat(formatKey, errorCode); + // Add pattern with its associated skeleton. Override any duplicate + // derived from std patterns, but not a previous availableFormats entry: + const UnicodeString& formatValue = value.getUnicodeString(errorCode); + conflictingPattern.remove(); + dtpg.addPatternWithSkeleton(formatValue, &formatKey, !isRoot, conflictingPattern, errorCode); + } + } + } +}; + +// Virtual destructors must be defined out of line. +DateTimePatternGenerator::AppendItemFormatsSink::~AppendItemFormatsSink() {} +DateTimePatternGenerator::AppendItemNamesSink::~AppendItemNamesSink() {} +DateTimePatternGenerator::AvailableFormatsSink::~AvailableFormatsSink() {} + +void +DateTimePatternGenerator::addCLDRData(const Locale& locale, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } + UnicodeString rbPattern, value, field; + CharString path; + + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getName(), &errorCode)); + if (U_FAILURE(errorCode)) { return; } + + CharString calendarTypeToUse; // to be filled in with the type to use, if all goes well + getCalendarTypeToUse(locale, calendarTypeToUse, errorCode); + if (U_FAILURE(errorCode)) { return; } + + // Local err to ignore resource not found exceptions + UErrorCode err = U_ZERO_ERROR; + + // Load append item formats. + AppendItemFormatsSink appendItemFormatsSink(*this); + path.clear() + .append(DT_DateTimeCalendarTag, errorCode) + .append('/', errorCode) + .append(calendarTypeToUse, errorCode) + .append('/', errorCode) + .append(DT_DateTimeAppendItemsTag, errorCode); // i.e., calendar/xxx/appendItems + if (U_FAILURE(errorCode)) { return; } + ures_getAllItemsWithFallback(rb.getAlias(), path.data(), appendItemFormatsSink, err); + appendItemFormatsSink.fillInMissing(); + + // Load CLDR item names. + err = U_ZERO_ERROR; + AppendItemNamesSink appendItemNamesSink(*this); + ures_getAllItemsWithFallback(rb.getAlias(), DT_DateTimeFieldsTag, appendItemNamesSink, err); + appendItemNamesSink.fillInMissing(); + + // Load the available formats from CLDR. + err = U_ZERO_ERROR; + initHashtable(errorCode); + if (U_FAILURE(errorCode)) { return; } + AvailableFormatsSink availableFormatsSink(*this); + path.clear() + .append(DT_DateTimeCalendarTag, errorCode) + .append('/', errorCode) + .append(calendarTypeToUse, errorCode) + .append('/', errorCode) + .append(DT_DateTimeAvailableFormatsTag, errorCode); // i.e., calendar/xxx/availableFormats + if (U_FAILURE(errorCode)) { return; } + ures_getAllItemsWithFallback(rb.getAlias(), path.data(), availableFormatsSink, err); +} + +void +DateTimePatternGenerator::initHashtable(UErrorCode& err) { + if (U_FAILURE(err)) { return; } + if (fAvailableFormatKeyHash!=nullptr) { + return; + } + LocalPointer hash(new Hashtable(FALSE, err), err); + if (U_SUCCESS(err)) { + fAvailableFormatKeyHash = hash.orphan(); + } +} + +void +DateTimePatternGenerator::setAppendItemFormat(UDateTimePatternField field, const UnicodeString& value) { + appendItemFormats[field] = value; + // NUL-terminate for the C API. + appendItemFormats[field].getTerminatedBuffer(); +} + +const UnicodeString& +DateTimePatternGenerator::getAppendItemFormat(UDateTimePatternField field) const { + return appendItemFormats[field]; +} + +void +DateTimePatternGenerator::setAppendItemName(UDateTimePatternField field, const UnicodeString& value) { + setFieldDisplayName(field, UDATPG_WIDTH_APPENDITEM, value); +} + +const UnicodeString& +DateTimePatternGenerator::getAppendItemName(UDateTimePatternField field) const { + return fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM]; +} + +void +DateTimePatternGenerator::setFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width, const UnicodeString& value) { + fieldDisplayNames[field][width] = value; + // NUL-terminate for the C API. + fieldDisplayNames[field][width].getTerminatedBuffer(); +} + +UnicodeString +DateTimePatternGenerator::getFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) const { + return fieldDisplayNames[field][width]; +} + +UnicodeString& +DateTimePatternGenerator::getMutableFieldDisplayName(UDateTimePatternField field, UDateTimePGDisplayWidth width) { + return fieldDisplayNames[field][width]; +} + +void +DateTimePatternGenerator::getAppendName(UDateTimePatternField field, UnicodeString& value) { + value = SINGLE_QUOTE; + value += fieldDisplayNames[field][UDATPG_WIDTH_APPENDITEM]; + value += SINGLE_QUOTE; +} + +UnicodeString +DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UErrorCode& status) { + return getBestPattern(patternForm, UDATPG_MATCH_NO_OPTIONS, status); +} + +UnicodeString +DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDateTimePatternMatchOptions options, UErrorCode& status) { + if (U_FAILURE(status)) { + return UnicodeString(); + } + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return UnicodeString(); + } + const UnicodeString *bestPattern = nullptr; + UnicodeString dtFormat; + UnicodeString resultPattern; + int32_t flags = kDTPGNoFlags; + + int32_t dateMask=(1<set(patternFormMapped, fp); + const PtnSkeleton* specifiedSkeleton = nullptr; + bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, status, &specifiedSkeleton); + if (U_FAILURE(status)) { + return UnicodeString(); + } + + if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) { + resultPattern = adjustFieldTypes(*bestPattern, specifiedSkeleton, flags, options); + + return resultPattern; + } + int32_t neededFields = dtMatcher->getFieldMask(); + UnicodeString datePattern=getBestAppending(neededFields & dateMask, flags, status, options); + UnicodeString timePattern=getBestAppending(neededFields & timeMask, flags, status, options); + if (U_FAILURE(status)) { + return UnicodeString(); + } + if (datePattern.length()==0) { + if (timePattern.length()==0) { + resultPattern.remove(); + } + else { + return timePattern; + } + } + if (timePattern.length()==0) { + return datePattern; + } + resultPattern.remove(); + status = U_ZERO_ERROR; + dtFormat=getDateTimeFormat(); + SimpleFormatter(dtFormat, 2, 2, status).format(timePattern, datePattern, resultPattern, status); + return resultPattern; +} + +/* + * Map a skeleton that may have metacharacters jJC to one without, by replacing + * the metacharacters with locale-appropriate fields of h/H/k/K and of a/b/B + * (depends on fDefaultHourFormatChar and fAllowedHourFormats being set, which in + * turn depends on initData having been run). This method also updates the flags + * as necessary. Returns the updated skeleton. + */ +UnicodeString +DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status) { + UnicodeString patternFormMapped; + patternFormMapped.remove(); + UBool inQuoted = FALSE; + int32_t patPos, patLen = patternForm.length(); + for (patPos = 0; patPos < patLen; patPos++) { + UChar patChr = patternForm.charAt(patPos); + if (patChr == SINGLE_QUOTE) { + inQuoted = !inQuoted; + } else if (!inQuoted) { + // Handle special mappings for 'j' and 'C' in which fields lengths + // 1,3,5 => hour field length 1 + // 2,4,6 => hour field length 2 + // 1,2 => abbreviated dayPeriod (field length 1..3) + // 3,4 => long dayPeriod (field length 4) + // 5,6 => narrow dayPeriod (field length 5) + if (patChr == LOW_J || patChr == CAP_C) { + int32_t extraLen = 0; // 1 less than total field length + while (patPos+1 < patLen && patternForm.charAt(patPos+1)==patChr) { + extraLen++; + patPos++; + } + int32_t hourLen = 1 + (extraLen & 1); + int32_t dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1); + UChar hourChar = LOW_H; + UChar dayPeriodChar = LOW_A; + if (patChr == LOW_J) { + hourChar = fDefaultHourFormatChar; + } else { + AllowedHourFormat bestAllowed; + if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { + bestAllowed = (AllowedHourFormat)fAllowedHourFormats[0]; + } else { + status = U_INVALID_FORMAT_ERROR; + return UnicodeString(); + } + if (bestAllowed == ALLOWED_HOUR_FORMAT_H || bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_Hb) { + hourChar = CAP_H; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_K || bestAllowed == ALLOWED_HOUR_FORMAT_KB || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { + hourChar = CAP_K; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_k) { + hourChar = LOW_K; + } + // in #13183 just add b/B to skeleton, no longer need to set special flags + if (bestAllowed == ALLOWED_HOUR_FORMAT_HB || bestAllowed == ALLOWED_HOUR_FORMAT_hB || bestAllowed == ALLOWED_HOUR_FORMAT_KB) { + dayPeriodChar = CAP_B; + } else if (bestAllowed == ALLOWED_HOUR_FORMAT_Hb || bestAllowed == ALLOWED_HOUR_FORMAT_hb || bestAllowed == ALLOWED_HOUR_FORMAT_Kb) { + dayPeriodChar = LOW_B; + } + } + if (hourChar==CAP_H || hourChar==LOW_K) { + dayPeriodLen = 0; + } + while (dayPeriodLen-- > 0) { + patternFormMapped.append(dayPeriodChar); + } + while (hourLen-- > 0) { + patternFormMapped.append(hourChar); + } + } else if (patChr == CAP_J) { + // Get pattern for skeleton with H, then replace H or k + // with fDefaultHourFormatChar (if different) + patternFormMapped.append(CAP_H); + *flags |= kDTPGSkeletonUsesCapJ; + } else { + patternFormMapped.append(patChr); + } + } + } + return patternFormMapped; +} + +UnicodeString +DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, + const UnicodeString& skeleton, + UErrorCode& status) { + return replaceFieldTypes(pattern, skeleton, UDATPG_MATCH_NO_OPTIONS, status); +} + +UnicodeString +DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, + const UnicodeString& skeleton, + UDateTimePatternMatchOptions options, + UErrorCode& status) { + if (U_FAILURE(status)) { + return UnicodeString(); + } + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return UnicodeString(); + } + dtMatcher->set(skeleton, fp); + UnicodeString result = adjustFieldTypes(pattern, nullptr, kDTPGNoFlags, options); + return result; +} + +void +DateTimePatternGenerator::setDecimal(const UnicodeString& newDecimal) { + this->decimal = newDecimal; + // NUL-terminate for the C API. + this->decimal.getTerminatedBuffer(); +} + +const UnicodeString& +DateTimePatternGenerator::getDecimal() const { + return decimal; +} + +void +DateTimePatternGenerator::addCanonicalItems(UErrorCode& status) { + if (U_FAILURE(status)) { return; } + UnicodeString conflictingPattern; + + for (int32_t i=0; i 0) { + addPattern(UnicodeString(Canonical_Items[i]), FALSE, conflictingPattern, status); + } + if (U_FAILURE(status)) { return; } + } +} + +void +DateTimePatternGenerator::setDateTimeFormat(const UnicodeString& dtFormat) { + dateTimeFormat = dtFormat; + // NUL-terminate for the C API. + dateTimeFormat.getTerminatedBuffer(); +} + +const UnicodeString& +DateTimePatternGenerator::getDateTimeFormat() const { + return dateTimeFormat; +} + +void +DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + + const UChar *resStr; + int32_t resStrLen = 0; + + LocalPointer fCalendar(Calendar::createInstance(locale, status), status); + if (U_FAILURE(status)) { return; } + + LocalUResourceBundlePointer calData(ures_open(nullptr, locale.getBaseName(), &status)); + if (U_FAILURE(status)) { return; } + ures_getByKey(calData.getAlias(), DT_DateTimeCalendarTag, calData.getAlias(), &status); + if (U_FAILURE(status)) { return; } + + LocalUResourceBundlePointer dateTimePatterns; + if (fCalendar->getType() != nullptr && *fCalendar->getType() != '\0' + && uprv_strcmp(fCalendar->getType(), DT_DateTimeGregorianTag) != 0) { + dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), fCalendar->getType(), + nullptr, &status)); + ures_getByKeyWithFallback(dateTimePatterns.getAlias(), DT_DateTimePatternsTag, + dateTimePatterns.getAlias(), &status); + } + + if (dateTimePatterns.isNull() || status == U_MISSING_RESOURCE_ERROR) { + status = U_ZERO_ERROR; + dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), DT_DateTimeGregorianTag, + dateTimePatterns.orphan(), &status)); + ures_getByKeyWithFallback(dateTimePatterns.getAlias(), DT_DateTimePatternsTag, + dateTimePatterns.getAlias(), &status); + } + if (U_FAILURE(status)) { return; } + + if (ures_getSize(dateTimePatterns.getAlias()) <= DateFormat::kDateTime) + { + status = U_INVALID_FORMAT_ERROR; + return; + } + resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), (int32_t)DateFormat::kDateTime, &resStrLen, &status); + setDateTimeFormat(UnicodeString(TRUE, resStr, resStrLen)); +} + +void +DateTimePatternGenerator::setDecimalSymbols(const Locale& locale, UErrorCode& status) { + DecimalFormatSymbols dfs = DecimalFormatSymbols(locale, status); + if(U_SUCCESS(status)) { + decimal = dfs.getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); + // NUL-terminate for the C API. + decimal.getTerminatedBuffer(); + } +} + +UDateTimePatternConflict +DateTimePatternGenerator::addPattern( + const UnicodeString& pattern, + UBool override, + UnicodeString &conflictingPattern, + UErrorCode& status) +{ + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return UDATPG_NO_CONFLICT; + } + + return addPatternWithSkeleton(pattern, nullptr, override, conflictingPattern, status); +} + +// For DateTimePatternGenerator::addPatternWithSkeleton - +// If skeletonToUse is specified, then an availableFormats entry is being added. In this case: +// 1. We pass that skeleton to matcher.set instead of having it derive a skeleton from the pattern. +// 2. If the new entry's skeleton or basePattern does match an existing entry but that entry also had a skeleton specified +// (i.e. it was also from availableFormats), then the new entry does not override it regardless of the value of the override +// parameter. This prevents later availableFormats entries from a parent locale overriding earlier ones from the actual +// specified locale. However, availableFormats entries *should* override entries with matching skeleton whose skeleton was +// derived (i.e. entries derived from the standard date/time patters for the specified locale). +// 3. When adding the pattern (patternMap->add), we set a new boolean to indicate that the added entry had a +// specified skeleton (which sets a new field in the PtnElem in the PatternMap). +UDateTimePatternConflict +DateTimePatternGenerator::addPatternWithSkeleton( + const UnicodeString& pattern, + const UnicodeString* skeletonToUse, + UBool override, + UnicodeString& conflictingPattern, + UErrorCode& status) +{ + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return UDATPG_NO_CONFLICT; + } + + UnicodeString basePattern; + PtnSkeleton skeleton; + UDateTimePatternConflict conflictingStatus = UDATPG_NO_CONFLICT; + + DateTimeMatcher matcher; + if ( skeletonToUse == nullptr ) { + matcher.set(pattern, fp, skeleton); + matcher.getBasePattern(basePattern); + } else { + matcher.set(*skeletonToUse, fp, skeleton); // no longer trims skeleton fields to max len 3, per #7930 + matcher.getBasePattern(basePattern); // or perhaps instead: basePattern = *skeletonToUse; + } + // We only care about base conflicts - and replacing the pattern associated with a base - if: + // 1. the conflicting previous base pattern did *not* have an explicit skeleton; in that case the previous + // base + pattern combination was derived from either (a) a canonical item, (b) a standard format, or + // (c) a pattern specified programmatically with a previous call to addPattern (which would only happen + // if we are getting here from a subsequent call to addPattern). + // 2. a skeleton is specified for the current pattern, but override=false; in that case we are checking + // availableFormats items from root, which should not override any previous entry with the same base. + UBool entryHadSpecifiedSkeleton; + const UnicodeString *duplicatePattern = patternMap->getPatternFromBasePattern(basePattern, entryHadSpecifiedSkeleton); + if (duplicatePattern != nullptr && (!entryHadSpecifiedSkeleton || (skeletonToUse != nullptr && !override))) { + conflictingStatus = UDATPG_BASE_CONFLICT; + conflictingPattern = *duplicatePattern; + if (!override) { + return conflictingStatus; + } + } + // The only time we get here with override=true and skeletonToUse!=null is when adding availableFormats + // items from CLDR data. In that case, we don't want an item from a parent locale to replace an item with + // same skeleton from the specified locale, so skip the current item if skeletonWasSpecified is true for + // the previously-specified conflicting item. + const PtnSkeleton* entrySpecifiedSkeleton = nullptr; + duplicatePattern = patternMap->getPatternFromSkeleton(skeleton, &entrySpecifiedSkeleton); + if (duplicatePattern != nullptr ) { + conflictingStatus = UDATPG_CONFLICT; + conflictingPattern = *duplicatePattern; + if (!override || (skeletonToUse != nullptr && entrySpecifiedSkeleton != nullptr)) { + return conflictingStatus; + } + } + patternMap->add(basePattern, skeleton, pattern, skeletonToUse != nullptr, status); + if(U_FAILURE(status)) { + return conflictingStatus; + } + + return UDATPG_NO_CONFLICT; +} + + +UDateTimePatternField +DateTimePatternGenerator::getAppendFormatNumber(const char* field) const { + for (int32_t i=0; i0; --i) { + if (uprv_strcmp(CLDR_FIELD_WIDTH[i], hyphenPtr)==0) { + *widthP=(UDateTimePGDisplayWidth)i; + break; + } + } + *hyphenPtr = 0; // now delete width portion of key + } + for (int32_t i=0; igetPatternFromSkeleton(*trial.getSkeletonPtr(), &specifiedSkeleton); + missingFields->setTo(tempInfo); + if (distance==0) { + break; + } + } + } + + // If the best raw match had a specified skeleton and that skeleton was requested by the caller, + // then return it too. This generally happens when the caller needs to pass that skeleton + // through to adjustFieldTypes so the latter can do a better job. + if (bestPattern && specifiedSkeletonPtr) { + *specifiedSkeletonPtr = specifiedSkeleton; + } + return bestPattern; +} + +UnicodeString +DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, + const PtnSkeleton* specifiedSkeleton, + int32_t flags, + UDateTimePatternMatchOptions options) { + UnicodeString newPattern; + fp->set(pattern); + for (int32_t i=0; i < fp->itemNumber; i++) { + UnicodeString field = fp->items[i]; + if ( fp->isQuoteLiteral(field) ) { + + UnicodeString quoteLiteral; + fp->getQuoteLiteral(quoteLiteral, &i); + newPattern += quoteLiteral; + } + else { + if (fp->isPatternSeparator(field)) { + newPattern+=field; + continue; + } + int32_t canonicalIndex = fp->getCanonicalIndex(field); + if (canonicalIndex < 0) { + newPattern+=field; + continue; // don't adjust + } + const dtTypeElem *row = &dtTypes[canonicalIndex]; + int32_t typeValue = row->field; + + // handle day periods - with #13183, no longer need special handling here, integrated with normal types + + if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) { + field += decimal; + dtMatcher->skeleton.original.appendFieldTo(UDATPG_FRACTIONAL_SECOND_FIELD, field); + } else if (dtMatcher->skeleton.type[typeValue]!=0) { + // Here: + // - "reqField" is the field from the originally requested skeleton, with length + // "reqFieldLen". + // - "field" is the field from the found pattern. + // + // The adjusted field should consist of characters from the originally requested + // skeleton, except in the case of UDATPG_HOUR_FIELD or UDATPG_MONTH_FIELD or + // UDATPG_WEEKDAY_FIELD or UDATPG_YEAR_FIELD, in which case it should consist + // of characters from the found pattern. + // + // The length of the adjusted field (adjFieldLen) should match that in the originally + // requested skeleton, except that in the following cases the length of the adjusted field + // should match that in the found pattern (i.e. the length of this pattern field should + // not be adjusted): + // 1. typeValue is UDATPG_HOUR_FIELD/MINUTE/SECOND and the corresponding bit in options is + // not set (ticket #7180). Note, we may want to implement a similar change for other + // numeric fields (MM, dd, etc.) so the default behavior is to get locale preference for + // field length, but options bits can be used to override this. + // 2. There is a specified skeleton for the found pattern and one of the following is true: + // a) The length of the field in the skeleton (skelFieldLen) is equal to reqFieldLen. + // b) The pattern field is numeric and the skeleton field is not, or vice versa. + + UChar reqFieldChar = dtMatcher->skeleton.original.getFieldChar(typeValue); + int32_t reqFieldLen = dtMatcher->skeleton.original.getFieldLength(typeValue); + if (reqFieldChar == CAP_E && reqFieldLen < 3) + reqFieldLen = 3; // 1-3 for E are equivalent to 3 for c,e + int32_t adjFieldLen = reqFieldLen; + if ( (typeValue==UDATPG_HOUR_FIELD && (options & UDATPG_MATCH_HOUR_FIELD_LENGTH)==0) || + (typeValue==UDATPG_MINUTE_FIELD && (options & UDATPG_MATCH_MINUTE_FIELD_LENGTH)==0) || + (typeValue==UDATPG_SECOND_FIELD && (options & UDATPG_MATCH_SECOND_FIELD_LENGTH)==0) ) { + adjFieldLen = field.length(); + } else if (specifiedSkeleton) { + int32_t skelFieldLen = specifiedSkeleton->original.getFieldLength(typeValue); + UBool patFieldIsNumeric = (row->type > 0); + UBool skelFieldIsNumeric = (specifiedSkeleton->type[typeValue] > 0); + if (skelFieldLen == reqFieldLen || (patFieldIsNumeric && !skelFieldIsNumeric) || (skelFieldIsNumeric && !patFieldIsNumeric)) { + // don't adjust the field length in the found pattern + adjFieldLen = field.length(); + } + } + UChar c = (typeValue!= UDATPG_HOUR_FIELD + && typeValue!= UDATPG_MONTH_FIELD + && typeValue!= UDATPG_WEEKDAY_FIELD + && (typeValue!= UDATPG_YEAR_FIELD || reqFieldChar==CAP_Y)) + ? reqFieldChar + : field.charAt(0); + if (typeValue == UDATPG_HOUR_FIELD && (flags & kDTPGSkeletonUsesCapJ) != 0) { + c = fDefaultHourFormatChar; + } + field.remove(); + for (int32_t j=adjFieldLen; j>0; --j) { + field += c; + } + } + newPattern+=field; + } + } + return newPattern; +} + +UnicodeString +DateTimePatternGenerator::getBestAppending(int32_t missingFields, int32_t flags, UErrorCode &status, UDateTimePatternMatchOptions options) { + if (U_FAILURE(status)) { + return UnicodeString(); + } + UnicodeString resultPattern, tempPattern; + const UnicodeString* tempPatternPtr; + int32_t lastMissingFieldMask=0; + if (missingFields!=0) { + resultPattern=UnicodeString(); + const PtnSkeleton* specifiedSkeleton=nullptr; + tempPatternPtr = getBestRaw(*dtMatcher, missingFields, distanceInfo, status, &specifiedSkeleton); + if (U_FAILURE(status)) { + return UnicodeString(); + } + tempPattern = *tempPatternPtr; + resultPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); + if ( distanceInfo->missingFieldMask==0 ) { + return resultPattern; + } + while (distanceInfo->missingFieldMask!=0) { // precondition: EVERY single field must work! + if ( lastMissingFieldMask == distanceInfo->missingFieldMask ) { + break; // cannot find the proper missing field + } + if (((distanceInfo->missingFieldMask & UDATPG_SECOND_AND_FRACTIONAL_MASK)==UDATPG_FRACTIONAL_MASK) && + ((missingFields & UDATPG_SECOND_AND_FRACTIONAL_MASK) == UDATPG_SECOND_AND_FRACTIONAL_MASK)) { + resultPattern = adjustFieldTypes(resultPattern, specifiedSkeleton, flags | kDTPGFixFractionalSeconds, options); + distanceInfo->missingFieldMask &= ~UDATPG_FRACTIONAL_MASK; + continue; + } + int32_t startingMask = distanceInfo->missingFieldMask; + tempPatternPtr = getBestRaw(*dtMatcher, distanceInfo->missingFieldMask, distanceInfo, status, &specifiedSkeleton); + if (U_FAILURE(status)) { + return UnicodeString(); + } + tempPattern = *tempPatternPtr; + tempPattern = adjustFieldTypes(tempPattern, specifiedSkeleton, flags, options); + int32_t foundMask=startingMask& ~distanceInfo->missingFieldMask; + int32_t topField=getTopBitNumber(foundMask); + + if (appendItemFormats[topField].length() != 0) { + UnicodeString appendName; + getAppendName((UDateTimePatternField)topField, appendName); + const UnicodeString *values[3] = { + &resultPattern, + &tempPattern, + &appendName + }; + SimpleFormatter(appendItemFormats[topField], 2, 3, status). + formatAndReplace(values, 3, resultPattern, nullptr, 0, status); + } + lastMissingFieldMask = distanceInfo->missingFieldMask; + } + } + return resultPattern; +} + +int32_t +DateTimePatternGenerator::getTopBitNumber(int32_t foundMask) const { + if ( foundMask==0 ) { + return 0; + } + int32_t i=0; + while (foundMask!=0) { + foundMask >>=1; + ++i; + } + if (i-1 >UDATPG_ZONE_FIELD) { + return UDATPG_ZONE_FIELD; + } + else + return i-1; +} + +void +DateTimePatternGenerator::setAvailableFormat(const UnicodeString &key, UErrorCode& err) +{ + fAvailableFormatKeyHash->puti(key, 1, err); +} + +UBool +DateTimePatternGenerator::isAvailableFormatSet(const UnicodeString &key) const { + return (UBool)(fAvailableFormatKeyHash->geti(key) == 1); +} + +void +DateTimePatternGenerator::copyHashtable(Hashtable *other, UErrorCode &status) { + if (other == nullptr || U_FAILURE(status)) { + return; + } + if (fAvailableFormatKeyHash != nullptr) { + delete fAvailableFormatKeyHash; + fAvailableFormatKeyHash = nullptr; + } + initHashtable(status); + if(U_FAILURE(status)){ + return; + } + int32_t pos = UHASH_FIRST; + const UHashElement* elem = nullptr; + // walk through the hash table and create a deep clone + while((elem = other->nextElement(pos))!= nullptr){ + const UHashTok otherKeyTok = elem->key; + UnicodeString* otherKey = (UnicodeString*)otherKeyTok.pointer; + fAvailableFormatKeyHash->puti(*otherKey, 1, status); + if(U_FAILURE(status)){ + return; + } + } +} + +StringEnumeration* +DateTimePatternGenerator::getSkeletons(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return nullptr; + } + LocalPointer skeletonEnumerator( + new DTSkeletonEnumeration(*patternMap, DT_SKELETON, status), status); + + return U_SUCCESS(status) ? skeletonEnumerator.orphan() : nullptr; +} + +const UnicodeString& +DateTimePatternGenerator::getPatternForSkeleton(const UnicodeString& skeleton) const { + PtnElem *curElem; + + if (skeleton.length() ==0) { + return emptyString; + } + curElem = patternMap->getHeader(skeleton.charAt(0)); + while ( curElem != nullptr ) { + if ( curElem->skeleton->getSkeleton()==skeleton ) { + return curElem->pattern; + } + curElem = curElem->next.getAlias(); + } + return emptyString; +} + +StringEnumeration* +DateTimePatternGenerator::getBaseSkeletons(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return nullptr; + } + LocalPointer baseSkeletonEnumerator( + new DTSkeletonEnumeration(*patternMap, DT_BASESKELETON, status), status); + + return U_SUCCESS(status) ? baseSkeletonEnumerator.orphan() : nullptr; +} + +StringEnumeration* +DateTimePatternGenerator::getRedundants(UErrorCode& status) { + if (U_FAILURE(status)) { return nullptr; } + if (U_FAILURE(internalErrorCode)) { + status = internalErrorCode; + return nullptr; + } + LocalPointer output(new DTRedundantEnumeration(), status); + if (U_FAILURE(status)) { return nullptr; } + const UnicodeString *pattern; + PatternMapIterator it(status); + if (U_FAILURE(status)) { return nullptr; } + + for (it.set(*patternMap); it.hasNext(); ) { + DateTimeMatcher current = it.next(); + pattern = patternMap->getPatternFromSkeleton(*(it.getSkeleton())); + if ( isCanonicalItem(*pattern) ) { + continue; + } + if ( skipMatcher == nullptr ) { + skipMatcher = new DateTimeMatcher(current); + if (skipMatcher == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + } + else { + *skipMatcher = current; + } + UnicodeString trial = getBestPattern(current.getPattern(), status); + if (U_FAILURE(status)) { return nullptr; } + if (trial == *pattern) { + ((DTRedundantEnumeration *)output.getAlias())->add(*pattern, status); + if (U_FAILURE(status)) { return nullptr; } + } + if (current.equals(skipMatcher)) { + continue; + } + } + return output.orphan(); +} + +UBool +DateTimePatternGenerator::isCanonicalItem(const UnicodeString& item) const { + if ( item.length() != 1 ) { + return FALSE; + } + for (int32_t i=0; iisDupAllowed = other.isDupAllowed; + for (int32_t bootIndex = 0; bootIndex < MAX_PATTERN_ENTRIES; ++bootIndex) { + PtnElem *curElem, *otherElem, *prevElem=nullptr; + otherElem = other.boot[bootIndex]; + while (otherElem != nullptr) { + LocalPointer newElem(new PtnElem(otherElem->basePattern, otherElem->pattern), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeleton.adoptInsteadAndCheckErrorCode(new PtnSkeleton(*(otherElem->skeleton)), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeletonWasSpecified = otherElem->skeletonWasSpecified; + + // Release ownership from the LocalPointer of the PtnElem object. + // The PtnElem will now be owned by either the boot (for the first entry in the linked-list) + // or owned by the previous PtnElem object in the linked-list. + curElem = newElem.orphan(); + + if (this->boot[bootIndex] == nullptr) { + this->boot[bootIndex] = curElem; + } else { + if (prevElem != nullptr) { + prevElem->next.adoptInstead(curElem); + } else { + UPRV_UNREACHABLE; + } + } + prevElem = curElem; + otherElem = otherElem->next.getAlias(); + } + + } +} + +PtnElem* +PatternMap::getHeader(UChar baseChar) const { + PtnElem* curElem; + + if ( (baseChar >= CAP_A) && (baseChar <= CAP_Z) ) { + curElem = boot[baseChar-CAP_A]; + } + else { + if ( (baseChar >=LOW_A) && (baseChar <= LOW_Z) ) { + curElem = boot[26+baseChar-LOW_A]; + } + else { + return nullptr; + } + } + return curElem; +} + +PatternMap::~PatternMap() { + for (int32_t i=0; i < MAX_PATTERN_ENTRIES; ++i ) { + if (boot[i] != nullptr ) { + delete boot[i]; + boot[i] = nullptr; + } + } +} // PatternMap destructor + +void +PatternMap::add(const UnicodeString& basePattern, + const PtnSkeleton& skeleton, + const UnicodeString& value,// mapped pattern value + UBool skeletonWasSpecified, + UErrorCode &status) { + UChar baseChar = basePattern.charAt(0); + PtnElem *curElem, *baseElem; + status = U_ZERO_ERROR; + + // the baseChar must be A-Z or a-z + if ((baseChar >= CAP_A) && (baseChar <= CAP_Z)) { + baseElem = boot[baseChar-CAP_A]; + } + else { + if ((baseChar >=LOW_A) && (baseChar <= LOW_Z)) { + baseElem = boot[26+baseChar-LOW_A]; + } + else { + status = U_ILLEGAL_CHARACTER; + return; + } + } + + if (baseElem == nullptr) { + LocalPointer newElem(new PtnElem(basePattern, value), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeleton.adoptInsteadAndCheckErrorCode(new PtnSkeleton(skeleton), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeletonWasSpecified = skeletonWasSpecified; + if (baseChar >= LOW_A) { + boot[26 + (baseChar - LOW_A)] = newElem.orphan(); // the boot array now owns the PtnElem. + } + else { + boot[baseChar - CAP_A] = newElem.orphan(); // the boot array now owns the PtnElem. + } + } + if ( baseElem != nullptr ) { + curElem = getDuplicateElem(basePattern, skeleton, baseElem); + + if (curElem == nullptr) { + // add new element to the list. + curElem = baseElem; + while( curElem -> next != nullptr ) + { + curElem = curElem->next.getAlias(); + } + + LocalPointer newElem(new PtnElem(basePattern, value), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeleton.adoptInsteadAndCheckErrorCode(new PtnSkeleton(skeleton), status); + if (U_FAILURE(status)) { + return; // out of memory + } + newElem->skeletonWasSpecified = skeletonWasSpecified; + curElem->next.adoptInstead(newElem.orphan()); + curElem = curElem->next.getAlias(); + } + else { + // Pattern exists in the list already. + if ( !isDupAllowed ) { + return; + } + // Overwrite the value. + curElem->pattern = value; + // It was a bug that we were not doing the following previously, + // though that bug hid other problems by making things partly work. + curElem->skeletonWasSpecified = skeletonWasSpecified; + } + } +} // PatternMap::add + +// Find the pattern from the given basePattern string. +const UnicodeString * +PatternMap::getPatternFromBasePattern(const UnicodeString& basePattern, UBool& skeletonWasSpecified) const { // key to search for + PtnElem *curElem; + + if ((curElem=getHeader(basePattern.charAt(0)))==nullptr) { + return nullptr; // no match + } + + do { + if ( basePattern.compare(curElem->basePattern)==0 ) { + skeletonWasSpecified = curElem->skeletonWasSpecified; + return &(curElem->pattern); + } + curElem = curElem->next.getAlias(); + } while (curElem != nullptr); + + return nullptr; +} // PatternMap::getFromBasePattern + + +// Find the pattern from the given skeleton. +// At least when this is called from getBestRaw & addPattern (in which case specifiedSkeletonPtr is non-NULL), +// the comparison should be based on skeleton.original (which is unique and tied to the distance measurement in bestRaw) +// and not skeleton.baseOriginal (which is not unique); otherwise we may pick a different skeleton than the one with the +// optimum distance value in getBestRaw. When this is called from public getRedundants (specifiedSkeletonPtr is NULL), +// for now it will continue to compare based on baseOriginal so as not to change the behavior unnecessarily. +const UnicodeString * +PatternMap::getPatternFromSkeleton(const PtnSkeleton& skeleton, const PtnSkeleton** specifiedSkeletonPtr) const { // key to search for + PtnElem *curElem; + + if (specifiedSkeletonPtr) { + *specifiedSkeletonPtr = nullptr; + } + + // find boot entry + UChar baseChar = skeleton.getFirstChar(); + if ((curElem=getHeader(baseChar))==nullptr) { + return nullptr; // no match + } + + do { + UBool equal; + if (specifiedSkeletonPtr != nullptr) { // called from DateTimePatternGenerator::getBestRaw or addPattern, use original + equal = curElem->skeleton->original == skeleton.original; + } else { // called from DateTimePatternGenerator::getRedundants, use baseOriginal + equal = curElem->skeleton->baseOriginal == skeleton.baseOriginal; + } + if (equal) { + if (specifiedSkeletonPtr && curElem->skeletonWasSpecified) { + *specifiedSkeletonPtr = curElem->skeleton.getAlias(); + } + return &(curElem->pattern); + } + curElem = curElem->next.getAlias(); + } while (curElem != nullptr); + + return nullptr; +} + +UBool +PatternMap::equals(const PatternMap& other) const { + if ( this==&other ) { + return TRUE; + } + for (int32_t bootIndex = 0; bootIndex < MAX_PATTERN_ENTRIES; ++bootIndex) { + if (boot[bootIndex] == other.boot[bootIndex]) { + continue; + } + if ((boot[bootIndex] == nullptr) || (other.boot[bootIndex] == nullptr)) { + return FALSE; + } + PtnElem *otherElem = other.boot[bootIndex]; + PtnElem *myElem = boot[bootIndex]; + while ((otherElem != nullptr) || (myElem != nullptr)) { + if ( myElem == otherElem ) { + break; + } + if ((otherElem == nullptr) || (myElem == nullptr)) { + return FALSE; + } + if ( (myElem->basePattern != otherElem->basePattern) || + (myElem->pattern != otherElem->pattern) ) { + return FALSE; + } + if ((myElem->skeleton.getAlias() != otherElem->skeleton.getAlias()) && + !myElem->skeleton->equals(*(otherElem->skeleton))) { + return FALSE; + } + myElem = myElem->next.getAlias(); + otherElem = otherElem->next.getAlias(); + } + } + return TRUE; +} + +// find any key existing in the mapping table already. +// return TRUE if there is an existing key, otherwise return FALSE. +PtnElem* +PatternMap::getDuplicateElem( + const UnicodeString &basePattern, + const PtnSkeleton &skeleton, + PtnElem *baseElem) { + PtnElem *curElem; + + if ( baseElem == nullptr ) { + return nullptr; + } + else { + curElem = baseElem; + } + do { + if ( basePattern.compare(curElem->basePattern)==0 ) { + UBool isEqual = TRUE; + for (int32_t i = 0; i < UDATPG_FIELD_COUNT; ++i) { + if (curElem->skeleton->type[i] != skeleton.type[i] ) { + isEqual = FALSE; + break; + } + } + if (isEqual) { + return curElem; + } + } + curElem = curElem->next.getAlias(); + } while( curElem != nullptr ); + + // end of the list + return nullptr; + +} // PatternMap::getDuplicateElem + +DateTimeMatcher::DateTimeMatcher(void) { +} + +DateTimeMatcher::~DateTimeMatcher() {} + +DateTimeMatcher::DateTimeMatcher(const DateTimeMatcher& other) { + copyFrom(other.skeleton); +} + + +void +DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp) { + PtnSkeleton localSkeleton; + return set(pattern, fp, localSkeleton); +} + +void +DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton& skeletonResult) { + int32_t i; + for (i=0; iset(pattern); + for (i=0; i < fp->itemNumber; i++) { + const UnicodeString& value = fp->items[i]; + // don't skip 'a' anymore, dayPeriod handled specially below + + if ( fp->isQuoteLiteral(value) ) { + UnicodeString quoteLiteral; + fp->getQuoteLiteral(quoteLiteral, &i); + continue; + } + int32_t canonicalIndex = fp->getCanonicalIndex(value); + if (canonicalIndex < 0) { + continue; + } + const dtTypeElem *row = &dtTypes[canonicalIndex]; + int32_t field = row->field; + skeletonResult.original.populate(field, value); + UChar repeatChar = row->patternChar; + int32_t repeatCount = row->minLen; + skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount); + int16_t subField = row->type; + if (row->type > 0) { + U_ASSERT(value.length() < INT16_MAX); + subField += static_cast(value.length()); + } + skeletonResult.type[field] = subField; + } + // #13183, handle special behavior for day period characters (a, b, B) + if (!skeletonResult.original.isFieldEmpty(UDATPG_HOUR_FIELD)) { + if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) { + // We have a skeleton with 12-hour-cycle format + if (skeletonResult.original.isFieldEmpty(UDATPG_DAYPERIOD_FIELD)) { + // But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a") + for (i = 0; dtTypes[i].patternChar != 0; i++) { + if ( dtTypes[i].field == UDATPG_DAYPERIOD_FIELD ) { + // first entry for UDATPG_DAYPERIOD_FIELD + skeletonResult.original.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.baseOriginal.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = dtTypes[i].type; + skeletonResult.addedDefaultDayPeriod = TRUE; + break; + } + } + } + } else { + // Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it) + skeletonResult.original.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.baseOriginal.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = NONE; + } + } + copyFrom(skeletonResult); +} + +void +DateTimeMatcher::getBasePattern(UnicodeString &result ) { + result.remove(); // Reset the result first. + skeleton.baseOriginal.appendTo(result); +} + +UnicodeString +DateTimeMatcher::getPattern() { + UnicodeString result; + return skeleton.original.appendTo(result); +} + +int32_t +DateTimeMatcher::getDistance(const DateTimeMatcher& other, int32_t includeMask, DistanceInfo& distanceInfo) const { + int32_t result = 0; + distanceInfo.clear(); + for (int32_t i=0; iskeleton.original; +} + +int32_t +DateTimeMatcher::getFieldMask() const { + int32_t result = 0; + + for (int32_t i=0; i= pattern.length()) { + return DONE; + } + // check the current char is between A-Z or a-z + do { + UChar c=pattern.charAt(curLoc); + if ( (c>=CAP_A && c<=CAP_Z) || (c>=LOW_A && c<=LOW_Z) ) { + curLoc++; + } + else { + startPos = curLoc; + *len=1; + return ADD_TOKEN; + } + + if ( pattern.charAt(curLoc)!= pattern.charAt(startPos) ) { + break; // not the same token + } + } while(curLoc <= pattern.length()); + *len = curLoc-startPos; + return ADD_TOKEN; +} + +void +FormatParser::set(const UnicodeString& pattern) { + int32_t startPos = 0; + TokenStatus result = START; + int32_t len = 0; + itemNumber = 0; + + do { + result = setTokens( pattern, startPos, &len ); + if ( result == ADD_TOKEN ) + { + items[itemNumber++] = UnicodeString(pattern, startPos, len ); + startPos += len; + } + else { + break; + } + } while (result==ADD_TOKEN && itemNumber < MAX_DT_TOKEN); +} + +int32_t +FormatParser::getCanonicalIndex(const UnicodeString& s, UBool strict) { + int32_t len = s.length(); + if (len == 0) { + return -1; + } + UChar ch = s.charAt(0); + + // Verify that all are the same character. + for (int32_t l = 1; l < len; l++) { + if (ch != s.charAt(l)) { + return -1; + } + } + int32_t i = 0; + int32_t bestRow = -1; + while (dtTypes[i].patternChar != 0x0000) { + if ( dtTypes[i].patternChar != ch ) { + ++i; + continue; + } + bestRow = i; + if (dtTypes[i].patternChar != dtTypes[i+1].patternChar) { + return i; + } + if (dtTypes[i+1].minLen <= len) { + ++i; + continue; + } + return i; + } + return strict ? -1 : bestRow; +} + +UBool +FormatParser::isQuoteLiteral(const UnicodeString& s) { + return (UBool)(s.charAt(0) == SINGLE_QUOTE); +} + +// This function assumes the current itemIndex points to the quote literal. +// Please call isQuoteLiteral prior to this function. +void +FormatParser::getQuoteLiteral(UnicodeString& quote, int32_t *itemIndex) { + int32_t i = *itemIndex; + + quote.remove(); + if (items[i].charAt(0)==SINGLE_QUOTE) { + quote += items[i]; + ++i; + } + while ( i < itemNumber ) { + if ( items[i].charAt(0)==SINGLE_QUOTE ) { + if ( (i+1patternMap=&newPatternMap; +} + +PtnSkeleton* +PatternMapIterator::getSkeleton() const { + if ( nodePtr == nullptr ) { + return nullptr; + } + else { + return nodePtr->skeleton.getAlias(); + } +} + +UBool +PatternMapIterator::hasNext() const { + int32_t headIndex = bootIndex; + PtnElem *curPtr = nodePtr; + + if (patternMap==nullptr) { + return FALSE; + } + while ( headIndex < MAX_PATTERN_ENTRIES ) { + if ( curPtr != nullptr ) { + if ( curPtr->next != nullptr ) { + return TRUE; + } + else { + headIndex++; + curPtr=nullptr; + continue; + } + } + else { + if ( patternMap->boot[headIndex] != nullptr ) { + return TRUE; + } + else { + headIndex++; + continue; + } + } + } + return FALSE; +} + +DateTimeMatcher& +PatternMapIterator::next() { + while ( bootIndex < MAX_PATTERN_ENTRIES ) { + if ( nodePtr != nullptr ) { + if ( nodePtr->next != nullptr ) { + nodePtr = nodePtr->next.getAlias(); + break; + } + else { + bootIndex++; + nodePtr=nullptr; + continue; + } + } + else { + if ( patternMap->boot[bootIndex] != nullptr ) { + nodePtr = patternMap->boot[bootIndex]; + break; + } + else { + bootIndex++; + continue; + } + } + } + if (nodePtr!=nullptr) { + matcher->copyFrom(*nodePtr->skeleton); + } + else { + matcher->copyFrom(); + } + return *matcher; +} + + +SkeletonFields::SkeletonFields() { + // Set initial values to zero + clear(); +} + +void SkeletonFields::clear() { + uprv_memset(chars, 0, sizeof(chars)); + uprv_memset(lengths, 0, sizeof(lengths)); +} + +void SkeletonFields::copyFrom(const SkeletonFields& other) { + uprv_memcpy(chars, other.chars, sizeof(chars)); + uprv_memcpy(lengths, other.lengths, sizeof(lengths)); +} + +void SkeletonFields::clearField(int32_t field) { + chars[field] = 0; + lengths[field] = 0; +} + +UChar SkeletonFields::getFieldChar(int32_t field) const { + return chars[field]; +} + +int32_t SkeletonFields::getFieldLength(int32_t field) const { + return lengths[field]; +} + +void SkeletonFields::populate(int32_t field, const UnicodeString& value) { + populate(field, value.charAt(0), value.length()); +} + +void SkeletonFields::populate(int32_t field, UChar ch, int32_t length) { + chars[field] = (int8_t) ch; + lengths[field] = (int8_t) length; +} + +UBool SkeletonFields::isFieldEmpty(int32_t field) const { + return lengths[field] == 0; +} + +UnicodeString& SkeletonFields::appendTo(UnicodeString& string) const { + for (int32_t i = 0; i < UDATPG_FIELD_COUNT; ++i) { + appendFieldTo(i, string); + } + return string; +} + +UnicodeString& SkeletonFields::appendFieldTo(int32_t field, UnicodeString& string) const { + UChar ch(chars[field]); + int32_t length = (int32_t) lengths[field]; + + for (int32_t i=0; i= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; +} + +UnicodeString +PtnSkeleton::getBaseSkeleton() const { + UnicodeString result; + result = baseOriginal.appendTo(result); + int32_t pos; + if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; +} + +UChar +PtnSkeleton::getFirstChar() const { + return baseOriginal.getFirstChar(); +} + +PtnSkeleton::~PtnSkeleton() { +} + +PtnElem::PtnElem(const UnicodeString &basePat, const UnicodeString &pat) : + basePattern(basePat), skeleton(nullptr), pattern(pat), next(nullptr) +{ +} + +PtnElem::~PtnElem() { +} + +DTSkeletonEnumeration::DTSkeletonEnumeration(PatternMap& patternMap, dtStrEnum type, UErrorCode& status) : fSkeletons(nullptr) { + PtnElem *curElem; + PtnSkeleton *curSkeleton; + UnicodeString s; + int32_t bootIndex; + + pos=0; + fSkeletons.adoptInsteadAndCheckErrorCode(new UVector(status), status); + if (U_FAILURE(status)) { + return; + } + + for (bootIndex=0; bootIndexbasePattern; + break; + case DT_PATTERN: + s=curElem->pattern; + break; + case DT_SKELETON: + curSkeleton=curElem->skeleton.getAlias(); + s=curSkeleton->getSkeleton(); + break; + } + if ( !isCanonicalItem(s) ) { + LocalPointer newElem(new UnicodeString(s), status); + if (U_FAILURE(status)) { + return; + } + fSkeletons->addElement(newElem.getAlias(), status); + if (U_FAILURE(status)) { + fSkeletons.adoptInstead(nullptr); + return; + } + newElem.orphan(); // fSkeletons vector now owns the UnicodeString. + } + curElem = curElem->next.getAlias(); + } + } + if ((bootIndex==MAX_PATTERN_ENTRIES) && (curElem!=nullptr) ) { + status = U_BUFFER_OVERFLOW_ERROR; + } +} + +const UnicodeString* +DTSkeletonEnumeration::snext(UErrorCode& status) { + if (U_SUCCESS(status) && fSkeletons.isValid() && pos < fSkeletons->size()) { + return (const UnicodeString*)fSkeletons->elementAt(pos++); + } + return nullptr; +} + +void +DTSkeletonEnumeration::reset(UErrorCode& /*status*/) { + pos=0; +} + +int32_t +DTSkeletonEnumeration::count(UErrorCode& /*status*/) const { + return (fSkeletons.isNull()) ? 0 : fSkeletons->size(); +} + +UBool +DTSkeletonEnumeration::isCanonicalItem(const UnicodeString& item) { + if ( item.length() != 1 ) { + return FALSE; + } + for (int32_t i=0; isize(); ++i) { + if ((s = (UnicodeString *)fSkeletons->elementAt(i)) != nullptr) { + delete s; + } + } + } +} + +DTRedundantEnumeration::DTRedundantEnumeration() : pos(0), fPatterns(nullptr) { +} + +void +DTRedundantEnumeration::add(const UnicodeString& pattern, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (fPatterns.isNull()) { + fPatterns.adoptInsteadAndCheckErrorCode(new UVector(status), status); + if (U_FAILURE(status)) { + return; + } + } + LocalPointer newElem(new UnicodeString(pattern), status); + if (U_FAILURE(status)) { + return; + } + fPatterns->addElement(newElem.getAlias(), status); + if (U_FAILURE(status)) { + fPatterns.adoptInstead(nullptr); + return; + } + newElem.orphan(); // fPatterns now owns the string. +} + +const UnicodeString* +DTRedundantEnumeration::snext(UErrorCode& status) { + if (U_SUCCESS(status) && fPatterns.isValid() && pos < fPatterns->size()) { + return (const UnicodeString*)fPatterns->elementAt(pos++); + } + return nullptr; +} + +void +DTRedundantEnumeration::reset(UErrorCode& /*status*/) { + pos=0; +} + +int32_t +DTRedundantEnumeration::count(UErrorCode& /*status*/) const { + return (fPatterns.isNull()) ? 0 : fPatterns->size(); +} + +UBool +DTRedundantEnumeration::isCanonicalItem(const UnicodeString& item) const { + if ( item.length() != 1 ) { + return FALSE; + } + for (int32_t i=0; isize(); ++i) { + if ((s = (UnicodeString *)fPatterns->elementAt(i)) != nullptr) { + delete s; + } + } + } +} + +U_NAMESPACE_END + + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +//eof diff --git a/tools/license-builder.sh b/tools/license-builder.sh index 8c51b43e53895f..b29e8435228ea8 100755 --- a/tools/license-builder.sh +++ b/tools/license-builder.sh @@ -75,8 +75,8 @@ addlicense "npm" "deps/npm" "$(cat ${rootdir}/deps/npm/LICENSE)" # Build tools addlicense "GYP" "tools/gyp" "$(cat ${rootdir}/tools/gyp/LICENSE)" addlicense "inspector_protocol" "tools/inspector_protocol" "$(cat ${rootdir}/tools/inspector_protocol/LICENSE)" -addlicense "jinja2" "tools/jinja2" "$(cat ${rootdir}/tools/jinja2/LICENSE)" -addlicense "markupsafe" "tools/markupsafe" "$(cat ${rootdir}/tools/markupsafe/LICENSE)" +addlicense "jinja2" "tools/inspector_protocol/jinja2" "$(cat ${rootdir}/tools/inspector_protocol/jinja2/LICENSE)" +addlicense "markupsafe" "tools/inspector_protocol/markupsafe" "$(cat ${rootdir}/tools/inspector_protocol/markupsafe/LICENSE)" # Testing tools addlicense "cpplint.py" "tools/cpplint.py" \ diff --git a/tools/snapshot/node_mksnapshot.cc b/tools/snapshot/node_mksnapshot.cc new file mode 100644 index 00000000000000..c273ba20b610e1 --- /dev/null +++ b/tools/snapshot/node_mksnapshot.cc @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include + +#include "libplatform/libplatform.h" +#include "node_internals.h" +#include "snapshot_builder.h" +#include "v8.h" + +#ifdef _WIN32 +#include + +int wmain(int argc, wchar_t* argv[]) { +#else // UNIX +int main(int argc, char* argv[]) { +#endif // _WIN32 + + if (argc < 2) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + std::ofstream out; + out.open(argv[1], std::ios::out | std::ios::binary); + if (!out.is_open()) { + std::cerr << "Cannot open " << argv[1] << "\n"; + return 1; + } + + int node_argc = 1; + char argv0[] = "node"; + char* node_argv[] = {argv0, nullptr}; + + node::InitializationResult result = + node::InitializeOncePerProcess(node_argc, node_argv); + CHECK(!result.early_return); + CHECK_EQ(result.exit_code, 0); + + { + std::string snapshot = + node::SnapshotBuilder::Generate(result.args, result.exec_args); + out << snapshot; + out.close(); + } + + node::TearDownOncePerProcess(); + return 0; +} diff --git a/tools/snapshot/snapshot_builder.cc b/tools/snapshot/snapshot_builder.cc new file mode 100644 index 00000000000000..1faa5330ae118f --- /dev/null +++ b/tools/snapshot/snapshot_builder.cc @@ -0,0 +1,110 @@ +#include "snapshot_builder.h" +#include +#include +#include "env-inl.h" +#include "node_internals.h" +#include "node_main_instance.h" +#include "node_v8_platform-inl.h" + +namespace node { + +using v8::Context; +using v8::HandleScope; +using v8::Isolate; +using v8::Local; +using v8::Locker; +using v8::SnapshotCreator; +using v8::StartupData; + +template +void WriteVector(std::stringstream* ss, const T* vec, size_t size) { + for (size_t i = 0; i < size; i++) { + *ss << std::to_string(vec[i]) << (i == size - 1 ? '\n' : ','); + } +} + +std::string FormatBlob(v8::StartupData* blob, + const std::vector& isolate_data_indexes) { + std::stringstream ss; + + ss << R"(#include +#include "node_main_instance.h" +#include "v8.h" + +// This file is generated by tools/snapshot. Do not edit. + +namespace node { + +static const char blob_data[] = { +)"; + WriteVector(&ss, blob->data, blob->raw_size); + ss << R"(}; + +static const int blob_size = )" + << blob->raw_size << R"(; +static v8::StartupData blob = { blob_data, blob_size }; +)"; + + ss << R"(v8::StartupData* NodeMainInstance::GetEmbeddedSnapshotBlob() { + return &blob; +} + +static const std::vector isolate_data_indexes { +)"; + WriteVector(&ss, isolate_data_indexes.data(), isolate_data_indexes.size()); + ss << R"(}; + +const std::vector* NodeMainInstance::GetIsolateDataIndexes() { + return &isolate_data_indexes; +} +} // namespace node +)"; + + return ss.str(); +} + +std::string SnapshotBuilder::Generate( + const std::vector args, + const std::vector exec_args) { + // TODO(joyeecheung): collect external references and set it in + // params.external_references. + std::vector external_references = { + reinterpret_cast(nullptr)}; + Isolate* isolate = Isolate::Allocate(); + per_process::v8_platform.Platform()->RegisterIsolate(isolate, + uv_default_loop()); + NodeMainInstance* main_instance = nullptr; + std::string result; + + { + std::vector isolate_data_indexes; + SnapshotCreator creator(isolate, external_references.data()); + { + main_instance = + NodeMainInstance::Create(isolate, + uv_default_loop(), + per_process::v8_platform.Platform(), + args, + exec_args); + HandleScope scope(isolate); + creator.SetDefaultContext(Context::New(isolate)); + isolate_data_indexes = main_instance->isolate_data()->Serialize(&creator); + + size_t index = creator.AddContext(NewContext(isolate)); + CHECK_EQ(index, NodeMainInstance::kNodeContextIndex); + } + + // Must be out of HandleScope + StartupData blob = + creator.CreateBlob(SnapshotCreator::FunctionCodeHandling::kClear); + // Must be done while the snapshot creator isolate is entered i.e. the + // creator is still alive. + main_instance->Dispose(); + result = FormatBlob(&blob, isolate_data_indexes); + delete blob.data; + } + + per_process::v8_platform.Platform()->UnregisterIsolate(isolate); + return result; +} +} // namespace node diff --git a/tools/snapshot/snapshot_builder.h b/tools/snapshot/snapshot_builder.h new file mode 100644 index 00000000000000..2e587d078b9bcd --- /dev/null +++ b/tools/snapshot/snapshot_builder.h @@ -0,0 +1,15 @@ +#ifndef TOOLS_SNAPSHOT_SNAPSHOT_BUILDER_H_ +#define TOOLS_SNAPSHOT_SNAPSHOT_BUILDER_H_ + +#include +#include + +namespace node { +class SnapshotBuilder { + public: + static std::string Generate(const std::vector args, + const std::vector exec_args); +}; +} // namespace node + +#endif // TOOLS_SNAPSHOT_SNAPSHOT_BUILDER_H_