From c6e429a6bca82af71a37b8e4bd3da72d08f0e500 Mon Sep 17 00:00:00 2001 From: Michael Dawson Date: Wed, 12 Oct 2016 21:10:06 -0400 Subject: [PATCH 001/119] doc: add CTC meeting minutes for 2016-10-12 PR-URL: https://github.com/nodejs/node/pull/9070 Reviewed-By: Rich Trott Reviewed-By: James M Snell --- doc/ctc-meetings/2016-10-12.md | 157 +++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 doc/ctc-meetings/2016-10-12.md diff --git a/doc/ctc-meetings/2016-10-12.md b/doc/ctc-meetings/2016-10-12.md new file mode 100644 index 00000000000000..1b93d6e6f4e09b --- /dev/null +++ b/doc/ctc-meetings/2016-10-12.md @@ -0,0 +1,157 @@ +# Node Foundation CTC Meeting 2016-10-12 +## Links + +* **Audio Recording**: TBP +* **GitHub Issue**: [#9020](https://github.com/nodejs/node/issues/9020) +* **Minutes Google Doc**: +* _Previous Minutes Google Doc: _ + +## Present + +* Сковорода Никита Андреевич @ChALkeR (CTC) +* Colin Ihrig @cjihrig (CTC) +* Evan Lucas @evanlucas (CTC) +* Jeremiah Senkpiel @Fishrock123 (CTC) +* Michael Dawson @mhdawson (CTC) +* Brian White @mscdex (CTC) +* Ali Ijaz Sheikh @ofrobots (CTC) +* Shigeki Ohtsu @shigeki (CTC) +* Sakthipriyan Vairamani @thefourtheye (observer) +* Trevor Norris @trevnorris (CTC) +* Rich Trott @Trott (CTC) + +## Standup + +* Сковорода Никита Андреевич @ChALkeR (CTC) + * Nothing worth mentioning. + I was busy for the last week, catching up now. +* Colin Ihrig @cjihrig (CTC) + * Issue and PR review. A few PRs for tests. +* Evan Lucas @evanlucas (CTC) + * Opened a few PRs + * Some issue/pr review + * Wrote Chrome extension to make generating review metadata easier +* Jeremiah Senkpiel @Fishrock123 (CTC) + * misc PRs / issues + * working with the ChakraCore team on ES Modules + * v6.8.0 Release +* Michael Dawson @mhdawson (CTC) + * Misc review + land + * Back to working on adding nightly code coverage build + * ABI stable API PoC + * Keeping up to date on issues +* Brian White @mscdex (CTC) + * Worked on improved string encoding/decoding performance + * Reviewed PRs, commented on issues +* Ali Ijaz Sheikh @ofrobots (CTC) + * Travelling last week so not too much +* Shigeki Ohtsu @shigeki (CTC) + * Review some PR and issues related to crypto. +* Sakthipriyan Vairamani @thefourtheye (observer) + * catching up + * reviewing PRs and commenting +* Trevor Norris (CTC) + * Finishing up implementing parentId for async hooks +* Rich Trott @Trott (CTC) + * Issue and PR review + * governance discussions/issues + * Outreachy mentoring prep/work with applicants + +## Agenda + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + +### nodejs/node + +* governance: expand use of CTC issue tracker [#8945](https://github.com/nodejs/node/pull/8945) +* doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + +### nodejs/TSC + +* Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) + + +## Previous Meeting Review + +### nodejs/node + +* doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) + * approved last week, if any objections comment now + on issue +* Intl: Consider deprecating Intl.v8BreakIterator [#8865](https://github.com/nodejs/node/issues/8865) + * now closed so resolved +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + * back on agenda for this week + +### nodejs/CTC + +* Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) + * resolved, new meeting schedule set for next month. + +## Minutes + +### governance: expand use of CTC issue tracker [#8945](https://github.com/nodejs/node/pull/8945) + + * don't want to change decision making process without + putting through current process. + * ctc-review label would be useful. For issues we need to + come to consensus but that we don't need to bring to meeting. + Still good to open issues in CTC repo. + * Comment from @thefourtheye that section on consensus + seeking model could use some clarification. Rich -> likely + out of scope for this change. + * This only applies to issues that don't need a vote, votes + mostly required when consensus cannot be achieved. + * Please add your comments or LTGM to the issue. + +### doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) + + * discussed last week and input provided by CTC. + * removed from CTC-agenda. + + +### net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + + * latest discussion in issue still around if there is + any other way to close socket. + * you will already get errors if you listen twice. + * Some discussion, but missing proponents so discussion + back into github issue. + * If you object to it going into 7 (even though semver major) + make sure to comment. + + +### Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) + * Already discussed in TSC, here to discuss with those not in CTC. + * no strong opinions voiced beyond what is in issue. + * comments that we have gotten questions as to + why we have 2 bodies. + + +### General v7.0.0 / v6 LTS Planning / Discussion + + +* 2 weeks out from V7.0 - Jerimiah handling this one. +* 6 days from LTS release - Rodd handling this one. +* v6 Current release should go out today. + + +### http: improve invalid character in header error message [9010](https://github.com/nodejs/node/pull/9010) + +* asked if this could go into 7, some discussion, take + ongoing discussion back to github + +## Q/A on public channels + + +## Upcoming Meetings + +* CTC: 2016-10-19, 1pm Pacific +* TSC: 2016-10-13, 1pm Pacific +* Build: 2016-10-11 +* Diagnostics: first week of November +* Benchmarking: +* LTS: 2016-10-17 +* Post-Mortem: +* API: From 362c307f3835588a6d358046fcd1624316a13e1d Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 17 Oct 2016 13:35:24 +0200 Subject: [PATCH 002/119] src: speed up module loading, skip EOF read Stop reading from disk when we read fewer bytes than requested because the next read will be the zero-sized EOF. PR-URL: https://github.com/nodejs/node/pull/9132 Reviewed-By: James M Snell --- src/node_file.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index 70f99c09f6f23a..58abec64f5b118 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -565,8 +565,6 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { CHECK_GE(numchars, 0); if (static_cast(numchars) < kBlockSize) { chars.resize(start + numchars); - } - if (numchars == 0) { break; } offset += numchars; From 8b53f3c41c00fb526f0c45b4a2f53c9567e0095d Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 17 Oct 2016 13:42:03 +0200 Subject: [PATCH 003/119] src: speed up module loading, don't resize buffer Don't bother shrinking the read buffer on the final read because we dispose it immediately afterwards. Avoids some unnecessary memory allocation and copying. PR-URL: https://github.com/nodejs/node/pull/9132 Reviewed-By: James M Snell --- src/node_file.cc | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/node_file.cc b/src/node_file.cc index 58abec64f5b118..0abb88088786ae 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -546,10 +546,11 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { return; } + const size_t kBlockSize = 32 << 10; std::vector chars; int64_t offset = 0; - for (;;) { - const size_t kBlockSize = 32 << 10; + ssize_t numchars; + do { const size_t start = chars.size(); chars.resize(start + kBlockSize); @@ -558,24 +559,19 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { buf.len = kBlockSize; uv_fs_t read_req; - const ssize_t numchars = - uv_fs_read(loop, &read_req, fd, &buf, 1, offset, nullptr); + numchars = uv_fs_read(loop, &read_req, fd, &buf, 1, offset, nullptr); uv_fs_req_cleanup(&read_req); CHECK_GE(numchars, 0); - if (static_cast(numchars) < kBlockSize) { - chars.resize(start + numchars); - break; - } offset += numchars; - } + } while (static_cast(numchars) == kBlockSize); uv_fs_t close_req; CHECK_EQ(0, uv_fs_close(loop, &close_req, fd, nullptr)); uv_fs_req_cleanup(&close_req); size_t start = 0; - if (chars.size() >= 3 && 0 == memcmp(&chars[0], "\xEF\xBB\xBF", 3)) { + if (offset >= 3 && 0 == memcmp(&chars[0], "\xEF\xBB\xBF", 3)) { start = 3; // Skip UTF-8 BOM. } @@ -583,7 +579,7 @@ static void InternalModuleReadFile(const FunctionCallbackInfo& args) { String::NewFromUtf8(env->isolate(), &chars[start], String::kNormalString, - chars.size() - start); + offset - start); args.GetReturnValue().Set(chars_string); } From 9e753ba7823f7764218343a70da149c0c2e13f51 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 21 Oct 2016 13:47:49 +0200 Subject: [PATCH 004/119] src: simplify code, remove NodeInstanceData NodeInstanceData is not used meaningfully and makes the initialization logic harder to follow. Let's remove it and delete 100 lines of code in one fell swoop. PR-URL: https://github.com/nodejs/node/pull/9224 Reviewed-By: James M Snell --- src/node.cc | 51 +++++++++------------------- src/node_internals.h | 81 -------------------------------------------- 2 files changed, 16 insertions(+), 116 deletions(-) diff --git a/src/node.cc b/src/node.cc index be9cd6442c5c18..0b3fc7e4d06de1 100644 --- a/src/node.cc +++ b/src/node.cc @@ -4369,10 +4369,9 @@ void FreeEnvironment(Environment* env) { } -// Entry point for new node instances, also called directly for the main -// node instance. -static void StartNodeInstance(void* arg) { - NodeInstanceData* instance_data = static_cast(arg); +inline int Start(uv_loop_t* event_loop, + int argc, const char* const* argv, + int exec_argc, const char* const* exec_argv) { Isolate::CreateParams params; ArrayBufferAllocator array_buffer_allocator; params.array_buffer_allocator = &array_buffer_allocator; @@ -4383,39 +4382,32 @@ static void StartNodeInstance(void* arg) { { Mutex::ScopedLock scoped_lock(node_isolate_mutex); - if (instance_data->is_main()) { - CHECK_EQ(node_isolate, nullptr); - node_isolate = isolate; - } + CHECK_EQ(node_isolate, nullptr); + node_isolate = isolate; } if (track_heap_objects) { isolate->GetHeapProfiler()->StartTrackingHeapObjects(true); } + int exit_code; { Locker locker(isolate); Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); - IsolateData isolate_data(isolate, instance_data->event_loop(), + IsolateData isolate_data(isolate, event_loop, array_buffer_allocator.zero_fill_field()); Local context = Context::New(isolate); Context::Scope context_scope(context); Environment env(&isolate_data, context); - env.Start(instance_data->argc(), - instance_data->argv(), - instance_data->exec_argc(), - instance_data->exec_argv(), - v8_is_profiling); + env.Start(argc, argv, exec_argc, exec_argv, v8_is_profiling); isolate->SetAbortOnUncaughtExceptionCallback( ShouldAbortOnUncaughtException); // Start debug agent when argv has --debug - if (instance_data->use_debug_agent()) { - const char* path = instance_data->argc() > 1 - ? instance_data->argv()[1] - : nullptr; + if (use_debug_agent) { + const char* path = argc > 1 ? argv[1] : nullptr; StartDebug(&env, path, debug_wait_connect); if (use_inspector && !debugger_running) { exit(12); @@ -4430,7 +4422,7 @@ static void StartNodeInstance(void* arg) { env.set_trace_sync_io(trace_sync_io); // Enable debugger - if (instance_data->use_debug_agent()) + if (use_debug_agent) EnableDebug(&env); { @@ -4455,9 +4447,7 @@ static void StartNodeInstance(void* arg) { env.set_trace_sync_io(false); - int exit_code = EmitExit(&env); - if (instance_data->is_main()) - instance_data->set_exit_code(exit_code); + exit_code = EmitExit(&env); RunAtExit(&env); WaitForInspectorDisconnect(&env); @@ -4475,6 +4465,8 @@ static void StartNodeInstance(void* arg) { CHECK_NE(isolate, nullptr); isolate->Dispose(); isolate = nullptr; + + return exit_code; } int Start(int argc, char** argv) { @@ -4505,19 +4497,8 @@ int Start(int argc, char** argv) { v8_platform.Initialize(v8_thread_pool_size); V8::Initialize(); v8_initialized = true; - - int exit_code = 1; - { - NodeInstanceData instance_data(NodeInstanceType::MAIN, - uv_default_loop(), - argc, - const_cast(argv), - exec_argc, - exec_argv, - use_debug_agent); - StartNodeInstance(&instance_data); - exit_code = instance_data.exit_code(); - } + const int exit_code = + Start(uv_default_loop(), argc, argv, exec_argc, exec_argv); v8_initialized = false; V8::Dispose(); diff --git a/src/node_internals.h b/src/node_internals.h index 99b0cec2df2178..ae284660782cfe 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -179,87 +179,6 @@ class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { // by clearing all callbacks that could handle the error. void ClearFatalExceptionHandlers(Environment* env); -enum NodeInstanceType { MAIN, WORKER, REMOTE_DEBUG_SERVER }; - -class NodeInstanceData { - public: - NodeInstanceData(NodeInstanceType node_instance_type, - uv_loop_t* event_loop, - int argc, - const char** argv, - int exec_argc, - const char** exec_argv, - bool use_debug_agent_flag) - : node_instance_type_(node_instance_type), - exit_code_(1), - event_loop_(event_loop), - argc_(argc), - argv_(argv), - exec_argc_(exec_argc), - exec_argv_(exec_argv), - use_debug_agent_flag_(use_debug_agent_flag) { - CHECK_NE(event_loop_, nullptr); - } - - uv_loop_t* event_loop() const { - return event_loop_; - } - - int exit_code() { - CHECK(is_main()); - return exit_code_; - } - - void set_exit_code(int exit_code) { - CHECK(is_main()); - exit_code_ = exit_code; - } - - bool is_main() { - return node_instance_type_ == MAIN; - } - - bool is_worker() { - return node_instance_type_ == WORKER; - } - - bool is_remote_debug_server() { - return node_instance_type_ == REMOTE_DEBUG_SERVER; - } - - int argc() { - return argc_; - } - - const char** argv() { - return argv_; - } - - int exec_argc() { - return exec_argc_; - } - - const char** exec_argv() { - return exec_argv_; - } - - bool use_debug_agent() { - return is_main() && use_debug_agent_flag_; - } - - private: - const NodeInstanceType node_instance_type_; - int exit_code_; - uv_loop_t* const event_loop_; - const int argc_; - const char** argv_; - const int exec_argc_; - const char** exec_argv_; - const bool use_debug_agent_flag_; - - DISALLOW_COPY_AND_ASSIGN(NodeInstanceData); -}; - namespace Buffer { v8::MaybeLocal Copy(Environment* env, const char* data, size_t len); v8::MaybeLocal New(Environment* env, size_t size); From f2a3b24611c68c57358570ac597f4d1f379d01b6 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Fri, 21 Oct 2016 14:24:48 +0200 Subject: [PATCH 005/119] src: clean up program/isolate/env init logic Reorder the initialization logic so that program-wide, per-isolate and per-environment initialization is more cleanly separated. PR-URL: https://github.com/nodejs/node/pull/9224 Reviewed-By: James M Snell --- src/env.cc | 2 - src/node.cc | 161 ++++++++++++++++++++++++++-------------------------- 2 files changed, 81 insertions(+), 82 deletions(-) diff --git a/src/env.cc b/src/env.cc index 8efe13816c0ee9..efa2d53f0435b2 100644 --- a/src/env.cc +++ b/src/env.cc @@ -30,8 +30,6 @@ void Environment::Start(int argc, HandleScope handle_scope(isolate()); Context::Scope context_scope(context()); - isolate()->SetAutorunMicrotasks(false); - uv_check_init(event_loop(), immediate_check_handle()); uv_unref(reinterpret_cast(immediate_check_handle())); diff --git a/src/node.cc b/src/node.cc index 0b3fc7e4d06de1..8a39cff3e989ff 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3341,11 +3341,6 @@ void SetupProcessObject(Environment* env, #undef READONLY_PROPERTY -static void AtProcessExit() { - uv_tty_reset_mode(); -} - - void SignalExit(int signo) { uv_tty_reset_mode(); #ifdef __FreeBSD__ @@ -3375,11 +3370,6 @@ static void RawDebug(const FunctionCallbackInfo& args) { void LoadEnvironment(Environment* env) { HandleScope handle_scope(env->isolate()); - env->isolate()->SetFatalErrorHandler(node::OnFatalError); - env->isolate()->AddMessageListener(OnMessage); - - atexit(AtProcessExit); - TryCatch try_catch(env->isolate()); // Disable verbose mode to stop FatalException() handler from trying @@ -4369,16 +4359,89 @@ void FreeEnvironment(Environment* env) { } +inline int Start(Isolate* isolate, IsolateData* isolate_data, + int argc, const char* const* argv, + int exec_argc, const char* const* exec_argv) { + HandleScope handle_scope(isolate); + Local context = Context::New(isolate); + Context::Scope context_scope(context); + Environment env(isolate_data, context); + env.Start(argc, argv, exec_argc, exec_argv, v8_is_profiling); + + // Start debug agent when argv has --debug + if (use_debug_agent) { + const char* path = argc > 1 ? argv[1] : nullptr; + StartDebug(&env, path, debug_wait_connect); + if (use_inspector && !debugger_running) + return 12; // Signal internal error. + } + + { + Environment::AsyncCallbackScope callback_scope(&env); + LoadEnvironment(&env); + } + + env.set_trace_sync_io(trace_sync_io); + + // Enable debugger + if (use_debug_agent) + EnableDebug(&env); + + { + SealHandleScope seal(isolate); + bool more; + do { + v8_platform.PumpMessageLoop(isolate); + more = uv_run(env.event_loop(), UV_RUN_ONCE); + + if (more == false) { + v8_platform.PumpMessageLoop(isolate); + EmitBeforeExit(&env); + + // Emit `beforeExit` if the loop became alive either after emitting + // event, or after running some callbacks. + more = uv_loop_alive(env.event_loop()); + if (uv_run(env.event_loop(), UV_RUN_NOWAIT) != 0) + more = true; + } + } while (more == true); + } + + env.set_trace_sync_io(false); + + const int exit_code = EmitExit(&env); + RunAtExit(&env); + + WaitForInspectorDisconnect(&env); +#if defined(LEAK_SANITIZER) + __lsan_do_leak_check(); +#endif + + return exit_code; +} + inline int Start(uv_loop_t* event_loop, int argc, const char* const* argv, int exec_argc, const char* const* exec_argv) { Isolate::CreateParams params; - ArrayBufferAllocator array_buffer_allocator; - params.array_buffer_allocator = &array_buffer_allocator; + ArrayBufferAllocator allocator; + params.array_buffer_allocator = &allocator; #ifdef NODE_ENABLE_VTUNE_PROFILING params.code_event_handler = vTune::GetVtuneCodeEventHandler(); #endif - Isolate* isolate = Isolate::New(params); + + Isolate* const isolate = Isolate::New(params); + if (isolate == nullptr) + return 12; // Signal internal error. + + isolate->AddMessageListener(OnMessage); + isolate->SetAbortOnUncaughtExceptionCallback(ShouldAbortOnUncaughtException); + isolate->SetAutorunMicrotasks(false); + isolate->SetFatalErrorHandler(OnFatalError); + + if (track_heap_objects) { + isolate->GetHeapProfiler()->StartTrackingHeapObjects(true); + } { Mutex::ScopedLock scoped_lock(node_isolate_mutex); @@ -4386,90 +4449,28 @@ inline int Start(uv_loop_t* event_loop, node_isolate = isolate; } - if (track_heap_objects) { - isolate->GetHeapProfiler()->StartTrackingHeapObjects(true); - } - int exit_code; { Locker locker(isolate); Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); - IsolateData isolate_data(isolate, event_loop, - array_buffer_allocator.zero_fill_field()); - Local context = Context::New(isolate); - Context::Scope context_scope(context); - Environment env(&isolate_data, context); - env.Start(argc, argv, exec_argc, exec_argv, v8_is_profiling); - - isolate->SetAbortOnUncaughtExceptionCallback( - ShouldAbortOnUncaughtException); - - // Start debug agent when argv has --debug - if (use_debug_agent) { - const char* path = argc > 1 ? argv[1] : nullptr; - StartDebug(&env, path, debug_wait_connect); - if (use_inspector && !debugger_running) { - exit(12); - } - } - - { - Environment::AsyncCallbackScope callback_scope(&env); - LoadEnvironment(&env); - } - - env.set_trace_sync_io(trace_sync_io); - - // Enable debugger - if (use_debug_agent) - EnableDebug(&env); - - { - SealHandleScope seal(isolate); - bool more; - do { - v8_platform.PumpMessageLoop(isolate); - more = uv_run(env.event_loop(), UV_RUN_ONCE); - - if (more == false) { - v8_platform.PumpMessageLoop(isolate); - EmitBeforeExit(&env); - - // Emit `beforeExit` if the loop became alive either after emitting - // event, or after running some callbacks. - more = uv_loop_alive(env.event_loop()); - if (uv_run(env.event_loop(), UV_RUN_NOWAIT) != 0) - more = true; - } - } while (more == true); - } - - env.set_trace_sync_io(false); - - exit_code = EmitExit(&env); - RunAtExit(&env); - - WaitForInspectorDisconnect(&env); -#if defined(LEAK_SANITIZER) - __lsan_do_leak_check(); -#endif + IsolateData isolate_data(isolate, event_loop, allocator.zero_fill_field()); + exit_code = Start(isolate, &isolate_data, argc, argv, exec_argc, exec_argv); } { Mutex::ScopedLock scoped_lock(node_isolate_mutex); - if (node_isolate == isolate) - node_isolate = nullptr; + CHECK_EQ(node_isolate, isolate); + node_isolate = nullptr; } - CHECK_NE(isolate, nullptr); isolate->Dispose(); - isolate = nullptr; return exit_code; } int Start(int argc, char** argv) { + atexit([] () { uv_tty_reset_mode(); }); PlatformInit(); CHECK_GT(argc, 0); From 4be1ba582a5c3a5a1a1647aa6fe7c5b7c74eac0e Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sat, 22 Oct 2016 16:21:34 +0200 Subject: [PATCH 006/119] test: move flaky test to test/pummel Move sequential/test-crypto-timing-safe-equal-benchmarks to test/pummel because it fails for me locally quite frequently and because it takes about five or six seconds to complete, which is too long for a test in test/sequential. Fixes: https://github.com/nodejs/node/issues/8744 PR-URL: https://github.com/nodejs/node/pull/9241 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: not-an-aardvark --- .../test-crypto-timing-safe-equal-benchmarks.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{sequential => pummel}/test-crypto-timing-safe-equal-benchmarks.js (100%) diff --git a/test/sequential/test-crypto-timing-safe-equal-benchmarks.js b/test/pummel/test-crypto-timing-safe-equal-benchmarks.js similarity index 100% rename from test/sequential/test-crypto-timing-safe-equal-benchmarks.js rename to test/pummel/test-crypto-timing-safe-equal-benchmarks.js From 204461925bda6466e79ac25f4bb0f9b76d06fa56 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Sat, 22 Oct 2016 16:27:13 +0200 Subject: [PATCH 007/119] test: make flaky pummel test more reliable Increase the number of iterations from 1e4 to 1e5. Makes the test pass for me locally when previously it would fail 9 out of 10 times because the running time was not enough to smooth away the outliers. Fixes: https://github.com/nodejs/node/issues/8744 PR-URL: https://github.com/nodejs/node/pull/9241 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: not-an-aardvark --- test/pummel/test-crypto-timing-safe-equal-benchmarks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pummel/test-crypto-timing-safe-equal-benchmarks.js b/test/pummel/test-crypto-timing-safe-equal-benchmarks.js index de46a899f263f5..5560a4a256b5fe 100644 --- a/test/pummel/test-crypto-timing-safe-equal-benchmarks.js +++ b/test/pummel/test-crypto-timing-safe-equal-benchmarks.js @@ -28,7 +28,7 @@ function runOneBenchmark(...args) { } function getTValue(compareFunc) { - const numTrials = 10000; + const numTrials = 1e5; const bufSize = 10000; // Perform benchmarks to verify that timingSafeEqual is actually timing-safe. From 21ba3e3b89fe106e48e2662e106e6f9f679f943f Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 19 Oct 2016 14:18:33 +0200 Subject: [PATCH 008/119] test: add more module loader test coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verify that a package.json without a .main property loads index.js. PR-URL: https://github.com/nodejs/node/pull/9196 Reviewed-By: Brian White Reviewed-By: Colin Ihrig Reviewed-By: Evan Lucas Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- test/fixtures/packages/index/index.js | 1 + test/fixtures/packages/index/package.json | 1 + test/sequential/test-module-loading.js | 3 +++ 3 files changed, 5 insertions(+) create mode 100644 test/fixtures/packages/index/index.js create mode 100644 test/fixtures/packages/index/package.json diff --git a/test/fixtures/packages/index/index.js b/test/fixtures/packages/index/index.js new file mode 100644 index 00000000000000..014fa39dc365d1 --- /dev/null +++ b/test/fixtures/packages/index/index.js @@ -0,0 +1 @@ +exports.ok = 'ok'; diff --git a/test/fixtures/packages/index/package.json b/test/fixtures/packages/index/package.json new file mode 100644 index 00000000000000..0967ef424bce67 --- /dev/null +++ b/test/fixtures/packages/index/package.json @@ -0,0 +1 @@ +{} diff --git a/test/sequential/test-module-loading.js b/test/sequential/test-module-loading.js index 2f07bf55cf9766..d272b1921ba99e 100644 --- a/test/sequential/test-module-loading.js +++ b/test/sequential/test-module-loading.js @@ -69,6 +69,8 @@ assert.equal(threeFolder, threeIndex); assert.notEqual(threeFolder, three); console.error('test package.json require() loading'); +assert.equal(require('../fixtures/packages/index').ok, 'ok', + 'Failed loading package'); assert.equal(require('../fixtures/packages/main').ok, 'ok', 'Failed loading package'); assert.equal(require('../fixtures/packages/main-index').ok, 'ok', @@ -208,6 +210,7 @@ assert.deepStrictEqual(children, { }, 'fixtures/nested-index/three.js': {}, 'fixtures/nested-index/three/index.js': {}, + 'fixtures/packages/index/index.js': {}, 'fixtures/packages/main/package-main-module.js': {}, 'fixtures/packages/main-index/package-main-module/index.js': {}, 'fixtures/cycles/root.js': { From c231130e06f390f20225987f4933f434ab6e781b Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 19 Oct 2016 21:43:36 +0200 Subject: [PATCH 009/119] module: skip directories known not to exist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is no point in trying to search for files in a directory that we know does not exist, so stop doing that. Reduces the total number of stat(2) calls and the number of stat(2) misses on a medium-sized application by about 21% and 29% respectively. Reduces the total number of package.json open(2) calls and the number of open(2) misses by about 21% and 93% (!) respectively. Before: % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 50.93 0.178419 38 4702 lstat 29.08 0.101875 36 2800 2010 stat 11.36 0.039796 43 932 215 open 5.39 0.018897 34 550 fstat 3.24 0.011337 34 336 pread ------ ----------- ----------- --------- --------- ---------------- 100.00 0.350324 9320 2225 total After: % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 55.49 0.176638 38 4702 lstat 24.76 0.078826 35 2225 1435 stat 10.19 0.032434 44 733 16 open 6.19 0.019719 36 550 fstat 3.37 0.010723 32 336 pread ------ ----------- ----------- --------- --------- ---------------- 100.00 0.318340 8546 1451 total PR-URL: https://github.com/nodejs/node/pull/9196 Reviewed-By: Brian White Reviewed-By: Colin Ihrig Reviewed-By: Evan Lucas Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- lib/module.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/module.js b/lib/module.js index 2d886d8a52e761..bc9d11ee0bcfce 100644 --- a/lib/module.js +++ b/lib/module.js @@ -171,8 +171,8 @@ Module._findPath = function(request, paths, isMain) { var basePath = path.resolve(curPath, request); var filename; + const rc = stat(basePath); if (!trailingSlash) { - const rc = stat(basePath); if (rc === 0) { // File. if (preserveSymlinks && !isMain) { filename = path.resolve(basePath); @@ -193,13 +193,13 @@ Module._findPath = function(request, paths, isMain) { } } - if (!filename) { + if (!filename && rc === 1) { // Directory. if (exts === undefined) exts = Object.keys(Module._extensions); filename = tryPackage(basePath, exts, isMain); } - if (!filename) { + if (!filename && rc === 1) { // Directory. // try it with each of the extensions at "index" if (exts === undefined) exts = Object.keys(Module._extensions); From 2e7b078e7b3cb6fc9481144c9ce4097adabf5ad0 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 19 Oct 2016 13:15:22 +0200 Subject: [PATCH 010/119] inspector: fix request path nullptr dereference Fix a nullptr dereference when an invalid path is requested. Regression introduced in commit 69fc85d ("inspector: generate UUID for debug targets"), caught by Coverity. PR-URL: https://github.com/nodejs/node/pull/9184 Reviewed-By: Ali Ijaz Sheikh Reviewed-By: Colin Ihrig Reviewed-By: Eugene Ostroukhov Reviewed-By: James M Snell --- src/inspector_agent.cc | 9 ++++++--- test/inspector/inspector-helper.js | 23 +++++++++++++++++------ test/inspector/test-inspector.js | 22 +++++++++++++++++++--- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index 1cbaa92b9abcea..3f3d548de4cdf6 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -681,17 +681,20 @@ bool AgentImpl::RespondToGet(InspectorSocket* socket, const std::string& path) { if (match_path_segment(command, "list") || command[0] == '\0') { SendTargentsListResponse(socket); + return true; } else if (match_path_segment(command, "protocol")) { SendProtocolJson(socket); + return true; } else if (match_path_segment(command, "version")) { SendVersionResponse(socket); - } else { - const char* pid = match_path_segment(command, "activate"); + return true; + } else if (const char* pid = match_path_segment(command, "activate")) { if (pid != id_) return false; SendHttpResponse(socket, "Target activated"); + return true; } - return true; + return false; } // static diff --git a/test/inspector/inspector-helper.js b/test/inspector/inspector-helper.js index b78b921aebfaf7..76fb33dba2be4d 100644 --- a/test/inspector/inspector-helper.js +++ b/test/inspector/inspector-helper.js @@ -86,7 +86,17 @@ function checkHttpResponse(port, path, callback) { res.setEncoding('utf8'); res .on('data', (data) => response += data.toString()) - .on('end', () => callback(JSON.parse(response))); + .on('end', () => { + let err = null; + let json = undefined; + try { + json = JSON.parse(response); + } catch (e) { + err = e; + err.response = response; + } + callback(err, json); + }); }); } @@ -284,8 +294,8 @@ TestSession.prototype.disconnect = function(childDone) { TestSession.prototype.testHttpResponse = function(path, check) { return this.enqueue((callback) => - checkHttpResponse(this.harness_.port, path, (response) => { - check.call(this, response); + checkHttpResponse(this.harness_.port, path, (err, response) => { + check.call(this, err, response); callback(); })); }; @@ -352,8 +362,8 @@ Harness.prototype.enqueue_ = function(task) { Harness.prototype.testHttpResponse = function(path, check) { return this.enqueue_((doneCallback) => { - checkHttpResponse(this.port, path, (response) => { - check.call(this, response); + checkHttpResponse(this.port, path, (err, response) => { + check.call(this, err, response); doneCallback(); }); }); @@ -393,7 +403,8 @@ Harness.prototype.wsHandshake = function(devtoolsUrl, tests, readyCallback) { Harness.prototype.runFrontendSession = function(tests) { return this.enqueue_((callback) => { - checkHttpResponse(this.port, '/json/list', (response) => { + checkHttpResponse(this.port, '/json/list', (err, response) => { + assert.ifError(err); this.wsHandshake(response[0]['webSocketDebuggerUrl'], tests, callback); }); }); diff --git a/test/inspector/test-inspector.js b/test/inspector/test-inspector.js index d2130b36b1fbe8..eba4a0fc05dac2 100644 --- a/test/inspector/test-inspector.js +++ b/test/inspector/test-inspector.js @@ -5,7 +5,8 @@ const helper = require('./inspector-helper.js'); let scopeId; -function checkListResponse(response) { +function checkListResponse(err, response) { + assert.ifError(err); assert.strictEqual(1, response.length); assert.ok(response[0]['devtoolsFrontendUrl']); assert.ok( @@ -13,6 +14,17 @@ function checkListResponse(response) { .match(/ws:\/\/localhost:\d+\/[0-9A-Fa-f]{8}-/)); } +function checkVersion(err, response) { + assert.ifError(err); + assert.ok(response); +} + +function checkBadPath(err, response) { + assert(err instanceof SyntaxError); + assert(/Unexpected token/.test(err.message)); + assert(/WebSockets request was expected/.test(err.response)); +} + function expectMainScriptSource(result) { const expected = helper.mainScriptSource(); const source = result['scriptSource']; @@ -153,7 +165,8 @@ function testInspectScope(session) { } function testNoUrlsWhenConnected(session) { - session.testHttpResponse('/json/list', (response) => { + session.testHttpResponse('/json/list', (err, response) => { + assert.ifError(err); assert.strictEqual(1, response.length); assert.ok(!response[0].hasOwnProperty('devtoolsFrontendUrl')); assert.ok(!response[0].hasOwnProperty('webSocketDebuggerUrl')); @@ -171,7 +184,10 @@ function runTests(harness) { harness .testHttpResponse('/json', checkListResponse) .testHttpResponse('/json/list', checkListResponse) - .testHttpResponse('/json/version', assert.ok) + .testHttpResponse('/json/version', checkVersion) + .testHttpResponse('/json/activate', checkBadPath) + .testHttpResponse('/json/activate/boom', checkBadPath) + .testHttpResponse('/json/badpath', checkBadPath) .runFrontendSession([ testNoUrlsWhenConnected, testBreakpointOnStart, From 06b414078ebf62d95174f11ef1a82af6d2035040 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 19 Oct 2016 13:31:18 +0200 Subject: [PATCH 011/119] test: remove test-v8-inspector-json-protocol test Remove parallel/test-v8-inspector-json-protocol, it duplicates the test found in inspector/test-inspector. PR-URL: https://github.com/nodejs/node/pull/9184 Reviewed-By: Ali Ijaz Sheikh Reviewed-By: Colin Ihrig Reviewed-By: Eugene Ostroukhov Reviewed-By: James M Snell --- .../test-v8-inspector-json-protocol.js | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 test/parallel/test-v8-inspector-json-protocol.js diff --git a/test/parallel/test-v8-inspector-json-protocol.js b/test/parallel/test-v8-inspector-json-protocol.js deleted file mode 100644 index 762c4386bb906a..00000000000000 --- a/test/parallel/test-v8-inspector-json-protocol.js +++ /dev/null @@ -1,22 +0,0 @@ -// Flags: --inspect={PORT} -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const http = require('http'); - -const options = { - path: '/json/protocol', - port: common.PORT, - host: common.localhostIPv4, -}; - -http.get(options, common.mustCall((res) => { - let body = ''; - res.setEncoding('utf8'); - res.on('data', (data) => body += data); - res.on('end', common.mustCall(() => { - assert(body.length > 0); - assert.deepStrictEqual(JSON.stringify(JSON.parse(body)), body); - })); -})); From 9372aee4a395578f65df03f290760dd3979a2ee6 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 28 Sep 2016 12:01:48 +0200 Subject: [PATCH 012/119] lib: fix beforeExit not working with -e Commit 93a44d5 ("src: fix deferred events not working with -e") defers evaluation of the script to the next tick. A side effect of that change is that 'beforeExit' listeners run before the actual script. 'beforeExit' is emitted when the event loop is empty but process.nextTick() does not ref the event loop. Fix that by using setImmediate(). Because it is implemented in terms of a uv_check_t handle, it interacts with the event loop properly. Fixes: https://github.com/nodejs/node/issues/8534 PR-URL: https://github.com/nodejs/node/pull/8821 Reviewed-By: Colin Ihrig --- lib/internal/bootstrap_node.js | 2 +- test/message/eval_messages.out | 28 ++++++++++++++++------------ test/message/stdin_messages.out | 28 ++++++++++++++++------------ test/parallel/test-cli-eval.js | 15 +++++++++++++++ 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js index 8b8d066ab039e9..8db79aa33fb32a 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -341,7 +341,7 @@ // Defer evaluation for a tick. This is a workaround for deferred // events not firing when evaluating scripts from the command line, // see https://github.com/nodejs/node/issues/1600. - process.nextTick(function() { + setImmediate(function() { const result = module._compile(script, `${name}-wrapper`); if (process._print_eval) console.log(result); }); diff --git a/test/message/eval_messages.out b/test/message/eval_messages.out index 7fbf51f7e0f2f7..44965be374bac5 100644 --- a/test/message/eval_messages.out +++ b/test/message/eval_messages.out @@ -6,9 +6,10 @@ SyntaxError: Strict mode code may not include a with statement at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) 42 42 [eval]:1 @@ -20,9 +21,10 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) [eval]:1 throw new Error("hello") ^ @@ -32,9 +34,10 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) 100 [eval]:1 var x = 100; y = x; @@ -45,9 +48,10 @@ ReferenceError: y is not defined at Object.exports.runInThisContext (vm.js:*) at Object. ([eval]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) [eval]:1 var ______________________________________________; throw 10 ^ diff --git a/test/message/stdin_messages.out b/test/message/stdin_messages.out index 62c43b02a8e81b..828bee92cb6f7f 100644 --- a/test/message/stdin_messages.out +++ b/test/message/stdin_messages.out @@ -7,9 +7,10 @@ SyntaxError: Strict mode code may not include a with statement at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) 42 42 @@ -22,9 +23,10 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) [stdin]:1 throw new Error("hello") @@ -35,9 +37,10 @@ Error: hello at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) 100 [stdin]:1 @@ -49,9 +52,10 @@ ReferenceError: y is not defined at Object.exports.runInThisContext (vm.js:*) at Object. ([stdin]-wrapper:*:*) at Module._compile (module.js:*:*) - at bootstrap_node.js:*:* - at _combinedTickCallback (internal/process/next_tick.js:*:*) - at process._tickCallback (internal/process/next_tick.js:*:*) + at Immediate. (bootstrap_node.js:*:*) + at runCallback (timers.js:*:*) + at tryOnImmediate (timers.js:*:*) + at processImmediate [as _immediateCallback] (timers.js:*:*) [stdin]:1 var ______________________________________________; throw 10 diff --git a/test/parallel/test-cli-eval.js b/test/parallel/test-cli-eval.js index f22084bc690395..3c38afd2ac4524 100644 --- a/test/parallel/test-cli-eval.js +++ b/test/parallel/test-cli-eval.js @@ -97,3 +97,18 @@ child.exec(nodejs + ` -e 'require("child_process").fork("${emptyFile}")'`, assert.equal(stdout, ''); assert.equal(stderr, ''); }); + +// Regression test for https://github.com/nodejs/node/issues/8534. +{ + const script = ` + // console.log() can revive the event loop so we must be careful + // to write from a 'beforeExit' event listener only once. + process.once("beforeExit", () => console.log("beforeExit")); + process.on("exit", () => console.log("exit")); + console.log("start"); + `; + const options = { encoding: 'utf8' }; + const proc = child.spawnSync(process.execPath, ['-e', script], options); + assert.strictEqual(proc.stderr, ''); + assert.strictEqual(proc.stdout, 'start\nbeforeExit\nexit\n'); +} From 63ef0990f30a607bc242b48a1d8af01ce997d85e Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 20 Oct 2016 13:45:38 -0400 Subject: [PATCH 013/119] test: add coverage for execFileSync() errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds coverage for errors returned by execFileSync() when the child process exits with a non-zero code. PR-URL: https://github.com/nodejs/node/pull/9211 Reviewed-By: Michaël Zasso Reviewed-By: Sakthipriyan Vairamani Reviewed-By: James M Snell Reviewed-By: Ben Noordhuis --- test/sequential/test-child-process-execsync.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/sequential/test-child-process-execsync.js b/test/sequential/test-child-process-execsync.js index 01d7f868845ae0..137ddbda425f2c 100644 --- a/test/sequential/test-child-process-execsync.js +++ b/test/sequential/test-child-process-execsync.js @@ -87,3 +87,19 @@ assert.strictEqual(ret, msg + '\n', execSync('exit -1', {stdio: 'ignore'}); }, /Command failed: exit -1/); } + +// Verify the execFileSync() behavior when the child exits with a non-zero code. +{ + const args = ['-e', 'process.exit(1)']; + + assert.throws(() => { + execFileSync(process.execPath, args); + }, (err) => { + const msg = `Command failed: ${process.execPath} ${args.join(' ')}`; + + assert(err instanceof Error); + assert.strictEqual(err.message.trim(), msg); + assert.strictEqual(err.status, 1); + return true; + }); +} From d573acf96f03a3649c8d34bee5e7ed63907546a6 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 20 Oct 2016 12:34:09 -0400 Subject: [PATCH 014/119] child_process: remove unreachable execSync() code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code coverage showed that the execSync() variable inheritStderr was never set to the default value of true. This is because the default case is hit whenever normalizeExecArgs() returns an object without an 'options' property. However, this can never be the case because normalizeExecArgs() unconditionally creates the options object. This commit removes the unreachable code. PR-URL: https://github.com/nodejs/node/pull/9209 Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca Reviewed-By: Sakthipriyan Vairamani --- lib/child_process.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/child_process.js b/lib/child_process.js index 3cc6e2ce6a944e..4c2fb7e09817f4 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -517,7 +517,7 @@ exports.execFileSync = execFileSync; function execSync(command /*, options*/) { var opts = normalizeExecArgs.apply(null, arguments); - var inheritStderr = opts.options ? !opts.options.stdio : true; + var inheritStderr = !opts.options.stdio; var ret = spawnSync(opts.file, opts.options); ret.cmd = command; From d1c32aa335aa790d417dd734b48d9b52efa79f38 Mon Sep 17 00:00:00 2001 From: Oliver Salzburg Date: Tue, 18 Oct 2016 18:48:44 +0200 Subject: [PATCH 015/119] doc: mention case-insensitive env on windows On Windows OS, environment variables are case-insensitive and are treated likewise in NodeJS. This can be confusing and can lead to hard-to-debug problems when moving code from one environment to another. Reviewed-By: Benjamin Gruenbaum Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca PR-URL: https://github.com/nodejs/node/pull/9166 Fixes: https://github.com/nodejs/node/issues/9157 --- doc/api/process.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/api/process.md b/doc/api/process.md index 376a40d7133eb2..7a109dd6abfe2d 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -708,6 +708,16 @@ console.log(process.env.TEST); // => undefined ``` +On Windows operating systems, environment variables are case-insensitive. + +Example: + +```js +process.env.TEST = 1; +console.log(process.env.test); +// => 1 +``` + ## process.emitWarning(warning[, name][, ctor]) + +When set to `1`, instructs the module loader to preserve symbolic links when +resolving and caching modules. ### `NODE_REPL_HISTORY=file` + +* `source` {Buffer} A `Buffer` instance +* `fromEnc` {String} The current encoding +* `toEnc` {String} To target encoding + +Re-encodes the given `Buffer` instance from one character encoding to another. +Returns a new `Buffer` instance. + +Throws if the `fromEnc` or `toEnc` specify invalid character encodings or if +conversion from `fromEnc` to `toEnc` is not permitted. + +The transcoding process will use substitution characters if a given byte +sequence cannot be adequately represented in the target encoding. For instance: + +```js +const newBuf = buffer.transcode(Buffer.from('€'), 'utf8', 'ascii'); +console.log(newBuf.toString('ascii')); + // prints '?' +``` + +Because the Euro (`€`) sign is not representable in US-ASCII, it is replaced +with `?` in the transcoded `Buffer`. + ## Class: SlowBuffer + // - asyncTaskStarted + // - asyncTaskCanceled <-- canceled before finished + // <-- async stack requested here --> + // - asyncTaskFinished + std::unique_ptr stack; + if (stackIt != m_asyncTaskStacks.end() && stackIt->second) + stack = stackIt->second->cloneImpl(); + m_currentStacks.push_back(std::move(stack)); +} + +void V8Debugger::asyncTaskFinished(void* task) { + if (!m_maxAsyncCallStackDepth) return; + // We could start instrumenting half way and the stack is empty. + if (!m_currentStacks.size()) return; + + DCHECK(m_currentTasks.back() == task); + m_currentTasks.pop_back(); + + m_currentStacks.pop_back(); + if (m_recurringTasks.find(task) == m_recurringTasks.end()) + m_asyncTaskStacks.erase(task); +} + +void V8Debugger::allAsyncTasksCanceled() { + m_asyncTaskStacks.clear(); + m_recurringTasks.clear(); + m_currentStacks.clear(); + m_currentTasks.clear(); +} + +void V8Debugger::muteScriptParsedEvents() { + ++m_ignoreScriptParsedEventsCounter; +} + +void V8Debugger::unmuteScriptParsedEvents() { + --m_ignoreScriptParsedEventsCounter; + DCHECK_GE(m_ignoreScriptParsedEventsCounter, 0); +} + +std::unique_ptr V8Debugger::captureStackTrace( + bool fullStack) { + if (!m_isolate->InContext()) return nullptr; + + v8::HandleScope handles(m_isolate); + int contextGroupId = getGroupId(m_isolate->GetCurrentContext()); + if (!contextGroupId) return nullptr; + + size_t stackSize = + fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; + if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) + stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; + + return V8StackTraceImpl::capture(this, contextGroupId, stackSize); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-debugger.h b/deps/v8_inspector/src/inspector/v8-debugger.h new file mode 100644 index 00000000000000..83c1b21b02a712 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-debugger.h @@ -0,0 +1,160 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8DEBUGGER_H_ +#define V8_INSPECTOR_V8DEBUGGER_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/java-script-call-frame.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" +#include "src/inspector/v8-debugger-script.h" + +#include "include/v8-debug.h" +#include "include/v8-inspector.h" + +namespace v8_inspector { + +struct ScriptBreakpoint; +class V8DebuggerAgentImpl; +class V8InspectorImpl; +class V8StackTraceImpl; + +using protocol::ErrorString; + +class V8Debugger { + public: + V8Debugger(v8::Isolate*, V8InspectorImpl*); + ~V8Debugger(); + + static int contextId(v8::Local); + static int getGroupId(v8::Local); + int markContext(const V8ContextInfo&); + + bool enabled() const; + + String16 setBreakpoint(const String16& sourceID, const ScriptBreakpoint&, + int* actualLineNumber, int* actualColumnNumber); + void removeBreakpoint(const String16& breakpointId); + void setBreakpointsActivated(bool); + bool breakpointsActivated() const { return m_breakpointsActivated; } + + enum PauseOnExceptionsState { + DontPauseOnExceptions, + PauseOnAllExceptions, + PauseOnUncaughtExceptions + }; + PauseOnExceptionsState getPauseOnExceptionsState(); + void setPauseOnExceptionsState(PauseOnExceptionsState); + void setPauseOnNextStatement(bool); + bool canBreakProgram(); + void breakProgram(); + void continueProgram(); + void stepIntoStatement(); + void stepOverStatement(); + void stepOutOfFunction(); + void clearStepping(); + + bool setScriptSource(const String16& sourceID, + v8::Local newSource, bool dryRun, + ErrorString*, + protocol::Maybe*, + JavaScriptCallFrames* newCallFrames, + protocol::Maybe* stackChanged); + JavaScriptCallFrames currentCallFrames(int limit = 0); + + // Each script inherits debug data from v8::Context where it has been + // compiled. + // Only scripts whose debug data matches |contextGroupId| will be reported. + // Passing 0 will result in reporting all scripts. + void getCompiledScripts(int contextGroupId, + std::vector>&); + void enable(); + void disable(); + + bool isPaused(); + v8::Local pausedContext() { return m_pausedContext; } + + int maxAsyncCallChainDepth() { return m_maxAsyncCallStackDepth; } + V8StackTraceImpl* currentAsyncCallChain(); + void setAsyncCallStackDepth(V8DebuggerAgentImpl*, int); + std::unique_ptr createStackTrace(v8::Local); + std::unique_ptr captureStackTrace(bool fullStack); + + v8::MaybeLocal internalProperties(v8::Local, + v8::Local); + + void asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring); + void asyncTaskScheduled(const String16& taskName, void* task, bool recurring); + void asyncTaskCanceled(void* task); + void asyncTaskStarted(void* task); + void asyncTaskFinished(void* task); + void allAsyncTasksCanceled(); + + void muteScriptParsedEvents(); + void unmuteScriptParsedEvents(); + + V8InspectorImpl* inspector() { return m_inspector; } + + private: + void compileDebuggerScript(); + v8::MaybeLocal callDebuggerMethod(const char* functionName, + int argc, + v8::Local argv[]); + v8::Local debuggerContext() const; + void clearBreakpoints(); + + static void breakProgramCallback(const v8::FunctionCallbackInfo&); + void handleProgramBreak(v8::Local pausedContext, + v8::Local executionState, + v8::Local exception, + v8::Local hitBreakpoints, + bool isPromiseRejection = false); + static void v8DebugEventCallback(const v8::Debug::EventDetails&); + v8::Local callInternalGetterFunction(v8::Local, + const char* functionName); + void handleV8DebugEvent(const v8::Debug::EventDetails&); + void handleV8AsyncTaskEvent(v8::Local, + v8::Local executionState, + v8::Local eventData); + + v8::Local collectionEntries(v8::Local, + v8::Local); + v8::Local generatorObjectLocation(v8::Local, + v8::Local); + v8::Local functionLocation(v8::Local, + v8::Local); + v8::MaybeLocal functionScopes(v8::Local, + v8::Local); + + v8::Isolate* m_isolate; + V8InspectorImpl* m_inspector; + int m_lastContextId; + int m_enableCount; + bool m_breakpointsActivated; + v8::Global m_debuggerScript; + v8::Global m_debuggerContext; + v8::Local m_executionState; + v8::Local m_pausedContext; + bool m_runningNestedMessageLoop; + int m_ignoreScriptParsedEventsCounter; + + using AsyncTaskToStackTrace = + protocol::HashMap>; + AsyncTaskToStackTrace m_asyncTaskStacks; + protocol::HashSet m_recurringTasks; + int m_maxAsyncCallStackDepth; + std::vector m_currentTasks; + std::vector> m_currentStacks; + protocol::HashMap m_maxAsyncCallStackDepthMap; + + DISALLOW_COPY_AND_ASSIGN(V8Debugger); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8DEBUGGER_H_ diff --git a/deps/v8_inspector/src/inspector/v8-function-call.cc b/deps/v8_inspector/src/inspector/v8-function-call.cc new file mode 100644 index 00000000000000..3880e3100e497e --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-function-call.cc @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-function-call.h" + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +V8FunctionCall::V8FunctionCall(V8InspectorImpl* inspector, + v8::Local context, + v8::Local value, const String16& name) + : m_inspector(inspector), + m_context(context), + m_name(toV8String(context->GetIsolate(), name)), + m_value(value) {} + +void V8FunctionCall::appendArgument(v8::Local value) { + m_arguments.push_back(value); +} + +void V8FunctionCall::appendArgument(const String16& argument) { + m_arguments.push_back(toV8String(m_context->GetIsolate(), argument)); +} + +void V8FunctionCall::appendArgument(int argument) { + m_arguments.push_back(v8::Number::New(m_context->GetIsolate(), argument)); +} + +void V8FunctionCall::appendArgument(bool argument) { + m_arguments.push_back(argument ? v8::True(m_context->GetIsolate()) + : v8::False(m_context->GetIsolate())); +} + +v8::Local V8FunctionCall::call(bool& hadException, + bool reportExceptions) { + v8::TryCatch tryCatch(m_context->GetIsolate()); + tryCatch.SetVerbose(reportExceptions); + + v8::Local result = callWithoutExceptionHandling(); + hadException = tryCatch.HasCaught(); + return result; +} + +v8::Local V8FunctionCall::callWithoutExceptionHandling() { + v8::Local thisObject = v8::Local::Cast(m_value); + v8::Local value; + if (!thisObject->Get(m_context, m_name).ToLocal(&value)) + return v8::Local(); + + DCHECK(value->IsFunction()); + + v8::Local function = v8::Local::Cast(value); + std::unique_ptr[]> info( + new v8::Local[m_arguments.size()]); + for (size_t i = 0; i < m_arguments.size(); ++i) { + info[i] = m_arguments[i]; + DCHECK(!info[i].IsEmpty()); + } + + int contextGroupId = V8Debugger::getGroupId(m_context); + if (contextGroupId) { + m_inspector->client()->muteMetrics(contextGroupId); + m_inspector->muteExceptions(contextGroupId); + } + v8::MicrotasksScope microtasksScope(m_context->GetIsolate(), + v8::MicrotasksScope::kDoNotRunMicrotasks); + v8::MaybeLocal maybeResult = function->Call( + m_context, thisObject, static_cast(m_arguments.size()), info.get()); + if (contextGroupId) { + m_inspector->client()->unmuteMetrics(contextGroupId); + m_inspector->unmuteExceptions(contextGroupId); + } + + v8::Local result; + if (!maybeResult.ToLocal(&result)) return v8::Local(); + return result; +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.h b/deps/v8_inspector/src/inspector/v8-function-call.h similarity index 66% rename from deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.h rename to deps/v8_inspector/src/inspector/v8-function-call.h index d853644888c5fc..0337caa339e202 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.h +++ b/deps/v8_inspector/src/inspector/v8-function-call.h @@ -28,39 +28,38 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef V8FunctionCall_h -#define V8FunctionCall_h +#ifndef V8_INSPECTOR_V8FUNCTIONCALL_H_ +#define V8_INSPECTOR_V8FUNCTIONCALL_H_ -#include "platform/inspector_protocol/InspectorProtocol.h" +#include "src/inspector/string-16.h" -#include +#include "include/v8.h" namespace v8_inspector { class V8InspectorImpl; -namespace protocol = blink::protocol; - class V8FunctionCall { -public: - V8FunctionCall(V8InspectorImpl*, v8::Local, v8::Local, const String16& name); + public: + V8FunctionCall(V8InspectorImpl*, v8::Local, v8::Local, + const String16& name); - void appendArgument(v8::Local); - void appendArgument(const String16&); - void appendArgument(int); - void appendArgument(bool); + void appendArgument(v8::Local); + void appendArgument(const String16&); + void appendArgument(int); + void appendArgument(bool); - v8::Local call(bool& hadException, bool reportExceptions = true); - v8::Local callWithoutExceptionHandling(); + v8::Local call(bool& hadException, bool reportExceptions = true); + v8::Local callWithoutExceptionHandling(); -protected: - V8InspectorImpl* m_inspector; - v8::Local m_context; - std::vector> m_arguments; - v8::Local m_name; - v8::Local m_value; + protected: + V8InspectorImpl* m_inspector; + v8::Local m_context; + std::vector> m_arguments; + v8::Local m_name; + v8::Local m_value; }; -} // namespace v8_inspector +} // namespace v8_inspector -#endif // V8FunctionCall +#endif // V8_INSPECTOR_V8FUNCTIONCALL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.cc b/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.cc new file mode 100644 index 00000000000000..84c890bf3f72bf --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.cc @@ -0,0 +1,407 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-heap-profiler-agent-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" + +#include "include/v8-inspector.h" +#include "include/v8-profiler.h" +#include "include/v8-version.h" + +namespace v8_inspector { + +namespace { + +namespace HeapProfilerAgentState { +static const char heapProfilerEnabled[] = "heapProfilerEnabled"; +static const char heapObjectsTrackingEnabled[] = "heapObjectsTrackingEnabled"; +static const char allocationTrackingEnabled[] = "allocationTrackingEnabled"; +static const char samplingHeapProfilerEnabled[] = "samplingHeapProfilerEnabled"; +static const char samplingHeapProfilerInterval[] = + "samplingHeapProfilerInterval"; +} + +class HeapSnapshotProgress final : public v8::ActivityControl { + public: + explicit HeapSnapshotProgress(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + ControlOption ReportProgressValue(int done, int total) override { + m_frontend->reportHeapSnapshotProgress(done, total, + protocol::Maybe()); + if (done >= total) { + m_frontend->reportHeapSnapshotProgress(total, total, true); + } + m_frontend->flush(); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +class GlobalObjectNameResolver final + : public v8::HeapProfiler::ObjectNameResolver { + public: + explicit GlobalObjectNameResolver(V8InspectorSessionImpl* session) + : m_offset(0), m_strings(10000), m_session(session) {} + + const char* GetName(v8::Local object) override { + InspectedContext* context = m_session->inspector()->getContext( + m_session->contextGroupId(), + V8Debugger::contextId(object->CreationContext())); + if (!context) return ""; + String16 name = context->origin(); + size_t length = name.length(); + if (m_offset + length + 1 >= m_strings.size()) return ""; + for (size_t i = 0; i < length; ++i) { + UChar ch = name[i]; + m_strings[m_offset + i] = ch > 0xff ? '?' : static_cast(ch); + } + m_strings[m_offset + length] = '\0'; + char* result = &*m_strings.begin() + m_offset; + m_offset += length + 1; + return result; + } + + private: + size_t m_offset; + std::vector m_strings; + V8InspectorSessionImpl* m_session; +}; + +class HeapSnapshotOutputStream final : public v8::OutputStream { + public: + explicit HeapSnapshotOutputStream(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + void EndOfStream() override {} + int GetChunkSize() override { return 102400; } + WriteResult WriteAsciiChunk(char* data, int size) override { + m_frontend->addHeapSnapshotChunk(String16(data, size)); + m_frontend->flush(); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +v8::Local objectByHeapObjectId(v8::Isolate* isolate, int id) { + v8::HeapProfiler* profiler = isolate->GetHeapProfiler(); + v8::Local value = profiler->FindObjectById(id); + if (value.IsEmpty() || !value->IsObject()) return v8::Local(); + return value.As(); +} + +class InspectableHeapObject final : public V8InspectorSession::Inspectable { + public: + explicit InspectableHeapObject(int heapObjectId) + : m_heapObjectId(heapObjectId) {} + v8::Local get(v8::Local context) override { + return objectByHeapObjectId(context->GetIsolate(), m_heapObjectId); + } + + private: + int m_heapObjectId; +}; + +class HeapStatsStream final : public v8::OutputStream { + public: + explicit HeapStatsStream(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + + void EndOfStream() override {} + + WriteResult WriteAsciiChunk(char* data, int size) override { + DCHECK(false); + return kAbort; + } + + WriteResult WriteHeapStatsChunk(v8::HeapStatsUpdate* updateData, + int count) override { + DCHECK_GT(count, 0); + std::unique_ptr> statsDiff = + protocol::Array::create(); + for (int i = 0; i < count; ++i) { + statsDiff->addItem(updateData[i].index); + statsDiff->addItem(updateData[i].count); + statsDiff->addItem(updateData[i].size); + } + m_frontend->heapStatsUpdate(std::move(statsDiff)); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +} // namespace + +V8HeapProfilerAgentImpl::V8HeapProfilerAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_isolate(session->inspector()->isolate()), + m_frontend(frontendChannel), + m_state(state), + m_hasTimer(false) {} + +V8HeapProfilerAgentImpl::~V8HeapProfilerAgentImpl() {} + +void V8HeapProfilerAgentImpl::restore() { + if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, + false)) + m_frontend.resetProfiles(); + if (m_state->booleanProperty( + HeapProfilerAgentState::heapObjectsTrackingEnabled, false)) + startTrackingHeapObjectsInternal(m_state->booleanProperty( + HeapProfilerAgentState::allocationTrackingEnabled, false)); + if (m_state->booleanProperty( + HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { + ErrorString error; + double samplingInterval = m_state->doubleProperty( + HeapProfilerAgentState::samplingHeapProfilerInterval, -1); + DCHECK_GE(samplingInterval, 0); + startSampling(&error, Maybe(samplingInterval)); + } +} + +void V8HeapProfilerAgentImpl::collectGarbage(ErrorString*) { + m_isolate->LowMemoryNotification(); +} + +void V8HeapProfilerAgentImpl::startTrackingHeapObjects( + ErrorString*, const protocol::Maybe& trackAllocations) { + m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, true); + bool allocationTrackingEnabled = trackAllocations.fromMaybe(false); + m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, + allocationTrackingEnabled); + startTrackingHeapObjectsInternal(allocationTrackingEnabled); +} + +void V8HeapProfilerAgentImpl::stopTrackingHeapObjects( + ErrorString* error, const protocol::Maybe& reportProgress) { + requestHeapStatsUpdate(); + takeHeapSnapshot(error, reportProgress); + stopTrackingHeapObjectsInternal(); +} + +void V8HeapProfilerAgentImpl::enable(ErrorString*) { + m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true); +} + +void V8HeapProfilerAgentImpl::disable(ErrorString* error) { + stopTrackingHeapObjectsInternal(); + if (m_state->booleanProperty( + HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (profiler) profiler->StopSamplingHeapProfiler(); + } + m_isolate->GetHeapProfiler()->ClearObjectIds(); + m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, false); +} + +void V8HeapProfilerAgentImpl::takeHeapSnapshot( + ErrorString* errorString, const protocol::Maybe& reportProgress) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + std::unique_ptr progress; + if (reportProgress.fromMaybe(false)) + progress = wrapUnique(new HeapSnapshotProgress(&m_frontend)); + + GlobalObjectNameResolver resolver(m_session); + const v8::HeapSnapshot* snapshot = + profiler->TakeHeapSnapshot(progress.get(), &resolver); + if (!snapshot) { + *errorString = "Failed to take heap snapshot"; + return; + } + HeapSnapshotOutputStream stream(&m_frontend); + snapshot->Serialize(&stream); + const_cast(snapshot)->Delete(); +} + +void V8HeapProfilerAgentImpl::getObjectByHeapObjectId( + ErrorString* error, const String16& heapSnapshotObjectId, + const protocol::Maybe& objectGroup, + std::unique_ptr* result) { + bool ok; + int id = heapSnapshotObjectId.toInteger(&ok); + if (!ok) { + *error = "Invalid heap snapshot object id"; + return; + } + + v8::HandleScope handles(m_isolate); + v8::Local heapObject = objectByHeapObjectId(m_isolate, id); + if (heapObject.IsEmpty()) { + *error = "Object is not available"; + return; + } + + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { + *error = "Object is not available"; + return; + } + + *result = m_session->wrapObject(heapObject->CreationContext(), heapObject, + objectGroup.fromMaybe(""), false); + if (!result) *error = "Object is not available"; +} + +void V8HeapProfilerAgentImpl::addInspectedHeapObject( + ErrorString* errorString, const String16& inspectedHeapObjectId) { + bool ok; + int id = inspectedHeapObjectId.toInteger(&ok); + if (!ok) { + *errorString = "Invalid heap snapshot object id"; + return; + } + + v8::HandleScope handles(m_isolate); + v8::Local heapObject = objectByHeapObjectId(m_isolate, id); + if (heapObject.IsEmpty()) { + *errorString = "Object is not available"; + return; + } + + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { + *errorString = "Object is not available"; + return; + } + + m_session->addInspectedObject(wrapUnique(new InspectableHeapObject(id))); +} + +void V8HeapProfilerAgentImpl::getHeapObjectId(ErrorString* errorString, + const String16& objectId, + String16* heapSnapshotObjectId) { + v8::HandleScope handles(m_isolate); + v8::Local value; + v8::Local context; + if (!m_session->unwrapObject(errorString, objectId, &value, &context, + nullptr) || + value->IsUndefined()) + return; + + v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value); + *heapSnapshotObjectId = String16::fromInteger(static_cast(id)); +} + +void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() { + HeapStatsStream stream(&m_frontend); + v8::SnapshotObjectId lastSeenObjectId = + m_isolate->GetHeapProfiler()->GetHeapStats(&stream); + m_frontend.lastSeenObjectId( + lastSeenObjectId, m_session->inspector()->client()->currentTimeMS()); +} + +// static +void V8HeapProfilerAgentImpl::onTimer(void* data) { + reinterpret_cast(data)->requestHeapStatsUpdate(); +} + +void V8HeapProfilerAgentImpl::startTrackingHeapObjectsInternal( + bool trackAllocations) { + m_isolate->GetHeapProfiler()->StartTrackingHeapObjects(trackAllocations); + if (!m_hasTimer) { + m_hasTimer = true; + m_session->inspector()->client()->startRepeatingTimer( + 0.05, &V8HeapProfilerAgentImpl::onTimer, reinterpret_cast(this)); + } +} + +void V8HeapProfilerAgentImpl::stopTrackingHeapObjectsInternal() { + if (m_hasTimer) { + m_session->inspector()->client()->cancelTimer( + reinterpret_cast(this)); + m_hasTimer = false; + } + m_isolate->GetHeapProfiler()->StopTrackingHeapObjects(); + m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, + false); + m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, false); +} + +void V8HeapProfilerAgentImpl::startSampling( + ErrorString* errorString, const Maybe& samplingInterval) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + const unsigned defaultSamplingInterval = 1 << 15; + double samplingIntervalValue = + samplingInterval.fromMaybe(defaultSamplingInterval); + m_state->setDouble(HeapProfilerAgentState::samplingHeapProfilerInterval, + samplingIntervalValue); + m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, + true); + profiler->StartSamplingHeapProfiler( + static_cast(samplingIntervalValue), 128, + v8::HeapProfiler::kSamplingForceGC); +} + +namespace { +std::unique_ptr +buildSampingHeapProfileNode(const v8::AllocationProfile::Node* node) { + auto children = protocol::Array< + protocol::HeapProfiler::SamplingHeapProfileNode>::create(); + for (const auto* child : node->children) + children->addItem(buildSampingHeapProfileNode(child)); + size_t selfSize = 0; + for (const auto& allocation : node->allocations) + selfSize += allocation.size * allocation.count; + std::unique_ptr callFrame = + protocol::Runtime::CallFrame::create() + .setFunctionName(toProtocolString(node->name)) + .setScriptId(String16::fromInteger(node->script_id)) + .setUrl(toProtocolString(node->script_name)) + .setLineNumber(node->line_number - 1) + .setColumnNumber(node->column_number - 1) + .build(); + std::unique_ptr result = + protocol::HeapProfiler::SamplingHeapProfileNode::create() + .setCallFrame(std::move(callFrame)) + .setSelfSize(selfSize) + .setChildren(std::move(children)) + .build(); + return result; +} +} // namespace + +void V8HeapProfilerAgentImpl::stopSampling( + ErrorString* errorString, + std::unique_ptr* profile) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + v8::HandleScope scope( + m_isolate); // Allocation profile contains Local handles. + std::unique_ptr v8Profile( + profiler->GetAllocationProfile()); + profiler->StopSamplingHeapProfiler(); + m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, + false); + if (!v8Profile) { + *errorString = "Cannot access v8 sampled heap profile."; + return; + } + v8::AllocationProfile::Node* root = v8Profile->GetRootNode(); + *profile = protocol::HeapProfiler::SamplingHeapProfile::create() + .setHead(buildSampingHeapProfileNode(root)) + .build(); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.h b/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.h new file mode 100644 index 00000000000000..caa969870bacc5 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.h @@ -0,0 +1,73 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ +#define V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/HeapProfiler.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; +using protocol::Maybe; + +class V8HeapProfilerAgentImpl : public protocol::HeapProfiler::Backend { + public: + V8HeapProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8HeapProfilerAgentImpl() override; + void restore(); + + void collectGarbage(ErrorString*) override; + + void enable(ErrorString*) override; + void startTrackingHeapObjects(ErrorString*, + const Maybe& trackAllocations) override; + void stopTrackingHeapObjects(ErrorString*, + const Maybe& reportProgress) override; + + void disable(ErrorString*) override; + + void takeHeapSnapshot(ErrorString*, + const Maybe& reportProgress) override; + + void getObjectByHeapObjectId( + ErrorString*, const String16& heapSnapshotObjectId, + const Maybe& objectGroup, + std::unique_ptr* result) override; + void addInspectedHeapObject(ErrorString*, + const String16& inspectedHeapObjectId) override; + void getHeapObjectId(ErrorString*, const String16& objectId, + String16* heapSnapshotObjectId) override; + + void startSampling(ErrorString*, + const Maybe& samplingInterval) override; + void stopSampling( + ErrorString*, + std::unique_ptr*) override; + + private: + void startTrackingHeapObjectsInternal(bool trackAllocations); + void stopTrackingHeapObjectsInternal(); + void requestHeapStatsUpdate(); + static void onTimer(void*); + + V8InspectorSessionImpl* m_session; + v8::Isolate* m_isolate; + protocol::HeapProfiler::Frontend m_frontend; + protocol::DictionaryValue* m_state; + bool m_hasTimer; + + DISALLOW_COPY_AND_ASSIGN(V8HeapProfilerAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-injected-script-host.cc b/deps/v8_inspector/src/inspector/v8-injected-script-host.cc new file mode 100644 index 00000000000000..dc41ef8631febe --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-injected-script-host.cc @@ -0,0 +1,216 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-injected-script-host.h" + +#include "src/base/macros.h" +#include "src/inspector/injected-script-native.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-internal-value-type.h" +#include "src/inspector/v8-value-copier.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +namespace { + +void setFunctionProperty(v8::Local context, + v8::Local obj, const char* name, + v8::FunctionCallback callback, + v8::Local external) { + v8::Local funcName = + toV8StringInternalized(context->GetIsolate(), name); + v8::Local func; + if (!v8::Function::New(context, callback, external, 0, + v8::ConstructorBehavior::kThrow) + .ToLocal(&func)) + return; + func->SetName(funcName); + createDataProperty(context, obj, funcName, func); +} + +V8InspectorImpl* unwrapInspector( + const v8::FunctionCallbackInfo& info) { + DCHECK(!info.Data().IsEmpty()); + DCHECK(info.Data()->IsExternal()); + V8InspectorImpl* inspector = + static_cast(info.Data().As()->Value()); + DCHECK(inspector); + return inspector; +} + +} // namespace + +v8::Local V8InjectedScriptHost::create( + v8::Local context, V8InspectorImpl* inspector) { + v8::Isolate* isolate = inspector->isolate(); + v8::Local injectedScriptHost = v8::Object::New(isolate); + bool success = injectedScriptHost->SetPrototype(context, v8::Null(isolate)) + .FromMaybe(false); + DCHECK(success); + USE(success); + v8::Local debuggerExternal = + v8::External::New(isolate, inspector); + setFunctionProperty(context, injectedScriptHost, "internalConstructorName", + V8InjectedScriptHost::internalConstructorNameCallback, + debuggerExternal); + setFunctionProperty( + context, injectedScriptHost, "formatAccessorsAsProperties", + V8InjectedScriptHost::formatAccessorsAsProperties, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "subtype", + V8InjectedScriptHost::subtypeCallback, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "getInternalProperties", + V8InjectedScriptHost::getInternalPropertiesCallback, + debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "objectHasOwnProperty", + V8InjectedScriptHost::objectHasOwnPropertyCallback, + debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "bind", + V8InjectedScriptHost::bindCallback, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "proxyTargetValue", + V8InjectedScriptHost::proxyTargetValueCallback, + debuggerExternal); + return injectedScriptHost; +} + +void V8InjectedScriptHost::internalConstructorNameCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1 || !info[0]->IsObject()) return; + + v8::Local object = info[0].As(); + info.GetReturnValue().Set(object->GetConstructorName()); +} + +void V8InjectedScriptHost::formatAccessorsAsProperties( + const v8::FunctionCallbackInfo& info) { + DCHECK_EQ(info.Length(), 2); + info.GetReturnValue().Set(false); + if (!info[1]->IsFunction()) return; + // Check that function is user-defined. + if (info[1].As()->ScriptId() != v8::UnboundScript::kNoScriptId) + return; + info.GetReturnValue().Set( + unwrapInspector(info)->client()->formatAccessorsAsProperties(info[0])); +} + +void V8InjectedScriptHost::subtypeCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1) return; + + v8::Isolate* isolate = info.GetIsolate(); + v8::Local value = info[0]; + if (value->IsObject()) { + v8::Local internalType = v8InternalValueTypeFrom( + isolate->GetCurrentContext(), v8::Local::Cast(value)); + if (internalType->IsString()) { + info.GetReturnValue().Set(internalType); + return; + } + } + if (value->IsArray() || value->IsArgumentsObject()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "array")); + return; + } + if (value->IsTypedArray()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "typedarray")); + return; + } + if (value->IsDate()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "date")); + return; + } + if (value->IsRegExp()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "regexp")); + return; + } + if (value->IsMap() || value->IsWeakMap()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "map")); + return; + } + if (value->IsSet() || value->IsWeakSet()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "set")); + return; + } + if (value->IsMapIterator() || value->IsSetIterator()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "iterator")); + return; + } + if (value->IsGeneratorObject()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "generator")); + return; + } + if (value->IsNativeError()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "error")); + return; + } + if (value->IsProxy()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "proxy")); + return; + } + if (value->IsPromise()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "promise")); + return; + } + std::unique_ptr subtype = + unwrapInspector(info)->client()->valueSubtype(value); + if (subtype) { + info.GetReturnValue().Set(toV8String(isolate, subtype->string())); + return; + } +} + +void V8InjectedScriptHost::getInternalPropertiesCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1) return; + v8::Local properties; + if (unwrapInspector(info) + ->debugger() + ->internalProperties(info.GetIsolate()->GetCurrentContext(), info[0]) + .ToLocal(&properties)) + info.GetReturnValue().Set(properties); +} + +void V8InjectedScriptHost::objectHasOwnPropertyCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 2 || !info[0]->IsObject() || !info[1]->IsString()) return; + bool result = info[0] + .As() + ->HasOwnProperty(info.GetIsolate()->GetCurrentContext(), + v8::Local::Cast(info[1])) + .FromMaybe(false); + info.GetReturnValue().Set(v8::Boolean::New(info.GetIsolate(), result)); +} + +void V8InjectedScriptHost::bindCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 2 || !info[1]->IsString()) return; + InjectedScriptNative* injectedScriptNative = + InjectedScriptNative::fromInjectedScriptHost(info.GetIsolate(), + info.Holder()); + if (!injectedScriptNative) return; + + v8::Local context = info.GetIsolate()->GetCurrentContext(); + v8::Local v8groupName = + info[1]->ToString(context).ToLocalChecked(); + String16 groupName = toProtocolStringWithTypeCheck(v8groupName); + int id = injectedScriptNative->bind(info[0], groupName); + info.GetReturnValue().Set(id); +} + +void V8InjectedScriptHost::proxyTargetValueCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() != 1 || !info[0]->IsProxy()) { + UNREACHABLE(); + return; + } + v8::Local target = info[0].As(); + while (target->IsProxy()) + target = v8::Local::Cast(target)->GetTarget(); + info.GetReturnValue().Set(target); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-injected-script-host.h b/deps/v8_inspector/src/inspector/v8-injected-script-host.h new file mode 100644 index 00000000000000..7d293af5a754d8 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-injected-script-host.h @@ -0,0 +1,46 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ +#define V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorImpl; + +// SECURITY NOTE: Although the InjectedScriptHost is intended for use solely by +// the inspector, +// a reference to the InjectedScriptHost may be leaked to the page being +// inspected. Thus, the +// InjectedScriptHost must never implemment methods that have more power over +// the page than the +// page already has itself (e.g. origin restriction bypasses). + +class V8InjectedScriptHost { + public: + // We expect that debugger outlives any JS context and thus + // V8InjectedScriptHost (owned by JS) + // is destroyed before inspector. + static v8::Local create(v8::Local, V8InspectorImpl*); + + private: + static void internalConstructorNameCallback( + const v8::FunctionCallbackInfo&); + static void formatAccessorsAsProperties( + const v8::FunctionCallbackInfo&); + static void subtypeCallback(const v8::FunctionCallbackInfo&); + static void getInternalPropertiesCallback( + const v8::FunctionCallbackInfo&); + static void objectHasOwnPropertyCallback( + const v8::FunctionCallbackInfo&); + static void bindCallback(const v8::FunctionCallbackInfo&); + static void proxyTargetValueCallback( + const v8::FunctionCallbackInfo&); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ diff --git a/deps/v8_inspector/src/inspector/v8-inspector-impl.cc b/deps/v8_inspector/src/inspector/v8-inspector-impl.cc new file mode 100644 index 00000000000000..bd68548fbf9f82 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-inspector-impl.cc @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2010-2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-inspector-impl.h" + +#include "src/inspector/inspected-context.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-agent-impl.h" +#include "src/inspector/v8-console-message.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" +#include "src/inspector/v8-runtime-agent-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +namespace v8_inspector { + +std::unique_ptr V8Inspector::create(v8::Isolate* isolate, + V8InspectorClient* client) { + return wrapUnique(new V8InspectorImpl(isolate, client)); +} + +V8InspectorImpl::V8InspectorImpl(v8::Isolate* isolate, + V8InspectorClient* client) + : m_isolate(isolate), + m_client(client), + m_debugger(new V8Debugger(isolate, this)), + m_capturingStackTracesCount(0), + m_lastExceptionId(0) {} + +V8InspectorImpl::~V8InspectorImpl() {} + +V8DebuggerAgentImpl* V8InspectorImpl::enabledDebuggerAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8DebuggerAgentImpl* agent = session ? session->debuggerAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +V8RuntimeAgentImpl* V8InspectorImpl::enabledRuntimeAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8RuntimeAgentImpl* agent = session ? session->runtimeAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +V8ProfilerAgentImpl* V8InspectorImpl::enabledProfilerAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8ProfilerAgentImpl* agent = session ? session->profilerAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +v8::MaybeLocal V8InspectorImpl::runCompiledScript( + v8::Local context, v8::Local script) { + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kRunMicrotasks); + int groupId = V8Debugger::getGroupId(context); + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->willExecuteScript(script->GetUnboundScript()->GetId()); + v8::MaybeLocal result = script->Run(context); + // Get agent from the map again, since it could have detached during script + // execution. + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->didExecuteScript(); + return result; +} + +v8::MaybeLocal V8InspectorImpl::callFunction( + v8::Local function, v8::Local context, + v8::Local receiver, int argc, v8::Local info[]) { + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kRunMicrotasks); + int groupId = V8Debugger::getGroupId(context); + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->willExecuteScript(function->ScriptId()); + v8::MaybeLocal result = + function->Call(context, receiver, argc, info); + // Get agent from the map again, since it could have detached during script + // execution. + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->didExecuteScript(); + return result; +} + +v8::MaybeLocal V8InspectorImpl::compileAndRunInternalScript( + v8::Local context, v8::Local source) { + v8::Local script = + compileScript(context, source, String16(), true); + if (script.IsEmpty()) return v8::MaybeLocal(); + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kDoNotRunMicrotasks); + return script->Run(context); +} + +v8::Local V8InspectorImpl::compileScript( + v8::Local context, v8::Local code, + const String16& fileName, bool markAsInternal) { + v8::ScriptOrigin origin( + toV8String(m_isolate, fileName), v8::Integer::New(m_isolate, 0), + v8::Integer::New(m_isolate, 0), + v8::False(m_isolate), // sharable + v8::Local(), + v8::Boolean::New(m_isolate, markAsInternal), // internal + toV8String(m_isolate, String16()), // sourceMap + v8::True(m_isolate)); // opaqueresource + v8::ScriptCompiler::Source source(code, origin); + v8::Local script; + if (!v8::ScriptCompiler::Compile(context, &source, + v8::ScriptCompiler::kNoCompileOptions) + .ToLocal(&script)) + return v8::Local(); + return script; +} + +void V8InspectorImpl::enableStackCapturingIfNeeded() { + if (!m_capturingStackTracesCount) + V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, + true); + ++m_capturingStackTracesCount; +} + +void V8InspectorImpl::disableStackCapturingIfNeeded() { + if (!(--m_capturingStackTracesCount)) + V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, + false); +} + +void V8InspectorImpl::muteExceptions(int contextGroupId) { + m_muteExceptionsMap[contextGroupId]++; +} + +void V8InspectorImpl::unmuteExceptions(int contextGroupId) { + m_muteExceptionsMap[contextGroupId]--; +} + +V8ConsoleMessageStorage* V8InspectorImpl::ensureConsoleMessageStorage( + int contextGroupId) { + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + if (storageIt == m_consoleStorageMap.end()) + storageIt = + m_consoleStorageMap + .insert(std::make_pair( + contextGroupId, + wrapUnique(new V8ConsoleMessageStorage(this, contextGroupId)))) + .first; + return storageIt->second.get(); +} + +bool V8InspectorImpl::hasConsoleMessageStorage(int contextGroupId) { + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + return storageIt != m_consoleStorageMap.end(); +} + +std::unique_ptr V8InspectorImpl::createStackTrace( + v8::Local stackTrace) { + return m_debugger->createStackTrace(stackTrace); +} + +std::unique_ptr V8InspectorImpl::connect( + int contextGroupId, V8Inspector::Channel* channel, + const StringView& state) { + DCHECK(m_sessions.find(contextGroupId) == m_sessions.cend()); + std::unique_ptr session = + V8InspectorSessionImpl::create(this, contextGroupId, channel, state); + m_sessions[contextGroupId] = session.get(); + return std::move(session); +} + +void V8InspectorImpl::disconnect(V8InspectorSessionImpl* session) { + DCHECK(m_sessions.find(session->contextGroupId()) != m_sessions.end()); + m_sessions.erase(session->contextGroupId()); +} + +InspectedContext* V8InspectorImpl::getContext(int groupId, + int contextId) const { + if (!groupId || !contextId) return nullptr; + + ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); + if (contextGroupIt == m_contexts.end()) return nullptr; + + ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); + if (contextIt == contextGroupIt->second->end()) return nullptr; + + return contextIt->second.get(); +} + +void V8InspectorImpl::contextCreated(const V8ContextInfo& info) { + int contextId = m_debugger->markContext(info); + + ContextsByGroupMap::iterator contextIt = m_contexts.find(info.contextGroupId); + if (contextIt == m_contexts.end()) + contextIt = m_contexts + .insert(std::make_pair(info.contextGroupId, + wrapUnique(new ContextByIdMap()))) + .first; + + const auto& contextById = contextIt->second; + + DCHECK(contextById->find(contextId) == contextById->cend()); + InspectedContext* context = new InspectedContext(this, info, contextId); + (*contextById)[contextId] = wrapUnique(context); + SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); + if (sessionIt != m_sessions.end()) + sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); +} + +void V8InspectorImpl::contextDestroyed(v8::Local context) { + int contextId = V8Debugger::contextId(context); + int contextGroupId = V8Debugger::getGroupId(context); + + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + if (storageIt != m_consoleStorageMap.end()) + storageIt->second->contextDestroyed(contextId); + + InspectedContext* inspectedContext = getContext(contextGroupId, contextId); + if (!inspectedContext) return; + + SessionMap::iterator iter = m_sessions.find(contextGroupId); + if (iter != m_sessions.end()) + iter->second->runtimeAgent()->reportExecutionContextDestroyed( + inspectedContext); + discardInspectedContext(contextGroupId, contextId); +} + +void V8InspectorImpl::resetContextGroup(int contextGroupId) { + m_consoleStorageMap.erase(contextGroupId); + m_muteExceptionsMap.erase(contextGroupId); + SessionMap::iterator session = m_sessions.find(contextGroupId); + if (session != m_sessions.end()) session->second->reset(); + m_contexts.erase(contextGroupId); +} + +void V8InspectorImpl::willExecuteScript(v8::Local context, + int scriptId) { + if (V8DebuggerAgentImpl* agent = + enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) + agent->willExecuteScript(scriptId); +} + +void V8InspectorImpl::didExecuteScript(v8::Local context) { + if (V8DebuggerAgentImpl* agent = + enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) + agent->didExecuteScript(); +} + +void V8InspectorImpl::idleStarted() { + for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { + if (it->second->profilerAgent()->idleStarted()) return; + } +} + +void V8InspectorImpl::idleFinished() { + for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { + if (it->second->profilerAgent()->idleFinished()) return; + } +} + +unsigned V8InspectorImpl::exceptionThrown( + v8::Local context, const StringView& message, + v8::Local exception, const StringView& detailedMessage, + const StringView& url, unsigned lineNumber, unsigned columnNumber, + std::unique_ptr stackTrace, int scriptId) { + int contextGroupId = V8Debugger::getGroupId(context); + if (!contextGroupId || m_muteExceptionsMap[contextGroupId]) return 0; + std::unique_ptr stackTraceImpl = + wrapUnique(static_cast(stackTrace.release())); + unsigned exceptionId = nextExceptionId(); + std::unique_ptr consoleMessage = + V8ConsoleMessage::createForException( + m_client->currentTimeMS(), toString16(detailedMessage), + toString16(url), lineNumber, columnNumber, std::move(stackTraceImpl), + scriptId, m_isolate, toString16(message), + V8Debugger::contextId(context), exception, exceptionId); + ensureConsoleMessageStorage(contextGroupId) + ->addMessage(std::move(consoleMessage)); + return exceptionId; +} + +void V8InspectorImpl::exceptionRevoked(v8::Local context, + unsigned exceptionId, + const StringView& message) { + int contextGroupId = V8Debugger::getGroupId(context); + if (!contextGroupId) return; + + std::unique_ptr consoleMessage = + V8ConsoleMessage::createForRevokedException( + m_client->currentTimeMS(), toString16(message), exceptionId); + ensureConsoleMessageStorage(contextGroupId) + ->addMessage(std::move(consoleMessage)); +} + +std::unique_ptr V8InspectorImpl::captureStackTrace( + bool fullStack) { + return m_debugger->captureStackTrace(fullStack); +} + +void V8InspectorImpl::asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring) { + m_debugger->asyncTaskScheduled(taskName, task, recurring); +} + +void V8InspectorImpl::asyncTaskCanceled(void* task) { + m_debugger->asyncTaskCanceled(task); +} + +void V8InspectorImpl::asyncTaskStarted(void* task) { + m_debugger->asyncTaskStarted(task); +} + +void V8InspectorImpl::asyncTaskFinished(void* task) { + m_debugger->asyncTaskFinished(task); +} + +void V8InspectorImpl::allAsyncTasksCanceled() { + m_debugger->allAsyncTasksCanceled(); +} + +v8::Local V8InspectorImpl::regexContext() { + if (m_regexContext.IsEmpty()) + m_regexContext.Reset(m_isolate, v8::Context::New(m_isolate)); + return m_regexContext.Get(m_isolate); +} + +void V8InspectorImpl::discardInspectedContext(int contextGroupId, + int contextId) { + if (!getContext(contextGroupId, contextId)) return; + m_contexts[contextGroupId]->erase(contextId); + if (m_contexts[contextGroupId]->empty()) m_contexts.erase(contextGroupId); +} + +const V8InspectorImpl::ContextByIdMap* V8InspectorImpl::contextGroup( + int contextGroupId) { + ContextsByGroupMap::iterator iter = m_contexts.find(contextGroupId); + return iter == m_contexts.end() ? nullptr : iter->second.get(); +} + +V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup( + int contextGroupId) { + if (!contextGroupId) return nullptr; + SessionMap::iterator iter = m_sessions.find(contextGroupId); + return iter == m_sessions.end() ? nullptr : iter->second; +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-inspector-impl.h b/deps/v8_inspector/src/inspector/v8-inspector-impl.h new file mode 100644 index 00000000000000..0ca1a6a7297b02 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-inspector-impl.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2010, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef V8_INSPECTOR_V8INSPECTORIMPL_H_ +#define V8_INSPECTOR_V8INSPECTORIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Protocol.h" + +#include "include/v8-debug.h" +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class InspectedContext; +class V8ConsoleMessageStorage; +class V8Debugger; +class V8DebuggerAgentImpl; +class V8InspectorSessionImpl; +class V8ProfilerAgentImpl; +class V8RuntimeAgentImpl; +class V8StackTraceImpl; + +class V8InspectorImpl : public V8Inspector { + public: + V8InspectorImpl(v8::Isolate*, V8InspectorClient*); + ~V8InspectorImpl() override; + + v8::Isolate* isolate() const { return m_isolate; } + V8InspectorClient* client() { return m_client; } + V8Debugger* debugger() { return m_debugger.get(); } + + v8::MaybeLocal runCompiledScript(v8::Local, + v8::Local); + v8::MaybeLocal callFunction(v8::Local, + v8::Local, + v8::Local receiver, + int argc, v8::Local info[]); + v8::MaybeLocal compileAndRunInternalScript(v8::Local, + v8::Local); + v8::Local compileScript(v8::Local, + v8::Local, + const String16& fileName, + bool markAsInternal); + v8::Local regexContext(); + + // V8Inspector implementation. + std::unique_ptr connect(int contextGroupId, + V8Inspector::Channel*, + const StringView& state) override; + void contextCreated(const V8ContextInfo&) override; + void contextDestroyed(v8::Local) override; + void resetContextGroup(int contextGroupId) override; + void willExecuteScript(v8::Local, int scriptId) override; + void didExecuteScript(v8::Local) override; + void idleStarted() override; + void idleFinished() override; + unsigned exceptionThrown(v8::Local, const StringView& message, + v8::Local exception, + const StringView& detailedMessage, + const StringView& url, unsigned lineNumber, + unsigned columnNumber, std::unique_ptr, + int scriptId) override; + void exceptionRevoked(v8::Local, unsigned exceptionId, + const StringView& message) override; + std::unique_ptr createStackTrace( + v8::Local) override; + std::unique_ptr captureStackTrace(bool fullStack) override; + void asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring) override; + void asyncTaskCanceled(void* task) override; + void asyncTaskStarted(void* task) override; + void asyncTaskFinished(void* task) override; + void allAsyncTasksCanceled() override; + + unsigned nextExceptionId() { return ++m_lastExceptionId; } + void enableStackCapturingIfNeeded(); + void disableStackCapturingIfNeeded(); + void muteExceptions(int contextGroupId); + void unmuteExceptions(int contextGroupId); + V8ConsoleMessageStorage* ensureConsoleMessageStorage(int contextGroupId); + bool hasConsoleMessageStorage(int contextGroupId); + using ContextByIdMap = + protocol::HashMap>; + void discardInspectedContext(int contextGroupId, int contextId); + const ContextByIdMap* contextGroup(int contextGroupId); + void disconnect(V8InspectorSessionImpl*); + V8InspectorSessionImpl* sessionForContextGroup(int contextGroupId); + InspectedContext* getContext(int groupId, int contextId) const; + V8DebuggerAgentImpl* enabledDebuggerAgentForGroup(int contextGroupId); + V8RuntimeAgentImpl* enabledRuntimeAgentForGroup(int contextGroupId); + V8ProfilerAgentImpl* enabledProfilerAgentForGroup(int contextGroupId); + + private: + v8::Isolate* m_isolate; + V8InspectorClient* m_client; + std::unique_ptr m_debugger; + v8::Global m_regexContext; + int m_capturingStackTracesCount; + unsigned m_lastExceptionId; + + using MuteExceptionsMap = protocol::HashMap; + MuteExceptionsMap m_muteExceptionsMap; + + using ContextsByGroupMap = + protocol::HashMap>; + ContextsByGroupMap m_contexts; + + using SessionMap = protocol::HashMap; + SessionMap m_sessions; + + using ConsoleStorageMap = + protocol::HashMap>; + ConsoleStorageMap m_consoleStorageMap; + + DISALLOW_COPY_AND_ASSIGN(V8InspectorImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INSPECTORIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-inspector-session-impl.cc b/deps/v8_inspector/src/inspector/v8-inspector-session-impl.cc new file mode 100644 index 00000000000000..9a0f652c4ca4ae --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-inspector-session-impl.cc @@ -0,0 +1,418 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-inspector-session-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/inspected-context.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/remote-object-id.h" +#include "src/inspector/search-util.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-agent-impl.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-heap-profiler-agent-impl.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" +#include "src/inspector/v8-runtime-agent-impl.h" +#include "src/inspector/v8-schema-agent-impl.h" + +namespace v8_inspector { + +// static +bool V8InspectorSession::canDispatchMethod(const StringView& method) { + return stringViewStartsWith(method, + protocol::Runtime::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Debugger::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Profiler::Metainfo::commandPrefix) || + stringViewStartsWith( + method, protocol::HeapProfiler::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Console::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Schema::Metainfo::commandPrefix); +} + +std::unique_ptr V8InspectorSessionImpl::create( + V8InspectorImpl* inspector, int contextGroupId, + V8Inspector::Channel* channel, const StringView& state) { + return wrapUnique( + new V8InspectorSessionImpl(inspector, contextGroupId, channel, state)); +} + +V8InspectorSessionImpl::V8InspectorSessionImpl(V8InspectorImpl* inspector, + int contextGroupId, + V8Inspector::Channel* channel, + const StringView& savedState) + : m_contextGroupId(contextGroupId), + m_inspector(inspector), + m_channel(channel), + m_customObjectFormatterEnabled(false), + m_dispatcher(this), + m_state(nullptr), + m_runtimeAgent(nullptr), + m_debuggerAgent(nullptr), + m_heapProfilerAgent(nullptr), + m_profilerAgent(nullptr), + m_consoleAgent(nullptr), + m_schemaAgent(nullptr) { + if (savedState.length()) { + std::unique_ptr state = + protocol::parseJSON(toString16(savedState)); + if (state) m_state = protocol::DictionaryValue::cast(std::move(state)); + if (!m_state) m_state = protocol::DictionaryValue::create(); + } else { + m_state = protocol::DictionaryValue::create(); + } + + m_runtimeAgent = wrapUnique(new V8RuntimeAgentImpl( + this, this, agentState(protocol::Runtime::Metainfo::domainName))); + protocol::Runtime::Dispatcher::wire(&m_dispatcher, m_runtimeAgent.get()); + + m_debuggerAgent = wrapUnique(new V8DebuggerAgentImpl( + this, this, agentState(protocol::Debugger::Metainfo::domainName))); + protocol::Debugger::Dispatcher::wire(&m_dispatcher, m_debuggerAgent.get()); + + m_profilerAgent = wrapUnique(new V8ProfilerAgentImpl( + this, this, agentState(protocol::Profiler::Metainfo::domainName))); + protocol::Profiler::Dispatcher::wire(&m_dispatcher, m_profilerAgent.get()); + + m_heapProfilerAgent = wrapUnique(new V8HeapProfilerAgentImpl( + this, this, agentState(protocol::HeapProfiler::Metainfo::domainName))); + protocol::HeapProfiler::Dispatcher::wire(&m_dispatcher, + m_heapProfilerAgent.get()); + + m_consoleAgent = wrapUnique(new V8ConsoleAgentImpl( + this, this, agentState(protocol::Console::Metainfo::domainName))); + protocol::Console::Dispatcher::wire(&m_dispatcher, m_consoleAgent.get()); + + m_schemaAgent = wrapUnique(new V8SchemaAgentImpl( + this, this, agentState(protocol::Schema::Metainfo::domainName))); + protocol::Schema::Dispatcher::wire(&m_dispatcher, m_schemaAgent.get()); + + if (savedState.length()) { + m_runtimeAgent->restore(); + m_debuggerAgent->restore(); + m_heapProfilerAgent->restore(); + m_profilerAgent->restore(); + m_consoleAgent->restore(); + } +} + +V8InspectorSessionImpl::~V8InspectorSessionImpl() { + ErrorString errorString; + m_consoleAgent->disable(&errorString); + m_profilerAgent->disable(&errorString); + m_heapProfilerAgent->disable(&errorString); + m_debuggerAgent->disable(&errorString); + m_runtimeAgent->disable(&errorString); + + discardInjectedScripts(); + m_inspector->disconnect(this); +} + +protocol::DictionaryValue* V8InspectorSessionImpl::agentState( + const String16& name) { + protocol::DictionaryValue* state = m_state->getObject(name); + if (!state) { + std::unique_ptr newState = + protocol::DictionaryValue::create(); + state = newState.get(); + m_state->setObject(name, std::move(newState)); + } + return state; +} + +void V8InspectorSessionImpl::sendProtocolResponse(int callId, + const String16& message) { + m_channel->sendProtocolResponse(callId, toStringView(message)); +} + +void V8InspectorSessionImpl::sendProtocolNotification(const String16& message) { + m_channel->sendProtocolNotification(toStringView(message)); +} + +void V8InspectorSessionImpl::flushProtocolNotifications() { + m_channel->flushProtocolNotifications(); +} + +void V8InspectorSessionImpl::reset() { + m_debuggerAgent->reset(); + m_runtimeAgent->reset(); + discardInjectedScripts(); +} + +void V8InspectorSessionImpl::discardInjectedScripts() { + m_inspectedObjects.clear(); + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + + std::vector keys; + keys.reserve(contexts->size()); + for (auto& idContext : *contexts) keys.push_back(idContext.first); + for (auto& key : keys) { + contexts = m_inspector->contextGroup(m_contextGroupId); + if (!contexts) continue; + auto contextIt = contexts->find(key); + if (contextIt != contexts->end()) + contextIt->second + ->discardInjectedScript(); // This may destroy some contexts. + } +} + +InjectedScript* V8InspectorSessionImpl::findInjectedScript( + ErrorString* errorString, int contextId) { + if (!contextId) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + auto contextsIt = contexts->find(contextId); + if (contextsIt == contexts->end()) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + const std::unique_ptr& context = contextsIt->second; + if (!context->getInjectedScript()) { + context->createInjectedScript(); + if (!context->getInjectedScript()) { + *errorString = "Cannot access specified execution context"; + return nullptr; + } + if (m_customObjectFormatterEnabled) + context->getInjectedScript()->setCustomObjectFormatterEnabled(true); + } + return context->getInjectedScript(); +} + +InjectedScript* V8InspectorSessionImpl::findInjectedScript( + ErrorString* errorString, RemoteObjectIdBase* objectId) { + return objectId ? findInjectedScript(errorString, objectId->contextId()) + : nullptr; +} + +void V8InspectorSessionImpl::releaseObjectGroup(const StringView& objectGroup) { + releaseObjectGroup(toString16(objectGroup)); +} + +void V8InspectorSessionImpl::releaseObjectGroup(const String16& objectGroup) { + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + + std::vector keys; + for (auto& idContext : *contexts) keys.push_back(idContext.first); + for (auto& key : keys) { + contexts = m_inspector->contextGroup(m_contextGroupId); + if (!contexts) continue; + auto contextsIt = contexts->find(key); + if (contextsIt == contexts->end()) continue; + InjectedScript* injectedScript = contextsIt->second->getInjectedScript(); + if (injectedScript) + injectedScript->releaseObjectGroup( + objectGroup); // This may destroy some contexts. + } +} + +bool V8InspectorSessionImpl::unwrapObject( + std::unique_ptr* error, const StringView& objectId, + v8::Local* object, v8::Local* context, + std::unique_ptr* objectGroup) { + ErrorString errorString; + String16 objectGroupString; + bool result = + unwrapObject(&errorString, toString16(objectId), object, context, + objectGroup ? &objectGroupString : nullptr); + if (error) *error = StringBufferImpl::adopt(errorString); + if (objectGroup) *objectGroup = StringBufferImpl::adopt(objectGroupString); + return result; +} + +bool V8InspectorSessionImpl::unwrapObject(ErrorString* errorString, + const String16& objectId, + v8::Local* object, + v8::Local* context, + String16* objectGroup) { + std::unique_ptr remoteId = + RemoteObjectId::parse(errorString, objectId); + if (!remoteId) return false; + InjectedScript* injectedScript = + findInjectedScript(errorString, remoteId.get()); + if (!injectedScript) return false; + if (!injectedScript->findObject(errorString, *remoteId, object)) return false; + *context = injectedScript->context()->context(); + if (objectGroup) *objectGroup = injectedScript->objectGroupName(*remoteId); + return true; +} + +std::unique_ptr +V8InspectorSessionImpl::wrapObject(v8::Local context, + v8::Local value, + const StringView& groupName) { + return wrapObject(context, value, toString16(groupName), false); +} + +std::unique_ptr +V8InspectorSessionImpl::wrapObject(v8::Local context, + v8::Local value, + const String16& groupName, + bool generatePreview) { + ErrorString errorString; + InjectedScript* injectedScript = + findInjectedScript(&errorString, V8Debugger::contextId(context)); + if (!injectedScript) return nullptr; + return injectedScript->wrapObject(&errorString, value, groupName, false, + generatePreview); +} + +std::unique_ptr +V8InspectorSessionImpl::wrapTable(v8::Local context, + v8::Local table, + v8::Local columns) { + ErrorString errorString; + InjectedScript* injectedScript = + findInjectedScript(&errorString, V8Debugger::contextId(context)); + if (!injectedScript) return nullptr; + return injectedScript->wrapTable(table, columns); +} + +void V8InspectorSessionImpl::setCustomObjectFormatterEnabled(bool enabled) { + m_customObjectFormatterEnabled = enabled; + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + for (auto& idContext : *contexts) { + InjectedScript* injectedScript = idContext.second->getInjectedScript(); + if (injectedScript) + injectedScript->setCustomObjectFormatterEnabled(enabled); + } +} + +void V8InspectorSessionImpl::reportAllContexts(V8RuntimeAgentImpl* agent) { + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + for (auto& idContext : *contexts) + agent->reportExecutionContextCreated(idContext.second.get()); +} + +void V8InspectorSessionImpl::dispatchProtocolMessage( + const StringView& message) { + m_dispatcher.dispatch(protocol::parseJSON(message)); +} + +std::unique_ptr V8InspectorSessionImpl::stateJSON() { + String16 json = m_state->toJSONString(); + return StringBufferImpl::adopt(json); +} + +std::vector> +V8InspectorSessionImpl::supportedDomains() { + std::vector> domains = + supportedDomainsImpl(); + std::vector> result; + for (size_t i = 0; i < domains.size(); ++i) + result.push_back(std::move(domains[i])); + return result; +} + +std::vector> +V8InspectorSessionImpl::supportedDomainsImpl() { + std::vector> result; + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Runtime::Metainfo::domainName) + .setVersion(protocol::Runtime::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Debugger::Metainfo::domainName) + .setVersion(protocol::Debugger::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Profiler::Metainfo::domainName) + .setVersion(protocol::Profiler::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::HeapProfiler::Metainfo::domainName) + .setVersion(protocol::HeapProfiler::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Schema::Metainfo::domainName) + .setVersion(protocol::Schema::Metainfo::version) + .build()); + return result; +} + +void V8InspectorSessionImpl::addInspectedObject( + std::unique_ptr inspectable) { + m_inspectedObjects.insert(m_inspectedObjects.begin(), std::move(inspectable)); + if (m_inspectedObjects.size() > kInspectedObjectBufferSize) + m_inspectedObjects.resize(kInspectedObjectBufferSize); +} + +V8InspectorSession::Inspectable* V8InspectorSessionImpl::inspectedObject( + unsigned num) { + if (num >= m_inspectedObjects.size()) return nullptr; + return m_inspectedObjects[num].get(); +} + +void V8InspectorSessionImpl::schedulePauseOnNextStatement( + const StringView& breakReason, const StringView& breakDetails) { + m_debuggerAgent->schedulePauseOnNextStatement( + toString16(breakReason), + protocol::DictionaryValue::cast(protocol::parseJSON(breakDetails))); +} + +void V8InspectorSessionImpl::cancelPauseOnNextStatement() { + m_debuggerAgent->cancelPauseOnNextStatement(); +} + +void V8InspectorSessionImpl::breakProgram(const StringView& breakReason, + const StringView& breakDetails) { + m_debuggerAgent->breakProgram( + toString16(breakReason), + protocol::DictionaryValue::cast(protocol::parseJSON(breakDetails))); +} + +void V8InspectorSessionImpl::setSkipAllPauses(bool skip) { + ErrorString errorString; + m_debuggerAgent->setSkipAllPauses(&errorString, skip); +} + +void V8InspectorSessionImpl::resume() { + ErrorString errorString; + m_debuggerAgent->resume(&errorString); +} + +void V8InspectorSessionImpl::stepOver() { + ErrorString errorString; + m_debuggerAgent->stepOver(&errorString); +} + +std::vector> +V8InspectorSessionImpl::searchInTextByLines(const StringView& text, + const StringView& query, + bool caseSensitive, bool isRegex) { + // TODO(dgozman): search may operate on StringView and avoid copying |text|. + std::vector> matches = + searchInTextByLinesImpl(this, toString16(text), toString16(query), + caseSensitive, isRegex); + std::vector> result; + for (size_t i = 0; i < matches.size(); ++i) + result.push_back(std::move(matches[i])); + return result; +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-inspector-session-impl.h b/deps/v8_inspector/src/inspector/v8-inspector-session-impl.h new file mode 100644 index 00000000000000..e84e8c99a77c3f --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-inspector-session-impl.h @@ -0,0 +1,126 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ +#define V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" +#include "src/inspector/protocol/Schema.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class InjectedScript; +class RemoteObjectIdBase; +class V8ConsoleAgentImpl; +class V8DebuggerAgentImpl; +class V8InspectorImpl; +class V8HeapProfilerAgentImpl; +class V8ProfilerAgentImpl; +class V8RuntimeAgentImpl; +class V8SchemaAgentImpl; + +using protocol::ErrorString; + +class V8InspectorSessionImpl : public V8InspectorSession, + public protocol::FrontendChannel { + public: + static std::unique_ptr create( + V8InspectorImpl*, int contextGroupId, V8Inspector::Channel*, + const StringView& state); + ~V8InspectorSessionImpl(); + + V8InspectorImpl* inspector() const { return m_inspector; } + V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); } + V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); } + V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); } + V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); } + V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); } + int contextGroupId() const { return m_contextGroupId; } + + InjectedScript* findInjectedScript(ErrorString*, int contextId); + InjectedScript* findInjectedScript(ErrorString*, RemoteObjectIdBase*); + void reset(); + void discardInjectedScripts(); + void reportAllContexts(V8RuntimeAgentImpl*); + void setCustomObjectFormatterEnabled(bool); + std::unique_ptr wrapObject( + v8::Local, v8::Local, const String16& groupName, + bool generatePreview); + std::unique_ptr wrapTable( + v8::Local, v8::Local table, + v8::Local columns); + std::vector> supportedDomainsImpl(); + bool unwrapObject(ErrorString*, const String16& objectId, + v8::Local*, v8::Local*, + String16* objectGroup); + void releaseObjectGroup(const String16& objectGroup); + + // V8InspectorSession implementation. + void dispatchProtocolMessage(const StringView& message) override; + std::unique_ptr stateJSON() override; + std::vector> supportedDomains() + override; + void addInspectedObject( + std::unique_ptr) override; + void schedulePauseOnNextStatement(const StringView& breakReason, + const StringView& breakDetails) override; + void cancelPauseOnNextStatement() override; + void breakProgram(const StringView& breakReason, + const StringView& breakDetails) override; + void setSkipAllPauses(bool) override; + void resume() override; + void stepOver() override; + std::vector> + searchInTextByLines(const StringView& text, const StringView& query, + bool caseSensitive, bool isRegex) override; + void releaseObjectGroup(const StringView& objectGroup) override; + bool unwrapObject(std::unique_ptr*, const StringView& objectId, + v8::Local*, v8::Local*, + std::unique_ptr* objectGroup) override; + std::unique_ptr wrapObject( + v8::Local, v8::Local, + const StringView& groupName) override; + + V8InspectorSession::Inspectable* inspectedObject(unsigned num); + static const unsigned kInspectedObjectBufferSize = 5; + + private: + V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, + V8Inspector::Channel*, const StringView& state); + protocol::DictionaryValue* agentState(const String16& name); + + // protocol::FrontendChannel implementation. + void sendProtocolResponse(int callId, const String16& message) override; + void sendProtocolNotification(const String16& message) override; + void flushProtocolNotifications() override; + + int m_contextGroupId; + V8InspectorImpl* m_inspector; + V8Inspector::Channel* m_channel; + bool m_customObjectFormatterEnabled; + + protocol::UberDispatcher m_dispatcher; + std::unique_ptr m_state; + + std::unique_ptr m_runtimeAgent; + std::unique_ptr m_debuggerAgent; + std::unique_ptr m_heapProfilerAgent; + std::unique_ptr m_profilerAgent; + std::unique_ptr m_consoleAgent; + std::unique_ptr m_schemaAgent; + std::vector> + m_inspectedObjects; + + DISALLOW_COPY_AND_ASSIGN(V8InspectorSessionImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-internal-value-type.cc b/deps/v8_inspector/src/inspector/v8-internal-value-type.cc new file mode 100644 index 00000000000000..cde8bc9f7f9957 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-internal-value-type.cc @@ -0,0 +1,77 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-internal-value-type.h" + +#include "src/inspector/protocol-platform.h" +#include "src/inspector/string-util.h" + +namespace v8_inspector { + +namespace { + +v8::Local internalSubtypePrivate(v8::Isolate* isolate) { + return v8::Private::ForApi( + isolate, + toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); +} + +v8::Local subtypeForInternalType(v8::Isolate* isolate, + V8InternalValueType type) { + switch (type) { + case V8InternalValueType::kEntry: + return toV8StringInternalized(isolate, "internal#entry"); + case V8InternalValueType::kLocation: + return toV8StringInternalized(isolate, "internal#location"); + case V8InternalValueType::kScope: + return toV8StringInternalized(isolate, "internal#scope"); + case V8InternalValueType::kScopeList: + return toV8StringInternalized(isolate, "internal#scopeList"); + } + UNREACHABLE(); + return v8::Local(); +} + +} // namespace + +bool markAsInternal(v8::Local context, + v8::Local object, V8InternalValueType type) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + v8::Local subtype = subtypeForInternalType(isolate, type); + return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); +} + +bool markArrayEntriesAsInternal(v8::Local context, + v8::Local array, + V8InternalValueType type) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + v8::Local subtype = subtypeForInternalType(isolate, type); + for (uint32_t i = 0; i < array->Length(); ++i) { + v8::Local entry; + if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) + return false; + if (!entry.As() + ->SetPrivate(context, privateValue, subtype) + .FromMaybe(false)) + return false; + } + return true; +} + +v8::Local v8InternalValueTypeFrom(v8::Local context, + v8::Local object) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + if (!object->HasPrivate(context, privateValue).FromMaybe(false)) + return v8::Null(isolate); + v8::Local subtypeValue; + if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || + !subtypeValue->IsString()) + return v8::Null(isolate); + return subtypeValue; +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-internal-value-type.h b/deps/v8_inspector/src/inspector/v8-internal-value-type.h new file mode 100644 index 00000000000000..e648a0d4a3ec7d --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-internal-value-type.h @@ -0,0 +1,23 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INTERNALVALUETYPE_H_ +#define V8_INSPECTOR_V8INTERNALVALUETYPE_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +enum class V8InternalValueType { kEntry, kLocation, kScope, kScopeList }; + +bool markAsInternal(v8::Local, v8::Local, + V8InternalValueType); +bool markArrayEntriesAsInternal(v8::Local, v8::Local, + V8InternalValueType); +v8::Local v8InternalValueTypeFrom(v8::Local, + v8::Local); + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INTERNALVALUETYPE_H_ diff --git a/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.cc b/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.cc new file mode 100644 index 00000000000000..0511ca39b55ca1 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.cc @@ -0,0 +1,321 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-profiler-agent-impl.h" + +#include + +#include "src/base/atomicops.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +#include "include/v8-profiler.h" + +namespace v8_inspector { + +namespace ProfilerAgentState { +static const char samplingInterval[] = "samplingInterval"; +static const char userInitiatedProfiling[] = "userInitiatedProfiling"; +static const char profilerEnabled[] = "profilerEnabled"; +} + +namespace { + +std::unique_ptr> +buildInspectorObjectForPositionTicks(const v8::CpuProfileNode* node) { + unsigned lineCount = node->GetHitLineCount(); + if (!lineCount) return nullptr; + auto array = protocol::Array::create(); + std::vector entries(lineCount); + if (node->GetLineTicks(&entries[0], lineCount)) { + for (unsigned i = 0; i < lineCount; i++) { + std::unique_ptr line = + protocol::Profiler::PositionTickInfo::create() + .setLine(entries[i].line) + .setTicks(entries[i].hit_count) + .build(); + array->addItem(std::move(line)); + } + } + return array; +} + +std::unique_ptr buildInspectorObjectFor( + v8::Isolate* isolate, const v8::CpuProfileNode* node) { + v8::HandleScope handleScope(isolate); + auto callFrame = + protocol::Runtime::CallFrame::create() + .setFunctionName(toProtocolString(node->GetFunctionName())) + .setScriptId(String16::fromInteger(node->GetScriptId())) + .setUrl(toProtocolString(node->GetScriptResourceName())) + .setLineNumber(node->GetLineNumber() - 1) + .setColumnNumber(node->GetColumnNumber() - 1) + .build(); + auto result = protocol::Profiler::ProfileNode::create() + .setCallFrame(std::move(callFrame)) + .setHitCount(node->GetHitCount()) + .setId(node->GetNodeId()) + .build(); + + const int childrenCount = node->GetChildrenCount(); + if (childrenCount) { + auto children = protocol::Array::create(); + for (int i = 0; i < childrenCount; i++) + children->addItem(node->GetChild(i)->GetNodeId()); + result->setChildren(std::move(children)); + } + + const char* deoptReason = node->GetBailoutReason(); + if (deoptReason && deoptReason[0] && strcmp(deoptReason, "no reason")) + result->setDeoptReason(deoptReason); + + auto positionTicks = buildInspectorObjectForPositionTicks(node); + if (positionTicks) result->setPositionTicks(std::move(positionTicks)); + + return result; +} + +std::unique_ptr> buildInspectorObjectForSamples( + v8::CpuProfile* v8profile) { + auto array = protocol::Array::create(); + int count = v8profile->GetSamplesCount(); + for (int i = 0; i < count; i++) + array->addItem(v8profile->GetSample(i)->GetNodeId()); + return array; +} + +std::unique_ptr> buildInspectorObjectForTimestamps( + v8::CpuProfile* v8profile) { + auto array = protocol::Array::create(); + int count = v8profile->GetSamplesCount(); + uint64_t lastTime = v8profile->GetStartTime(); + for (int i = 0; i < count; i++) { + uint64_t ts = v8profile->GetSampleTimestamp(i); + array->addItem(static_cast(ts - lastTime)); + lastTime = ts; + } + return array; +} + +void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, + protocol::Array* list) { + list->addItem(buildInspectorObjectFor(isolate, node)); + const int childrenCount = node->GetChildrenCount(); + for (int i = 0; i < childrenCount; i++) + flattenNodesTree(isolate, node->GetChild(i), list); +} + +std::unique_ptr createCPUProfile( + v8::Isolate* isolate, v8::CpuProfile* v8profile) { + auto nodes = protocol::Array::create(); + flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get()); + return protocol::Profiler::Profile::create() + .setNodes(std::move(nodes)) + .setStartTime(static_cast(v8profile->GetStartTime())) + .setEndTime(static_cast(v8profile->GetEndTime())) + .setSamples(buildInspectorObjectForSamples(v8profile)) + .setTimeDeltas(buildInspectorObjectForTimestamps(v8profile)) + .build(); +} + +std::unique_ptr currentDebugLocation( + V8InspectorImpl* inspector) { + std::unique_ptr callStack = + inspector->debugger()->captureStackTrace(false /* fullStack */); + auto location = protocol::Debugger::Location::create() + .setScriptId(toString16(callStack->topScriptId())) + .setLineNumber(callStack->topLineNumber()) + .build(); + location->setColumnNumber(callStack->topColumnNumber()); + return location; +} + +volatile int s_lastProfileId = 0; + +} // namespace + +class V8ProfilerAgentImpl::ProfileDescriptor { + public: + ProfileDescriptor(const String16& id, const String16& title) + : m_id(id), m_title(title) {} + String16 m_id; + String16 m_title; +}; + +V8ProfilerAgentImpl::V8ProfilerAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_isolate(m_session->inspector()->isolate()), + m_profiler(nullptr), + m_state(state), + m_frontend(frontendChannel), + m_enabled(false), + m_recordingCPUProfile(false) {} + +V8ProfilerAgentImpl::~V8ProfilerAgentImpl() { + if (m_profiler) m_profiler->Dispose(); +} + +void V8ProfilerAgentImpl::consoleProfile(const String16& title) { + if (!m_enabled) return; + String16 id = nextProfileId(); + m_startedProfiles.push_back(ProfileDescriptor(id, title)); + startProfiling(id); + m_frontend.consoleProfileStarted( + id, currentDebugLocation(m_session->inspector()), title); +} + +void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) { + if (!m_enabled) return; + String16 id; + String16 resolvedTitle; + // Take last started profile if no title was passed. + if (title.isEmpty()) { + if (m_startedProfiles.empty()) return; + id = m_startedProfiles.back().m_id; + resolvedTitle = m_startedProfiles.back().m_title; + m_startedProfiles.pop_back(); + } else { + for (size_t i = 0; i < m_startedProfiles.size(); i++) { + if (m_startedProfiles[i].m_title == title) { + resolvedTitle = title; + id = m_startedProfiles[i].m_id; + m_startedProfiles.erase(m_startedProfiles.begin() + i); + break; + } + } + if (id.isEmpty()) return; + } + std::unique_ptr profile = + stopProfiling(id, true); + if (!profile) return; + std::unique_ptr location = + currentDebugLocation(m_session->inspector()); + m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile), + resolvedTitle); +} + +void V8ProfilerAgentImpl::enable(ErrorString*) { + if (m_enabled) return; + m_enabled = true; + DCHECK(!m_profiler); + m_profiler = v8::CpuProfiler::New(m_isolate); + m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); +} + +void V8ProfilerAgentImpl::disable(ErrorString* errorString) { + if (!m_enabled) return; + for (size_t i = m_startedProfiles.size(); i > 0; --i) + stopProfiling(m_startedProfiles[i - 1].m_id, false); + m_startedProfiles.clear(); + stop(nullptr, nullptr); + m_profiler->Dispose(); + m_profiler = nullptr; + m_enabled = false; + m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); +} + +void V8ProfilerAgentImpl::setSamplingInterval(ErrorString* error, + int interval) { + if (m_recordingCPUProfile) { + *error = "Cannot change sampling interval when profiling."; + return; + } + m_state->setInteger(ProfilerAgentState::samplingInterval, interval); + m_profiler->SetSamplingInterval(interval); +} + +void V8ProfilerAgentImpl::restore() { + DCHECK(!m_enabled); + if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) + return; + m_enabled = true; + DCHECK(!m_profiler); + m_profiler = v8::CpuProfiler::New(m_isolate); + int interval = 0; + m_state->getInteger(ProfilerAgentState::samplingInterval, &interval); + if (interval) m_profiler->SetSamplingInterval(interval); + if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, + false)) { + ErrorString error; + start(&error); + } +} + +void V8ProfilerAgentImpl::start(ErrorString* error) { + if (m_recordingCPUProfile) return; + if (!m_enabled) { + *error = "Profiler is not enabled"; + return; + } + m_recordingCPUProfile = true; + m_frontendInitiatedProfileId = nextProfileId(); + startProfiling(m_frontendInitiatedProfileId); + m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); +} + +void V8ProfilerAgentImpl::stop( + ErrorString* errorString, + std::unique_ptr* profile) { + if (!m_recordingCPUProfile) { + if (errorString) *errorString = "No recording profiles found"; + return; + } + m_recordingCPUProfile = false; + std::unique_ptr cpuProfile = + stopProfiling(m_frontendInitiatedProfileId, !!profile); + if (profile) { + *profile = std::move(cpuProfile); + if (!profile->get() && errorString) *errorString = "Profile is not found"; + } + m_frontendInitiatedProfileId = String16(); + m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); +} + +String16 V8ProfilerAgentImpl::nextProfileId() { + return String16::fromInteger( + v8::base::NoBarrier_AtomicIncrement(&s_lastProfileId, 1)); +} + +void V8ProfilerAgentImpl::startProfiling(const String16& title) { + v8::HandleScope handleScope(m_isolate); + m_profiler->StartProfiling(toV8String(m_isolate, title), true); +} + +std::unique_ptr V8ProfilerAgentImpl::stopProfiling( + const String16& title, bool serialize) { + v8::HandleScope handleScope(m_isolate); + v8::CpuProfile* profile = + m_profiler->StopProfiling(toV8String(m_isolate, title)); + if (!profile) return nullptr; + std::unique_ptr result; + if (serialize) result = createCPUProfile(m_isolate, profile); + profile->Delete(); + return result; +} + +bool V8ProfilerAgentImpl::isRecording() const { + return m_recordingCPUProfile || !m_startedProfiles.empty(); +} + +bool V8ProfilerAgentImpl::idleStarted() { + if (m_profiler) m_profiler->SetIdle(true); + return m_profiler; +} + +bool V8ProfilerAgentImpl::idleFinished() { + if (m_profiler) m_profiler->SetIdle(false); + return m_profiler; +} + +void V8ProfilerAgentImpl::collectSample() { + if (m_profiler) m_profiler->CollectSample(); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.h b/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.h new file mode 100644 index 00000000000000..ee8997653af518 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-profiler-agent-impl.h @@ -0,0 +1,74 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ +#define V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Profiler.h" + +namespace v8 { +class CpuProfiler; +class Isolate; +} + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; + +class V8ProfilerAgentImpl : public protocol::Profiler::Backend { + public: + V8ProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8ProfilerAgentImpl() override; + + bool enabled() const { return m_enabled; } + void restore(); + + void enable(ErrorString*) override; + void disable(ErrorString*) override; + void setSamplingInterval(ErrorString*, int) override; + void start(ErrorString*) override; + void stop(ErrorString*, + std::unique_ptr*) override; + + void consoleProfile(const String16& title); + void consoleProfileEnd(const String16& title); + + bool idleStarted(); + bool idleFinished(); + + void collectSample(); + + private: + String16 nextProfileId(); + + void startProfiling(const String16& title); + std::unique_ptr stopProfiling( + const String16& title, bool serialize); + + bool isRecording() const; + + V8InspectorSessionImpl* m_session; + v8::Isolate* m_isolate; + v8::CpuProfiler* m_profiler; + protocol::DictionaryValue* m_state; + protocol::Profiler::Frontend m_frontend; + bool m_enabled; + bool m_recordingCPUProfile; + class ProfileDescriptor; + std::vector m_startedProfiles; + String16 m_frontendInitiatedProfileId; + + DISALLOW_COPY_AND_ASSIGN(V8ProfilerAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-regex.cc b/deps/v8_inspector/src/inspector/v8-regex.cc new file mode 100644 index 00000000000000..47af70d3604ae1 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-regex.cc @@ -0,0 +1,93 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-regex.h" + +#include + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-inspector-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +V8Regex::V8Regex(V8InspectorImpl* inspector, const String16& pattern, + bool caseSensitive, bool multiline) + : m_inspector(inspector) { + v8::Isolate* isolate = m_inspector->isolate(); + v8::HandleScope handleScope(isolate); + v8::Local context = m_inspector->regexContext(); + v8::Context::Scope contextScope(context); + v8::TryCatch tryCatch(isolate); + + unsigned flags = v8::RegExp::kNone; + if (!caseSensitive) flags |= v8::RegExp::kIgnoreCase; + if (multiline) flags |= v8::RegExp::kMultiline; + + v8::Local regex; + if (v8::RegExp::New(context, toV8String(isolate, pattern), + static_cast(flags)) + .ToLocal(®ex)) + m_regex.Reset(isolate, regex); + else if (tryCatch.HasCaught()) + m_errorMessage = toProtocolString(tryCatch.Message()->Get()); + else + m_errorMessage = "Internal error"; +} + +int V8Regex::match(const String16& string, int startFrom, + int* matchLength) const { + if (matchLength) *matchLength = 0; + + if (m_regex.IsEmpty() || string.isEmpty()) return -1; + + // v8 strings are limited to int. + if (string.length() > INT_MAX) return -1; + + v8::Isolate* isolate = m_inspector->isolate(); + v8::HandleScope handleScope(isolate); + v8::Local context = m_inspector->regexContext(); + v8::MicrotasksScope microtasks(isolate, + v8::MicrotasksScope::kDoNotRunMicrotasks); + v8::TryCatch tryCatch(isolate); + + v8::Local regex = m_regex.Get(isolate); + v8::Local exec; + if (!regex->Get(context, toV8StringInternalized(isolate, "exec")) + .ToLocal(&exec)) + return -1; + v8::Local argv[] = { + toV8String(isolate, string.substring(startFrom))}; + v8::Local returnValue; + if (!exec.As() + ->Call(context, regex, arraysize(argv), argv) + .ToLocal(&returnValue)) + return -1; + + // RegExp#exec returns null if there's no match, otherwise it returns an + // Array of strings with the first being the whole match string and others + // being subgroups. The Array also has some random properties tacked on like + // "index" which is the offset of the match. + // + // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec + + DCHECK(!returnValue.IsEmpty()); + if (!returnValue->IsArray()) return -1; + + v8::Local result = returnValue.As(); + v8::Local matchOffset; + if (!result->Get(context, toV8StringInternalized(isolate, "index")) + .ToLocal(&matchOffset)) + return -1; + if (matchLength) { + v8::Local match; + if (!result->Get(context, 0).ToLocal(&match)) return -1; + *matchLength = match.As()->Length(); + } + + return matchOffset.As()->Value() + startFrom; +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-regex.h b/deps/v8_inspector/src/inspector/v8-regex.h new file mode 100644 index 00000000000000..b4b1f8ce13517a --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-regex.h @@ -0,0 +1,37 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8REGEX_H_ +#define V8_INSPECTOR_V8REGEX_H_ + +#include "src/base/macros.h" +#include "src/inspector/string-16.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorImpl; + +enum MultilineMode { MultilineDisabled, MultilineEnabled }; + +class V8Regex { + public: + V8Regex(V8InspectorImpl*, const String16&, bool caseSensitive, + bool multiline = false); + int match(const String16&, int startFrom = 0, int* matchLength = 0) const; + bool isValid() const { return !m_regex.IsEmpty(); } + const String16& errorMessage() const { return m_errorMessage; } + + private: + V8InspectorImpl* m_inspector; + v8::Global m_regex; + String16 m_errorMessage; + + DISALLOW_COPY_AND_ASSIGN(V8Regex); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8REGEX_H_ diff --git a/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.cc b/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.cc new file mode 100644 index 00000000000000..640ec317d23752 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.cc @@ -0,0 +1,738 @@ +/* + * Copyright (C) 2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-runtime-agent-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/inspected-context.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/remote-object-id.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-message.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +namespace V8RuntimeAgentImplState { +static const char customObjectFormatterEnabled[] = + "customObjectFormatterEnabled"; +static const char runtimeEnabled[] = "runtimeEnabled"; +}; + +using protocol::Runtime::RemoteObject; + +static bool hasInternalError(ErrorString* errorString, bool hasError) { + if (hasError) *errorString = "Internal error"; + return hasError; +} + +namespace { + +template +class ProtocolPromiseHandler { + public: + static void add(V8InspectorImpl* inspector, v8::Local context, + v8::MaybeLocal value, + const String16& notPromiseError, int contextGroupId, + int executionContextId, const String16& objectGroup, + bool returnByValue, bool generatePreview, + std::unique_ptr callback) { + if (value.IsEmpty()) { + callback->sendFailure("Internal error"); + return; + } + if (!value.ToLocalChecked()->IsPromise()) { + callback->sendFailure(notPromiseError); + return; + } + v8::MicrotasksScope microtasks_scope(inspector->isolate(), + v8::MicrotasksScope::kRunMicrotasks); + v8::Local promise = + v8::Local::Cast(value.ToLocalChecked()); + Callback* rawCallback = callback.get(); + ProtocolPromiseHandler* handler = new ProtocolPromiseHandler( + inspector, contextGroupId, executionContextId, objectGroup, + returnByValue, generatePreview, std::move(callback)); + v8::Local wrapper = handler->m_wrapper.Get(inspector->isolate()); + + v8::Local thenCallbackFunction = + v8::Function::New(context, thenCallback, wrapper, 0, + v8::ConstructorBehavior::kThrow) + .ToLocalChecked(); + if (promise->Then(context, thenCallbackFunction).IsEmpty()) { + rawCallback->sendFailure("Internal error"); + return; + } + v8::Local catchCallbackFunction = + v8::Function::New(context, catchCallback, wrapper, 0, + v8::ConstructorBehavior::kThrow) + .ToLocalChecked(); + if (promise->Catch(context, catchCallbackFunction).IsEmpty()) { + rawCallback->sendFailure("Internal error"); + return; + } + } + + private: + static void thenCallback(const v8::FunctionCallbackInfo& info) { + ProtocolPromiseHandler* handler = + static_cast*>( + info.Data().As()->Value()); + DCHECK(handler); + v8::Local value = + info.Length() > 0 + ? info[0] + : v8::Local::Cast(v8::Undefined(info.GetIsolate())); + std::unique_ptr wrappedValue( + handler->wrapObject(value)); + if (!wrappedValue) return; + handler->m_callback->sendSuccess( + std::move(wrappedValue), Maybe()); + } + + static void catchCallback(const v8::FunctionCallbackInfo& info) { + ProtocolPromiseHandler* handler = + static_cast*>( + info.Data().As()->Value()); + DCHECK(handler); + v8::Local value = + info.Length() > 0 + ? info[0] + : v8::Local::Cast(v8::Undefined(info.GetIsolate())); + + std::unique_ptr wrappedValue( + handler->wrapObject(value)); + if (!wrappedValue) return; + + std::unique_ptr stack = + handler->m_inspector->debugger()->captureStackTrace(true); + std::unique_ptr exceptionDetails = + protocol::Runtime::ExceptionDetails::create() + .setExceptionId(handler->m_inspector->nextExceptionId()) + .setText("Uncaught (in promise)") + .setLineNumber(stack && !stack->isEmpty() ? stack->topLineNumber() + : 0) + .setColumnNumber( + stack && !stack->isEmpty() ? stack->topColumnNumber() : 0) + .setException(wrappedValue->clone()) + .build(); + if (stack) + exceptionDetails->setStackTrace(stack->buildInspectorObjectImpl()); + if (stack && !stack->isEmpty()) + exceptionDetails->setScriptId(toString16(stack->topScriptId())); + handler->m_callback->sendSuccess(std::move(wrappedValue), + std::move(exceptionDetails)); + } + + ProtocolPromiseHandler(V8InspectorImpl* inspector, int contextGroupId, + int executionContextId, const String16& objectGroup, + bool returnByValue, bool generatePreview, + std::unique_ptr callback) + : m_inspector(inspector), + m_contextGroupId(contextGroupId), + m_executionContextId(executionContextId), + m_objectGroup(objectGroup), + m_returnByValue(returnByValue), + m_generatePreview(generatePreview), + m_callback(std::move(callback)), + m_wrapper(inspector->isolate(), + v8::External::New(inspector->isolate(), this)) { + m_wrapper.SetWeak(this, cleanup, v8::WeakCallbackType::kParameter); + } + + static void cleanup( + const v8::WeakCallbackInfo>& data) { + if (!data.GetParameter()->m_wrapper.IsEmpty()) { + data.GetParameter()->m_wrapper.Reset(); + data.SetSecondPassCallback(cleanup); + } else { + data.GetParameter()->m_callback->sendFailure("Promise was collected"); + delete data.GetParameter(); + } + } + + std::unique_ptr wrapObject( + v8::Local value) { + ErrorString errorString; + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_contextGroupId, m_executionContextId); + if (!scope.initialize()) { + m_callback->sendFailure(errorString); + return nullptr; + } + std::unique_ptr wrappedValue = + scope.injectedScript()->wrapObject(&errorString, value, m_objectGroup, + m_returnByValue, m_generatePreview); + if (!wrappedValue) { + m_callback->sendFailure(errorString); + return nullptr; + } + return wrappedValue; + } + + V8InspectorImpl* m_inspector; + int m_contextGroupId; + int m_executionContextId; + String16 m_objectGroup; + bool m_returnByValue; + bool m_generatePreview; + std::unique_ptr m_callback; + v8::Global m_wrapper; +}; + +template +bool wrapEvaluateResultAsync(InjectedScript* injectedScript, + v8::MaybeLocal maybeResultValue, + const v8::TryCatch& tryCatch, + const String16& objectGroup, bool returnByValue, + bool generatePreview, Callback* callback) { + std::unique_ptr result; + Maybe exceptionDetails; + + ErrorString errorString; + injectedScript->wrapEvaluateResult( + &errorString, maybeResultValue, tryCatch, objectGroup, returnByValue, + generatePreview, &result, &exceptionDetails); + if (errorString.isEmpty()) { + callback->sendSuccess(std::move(result), exceptionDetails); + return true; + } + callback->sendFailure(errorString); + return false; +} + +int ensureContext(ErrorString* errorString, V8InspectorImpl* inspector, + int contextGroupId, const Maybe& executionContextId) { + int contextId; + if (executionContextId.isJust()) { + contextId = executionContextId.fromJust(); + } else { + v8::HandleScope handles(inspector->isolate()); + v8::Local defaultContext = + inspector->client()->ensureDefaultContextInGroup(contextGroupId); + if (defaultContext.IsEmpty()) { + *errorString = "Cannot find default execution context"; + return 0; + } + contextId = V8Debugger::contextId(defaultContext); + } + return contextId; +} + +} // namespace + +V8RuntimeAgentImpl::V8RuntimeAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* FrontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_state(state), + m_frontend(FrontendChannel), + m_inspector(session->inspector()), + m_enabled(false) {} + +V8RuntimeAgentImpl::~V8RuntimeAgentImpl() {} + +void V8RuntimeAgentImpl::evaluate( + const String16& expression, const Maybe& objectGroup, + const Maybe& includeCommandLineAPI, const Maybe& silent, + const Maybe& executionContextId, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr callback) { + ErrorString errorString; + int contextId = + ensureContext(&errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString.isEmpty()) { + callback->sendFailure(errorString); + return; + } + + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); + + if (includeCommandLineAPI.fromMaybe(false) && + !scope.installCommandLineAPI()) { + callback->sendFailure(errorString); + return; + } + + bool evalIsDisabled = !scope.context()->IsCodeGenerationFromStringsAllowed(); + // Temporarily enable allow evals for inspector. + if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(true); + + v8::MaybeLocal maybeResultValue; + v8::Local script = m_inspector->compileScript( + scope.context(), toV8String(m_inspector->isolate(), expression), + String16(), false); + if (!script.IsEmpty()) + maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); + + if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(false); + + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue, + "Result of the evaluation is not a promise", m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::awaitPromise( + const String16& promiseObjectId, const Maybe& returnByValue, + const Maybe& generatePreview, + std::unique_ptr callback) { + ErrorString errorString; + InjectedScript::ObjectScope scope( + &errorString, m_inspector, m_session->contextGroupId(), promiseObjectId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), scope.object(), + "Could not find promise with given id", m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), scope.objectGroupName(), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::callFunctionOn( + const String16& objectId, const String16& expression, + const Maybe>& + optionalArguments, + const Maybe& silent, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr callback) { + ErrorString errorString; + InjectedScript::ObjectScope scope(&errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + std::unique_ptr[]> argv = nullptr; + int argc = 0; + if (optionalArguments.isJust()) { + protocol::Array* arguments = + optionalArguments.fromJust(); + argc = static_cast(arguments->length()); + argv.reset(new v8::Local[argc]); + for (int i = 0; i < argc; ++i) { + v8::Local argumentValue; + if (!scope.injectedScript() + ->resolveCallArgument(&errorString, arguments->get(i)) + .ToLocal(&argumentValue)) { + callback->sendFailure(errorString); + return; + } + argv[i] = argumentValue; + } + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); + + v8::MaybeLocal maybeFunctionValue = + m_inspector->compileAndRunInternalScript( + scope.context(), + toV8String(m_inspector->isolate(), "(" + expression + ")")); + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeFunctionValue, + scope.tryCatch(), scope.objectGroupName(), false, + false, callback.get()); + return; + } + + v8::Local functionValue; + if (!maybeFunctionValue.ToLocal(&functionValue) || + !functionValue->IsFunction()) { + callback->sendFailure("Given expression does not evaluate to a function"); + return; + } + + v8::MaybeLocal maybeResultValue = m_inspector->callFunction( + functionValue.As(), scope.context(), scope.object(), argc, + argv.get()); + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), scope.objectGroupName(), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue, + "Result of the function call is not a promise", + m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), scope.objectGroupName(), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::getProperties( + ErrorString* errorString, const String16& objectId, + const Maybe& ownProperties, const Maybe& accessorPropertiesOnly, + const Maybe& generatePreview, + std::unique_ptr>* + result, + Maybe>* + internalProperties, + Maybe* exceptionDetails) { + using protocol::Runtime::InternalPropertyDescriptor; + + InjectedScript::ObjectScope scope(errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) return; + + scope.ignoreExceptionsAndMuteConsole(); + if (!scope.object()->IsObject()) { + *errorString = "Value with given id is not an object"; + return; + } + + v8::Local object = scope.object().As(); + scope.injectedScript()->getProperties( + errorString, object, scope.objectGroupName(), + ownProperties.fromMaybe(false), accessorPropertiesOnly.fromMaybe(false), + generatePreview.fromMaybe(false), result, exceptionDetails); + if (!errorString->isEmpty() || exceptionDetails->isJust() || + accessorPropertiesOnly.fromMaybe(false)) + return; + v8::Local propertiesArray; + if (hasInternalError(errorString, !m_inspector->debugger() + ->internalProperties(scope.context(), + scope.object()) + .ToLocal(&propertiesArray))) + return; + std::unique_ptr> + propertiesProtocolArray = + protocol::Array::create(); + for (uint32_t i = 0; i < propertiesArray->Length(); i += 2) { + v8::Local name; + if (hasInternalError( + errorString, + !propertiesArray->Get(scope.context(), i).ToLocal(&name)) || + !name->IsString()) + return; + v8::Local value; + if (hasInternalError( + errorString, + !propertiesArray->Get(scope.context(), i + 1).ToLocal(&value))) + return; + std::unique_ptr wrappedValue = + scope.injectedScript()->wrapObject(errorString, value, + scope.objectGroupName()); + if (!wrappedValue) return; + propertiesProtocolArray->addItem( + InternalPropertyDescriptor::create() + .setName(toProtocolString(name.As())) + .setValue(std::move(wrappedValue)) + .build()); + } + if (!propertiesProtocolArray->length()) return; + *internalProperties = std::move(propertiesProtocolArray); +} + +void V8RuntimeAgentImpl::releaseObject(ErrorString* errorString, + const String16& objectId) { + InjectedScript::ObjectScope scope(errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) return; + scope.injectedScript()->releaseObject(objectId); +} + +void V8RuntimeAgentImpl::releaseObjectGroup(ErrorString*, + const String16& objectGroup) { + m_session->releaseObjectGroup(objectGroup); +} + +void V8RuntimeAgentImpl::runIfWaitingForDebugger(ErrorString* errorString) { + m_inspector->client()->runIfWaitingForDebugger(m_session->contextGroupId()); +} + +void V8RuntimeAgentImpl::setCustomObjectFormatterEnabled(ErrorString*, + bool enabled) { + m_state->setBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled, + enabled); + m_session->setCustomObjectFormatterEnabled(enabled); +} + +void V8RuntimeAgentImpl::discardConsoleEntries(ErrorString*) { + V8ConsoleMessageStorage* storage = + m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); + storage->clear(); +} + +void V8RuntimeAgentImpl::compileScript( + ErrorString* errorString, const String16& expression, + const String16& sourceURL, bool persistScript, + const Maybe& executionContextId, Maybe* scriptId, + Maybe* exceptionDetails) { + if (!m_enabled) { + *errorString = "Runtime agent is not enabled"; + return; + } + int contextId = + ensureContext(errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString->isEmpty()) return; + InjectedScript::ContextScope scope(errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) return; + + if (!persistScript) m_inspector->debugger()->muteScriptParsedEvents(); + v8::Local script = m_inspector->compileScript( + scope.context(), toV8String(m_inspector->isolate(), expression), + sourceURL, false); + if (!persistScript) m_inspector->debugger()->unmuteScriptParsedEvents(); + if (script.IsEmpty()) { + if (scope.tryCatch().HasCaught()) + *exceptionDetails = scope.injectedScript()->createExceptionDetails( + errorString, scope.tryCatch(), String16(), false); + else + *errorString = "Script compilation failed"; + return; + } + + if (!persistScript) return; + + String16 scriptValueId = + String16::fromInteger(script->GetUnboundScript()->GetId()); + std::unique_ptr> global( + new v8::Global(m_inspector->isolate(), script)); + m_compiledScripts[scriptValueId] = std::move(global); + *scriptId = scriptValueId; +} + +void V8RuntimeAgentImpl::runScript( + const String16& scriptId, const Maybe& executionContextId, + const Maybe& objectGroup, const Maybe& silent, + const Maybe& includeCommandLineAPI, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& awaitPromise, + std::unique_ptr callback) { + if (!m_enabled) { + callback->sendFailure("Runtime agent is not enabled"); + return; + } + + auto it = m_compiledScripts.find(scriptId); + if (it == m_compiledScripts.end()) { + callback->sendFailure("No script with given id"); + return; + } + + ErrorString errorString; + int contextId = + ensureContext(&errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString.isEmpty()) { + callback->sendFailure(errorString); + return; + } + + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + + std::unique_ptr> scriptWrapper = std::move(it->second); + m_compiledScripts.erase(it); + v8::Local script = scriptWrapper->Get(m_inspector->isolate()); + if (script.IsEmpty()) { + callback->sendFailure("Script execution failed"); + return; + } + + if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) + return; + + v8::MaybeLocal maybeResultValue = + m_inspector->runCompiledScript(scope.context(), script); + + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) return; + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue.ToLocalChecked(), + "Result of the script execution is not a promise", + m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::restore() { + if (!m_state->booleanProperty(V8RuntimeAgentImplState::runtimeEnabled, false)) + return; + m_frontend.executionContextsCleared(); + ErrorString error; + enable(&error); + if (m_state->booleanProperty( + V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) + m_session->setCustomObjectFormatterEnabled(true); +} + +void V8RuntimeAgentImpl::enable(ErrorString* errorString) { + if (m_enabled) return; + m_inspector->client()->beginEnsureAllContextsInGroup( + m_session->contextGroupId()); + m_enabled = true; + m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true); + m_inspector->enableStackCapturingIfNeeded(); + m_session->reportAllContexts(this); + V8ConsoleMessageStorage* storage = + m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); + for (const auto& message : storage->messages()) { + if (!reportMessage(message.get(), false)) return; + } +} + +void V8RuntimeAgentImpl::disable(ErrorString* errorString) { + if (!m_enabled) return; + m_enabled = false; + m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, false); + m_inspector->disableStackCapturingIfNeeded(); + m_session->discardInjectedScripts(); + reset(); + m_inspector->client()->endEnsureAllContextsInGroup( + m_session->contextGroupId()); +} + +void V8RuntimeAgentImpl::reset() { + m_compiledScripts.clear(); + if (m_enabled) { + if (const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_session->contextGroupId())) { + for (auto& idContext : *contexts) idContext.second->setReported(false); + } + m_frontend.executionContextsCleared(); + } +} + +void V8RuntimeAgentImpl::reportExecutionContextCreated( + InspectedContext* context) { + if (!m_enabled) return; + context->setReported(true); + std::unique_ptr description = + protocol::Runtime::ExecutionContextDescription::create() + .setId(context->contextId()) + .setName(context->humanReadableName()) + .setOrigin(context->origin()) + .build(); + if (!context->auxData().isEmpty()) + description->setAuxData(protocol::DictionaryValue::cast( + protocol::parseJSON(context->auxData()))); + m_frontend.executionContextCreated(std::move(description)); +} + +void V8RuntimeAgentImpl::reportExecutionContextDestroyed( + InspectedContext* context) { + if (m_enabled && context->isReported()) { + context->setReported(false); + m_frontend.executionContextDestroyed(context->contextId()); + } +} + +void V8RuntimeAgentImpl::inspect( + std::unique_ptr objectToInspect, + std::unique_ptr hints) { + if (m_enabled) + m_frontend.inspectRequested(std::move(objectToInspect), std::move(hints)); +} + +void V8RuntimeAgentImpl::messageAdded(V8ConsoleMessage* message) { + if (m_enabled) reportMessage(message, true); +} + +bool V8RuntimeAgentImpl::reportMessage(V8ConsoleMessage* message, + bool generatePreview) { + message->reportToFrontend(&m_frontend, m_session, generatePreview); + m_frontend.flush(); + return m_inspector->hasConsoleMessageStorage(m_session->contextGroupId()); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.h b/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.h new file mode 100644 index 00000000000000..edeeed47ed455c --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-runtime-agent-impl.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ +#define V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class InjectedScript; +class InspectedContext; +class RemoteObjectIdBase; +class V8ConsoleMessage; +class V8InspectorImpl; +class V8InspectorSessionImpl; + +using protocol::ErrorString; +using protocol::Maybe; + +class V8RuntimeAgentImpl : public protocol::Runtime::Backend { + public: + V8RuntimeAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8RuntimeAgentImpl() override; + void restore(); + + // Part of the protocol. + void enable(ErrorString*) override; + void disable(ErrorString*) override; + void evaluate(const String16& expression, const Maybe& objectGroup, + const Maybe& includeCommandLineAPI, + const Maybe& silent, const Maybe& executionContextId, + const Maybe& returnByValue, + const Maybe& generatePreview, + const Maybe& userGesture, const Maybe& awaitPromise, + std::unique_ptr) override; + void awaitPromise(const String16& promiseObjectId, + const Maybe& returnByValue, + const Maybe& generatePreview, + std::unique_ptr) override; + void callFunctionOn( + const String16& objectId, const String16& expression, + const Maybe>& + optionalArguments, + const Maybe& silent, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr) override; + void releaseObject(ErrorString*, const String16& objectId) override; + void getProperties( + ErrorString*, const String16& objectId, const Maybe& ownProperties, + const Maybe& accessorPropertiesOnly, + const Maybe& generatePreview, + std::unique_ptr>* + result, + Maybe>* + internalProperties, + Maybe*) override; + void releaseObjectGroup(ErrorString*, const String16& objectGroup) override; + void runIfWaitingForDebugger(ErrorString*) override; + void setCustomObjectFormatterEnabled(ErrorString*, bool) override; + void discardConsoleEntries(ErrorString*) override; + void compileScript(ErrorString*, const String16& expression, + const String16& sourceURL, bool persistScript, + const Maybe& executionContextId, Maybe*, + Maybe*) override; + void runScript(const String16&, const Maybe& executionContextId, + const Maybe& objectGroup, const Maybe& silent, + const Maybe& includeCommandLineAPI, + const Maybe& returnByValue, + const Maybe& generatePreview, + const Maybe& awaitPromise, + std::unique_ptr) override; + + void reset(); + void reportExecutionContextCreated(InspectedContext*); + void reportExecutionContextDestroyed(InspectedContext*); + void inspect(std::unique_ptr objectToInspect, + std::unique_ptr hints); + void messageAdded(V8ConsoleMessage*); + bool enabled() const { return m_enabled; } + + private: + bool reportMessage(V8ConsoleMessage*, bool generatePreview); + + V8InspectorSessionImpl* m_session; + protocol::DictionaryValue* m_state; + protocol::Runtime::Frontend m_frontend; + V8InspectorImpl* m_inspector; + bool m_enabled; + protocol::HashMap>> + m_compiledScripts; + + DISALLOW_COPY_AND_ASSIGN(V8RuntimeAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-schema-agent-impl.cc b/deps/v8_inspector/src/inspector/v8-schema-agent-impl.cc new file mode 100644 index 00000000000000..9eed5bdf813710 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-schema-agent-impl.cc @@ -0,0 +1,29 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-schema-agent-impl.h" + +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/v8-inspector-session-impl.h" + +namespace v8_inspector { + +V8SchemaAgentImpl::V8SchemaAgentImpl(V8InspectorSessionImpl* session, + protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), m_frontend(frontendChannel) {} + +V8SchemaAgentImpl::~V8SchemaAgentImpl() {} + +void V8SchemaAgentImpl::getDomains( + ErrorString*, + std::unique_ptr>* result) { + std::vector> domains = + m_session->supportedDomainsImpl(); + *result = protocol::Array::create(); + for (size_t i = 0; i < domains.size(); ++i) + (*result)->addItem(std::move(domains[i])); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-schema-agent-impl.h b/deps/v8_inspector/src/inspector/v8-schema-agent-impl.h new file mode 100644 index 00000000000000..6150201f8bdace --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-schema-agent-impl.h @@ -0,0 +1,37 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ +#define V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Schema.h" + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; + +class V8SchemaAgentImpl : public protocol::Schema::Backend { + public: + V8SchemaAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8SchemaAgentImpl() override; + + void getDomains( + ErrorString*, + std::unique_ptr>*) override; + + private: + V8InspectorSessionImpl* m_session; + protocol::Schema::Frontend m_frontend; + + DISALLOW_COPY_AND_ASSIGN(V8SchemaAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-stack-trace-impl.cc b/deps/v8_inspector/src/inspector/v8-stack-trace-impl.cc new file mode 100644 index 00000000000000..1a38c6dd82a002 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-stack-trace-impl.cc @@ -0,0 +1,281 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-stack-trace-impl.h" + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" + +#include "include/v8-debug.h" +#include "include/v8-profiler.h" +#include "include/v8-version.h" + +namespace v8_inspector { + +namespace { + +static const v8::StackTrace::StackTraceOptions stackTraceOptions = + static_cast( + v8::StackTrace::kLineNumber | v8::StackTrace::kColumnOffset | + v8::StackTrace::kScriptId | v8::StackTrace::kScriptNameOrSourceURL | + v8::StackTrace::kFunctionName); + +V8StackTraceImpl::Frame toFrame(v8::Local frame) { + String16 scriptId = String16::fromInteger(frame->GetScriptId()); + String16 sourceName; + v8::Local sourceNameValue(frame->GetScriptNameOrSourceURL()); + if (!sourceNameValue.IsEmpty()) + sourceName = toProtocolString(sourceNameValue); + + String16 functionName; + v8::Local functionNameValue(frame->GetFunctionName()); + if (!functionNameValue.IsEmpty()) + functionName = toProtocolString(functionNameValue); + + int sourceLineNumber = frame->GetLineNumber(); + int sourceColumn = frame->GetColumn(); + return V8StackTraceImpl::Frame(functionName, scriptId, sourceName, + sourceLineNumber, sourceColumn); +} + +void toFramesVector(v8::Local stackTrace, + std::vector& frames, + size_t maxStackSize, v8::Isolate* isolate) { + DCHECK(isolate->InContext()); + int frameCount = stackTrace->GetFrameCount(); + if (frameCount > static_cast(maxStackSize)) + frameCount = static_cast(maxStackSize); + for (int i = 0; i < frameCount; i++) { + v8::Local stackFrame = stackTrace->GetFrame(i); + frames.push_back(toFrame(stackFrame)); + } +} + +} // namespace + +V8StackTraceImpl::Frame::Frame() + : m_functionName("undefined"), + m_scriptId(""), + m_scriptName("undefined"), + m_lineNumber(0), + m_columnNumber(0) {} + +V8StackTraceImpl::Frame::Frame(const String16& functionName, + const String16& scriptId, + const String16& scriptName, int lineNumber, + int column) + : m_functionName(functionName), + m_scriptId(scriptId), + m_scriptName(scriptName), + m_lineNumber(lineNumber), + m_columnNumber(column) { + DCHECK(m_lineNumber != v8::Message::kNoLineNumberInfo); + DCHECK(m_columnNumber != v8::Message::kNoColumnInfo); +} + +V8StackTraceImpl::Frame::~Frame() {} + +// buildInspectorObject() and SourceLocation's toTracedValue() should set the +// same fields. +// If either of them is modified, the other should be also modified. +std::unique_ptr +V8StackTraceImpl::Frame::buildInspectorObject() const { + return protocol::Runtime::CallFrame::create() + .setFunctionName(m_functionName) + .setScriptId(m_scriptId) + .setUrl(m_scriptName) + .setLineNumber(m_lineNumber - 1) + .setColumnNumber(m_columnNumber - 1) + .build(); +} + +V8StackTraceImpl::Frame V8StackTraceImpl::Frame::clone() const { + return Frame(m_functionName, m_scriptId, m_scriptName, m_lineNumber, + m_columnNumber); +} + +// static +void V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions( + v8::Isolate* isolate, bool capture) { + isolate->SetCaptureStackTraceForUncaughtExceptions( + capture, V8StackTraceImpl::maxCallStackSizeToCapture, stackTraceOptions); +} + +// static +std::unique_ptr V8StackTraceImpl::create( + V8Debugger* debugger, int contextGroupId, + v8::Local stackTrace, size_t maxStackSize, + const String16& description) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + std::vector frames; + if (!stackTrace.IsEmpty()) + toFramesVector(stackTrace, frames, maxStackSize, isolate); + + int maxAsyncCallChainDepth = 1; + V8StackTraceImpl* asyncCallChain = nullptr; + if (debugger && maxStackSize > 1) { + asyncCallChain = debugger->currentAsyncCallChain(); + maxAsyncCallChainDepth = debugger->maxAsyncCallChainDepth(); + } + // Do not accidentally append async call chain from another group. This should + // not + // happen if we have proper instrumentation, but let's double-check to be + // safe. + if (contextGroupId && asyncCallChain && asyncCallChain->m_contextGroupId && + asyncCallChain->m_contextGroupId != contextGroupId) { + asyncCallChain = nullptr; + maxAsyncCallChainDepth = 1; + } + + // Only the top stack in the chain may be empty, so ensure that second stack + // is non-empty (it's the top of appended chain). + if (asyncCallChain && asyncCallChain->isEmpty()) + asyncCallChain = asyncCallChain->m_parent.get(); + + if (stackTrace.IsEmpty() && !asyncCallChain) return nullptr; + + std::unique_ptr result(new V8StackTraceImpl( + contextGroupId, description, frames, + asyncCallChain ? asyncCallChain->cloneImpl() : nullptr)); + + // Crop to not exceed maxAsyncCallChainDepth. + V8StackTraceImpl* deepest = result.get(); + while (deepest && maxAsyncCallChainDepth) { + deepest = deepest->m_parent.get(); + maxAsyncCallChainDepth--; + } + if (deepest) deepest->m_parent.reset(); + + return result; +} + +// static +std::unique_ptr V8StackTraceImpl::capture( + V8Debugger* debugger, int contextGroupId, size_t maxStackSize, + const String16& description) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handleScope(isolate); + v8::Local stackTrace; + if (isolate->InContext()) { + if (debugger) { + V8InspectorImpl* inspector = debugger->inspector(); + V8ProfilerAgentImpl* profilerAgent = + inspector->enabledProfilerAgentForGroup(contextGroupId); + if (profilerAgent) profilerAgent->collectSample(); + } + stackTrace = v8::StackTrace::CurrentStackTrace( + isolate, static_cast(maxStackSize), stackTraceOptions); + } + return V8StackTraceImpl::create(debugger, contextGroupId, stackTrace, + maxStackSize, description); +} + +std::unique_ptr V8StackTraceImpl::cloneImpl() { + std::vector framesCopy(m_frames); + return wrapUnique( + new V8StackTraceImpl(m_contextGroupId, m_description, framesCopy, + m_parent ? m_parent->cloneImpl() : nullptr)); +} + +std::unique_ptr V8StackTraceImpl::clone() { + std::vector frames; + for (size_t i = 0; i < m_frames.size(); i++) + frames.push_back(m_frames.at(i).clone()); + return wrapUnique( + new V8StackTraceImpl(m_contextGroupId, m_description, frames, nullptr)); +} + +V8StackTraceImpl::V8StackTraceImpl(int contextGroupId, + const String16& description, + std::vector& frames, + std::unique_ptr parent) + : m_contextGroupId(contextGroupId), + m_description(description), + m_parent(std::move(parent)) { + m_frames.swap(frames); +} + +V8StackTraceImpl::~V8StackTraceImpl() {} + +StringView V8StackTraceImpl::topSourceURL() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_scriptName); +} + +int V8StackTraceImpl::topLineNumber() const { + DCHECK(m_frames.size()); + return m_frames[0].m_lineNumber; +} + +int V8StackTraceImpl::topColumnNumber() const { + DCHECK(m_frames.size()); + return m_frames[0].m_columnNumber; +} + +StringView V8StackTraceImpl::topFunctionName() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_functionName); +} + +StringView V8StackTraceImpl::topScriptId() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_scriptId); +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObjectImpl() const { + std::unique_ptr> frames = + protocol::Array::create(); + for (size_t i = 0; i < m_frames.size(); i++) + frames->addItem(m_frames.at(i).buildInspectorObject()); + + std::unique_ptr stackTrace = + protocol::Runtime::StackTrace::create() + .setCallFrames(std::move(frames)) + .build(); + if (!m_description.isEmpty()) stackTrace->setDescription(m_description); + if (m_parent) stackTrace->setParent(m_parent->buildInspectorObjectImpl()); + return stackTrace; +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObjectForTail(V8Debugger* debugger) const { + v8::HandleScope handleScope(v8::Isolate::GetCurrent()); + // Next call collapses possible empty stack and ensures + // maxAsyncCallChainDepth. + std::unique_ptr fullChain = V8StackTraceImpl::create( + debugger, m_contextGroupId, v8::Local(), + V8StackTraceImpl::maxCallStackSizeToCapture); + if (!fullChain || !fullChain->m_parent) return nullptr; + return fullChain->m_parent->buildInspectorObjectImpl(); +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObject() const { + return buildInspectorObjectImpl(); +} + +std::unique_ptr V8StackTraceImpl::toString() const { + String16Builder stackTrace; + for (size_t i = 0; i < m_frames.size(); ++i) { + const Frame& frame = m_frames[i]; + stackTrace.append("\n at " + (frame.functionName().length() + ? frame.functionName() + : "(anonymous function)")); + stackTrace.append(" ("); + stackTrace.append(frame.sourceURL()); + stackTrace.append(':'); + stackTrace.append(String16::fromInteger(frame.lineNumber())); + stackTrace.append(':'); + stackTrace.append(String16::fromInteger(frame.columnNumber())); + stackTrace.append(')'); + } + String16 string = stackTrace.toString(); + return StringBufferImpl::adopt(string); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-stack-trace-impl.h b/deps/v8_inspector/src/inspector/v8-stack-trace-impl.h new file mode 100644 index 00000000000000..f0a452e9390dd8 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-stack-trace-impl.h @@ -0,0 +1,99 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8STACKTRACEIMPL_H_ +#define V8_INSPECTOR_V8STACKTRACEIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class TracedValue; +class V8Debugger; + +// Note: async stack trace may have empty top stack with non-empty tail to +// indicate +// that current native-only state had some async story. +// On the other hand, any non-top async stack is guaranteed to be non-empty. +class V8StackTraceImpl final : public V8StackTrace { + public: + static const size_t maxCallStackSizeToCapture = 200; + + class Frame { + public: + Frame(); + Frame(const String16& functionName, const String16& scriptId, + const String16& scriptName, int lineNumber, int column = 0); + ~Frame(); + + const String16& functionName() const { return m_functionName; } + const String16& scriptId() const { return m_scriptId; } + const String16& sourceURL() const { return m_scriptName; } + int lineNumber() const { return m_lineNumber; } + int columnNumber() const { return m_columnNumber; } + Frame clone() const; + + private: + friend class V8StackTraceImpl; + std::unique_ptr buildInspectorObject() const; + void toTracedValue(TracedValue*) const; + + String16 m_functionName; + String16 m_scriptId; + String16 m_scriptName; + int m_lineNumber; + int m_columnNumber; + }; + + static void setCaptureStackTraceForUncaughtExceptions(v8::Isolate*, + bool capture); + static std::unique_ptr create( + V8Debugger*, int contextGroupId, v8::Local, + size_t maxStackSize, const String16& description = String16()); + static std::unique_ptr capture( + V8Debugger*, int contextGroupId, size_t maxStackSize, + const String16& description = String16()); + + // This method drops the async chain. Use cloneImpl() instead. + std::unique_ptr clone() override; + std::unique_ptr cloneImpl(); + std::unique_ptr buildInspectorObjectForTail( + V8Debugger*) const; + std::unique_ptr buildInspectorObjectImpl() + const; + ~V8StackTraceImpl() override; + + // V8StackTrace implementation. + bool isEmpty() const override { return !m_frames.size(); }; + StringView topSourceURL() const override; + int topLineNumber() const override; + int topColumnNumber() const override; + StringView topScriptId() const override; + StringView topFunctionName() const override; + std::unique_ptr buildInspectorObject() + const override; + std::unique_ptr toString() const override; + + private: + V8StackTraceImpl(int contextGroupId, const String16& description, + std::vector& frames, + std::unique_ptr parent); + + int m_contextGroupId; + String16 m_description; + std::vector m_frames; + std::unique_ptr m_parent; + + DISALLOW_COPY_AND_ASSIGN(V8StackTraceImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8STACKTRACEIMPL_H_ diff --git a/deps/v8_inspector/src/inspector/v8-value-copier.cc b/deps/v8_inspector/src/inspector/v8-value-copier.cc new file mode 100644 index 00000000000000..09d86b7b985016 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-value-copier.cc @@ -0,0 +1,110 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-value-copier.h" + +namespace v8_inspector { + +namespace { + +static int kMaxDepth = 20; +static int kMaxCalls = 1000; + +class V8ValueCopier { + public: + v8::MaybeLocal copy(v8::Local value, int depth) { + if (++m_calls > kMaxCalls || depth > kMaxDepth) + return v8::MaybeLocal(); + + if (value.IsEmpty()) return v8::MaybeLocal(); + if (value->IsNull() || value->IsUndefined() || value->IsBoolean() || + value->IsString() || value->IsNumber()) + return value; + if (!value->IsObject()) return v8::MaybeLocal(); + v8::Local object = value.As(); + if (object->CreationContext() != m_from) return value; + + if (object->IsArray()) { + v8::Local array = object.As(); + v8::Local result = v8::Array::New(m_isolate, array->Length()); + if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) + return v8::MaybeLocal(); + for (uint32_t i = 0; i < array->Length(); ++i) { + v8::Local item; + if (!array->Get(m_from, i).ToLocal(&item)) + return v8::MaybeLocal(); + v8::Local copied; + if (!copy(item, depth + 1).ToLocal(&copied)) + return v8::MaybeLocal(); + if (!createDataProperty(m_to, result, i, copied).FromMaybe(false)) + return v8::MaybeLocal(); + } + return result; + } + + v8::Local result = v8::Object::New(m_isolate); + if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) + return v8::MaybeLocal(); + v8::Local properties; + if (!object->GetOwnPropertyNames(m_from).ToLocal(&properties)) + return v8::MaybeLocal(); + for (uint32_t i = 0; i < properties->Length(); ++i) { + v8::Local name; + if (!properties->Get(m_from, i).ToLocal(&name) || !name->IsString()) + return v8::MaybeLocal(); + v8::Local property; + if (!object->Get(m_from, name).ToLocal(&property)) + return v8::MaybeLocal(); + v8::Local copied; + if (!copy(property, depth + 1).ToLocal(&copied)) + return v8::MaybeLocal(); + if (!createDataProperty(m_to, result, v8::Local::Cast(name), + copied) + .FromMaybe(false)) + return v8::MaybeLocal(); + } + return result; + } + + v8::Isolate* m_isolate; + v8::Local m_from; + v8::Local m_to; + int m_calls; +}; + +} // namespace + +v8::MaybeLocal copyValueFromDebuggerContext( + v8::Isolate* isolate, v8::Local debuggerContext, + v8::Local toContext, v8::Local value) { + V8ValueCopier copier; + copier.m_isolate = isolate; + copier.m_from = debuggerContext; + copier.m_to = toContext; + copier.m_calls = 0; + return copier.copy(value, 0); +} + +v8::Maybe createDataProperty(v8::Local context, + v8::Local object, + v8::Local key, + v8::Local value) { + v8::TryCatch tryCatch(context->GetIsolate()); + v8::Isolate::DisallowJavascriptExecutionScope throwJs( + context->GetIsolate(), + v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); + return object->CreateDataProperty(context, key, value); +} + +v8::Maybe createDataProperty(v8::Local context, + v8::Local array, int index, + v8::Local value) { + v8::TryCatch tryCatch(context->GetIsolate()); + v8::Isolate::DisallowJavascriptExecutionScope throwJs( + context->GetIsolate(), + v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); + return array->CreateDataProperty(context, index, value); +} + +} // namespace v8_inspector diff --git a/deps/v8_inspector/src/inspector/v8-value-copier.h b/deps/v8_inspector/src/inspector/v8-value-copier.h new file mode 100644 index 00000000000000..c24a5648a21642 --- /dev/null +++ b/deps/v8_inspector/src/inspector/v8-value-copier.h @@ -0,0 +1,24 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8VALUECOPIER_H_ +#define V8_INSPECTOR_V8VALUECOPIER_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +v8::MaybeLocal copyValueFromDebuggerContext( + v8::Isolate*, v8::Local debuggerContext, + v8::Local toContext, v8::Local); +v8::Maybe createDataProperty(v8::Local, + v8::Local, + v8::Local key, + v8::Local); +v8::Maybe createDataProperty(v8::Local, v8::Local, + int index, v8::Local); + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8VALUECOPIER_H_ diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/generate-inspector-protocol-version b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py similarity index 59% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/generate-inspector-protocol-version rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py index 8c13092541378d..dd9acad898b43e 100755 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/generate-inspector-protocol-version +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CheckProtocolCompatibility.py @@ -45,11 +45,9 @@ # # Adding --show_changes to the command line prints out a list of valid public API changes. -import collections import copy import os.path import optparse -import re import sys try: @@ -57,10 +55,11 @@ except ImportError: import simplejson as json + def list_to_map(items, key): result = {} for item in items: - if not "experimental" in item and not "hidden" in item: + if "experimental" not in item and "hidden" not in item: result[item[key]] = item return result @@ -95,7 +94,7 @@ def compare_schemas(d_1, d_2, reverse): for name in domains_by_name_1: domain_1 = domains_by_name_1[name] - if not name in domains_by_name_2: + if name not in domains_by_name_2: errors.append("%s: domain has been %s" % (name, removed(reverse))) continue compare_domains(domain_1, domains_by_name_2[name], types_1, types_2, errors, reverse) @@ -108,7 +107,7 @@ def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, revers commands_2 = named_list_to_map(domain_2, "commands", "name") for name in commands_1: command_1 = commands_1[name] - if not name in commands_2: + if name not in commands_2: errors.append("%s.%s: command has been %s" % (domain_1["domain"], name, removed(reverse))) continue compare_commands(domain_name, command_1, commands_2[name], types_map_1, types_map_2, errors, reverse) @@ -117,7 +116,7 @@ def compare_domains(domain_1, domain_2, types_map_1, types_map_2, errors, revers events_2 = named_list_to_map(domain_2, "events", "name") for name in events_1: event_1 = events_1[name] - if not name in events_2: + if name not in events_2: errors.append("%s.%s: event has been %s" % (domain_1["domain"], name, removed(reverse))) continue compare_events(domain_name, event_1, events_2[name], types_map_1, types_map_2, errors, reverse) @@ -146,13 +145,13 @@ def compare_events(domain_name, event_1, event_2, types_map_1, types_map_2, erro def compare_params_list(context, kind, params_1, params_2, types_map_1, types_map_2, depth, errors, reverse): for name in params_1: param_1 = params_1[name] - if not name in params_2: - if not "optional" in param_1: + if name not in params_2: + if "optional" not in param_1: errors.append("%s.%s: required %s has been %s" % (context, name, kind, removed(reverse))) continue param_2 = params_2[name] - if param_2 and "optional" in param_2 and not "optional" in param_1: + if param_2 and "optional" in param_2 and "optional" not in param_1: errors.append("%s.%s: %s %s is now %s" % (context, name, required(reverse), kind, required(not reverse))) continue type_1 = extract_type(param_1, types_map_1, errors) @@ -187,7 +186,7 @@ def compare_types(context, kind, type_1, type_2, types_map_1, types_map_2, depth def extract_type(typed_object, types_map, errors): if "type" in typed_object: - result = { "id": "", "type": typed_object["type"] } + result = {"id": "", "type": typed_object["type"]} if typed_object["type"] == "object": result["properties"] = [] elif typed_object["type"] == "array": @@ -195,9 +194,9 @@ def extract_type(typed_object, types_map, errors): return result elif "$ref" in typed_object: ref = typed_object["$ref"] - if not ref in types_map: + if ref not in types_map: errors.append("Can not resolve type: %s" % ref) - types_map[ref] = { "id": "", "type": "object" } + types_map[ref] = {"id": "", "type": "object"} return types_map[ref] @@ -224,10 +223,11 @@ def normalize_types(obj, domain_name, types): normalize_types(value, domain_name, types) -def load_schema(file, domains): - if not os.path.isfile(file): +def load_schema(file_name, domains): + # pylint: disable=W0613 + if not os.path.isfile(file_name): return - input_file = open(file, "r") + input_file = open(file_name, "r") json_string = input_file.read() parsed_json = json.loads(json_string) domains += parsed_json["domains"] @@ -237,141 +237,141 @@ def load_schema(file, domains): def self_test(): def create_test_schema_1(): return [ - { - "domain": "Network", - "types": [ - { - "id": "LoaderId", - "type": "string" - }, - { - "id": "Headers", - "type": "object" - }, - { - "id": "Request", - "type": "object", - "properties": [ - { "name": "url", "type": "string" }, - { "name": "method", "type": "string" }, - { "name": "headers", "$ref": "Headers" }, - { "name": "becameOptionalField", "type": "string" }, - { "name": "removedField", "type": "string" }, - ] - } - ], - "commands": [ - { - "name": "removedCommand", - }, - { - "name": "setExtraHTTPHeaders", - "parameters": [ - { "name": "headers", "$ref": "Headers" }, - { "name": "mismatched", "type": "string" }, - { "name": "becameOptional", "$ref": "Headers" }, - { "name": "removedRequired", "$ref": "Headers" }, - { "name": "becameRequired", "$ref": "Headers", "optional": True }, - { "name": "removedOptional", "$ref": "Headers", "optional": True }, - ], - "returns": [ - { "name": "mimeType", "type": "string" }, - { "name": "becameOptional", "type": "string" }, - { "name": "removedRequired", "type": "string" }, - { "name": "becameRequired", "type": "string", "optional": True }, - { "name": "removedOptional", "type": "string", "optional": True }, - ] - } - ], - "events": [ - { - "name": "requestWillBeSent", - "parameters": [ - { "name": "frameId", "type": "string", "experimental": True }, - { "name": "request", "$ref": "Request" }, - { "name": "becameOptional", "type": "string" }, - { "name": "removedRequired", "type": "string" }, - { "name": "becameRequired", "type": "string", "optional": True }, - { "name": "removedOptional", "type": "string", "optional": True }, + { + "domain": "Network", + "types": [ + { + "id": "LoaderId", + "type": "string" + }, + { + "id": "Headers", + "type": "object" + }, + { + "id": "Request", + "type": "object", + "properties": [ + {"name": "url", "type": "string"}, + {"name": "method", "type": "string"}, + {"name": "headers", "$ref": "Headers"}, + {"name": "becameOptionalField", "type": "string"}, + {"name": "removedField", "type": "string"}, ] - }, - { - "name": "removedEvent", - "parameters": [ - { "name": "errorText", "type": "string" }, - { "name": "canceled", "type": "boolean", "optional": True } - ] - } - ] - }, - { - "domain": "removedDomain" - } - ] + } + ], + "commands": [ + { + "name": "removedCommand", + }, + { + "name": "setExtraHTTPHeaders", + "parameters": [ + {"name": "headers", "$ref": "Headers"}, + {"name": "mismatched", "type": "string"}, + {"name": "becameOptional", "$ref": "Headers"}, + {"name": "removedRequired", "$ref": "Headers"}, + {"name": "becameRequired", "$ref": "Headers", "optional": True}, + {"name": "removedOptional", "$ref": "Headers", "optional": True}, + ], + "returns": [ + {"name": "mimeType", "type": "string"}, + {"name": "becameOptional", "type": "string"}, + {"name": "removedRequired", "type": "string"}, + {"name": "becameRequired", "type": "string", "optional": True}, + {"name": "removedOptional", "type": "string", "optional": True}, + ] + } + ], + "events": [ + { + "name": "requestWillBeSent", + "parameters": [ + {"name": "frameId", "type": "string", "experimental": True}, + {"name": "request", "$ref": "Request"}, + {"name": "becameOptional", "type": "string"}, + {"name": "removedRequired", "type": "string"}, + {"name": "becameRequired", "type": "string", "optional": True}, + {"name": "removedOptional", "type": "string", "optional": True}, + ] + }, + { + "name": "removedEvent", + "parameters": [ + {"name": "errorText", "type": "string"}, + {"name": "canceled", "type": "boolean", "optional": True} + ] + } + ] + }, + { + "domain": "removedDomain" + } + ] def create_test_schema_2(): return [ - { - "domain": "Network", - "types": [ - { - "id": "LoaderId", - "type": "string" - }, - { - "id": "Request", - "type": "object", - "properties": [ - { "name": "url", "type": "string" }, - { "name": "method", "type": "string" }, - { "name": "headers", "type": "object" }, - { "name": "becameOptionalField", "type": "string", "optional": True }, - ] - } - ], - "commands": [ - { - "name": "addedCommand", - }, - { - "name": "setExtraHTTPHeaders", - "parameters": [ - { "name": "headers", "type": "object" }, - { "name": "mismatched", "type": "object" }, - { "name": "becameOptional", "type": "object" , "optional": True }, - { "name": "addedRequired", "type": "object" }, - { "name": "becameRequired", "type": "object" }, - { "name": "addedOptional", "type": "object", "optional": True }, - ], - "returns": [ - { "name": "mimeType", "type": "string" }, - { "name": "becameOptional", "type": "string", "optional": True }, - { "name": "addedRequired", "type": "string"}, - { "name": "becameRequired", "type": "string" }, - { "name": "addedOptional", "type": "string", "optional": True }, - ] - } - ], - "events": [ - { - "name": "requestWillBeSent", - "parameters": [ - { "name": "request", "$ref": "Request" }, - { "name": "becameOptional", "type": "string", "optional": True }, - { "name": "addedRequired", "type": "string"}, - { "name": "becameRequired", "type": "string" }, - { "name": "addedOptional", "type": "string", "optional": True }, - ] - }, - { - "name": "addedEvent" - } - ] - }, - { - "domain": "addedDomain" - } - ] + { + "domain": "Network", + "types": [ + { + "id": "LoaderId", + "type": "string" + }, + { + "id": "Request", + "type": "object", + "properties": [ + {"name": "url", "type": "string"}, + {"name": "method", "type": "string"}, + {"name": "headers", "type": "object"}, + {"name": "becameOptionalField", "type": "string", "optional": True}, + ] + } + ], + "commands": [ + { + "name": "addedCommand", + }, + { + "name": "setExtraHTTPHeaders", + "parameters": [ + {"name": "headers", "type": "object"}, + {"name": "mismatched", "type": "object"}, + {"name": "becameOptional", "type": "object", "optional": True}, + {"name": "addedRequired", "type": "object"}, + {"name": "becameRequired", "type": "object"}, + {"name": "addedOptional", "type": "object", "optional": True}, + ], + "returns": [ + {"name": "mimeType", "type": "string"}, + {"name": "becameOptional", "type": "string", "optional": True}, + {"name": "addedRequired", "type": "string"}, + {"name": "becameRequired", "type": "string"}, + {"name": "addedOptional", "type": "string", "optional": True}, + ] + } + ], + "events": [ + { + "name": "requestWillBeSent", + "parameters": [ + {"name": "request", "$ref": "Request"}, + {"name": "becameOptional", "type": "string", "optional": True}, + {"name": "addedRequired", "type": "string"}, + {"name": "becameRequired", "type": "string"}, + {"name": "addedOptional", "type": "string", "optional": True}, + ] + }, + { + "name": "addedEvent" + } + ] + }, + { + "domain": "addedDomain" + } + ] expected_errors = [ "removedDomain: domain has been removed", @@ -389,16 +389,16 @@ def create_test_schema_2(): ] expected_errors_reverse = [ - "addedDomain: domain has been added", - "Network.addedEvent: event has been added", - "Network.addedCommand: command has been added", - "Network.setExtraHTTPHeaders.mismatched: parameter base type mismatch, 'string' vs 'object'", - "Network.setExtraHTTPHeaders.removedRequired: required parameter has been removed", - "Network.setExtraHTTPHeaders.becameOptional: required parameter is now optional", - "Network.setExtraHTTPHeaders.addedRequired: required response parameter has been added", - "Network.setExtraHTTPHeaders.becameRequired: optional response parameter is now required", - "Network.requestWillBeSent.becameRequired: optional parameter is now required", - "Network.requestWillBeSent.addedRequired: required parameter has been added", + "addedDomain: domain has been added", + "Network.addedEvent: event has been added", + "Network.addedCommand: command has been added", + "Network.setExtraHTTPHeaders.mismatched: parameter base type mismatch, 'string' vs 'object'", + "Network.setExtraHTTPHeaders.removedRequired: required parameter has been removed", + "Network.setExtraHTTPHeaders.becameOptional: required parameter is now optional", + "Network.setExtraHTTPHeaders.addedRequired: required response parameter has been added", + "Network.setExtraHTTPHeaders.becameRequired: optional response parameter is now required", + "Network.requestWillBeSent.becameRequired: optional parameter is now required", + "Network.requestWillBeSent.addedRequired: required parameter has been added", ] def is_subset(subset, superset, message): @@ -418,11 +418,10 @@ def errors_match(expected, actual): compare_schemas(create_test_schema_2(), create_test_schema_1(), True))) - -def load_domains_and_baselines(file, domains, baseline_domains): - version = load_schema(os.path.normpath(file), domains) +def load_domains_and_baselines(file_name, domains, baseline_domains): + version = load_schema(os.path.normpath(file_name), domains) suffix = "-%s.%s.json" % (version["major"], version["minor"]) - baseline_file = file.replace(".json", suffix) + baseline_file = file_name.replace(".json", suffix) load_schema(os.path.normpath(baseline_file), baseline_domains) return version @@ -434,29 +433,25 @@ def main(): cmdline_parser = optparse.OptionParser() cmdline_parser.add_option("--show_changes") - cmdline_parser.add_option("--o") + cmdline_parser.add_option("--expected_errors") + cmdline_parser.add_option("--stamp") arg_options, arg_values = cmdline_parser.parse_args() - if len(arg_values) < 1 or not arg_options.o: - sys.stderr.write("Usage: %s --o OUTPUT_FILE [--show_changes] PROTOCOL_FOLDER1 ?PROTOCOL_FOLDER2 \n" % sys.argv[0]) + if len(arg_values) < 1: + sys.stderr.write("Usage: %s [--show_changes] [, ...]\n" % sys.argv[0]) return 1 - output_path = arg_options.o - output_file = open(output_path, "w") - domains = [] baseline_domains = [] version = load_domains_and_baselines(arg_values[0], domains, baseline_domains) - if len(arg_values) > 1: - load_domains_and_baselines(arg_values[1], domains, baseline_domains) + for dependency in arg_values[1:]: + load_domains_and_baselines(dependency, domains, baseline_domains) - expected_errors = [ - "Debugger.globalObjectCleared: event has been removed", - "Runtime.executionContextCreated.context parameter->Runtime.ExecutionContextDescription.frameId: required property has been removed", - "Debugger.canSetScriptSource: command has been removed", - "Console.messageRepeatCountUpdated: event has been removed", - "Console.messagesCleared: event has been removed" - ] + expected_errors = [] + if arg_options.expected_errors: + expected_errors_file = open(arg_options.expected_errors, "r") + expected_errors = json.loads(expected_errors_file.read())["errors"] + expected_errors_file.close() errors = compare_schemas(baseline_domains, domains, False) unexpected_errors = [] @@ -466,7 +461,7 @@ def main(): if len(unexpected_errors) > 0: sys.stderr.write(" Compatibility checks FAILED\n") for error in unexpected_errors: - sys.stderr.write( " %s\n" % error) + sys.stderr.write(" %s\n" % error) return 1 if arg_options.show_changes: @@ -476,8 +471,9 @@ def main(): for change in changes: print " %s" % change - json.dump({"version": version, "domains": domains}, output_file, indent=4, sort_keys=False, separators=(',', ': ')) - output_file.close() + if arg_options.stamp: + with open(arg_options.stamp, 'a') as _: + pass if __name__ == '__main__': sys.exit(main()) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/CodeGenerator.py b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py similarity index 78% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/CodeGenerator.py rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py index 985236821316c6..e57e3a23898f88 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/CodeGenerator.py +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py @@ -21,34 +21,6 @@ # is regenerated, which causes a race condition and breaks concurrent build, # since some compile processes will try to read the partially written cache. module_path, module_filename = os.path.split(os.path.realpath(__file__)) -templates_dir = module_path - -# In Blink, jinja2 is in chromium's third_party directory. -# Insert at 1 so at front to override system libraries, and -# after path[0] == invoking script dir -blink_third_party_dir = os.path.normpath(os.path.join( - module_path, os.pardir, os.pardir, os.pardir, os.pardir, os.pardir, - "third_party")) -if os.path.isdir(blink_third_party_dir): - sys.path.insert(1, blink_third_party_dir) - -# In V8, it is in third_party folder -v8_third_party_dir = os.path.normpath(os.path.join( - module_path, os.pardir, os.pardir, "third_party")) - -if os.path.isdir(v8_third_party_dir): - sys.path.insert(1, v8_third_party_dir) - -# In Node, it is in deps folder -deps_dir = os.path.normpath(os.path.join( - module_path, os.pardir, os.pardir, os.pardir, os.pardir, "third_party")) - -if os.path.isdir(deps_dir): - sys.path.insert(1, os.path.join(deps_dir, "jinja2")) - sys.path.insert(1, os.path.join(deps_dir, "markupsafe")) - -import jinja2 - def read_config(): # pylint: disable=W0703 @@ -60,11 +32,30 @@ def json_object_hook(object_dict): return collections.namedtuple('X', keys)(*values) return json.loads(data, object_hook=json_object_hook) + def init_defaults(config_tuple, path, defaults): + keys = list(config_tuple._fields) # pylint: disable=E1101 + values = [getattr(config_tuple, k) for k in keys] + for i in xrange(len(keys)): + if hasattr(values[i], "_fields"): + values[i] = init_defaults(values[i], path + "." + keys[i], defaults) + for optional in defaults: + if optional.find(path + ".") != 0: + continue + optional_key = optional[len(path) + 1:] + if optional_key.find(".") == -1 and optional_key not in keys: + keys.append(optional_key) + values.append(defaults[optional]) + return collections.namedtuple('X', keys)(*values) + try: cmdline_parser = optparse.OptionParser() cmdline_parser.add_option("--output_base") + cmdline_parser.add_option("--jinja_dir") cmdline_parser.add_option("--config") arg_options, _ = cmdline_parser.parse_args() + jinja_dir = arg_options.jinja_dir + if not jinja_dir: + raise Exception("jinja directory must be specified") output_base = arg_options.output_base if not output_base: raise Exception("Base output directory must be specified") @@ -82,14 +73,23 @@ def json_object_hook(object_dict): config_json_file = open(config_file, "r") config_json_string = config_json_file.read() config_partial = json_to_object(config_json_string, output_base, config_base) - keys = list(config_partial._fields) # pylint: disable=E1101 - values = [getattr(config_partial, k) for k in keys] - for optional in ["imported", "exported", "lib"]: - if optional not in keys: - keys.append(optional) - values.append(False) config_json_file.close() - return (config_file, collections.namedtuple('X', keys)(*values)) + defaults = { + ".imported": False, + ".imported.export_macro": "", + ".imported.export_header": False, + ".imported.header": False, + ".imported.package": False, + ".protocol.export_macro": "", + ".protocol.export_header": False, + ".exported": False, + ".exported.export_macro": "", + ".exported.export_header": False, + ".lib": False, + ".lib.export_macro": "", + ".lib.export_header": False, + } + return (jinja_dir, config_file, init_defaults(config_partial, "", defaults)) except Exception: # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html exc = sys.exc_info()[1] @@ -109,9 +109,15 @@ def dash_to_camelcase(word): return prefix + "".join(to_title_case(x) or "-" for x in word.split("-")) -def initialize_jinja_env(cache_dir): +def initialize_jinja_env(jinja_dir, cache_dir): + dir = os.path.abspath(jinja_dir) + # pylint: disable=F0401 + sys.path.insert(1, os.path.join(dir, "jinja2")) + sys.path.insert(1, os.path.join(dir, "markupsafe")) + import jinja2 + jinja_env = jinja2.Environment( - loader=jinja2.FileSystemLoader(templates_dir), + loader=jinja2.FileSystemLoader(module_path), # Bytecode cache is not concurrency-safe unless pre-cached: # if pre-cached this is read-only, but writing creates a race condition. bytecode_cache=jinja2.FileSystemBytecodeCache(cache_dir), @@ -164,18 +170,18 @@ def calculate_exports_in_json(json_value): protocol.json_api["has_exports"] = True -def create_imported_type_definition(domain_name, type): +def create_imported_type_definition(domain_name, type, imported_namespace): # pylint: disable=W0622 return { - "return_type": "std::unique_ptr" % (domain_name, type["id"]), - "pass_type": "std::unique_ptr" % (domain_name, type["id"]), + "return_type": "std::unique_ptr<%s::%s::API::%s>" % (imported_namespace, domain_name, type["id"]), + "pass_type": "std::unique_ptr<%s::%s::API::%s>" % (imported_namespace, domain_name, type["id"]), "to_raw_type": "%s.get()", "to_pass_type": "std::move(%s)", "to_rvalue": "std::move(%s)", - "type": "std::unique_ptr" % (domain_name, type["id"]), - "raw_type": "protocol::%s::API::%s" % (domain_name, type["id"]), - "raw_pass_type": "protocol::%s::API::%s*" % (domain_name, type["id"]), - "raw_return_type": "protocol::%s::API::%s*" % (domain_name, type["id"]), + "type": "std::unique_ptr<%s::%s::API::%s>" % (imported_namespace, domain_name, type["id"]), + "raw_type": "%s::%s::API::%s" % (imported_namespace, domain_name, type["id"]), + "raw_pass_type": "%s::%s::API::%s*" % (imported_namespace, domain_name, type["id"]), + "raw_return_type": "%s::%s::API::%s*" % (imported_namespace, domain_name, type["id"]), } @@ -224,18 +230,18 @@ def create_any_type_definition(): } -def create_string_type_definition(string_type): +def create_string_type_definition(): # pylint: disable=W0622 return { - "return_type": string_type, - "pass_type": ("const %s&" % string_type), + "return_type": "String", + "pass_type": "const String&", "to_pass_type": "%s", "to_raw_type": "%s", "to_rvalue": "%s", - "type": string_type, - "raw_type": string_type, - "raw_pass_type": ("const %s&" % string_type), - "raw_return_type": string_type, + "type": "String", + "raw_type": "String", + "raw_pass_type": "const String&", + "raw_return_type": "String", } @@ -287,7 +293,7 @@ def wrap_array_definition(type): } -def create_type_definitions(protocol, string_type): +def create_type_definitions(protocol, imported_namespace): protocol.type_definitions = {} protocol.type_definitions["number"] = create_primitive_type_definition("number") protocol.type_definitions["integer"] = create_primitive_type_definition("integer") @@ -295,20 +301,20 @@ def create_type_definitions(protocol, string_type): protocol.type_definitions["object"] = create_object_type_definition() protocol.type_definitions["any"] = create_any_type_definition() for domain in protocol.json_api["domains"]: - protocol.type_definitions[domain["domain"] + ".string"] = create_string_type_definition(string_type) + protocol.type_definitions[domain["domain"] + ".string"] = create_string_type_definition() if not ("types" in domain): continue for type in domain["types"]: type_name = domain["domain"] + "." + type["id"] if type["type"] == "object" and domain["domain"] in protocol.imported_domains: - protocol.type_definitions[type_name] = create_imported_type_definition(domain["domain"], type) + protocol.type_definitions[type_name] = create_imported_type_definition(domain["domain"], type, imported_namespace) elif type["type"] == "object": protocol.type_definitions[type_name] = create_user_type_definition(domain["domain"], type) elif type["type"] == "array": items_type = type["items"]["type"] protocol.type_definitions[type_name] = wrap_array_definition(protocol.type_definitions[items_type]) elif type["type"] == domain["domain"] + ".string": - protocol.type_definitions[type_name] = create_string_type_definition(string_type) + protocol.type_definitions[type_name] = create_string_type_definition() else: protocol.type_definitions[type_name] = create_primitive_type_definition(type["type"]) @@ -340,6 +346,10 @@ def has_disable(commands): return False +def format_include(header): + return "\"" + header + "\"" if header[0] not in "<\"" else header + + def read_protocol_file(file_name, json_api): input_file = open(file_name, "r") json_string = input_file.read() @@ -362,7 +372,7 @@ def __init__(self): def main(): - config_file, config = read_config() + jinja_dir, config_file, config = read_config() protocol = Protocol() protocol.json_api = {"domains": []} @@ -370,7 +380,7 @@ def main(): protocol.imported_domains = read_protocol_file(config.imported.path, protocol.json_api) if config.imported else [] patch_full_qualified_refs(protocol) calculate_exports(protocol) - create_type_definitions(protocol, config.string.class_name) + create_type_definitions(protocol, "::".join(config.imported.namespace) if config.imported else "") if not config.exported: for domain_json in protocol.json_api["domains"]: @@ -382,7 +392,7 @@ def main(): os.mkdir(config.protocol.output) if protocol.json_api["has_exports"] and not os.path.exists(config.exported.output): os.mkdir(config.exported.output) - jinja_env = initialize_jinja_env(config.protocol.output) + jinja_env = initialize_jinja_env(jinja_dir, config.protocol.output) inputs = [] inputs.append(__file__) @@ -390,15 +400,16 @@ def main(): inputs.append(config.protocol.path) if config.imported: inputs.append(config.imported.path) + templates_dir = os.path.join(module_path, "templates") inputs.append(os.path.join(templates_dir, "TypeBuilder_h.template")) inputs.append(os.path.join(templates_dir, "TypeBuilder_cpp.template")) inputs.append(os.path.join(templates_dir, "Exported_h.template")) inputs.append(os.path.join(templates_dir, "Imported_h.template")) - h_template = jinja_env.get_template("TypeBuilder_h.template") - cpp_template = jinja_env.get_template("TypeBuilder_cpp.template") - exported_template = jinja_env.get_template("Exported_h.template") - imported_template = jinja_env.get_template("Imported_h.template") + h_template = jinja_env.get_template("templates/TypeBuilder_h.template") + cpp_template = jinja_env.get_template("templates/TypeBuilder_cpp.template") + exported_template = jinja_env.get_template("templates/Exported_h.template") + imported_template = jinja_env.get_template("templates/Imported_h.template") outputs = dict() @@ -410,7 +421,8 @@ def main(): "join_arrays": join_arrays, "resolve_type": functools.partial(resolve_type, protocol), "type_definition": functools.partial(type_definition, protocol), - "has_disable": has_disable + "has_disable": has_disable, + "format_include": format_include, } if domain["domain"] in protocol.generate_domains: @@ -423,31 +435,28 @@ def main(): if config.lib: template_context = { - "config": config + "config": config, + "format_include": format_include, } + lib_templates_dir = os.path.join(module_path, "lib") # Note these should be sorted in the right order. # TODO(dgozman): sort them programmatically based on commented includes. lib_h_templates = [ - "Allocator_h.template", - "Platform_h.template", "Collections_h.template", - "String16_h.template", "ErrorSupport_h.template", "Values_h.template", "Object_h.template", "ValueConversions_h.template", "Maybe_h.template", "Array_h.template", - "FrontendChannel_h.template", "BackendCallback_h.template", "DispatcherBase_h.template", "Parser_h.template", ] lib_cpp_templates = [ - "InspectorProtocol_cpp.template", - "String16_cpp.template", + "Protocol_cpp.template", "ErrorSupport_cpp.template", "Values_cpp.template", "Object_cpp.template", @@ -455,16 +464,23 @@ def main(): "Parser_cpp.template", ] + forward_h_templates = [ + "Forward_h.template", + "Allocator_h.template", + "FrontendChannel_h.template", + ] + def generate_lib_file(file_name, template_files): parts = [] for template_file in template_files: - inputs.append(os.path.join(templates_dir, template_file)) - template = jinja_env.get_template(template_file) + inputs.append(os.path.join(lib_templates_dir, template_file)) + template = jinja_env.get_template("lib/" + template_file) parts.append(template.render(template_context)) outputs[file_name] = "\n\n".join(parts) - generate_lib_file(os.path.join(config.lib.output, "InspectorProtocol.h"), lib_h_templates) - generate_lib_file(os.path.join(config.lib.output, "InspectorProtocol.cpp"), lib_cpp_templates) + generate_lib_file(os.path.join(config.lib.output, "Forward.h"), forward_h_templates) + generate_lib_file(os.path.join(config.lib.output, "Protocol.h"), lib_h_templates) + generate_lib_file(os.path.join(config.lib.output, "Protocol.cpp"), lib_cpp_templates) # Make gyp / make generatos happy, otherwise make rebuilds world. inputs_ts = max(map(os.path.getmtime, inputs)) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/ConcatenateProtocols.py b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/ConcatenateProtocols.py new file mode 100755 index 00000000000000..a7cbc992c76e40 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/ConcatenateProtocols.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os.path +import sys + +try: + import json +except ImportError: + import simplejson as json + + +def main(argv): + if len(argv) < 1: + sys.stderr.write("Usage: %s [ [, ...]] \n" % sys.argv[0]) + return 1 + + domains = [] + version = None + for protocol in argv[:-1]: + file_name = os.path.normpath(protocol) + if not os.path.isfile(file_name): + sys.stderr.write("Cannot find %s\n" % file_name) + return 1 + input_file = open(file_name, "r") + json_string = input_file.read() + parsed_json = json.loads(json_string) + domains += parsed_json["domains"] + version = parsed_json["version"] + + output_file = open(argv[-1], "w") + json.dump({"version": version, "domains": domains}, output_file, indent=4, sort_keys=False, separators=(',', ': ')) + output_file.close() + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/OWNERS b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/OWNERS similarity index 100% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/OWNERS rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/OWNERS diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni new file mode 100644 index 00000000000000..4b161a0981529b --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni @@ -0,0 +1,82 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This template will generate inspector protocol source code. The code will +# not be compiled, use get_target_outputs() to compile them. +# +# Inputs +# +# config_file (required) +# Path to json file specifying inspector protocol configuration. +# +# out_dir (required) +# Path to put the generated files in. It must be inside output or +# generated file directory. +# +# outputs (required) +# Files generated. Relative to out_dir. +# +# inputs (optional) +# Extra inputs specified by the config file. +template("inspector_protocol_generate") { + assert(defined(invoker.config_file)) + assert(defined(invoker.out_dir)) + assert(defined(invoker.outputs)) + + inspector_protocol_dir = + "//third_party/WebKit/Source/platform/inspector_protocol" + + action(target_name) { + script = "$inspector_protocol_dir/CodeGenerator.py" + + inputs = [ + invoker.config_file, + "$inspector_protocol_dir/lib/Allocator_h.template", + "$inspector_protocol_dir/lib/Array_h.template", + "$inspector_protocol_dir/lib/BackendCallback_h.template", + "$inspector_protocol_dir/lib/Collections_h.template", + "$inspector_protocol_dir/lib/DispatcherBase_cpp.template", + "$inspector_protocol_dir/lib/DispatcherBase_h.template", + "$inspector_protocol_dir/lib/ErrorSupport_cpp.template", + "$inspector_protocol_dir/lib/ErrorSupport_h.template", + "$inspector_protocol_dir/lib/Forward_h.template", + "$inspector_protocol_dir/lib/FrontendChannel_h.template", + "$inspector_protocol_dir/lib/Maybe_h.template", + "$inspector_protocol_dir/lib/Object_cpp.template", + "$inspector_protocol_dir/lib/Object_h.template", + "$inspector_protocol_dir/lib/Parser_cpp.template", + "$inspector_protocol_dir/lib/Parser_h.template", + "$inspector_protocol_dir/lib/Protocol_cpp.template", + "$inspector_protocol_dir/lib/ValueConversions_h.template", + "$inspector_protocol_dir/lib/Values_cpp.template", + "$inspector_protocol_dir/lib/Values_h.template", + "$inspector_protocol_dir/templates/Exported_h.template", + "$inspector_protocol_dir/templates/Imported_h.template", + "$inspector_protocol_dir/templates/TypeBuilder_cpp.template", + "$inspector_protocol_dir/templates/TypeBuilder_h.template", + ] + if (defined(invoker.inputs)) { + inputs += invoker.inputs + } + + args = [ + "--jinja_dir", + rebase_path("//third_party/", root_build_dir), # jinja is in chromium's third_party + "--output_base", + rebase_path(invoker.out_dir, root_build_dir), + "--config", + rebase_path(invoker.config_file, root_build_dir), + ] + + outputs = get_path_info(rebase_path(invoker.outputs, ".", invoker.out_dir), + "abspath") + + forward_variables_from(invoker, + [ + "visibility", + "deps", + "public_deps", + ]) + } +} diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gypi b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gypi new file mode 100644 index 00000000000000..aa43821b9aecca --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gypi @@ -0,0 +1,36 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Note: do not remove this file, it's used by v8's gyp. +# It will be moved out from platform/ soon. +{ + 'variables': { + 'inspector_protocol_files': [ + 'lib/Allocator_h.template', + 'lib/Array_h.template', + 'lib/BackendCallback_h.template', + 'lib/Collections_h.template', + 'lib/DispatcherBase_cpp.template', + 'lib/DispatcherBase_h.template', + 'lib/ErrorSupport_cpp.template', + 'lib/ErrorSupport_h.template', + 'lib/Forward_h.template', + 'lib/FrontendChannel_h.template', + 'lib/Maybe_h.template', + 'lib/Object_cpp.template', + 'lib/Object_h.template', + 'lib/Parser_cpp.template', + 'lib/Parser_h.template', + 'lib/Protocol_cpp.template', + 'lib/ValueConversions_h.template', + 'lib/Values_cpp.template', + 'lib/Values_h.template', + 'templates/Exported_h.template', + 'templates/Imported_h.template', + 'templates/TypeBuilder_cpp.template', + 'templates/TypeBuilder_h.template', + 'CodeGenerator.py', + ] + } +} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Allocator_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Allocator_h.template similarity index 65% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Allocator_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Allocator_h.template index e38b76cd62b7d3..8f8109d695c597 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Allocator_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Allocator_h.template @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef Allocator_h -#define Allocator_h +#ifndef {{"_".join(config.protocol.namespace)}}_Allocator_h +#define {{"_".join(config.protocol.namespace)}}_Allocator_h + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} enum NotNullTagEnum { NotNullLiteral }; @@ -19,4 +23,8 @@ enum NotNullTagEnum { NotNullLiteral }; ClassName(const ClassName&) = delete; \ ClassName& operator=(const ClassName&) = delete -#endif /* Allocator_h */ +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Allocator_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Array_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Array_h.template similarity index 84% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Array_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Array_h.template index 40abb2d467c161..9555e302a933d0 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Array_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Array_h.template @@ -2,19 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef Array_h -#define Array_h +#ifndef {{"_".join(config.protocol.namespace)}}_Array_h +#define {{"_".join(config.protocol.namespace)}}_Array_h //#include "ErrorSupport.h" -//#include "Platform.h" -//#include "String16.h" +//#include "Forward.h" //#include "ValueConversions.h" //#include "Values.h" -#include - -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} template class Array { @@ -34,7 +32,7 @@ public: std::unique_ptr> result(new Array()); errors->push(); for (size_t i = 0; i < array->size(); ++i) { - errors->setName(String16::fromInteger(i)); + errors->setName(StringUtil::fromInteger(i)); std::unique_ptr item = ValueConversions::parse(array->at(i), errors); result->m_vector.push_back(std::move(item)); } @@ -89,7 +87,7 @@ public: errors->push(); std::unique_ptr> result(new Array()); for (size_t i = 0; i < array->size(); ++i) { - errors->setName(String16::fromInteger(i)); + errors->setName(StringUtil::fromInteger(i)); T item = ValueConversions::parse(array->at(i), errors); result->m_vector.push_back(item); } @@ -126,13 +124,13 @@ private: std::vector m_vector; }; -template<> class Array : public ArrayBase {}; -template<> class Array : public ArrayBase {}; +template<> class Array : public ArrayBase {}; template<> class Array : public ArrayBase {}; template<> class Array : public ArrayBase {}; template<> class Array : public ArrayBase {}; -} // namespace platform -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(Array_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_Array_h) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template new file mode 100644 index 00000000000000..3c8fc15b3216e5 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template @@ -0,0 +1,24 @@ +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_BackendCallback_h +#define {{"_".join(config.protocol.namespace)}}_BackendCallback_h + +//#include "Forward.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +class {{config.lib.export_macro}} BackendCallback { +public: + virtual ~BackendCallback() { } + virtual void sendFailure(const ErrorString&) = 0; +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_BackendCallback_h) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Collections_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Collections_h.template new file mode 100644 index 00000000000000..3f760287b58f0e --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Collections_h.template @@ -0,0 +1,43 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Collections_h +#define {{"_".join(config.protocol.namespace)}}_Collections_h + +#include "{{config.protocol.package}}/Forward.h" +#include + +#if defined(__APPLE__) && !defined(_LIBCPP_VERSION) +#include +#include + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +template using HashMap = std::map; +template using HashSet = std::set; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#else +#include +#include + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +template using HashMap = std::unordered_map; +template using HashSet = std::unordered_set; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // defined(__APPLE__) && !defined(_LIBCPP_VERSION) + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Collections_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_cpp.template similarity index 77% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_cpp.template index 2f842e7fa1177c..76f77aae7ece78 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_cpp.template @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -namespace blink { -namespace protocol { +//#include "DispatcherBase.h" +//#include "Parser.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} // static const char DispatcherBase::kInvalidRequest[] = "Invalid request"; @@ -44,7 +48,7 @@ DispatcherBase::~DispatcherBase() } // static -bool DispatcherBase::getCommandName(const String16& message, String16* result) +bool DispatcherBase::getCommandName(const String& message, String* result) { std::unique_ptr value = parseJSON(message); if (!value) @@ -84,8 +88,10 @@ void DispatcherBase::sendResponse(int callId, const ErrorString& invocationError sendResponse(callId, invocationError, nullptr, DictionaryValue::create()); } -static void reportProtocolError(FrontendChannel* frontendChannel, int callId, DispatcherBase::CommonErrorCode code, const String16& errorMessage, ErrorSupport* errors) +static void reportProtocolErrorTo(FrontendChannel* frontendChannel, int callId, DispatcherBase::CommonErrorCode code, const String& errorMessage, ErrorSupport* errors) { + if (!frontendChannel) + return; std::unique_ptr error = DictionaryValue::create(); error->setInteger("code", code); error->setString("message", errorMessage); @@ -98,10 +104,9 @@ static void reportProtocolError(FrontendChannel* frontendChannel, int callId, Di frontendChannel->sendProtocolResponse(callId, message->toJSONString()); } -void DispatcherBase::reportProtocolError(int callId, CommonErrorCode code, const String16& errorMessage, ErrorSupport* errors) +void DispatcherBase::reportProtocolError(int callId, CommonErrorCode code, const String& errorMessage, ErrorSupport* errors) { - if (m_frontendChannel) - ::blink::protocol::reportProtocolError(m_frontendChannel, callId, code, errorMessage, errors); + reportProtocolErrorTo(m_frontendChannel, callId, code, errorMessage, errors); } void DispatcherBase::clearFrontend() @@ -122,14 +127,13 @@ std::unique_ptr DispatcherBase::weakPtr() UberDispatcher::UberDispatcher(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { } -void UberDispatcher::registerBackend(const String16& name, std::unique_ptr dispatcher) +void UberDispatcher::registerBackend(const String& name, std::unique_ptr dispatcher) { m_dispatchers[name] = std::move(dispatcher); } -void UberDispatcher::dispatch(const String16& message) +void UberDispatcher::dispatch(std::unique_ptr parsedMessage) { - std::unique_ptr parsedMessage = parseJSON(message); if (!parsedMessage) return; std::unique_ptr messageObject = DictionaryValue::cast(std::move(parsedMessage)); @@ -138,25 +142,25 @@ void UberDispatcher::dispatch(const String16& message) int callId = 0; protocol::Value* callIdValue = messageObject->get("id"); - bool success = callIdValue->asInteger(&callId); + bool success = callIdValue && callIdValue->asInteger(&callId); if (!success) return; protocol::Value* methodValue = messageObject->get("method"); - String16 method; + String method; success = methodValue && methodValue->asString(&method); if (!success) return; size_t dotIndex = method.find("."); - if (dotIndex == String16::kNotFound) { - reportProtocolError(m_frontendChannel, callId, DispatcherBase::MethodNotFound, "'" + method + "' wasn't found", nullptr); + if (dotIndex == StringUtil::kNotFound) { + reportProtocolErrorTo(m_frontendChannel, callId, DispatcherBase::MethodNotFound, "'" + method + "' wasn't found", nullptr); return; } - String16 domain = method.substring(0, dotIndex); + String domain = StringUtil::substring(method, 0, dotIndex); auto it = m_dispatchers.find(domain); if (it == m_dispatchers.end()) { - reportProtocolError(m_frontendChannel, callId, DispatcherBase::MethodNotFound, "'" + method + "' wasn't found", nullptr); + reportProtocolErrorTo(m_frontendChannel, callId, DispatcherBase::MethodNotFound, "'" + method + "' wasn't found", nullptr); return; } it->second->dispatch(callId, method, std::move(messageObject)); @@ -164,5 +168,6 @@ void UberDispatcher::dispatch(const String16& message) UberDispatcher::~UberDispatcher() = default; -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template similarity index 64% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template index 4402d9674ab246..17fd8708abdb76 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/DispatcherBase_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template @@ -2,28 +2,26 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef DispatcherBase_h -#define DispatcherBase_h +#ifndef {{"_".join(config.protocol.namespace)}}_DispatcherBase_h +#define {{"_".join(config.protocol.namespace)}}_DispatcherBase_h //#include "BackendCallback.h" //#include "Collections.h" //#include "ErrorSupport.h" -//#include "Platform.h" -//#include "String16.h" +//#include "Forward.h" //#include "Values.h" -#include "{{config.class_export.header}}" -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} -class FrontendChannel; class WeakPtr; -class {{config.class_export.macro}} DispatcherBase { +class {{config.lib.export_macro}} DispatcherBase { PROTOCOL_DISALLOW_COPY(DispatcherBase); public: static const char kInvalidRequest[]; - class {{config.class_export.macro}} WeakPtr { + class {{config.lib.export_macro}} WeakPtr { public: explicit WeakPtr(DispatcherBase*); ~WeakPtr(); @@ -34,7 +32,7 @@ public: DispatcherBase* m_dispatcher; }; - class {{config.class_export.macro}} Callback : public protocol::BackendCallback { + class {{config.lib.export_macro}} Callback : public protocol::BackendCallback { public: Callback(std::unique_ptr backendImpl, int callId); virtual ~Callback(); @@ -60,15 +58,15 @@ public: ServerError = -32000, }; - static bool getCommandName(const String16& message, String16* result); + static bool getCommandName(const String& message, String* result); - virtual void dispatch(int callId, const String16& method, std::unique_ptr messageObject) = 0; + virtual void dispatch(int callId, const String& method, std::unique_ptr messageObject) = 0; void sendResponse(int callId, const ErrorString&, ErrorSupport*, std::unique_ptr result); void sendResponse(int callId, const ErrorString&, std::unique_ptr result); void sendResponse(int callId, const ErrorString&); - void reportProtocolError(int callId, CommonErrorCode, const String16& errorMessage, ErrorSupport* errors); + void reportProtocolError(int callId, CommonErrorCode, const String& errorMessage, ErrorSupport* errors); void clearFrontend(); std::unique_ptr weakPtr(); @@ -78,21 +76,22 @@ private: protocol::HashSet m_weakPtrs; }; -class {{config.class_export.macro}} UberDispatcher { +class {{config.lib.export_macro}} UberDispatcher { PROTOCOL_DISALLOW_COPY(UberDispatcher); public: explicit UberDispatcher(FrontendChannel*); - void registerBackend(const String16& name, std::unique_ptr); - void dispatch(const String16& message); + void registerBackend(const String& name, std::unique_ptr); + void dispatch(std::unique_ptr message); FrontendChannel* channel() { return m_frontendChannel; } virtual ~UberDispatcher(); private: FrontendChannel* m_frontendChannel; - protocol::HashMap> m_dispatchers; + protocol::HashMap> m_dispatchers; }; -} // namespace platform -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(DispatcherBase_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_DispatcherBase_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_cpp.template similarity index 66% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_cpp.template index 695cb58dc3867f..34593ec13de84d 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_cpp.template @@ -2,22 +2,25 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -namespace blink { -namespace protocol { +//#include "ErrorSupport.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} ErrorSupport::ErrorSupport() : m_errorString(nullptr) { } -ErrorSupport::ErrorSupport(String16* errorString) : m_errorString(errorString) { } +ErrorSupport::ErrorSupport(String* errorString) : m_errorString(errorString) { } ErrorSupport::~ErrorSupport() { if (m_errorString && hasErrors()) { - String16Builder builder; + StringBuilder builder; builder.append("Internal error(s): "); builder.append(errors()); *m_errorString = builder.toString(); } } -void ErrorSupport::setName(const String16& name) +void ErrorSupport::setName(const String& name) { DCHECK(m_path.size()); m_path[m_path.size() - 1] = name; @@ -25,7 +28,7 @@ void ErrorSupport::setName(const String16& name) void ErrorSupport::push() { - m_path.push_back(String16()); + m_path.push_back(String()); } void ErrorSupport::pop() @@ -33,9 +36,9 @@ void ErrorSupport::pop() m_path.pop_back(); } -void ErrorSupport::addError(const String16& error) +void ErrorSupport::addError(const String& error) { - String16Builder builder; + StringBuilder builder; for (size_t i = 0; i < m_path.size(); ++i) { if (i) builder.append('.'); @@ -51,9 +54,9 @@ bool ErrorSupport::hasErrors() return m_errors.size(); } -String16 ErrorSupport::errors() +String ErrorSupport::errors() { - String16Builder builder; + StringBuilder builder; for (size_t i = 0; i < m_errors.size(); ++i) { if (i) builder.append("; "); @@ -62,5 +65,6 @@ String16 ErrorSupport::errors() return builder.toString(); } -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template new file mode 100644 index 00000000000000..9d2a19260305e6 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template @@ -0,0 +1,37 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_ErrorSupport_h +#define {{"_".join(config.protocol.namespace)}}_ErrorSupport_h + +//#include "Forward.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +class {{config.lib.export_macro}} ErrorSupport { +public: + ErrorSupport(); + ErrorSupport(String* errorString); + ~ErrorSupport(); + + void push(); + void setName(const String&); + void pop(); + void addError(const String&); + bool hasErrors(); + String errors(); + +private: + std::vector m_path; + std::vector m_errors; + String* m_errorString; +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_ErrorSupport_h) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template new file mode 100644 index 00000000000000..2ad3897ba9d3e4 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template @@ -0,0 +1,37 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Forward_h +#define {{"_".join(config.protocol.namespace)}}_Forward_h + +{% if config.lib.export_header %} +#include {{format_include(config.lib.export_header)}} +{% endif %} +#include {{format_include(config.lib.platform_header)}} +#include {{format_include(config.lib.string_header)}} + +#include + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +template class Array; +class DictionaryValue; +using ErrorString = String; +class ErrorSupport; +class FundamentalValue; +class ListValue; +template class Maybe; +class Object; +class SerializedValue; +class StringValue; +class UberDispatcher; +class Value; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Forward_h) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template new file mode 100644 index 00000000000000..8b653b58214b80 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template @@ -0,0 +1,24 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_FrontendChannel_h +#define {{"_".join(config.protocol.namespace)}}_FrontendChannel_h + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +class {{config.lib.export_macro}} FrontendChannel { +public: + virtual ~FrontendChannel() { } + virtual void sendProtocolResponse(int callId, const String& message) = 0; + virtual void sendProtocolNotification(const String& message) = 0; + virtual void flushProtocolNotifications() = 0; +}; + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_FrontendChannel_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Maybe_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Maybe_h.template similarity index 75% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Maybe_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Maybe_h.template index e15ac070da1287..2096572ba7ba60 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Maybe_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Maybe_h.template @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef Maybe_h -#define Maybe_h +#ifndef {{"_".join(config.protocol.namespace)}}_Maybe_h +#define {{"_".join(config.protocol.namespace)}}_Maybe_h -//#include "Platform.h" -//#include "String16.h" +//#include "Forward.h" -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} template class Maybe { @@ -66,22 +66,15 @@ public: }; template<> -class Maybe : public MaybeBase { +class Maybe : public MaybeBase { public: Maybe() { } - Maybe(const InspectorProtocolConvenienceStringType& value) : MaybeBase(value) { } + Maybe(const String& value) : MaybeBase(value) { } using MaybeBase::operator=; }; -template<> -class Maybe : public MaybeBase { -public: - Maybe() { } - Maybe(const String16& value) : MaybeBase(value) { } - using MaybeBase::operator=; -}; - -} // namespace platform -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(Maybe_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_Maybe_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_cpp.template similarity index 81% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_cpp.template index 4480d853ef0184..e3f18c3500e2b2 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_cpp.template @@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -namespace blink { -namespace protocol { +//#include "Object.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} std::unique_ptr Object::parse(protocol::Value* value, ErrorSupport* errors) { @@ -29,5 +32,6 @@ Object::Object(std::unique_ptr object) : m_object(std Object::~Object() { } -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template similarity index 56% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template index dc7f44b6b335d6..4ccd88bdab0a73 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Object_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template @@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef Object_h -#define Object_h +#ifndef {{"_".join(config.protocol.namespace)}}_Object_h +#define {{"_".join(config.protocol.namespace)}}_Object_h //#include "ErrorSupport.h" -//#include "Platform.h" +//#include "Forward.h" //#include "Values.h" -#include "{{config.class_export.header}}" -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} -class {{config.class_export.macro}} Object { +class {{config.lib.export_macro}} Object { public: static std::unique_ptr parse(protocol::Value*, ErrorSupport*); ~Object(); @@ -25,7 +25,8 @@ private: std::unique_ptr m_object; }; -} // namespace platform -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(Object_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_Object_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_cpp.template similarity index 76% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_cpp.template index 34d8ff0720d046..a103b8228e066e 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_cpp.template @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} namespace { @@ -28,7 +29,45 @@ const char* const nullString = "null"; const char* const trueString = "true"; const char* const falseString = "false"; -bool parseConstToken(const UChar* start, const UChar* end, const UChar** tokenEnd, const char* token) +bool isASCII(uint16_t c) +{ + return !(c & ~0x7F); +} + +bool isSpaceOrNewLine(uint16_t c) +{ + return isASCII(c) && c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9)); +} + +double charactersToDouble(const uint16_t* characters, size_t length, bool* ok) +{ + std::vector buffer; + buffer.reserve(length + 1); + for (size_t i = 0; i < length; ++i) { + if (!isASCII(characters[i])) { + *ok = false; + return 0; + } + buffer.push_back(static_cast(characters[i])); + } + buffer.push_back('\0'); + char* endptr; + double result = std::strtod(buffer.data(), &endptr); + *ok = !(*endptr); + return result; +} + +double charactersToDouble(const uint8_t* characters, size_t length, bool* ok) +{ + std::string buffer(reinterpret_cast(characters), length); + char* endptr; + double result = std::strtod(buffer.data(), &endptr); + *ok = !(*endptr); + return result; +} + +template +bool parseConstToken(const Char* start, const Char* end, const Char** tokenEnd, const char* token) { while (start < end && *token != '\0' && *start++ == *token++) { } if (*token != '\0') @@ -37,7 +76,8 @@ bool parseConstToken(const UChar* start, const UChar* end, const UChar** tokenEn return true; } -bool readInt(const UChar* start, const UChar* end, const UChar** tokenEnd, bool canHaveLeadingZeros) +template +bool readInt(const Char* start, const Char* end, const Char** tokenEnd, bool canHaveLeadingZeros) { if (start == end) return false; @@ -55,13 +95,14 @@ bool readInt(const UChar* start, const UChar* end, const UChar** tokenEnd, bool return true; } -bool parseNumberToken(const UChar* start, const UChar* end, const UChar** tokenEnd) +template +bool parseNumberToken(const Char* start, const Char* end, const Char** tokenEnd) { // We just grab the number here. We validate the size in DecodeNumber. // According to RFC4627, a valid number is: [minus] int [frac] [exp] if (start == end) return false; - UChar c = *start; + Char c = *start; if ('-' == c) ++start; @@ -104,12 +145,13 @@ bool parseNumberToken(const UChar* start, const UChar* end, const UChar** tokenE return true; } -bool readHexDigits(const UChar* start, const UChar* end, const UChar** tokenEnd, int digits) +template +bool readHexDigits(const Char* start, const Char* end, const Char** tokenEnd, int digits) { if (end - start < digits) return false; for (int i = 0; i < digits; ++i) { - UChar c = *start++; + Char c = *start++; if (!(('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'))) return false; } @@ -117,11 +159,14 @@ bool readHexDigits(const UChar* start, const UChar* end, const UChar** tokenEnd, return true; } -bool parseStringToken(const UChar* start, const UChar* end, const UChar** tokenEnd) +template +bool parseStringToken(const Char* start, const Char* end, const Char** tokenEnd) { while (start < end) { - UChar c = *start++; + Char c = *start++; if ('\\' == c) { + if (start == end) + return false; c = *start++; // Make sure the escaped char is valid. switch (c) { @@ -154,7 +199,8 @@ bool parseStringToken(const UChar* start, const UChar* end, const UChar** tokenE return false; } -bool skipComment(const UChar* start, const UChar* end, const UChar** commentEnd) +template +bool skipComment(const Char* start, const Char* end, const Char** commentEnd) { if (start == end) return false; @@ -177,7 +223,7 @@ bool skipComment(const UChar* start, const UChar* end, const UChar** commentEnd) } if (*start == '*') { - UChar previous = '\0'; + Char previous = '\0'; // Block comment, read until end marker. for (++start; start < end; previous = *start++) { if (previous == '*' && *start == '/') { @@ -192,13 +238,14 @@ bool skipComment(const UChar* start, const UChar* end, const UChar** commentEnd) return false; } -void skipWhitespaceAndComments(const UChar* start, const UChar* end, const UChar** whitespaceEnd) +template +void skipWhitespaceAndComments(const Char* start, const Char* end, const Char** whitespaceEnd) { while (start < end) { - if (String16::isSpaceOrNewLine(*start)) { + if (isSpaceOrNewLine(*start)) { ++start; } else if (*start == '/') { - const UChar* commentEnd; + const Char* commentEnd; if (!skipComment(start, end, &commentEnd)) break; start = commentEnd; @@ -209,7 +256,8 @@ void skipWhitespaceAndComments(const UChar* start, const UChar* end, const UChar *whitespaceEnd = start; } -Token parseToken(const UChar* start, const UChar* end, const UChar** tokenStart, const UChar** tokenEnd) +template +Token parseToken(const Char* start, const Char* end, const Char** tokenStart, const Char** tokenEnd) { skipWhitespaceAndComments(start, end, tokenStart); start = *tokenStart; @@ -270,7 +318,8 @@ Token parseToken(const UChar* start, const UChar* end, const UChar** tokenStart, return InvalidToken; } -inline int hexToInt(UChar c) +template +int hexToInt(Char c) { if ('0' <= c && c <= '9') return c - '0'; @@ -278,18 +327,21 @@ inline int hexToInt(UChar c) return c - 'A' + 10; if ('a' <= c && c <= 'f') return c - 'a' + 10; - NOTREACHED(); + DCHECK(false); return 0; } -bool decodeString(const UChar* start, const UChar* end, String16Builder* output) +template +bool decodeString(const Char* start, const Char* end, StringBuilder* output) { while (start < end) { - UChar c = *start++; + uint16_t c = *start++; if ('\\' != c) { output->append(c); continue; } + if (start == end) + return false; c = *start++; if (c == 'x') { @@ -335,7 +387,8 @@ bool decodeString(const UChar* start, const UChar* end, String16Builder* output) return true; } -bool decodeString(const UChar* start, const UChar* end, String16* output) +template +bool decodeString(const Char* start, const Char* end, String* output) { if (start == end) { *output = ""; @@ -343,22 +396,23 @@ bool decodeString(const UChar* start, const UChar* end, String16* output) } if (start > end) return false; - String16Builder buffer; - buffer.reserveCapacity(end - start); + StringBuilder buffer; + StringUtil::builderReserve(buffer, end - start); if (!decodeString(start, end, &buffer)) return false; *output = buffer.toString(); return true; } -std::unique_ptr buildValue(const UChar* start, const UChar* end, const UChar** valueTokenEnd, int depth) +template +std::unique_ptr buildValue(const Char* start, const Char* end, const Char** valueTokenEnd, int depth) { if (depth > stackLimit) return nullptr; std::unique_ptr result; - const UChar* tokenStart; - const UChar* tokenEnd; + const Char* tokenStart; + const Char* tokenEnd; Token token = parseToken(start, end, &tokenStart, &tokenEnd); switch (token) { case InvalidToken: @@ -374,7 +428,7 @@ std::unique_ptr buildValue(const UChar* start, const UChar* end, const UC break; case Number: { bool ok; - double value = String16::charactersToDouble(tokenStart, tokenEnd - tokenStart, &ok); + double value = charactersToDouble(tokenStart, tokenEnd - tokenStart, &ok); if (!ok) return nullptr; int number = static_cast(value); @@ -385,7 +439,7 @@ std::unique_ptr buildValue(const UChar* start, const UChar* end, const UC break; } case StringLiteral: { - String16 value; + String value; bool ok = decodeString(tokenStart + 1, tokenEnd - 1, &value); if (!ok) return nullptr; @@ -427,7 +481,7 @@ std::unique_ptr buildValue(const UChar* start, const UChar* end, const UC while (token != ObjectEnd) { if (token != StringLiteral) return nullptr; - String16 key; + String key; if (!decodeString(tokenStart + 1, tokenEnd - 1, &key)) return nullptr; start = tokenEnd; @@ -471,10 +525,11 @@ std::unique_ptr buildValue(const UChar* start, const UChar* end, const UC return result; } -std::unique_ptr parseJSONInternal(const UChar* start, unsigned length) +template +std::unique_ptr parseJSONInternal(const Char* start, unsigned length) { - const UChar* end = start + length; - const UChar *tokenEnd; + const Char* end = start + length; + const Char *tokenEnd; std::unique_ptr value = buildValue(start, end, &tokenEnd, 0); if (!value || tokenEnd != end) return nullptr; @@ -483,12 +538,16 @@ std::unique_ptr parseJSONInternal(const UChar* start, unsigned length) } // anonymous namespace -std::unique_ptr parseJSON(const String16& json) +std::unique_ptr parseJSON(const uint16_t* characters, unsigned length) { - if (json.isEmpty()) - return nullptr; - return parseJSONInternal(json.characters16(), json.length()); + return parseJSONInternal(characters, length); +} + +std::unique_ptr parseJSON(const uint8_t* characters, unsigned length) +{ + return parseJSONInternal(characters, length); } -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template new file mode 100644 index 00000000000000..7b2a29b6c9bef3 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template @@ -0,0 +1,22 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_Parser_h +#define {{"_".join(config.protocol.namespace)}}_Parser_h + +//#include "Forward.h" +//#include "Values.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + +{{config.lib.export_macro}} std::unique_ptr parseJSON(const uint8_t*, unsigned); +{{config.lib.export_macro}} std::unique_ptr parseJSON(const uint16_t*, unsigned); + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_Parser_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Platform_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Protocol_cpp.template similarity index 54% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Platform_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Protocol_cpp.template index 41b8ef2140cc14..8e35fa74fc34db 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Platform_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Protocol_cpp.template @@ -1,10 +1,12 @@ +// This file is generated. + // Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef protocol_Platform_h -#define protocol_Platform_h +#include "{{config.protocol.package}}/Protocol.h" -#include "{{config.lib.platform_header}}" +#include +#include -#endif // !defined(protocol_Platform_h) +#include diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ValueConversions_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ValueConversions_h.template similarity index 81% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ValueConversions_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ValueConversions_h.template index 3b7eaa4f79d58f..5384c7bb1e29f8 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ValueConversions_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/ValueConversions_h.template @@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ValueConversions_h -#define ValueConversions_h +#ifndef {{"_".join(config.protocol.namespace)}}_ValueConversions_h +#define {{"_".join(config.protocol.namespace)}}_ValueConversions_h //#include "ErrorSupport.h" -//#include "Platform.h" -//#include "String16.h" +//#include "Forward.h" //#include "Values.h" -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} template struct ValueConversions { @@ -83,34 +83,17 @@ struct ValueConversions { }; template<> -struct ValueConversions { - static InspectorProtocolConvenienceStringType parse(protocol::Value* value, ErrorSupport* errors) +struct ValueConversions { + static String parse(protocol::Value* value, ErrorSupport* errors) { - String16 result; + String result; bool success = value ? value->asString(&result) : false; if (!success) errors->addError("string value expected"); return result; } - static std::unique_ptr serialize(const InspectorProtocolConvenienceStringType& value) - { - return StringValue::create(value); - } -}; - -template<> -struct ValueConversions { - static String16 parse(protocol::Value* value, ErrorSupport* errors) - { - String16 result; - bool success = value ? value->asString(&result) : false; - if (!success) - errors->addError("string value expected"); - return result; - } - - static std::unique_ptr serialize(const String16& value) + static std::unique_ptr serialize(const String& value) { return StringValue::create(value); } @@ -181,7 +164,8 @@ struct ValueConversions { } }; -} // namespace platform -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(ValueConversions_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_ValueConversions_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_cpp.template similarity index 72% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_cpp.template index 482ec46ab44af7..1b5cdfee227b08 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_cpp.template @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include -#include +//#include "Values.h" -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} namespace { @@ -14,7 +14,7 @@ const char* const nullValueString = "null"; const char* const trueValueString = "true"; const char* const falseValueString = "false"; -inline bool escapeChar(UChar c, String16Builder* dst) +inline bool escapeChar(uint16_t c, StringBuilder* dst) { switch (c) { case '\b': dst->append("\\b"); break; @@ -32,20 +32,20 @@ inline bool escapeChar(UChar c, String16Builder* dst) const char hexDigits[17] = "0123456789ABCDEF"; -void appendUnsignedAsHex(UChar number, String16Builder* dst) +void appendUnsignedAsHex(uint16_t number, StringBuilder* dst) { dst->append("\\u"); for (size_t i = 0; i < 4; ++i) { - UChar c = hexDigits[(number & 0xF000) >> 12]; + uint16_t c = hexDigits[(number & 0xF000) >> 12]; dst->append(c); number <<= 4; } } -void escapeStringForJSON(const String16& str, String16Builder* dst) +void escapeStringForJSON(const String& str, StringBuilder* dst) { for (unsigned i = 0; i < str.length(); ++i) { - UChar c = str[i]; + uint16_t c = str[i]; if (!escapeChar(c, dst)) { if (c < 32 || c > 126 || c == '<' || c == '>') { // 1. Escaping <, > to prevent script execution. @@ -59,7 +59,7 @@ void escapeStringForJSON(const String16& str, String16Builder* dst) } } -void doubleQuoteStringForJSON(const String16& str, String16Builder* dst) +void doubleQuoteStringForJSON(const String& str, StringBuilder* dst) { dst->append('"'); escapeStringForJSON(str, dst); @@ -83,25 +83,25 @@ bool Value::asInteger(int*) const return false; } -bool Value::asString(String16*) const +bool Value::asString(String*) const { return false; } -bool Value::asSerialized(String16*) const +bool Value::asSerialized(String*) const { return false; } -String16 Value::toJSONString() const +String Value::toJSONString() const { - String16Builder result; - result.reserveCapacity(512); + StringBuilder result; + StringUtil::builderReserve(result, 512); writeJSON(&result); return result.toString(); } -void Value::writeJSON(String16Builder* output) const +void Value::writeJSON(StringBuilder* output) const { DCHECK(m_type == TypeNull); output->append(nullValueString, 4); @@ -141,7 +141,7 @@ bool FundamentalValue::asInteger(int* output) const return true; } -void FundamentalValue::writeJSON(String16Builder* output) const +void FundamentalValue::writeJSON(StringBuilder* output) const { DCHECK(type() == TypeBoolean || type() == TypeInteger || type() == TypeDouble); if (type() == TypeBoolean) { @@ -154,9 +154,9 @@ void FundamentalValue::writeJSON(String16Builder* output) const output->append(nullValueString, 4); return; } - output->append(String16::fromDouble(m_doubleValue)); + output->append(StringUtil::fromDouble(m_doubleValue)); } else if (type() == TypeInteger) { - output->append(String16::fromInteger(m_integerValue)); + output->append(StringUtil::fromInteger(m_integerValue)); } } @@ -167,18 +167,18 @@ std::unique_ptr FundamentalValue::clone() const case TypeInteger: return FundamentalValue::create(m_integerValue); case TypeBoolean: return FundamentalValue::create(m_boolValue); default: - NOTREACHED(); + DCHECK(false); } return nullptr; } -bool StringValue::asString(String16* output) const +bool StringValue::asString(String* output) const { *output = m_stringValue; return true; } -void StringValue::writeJSON(String16Builder* output) const +void StringValue::writeJSON(StringBuilder* output) const { DCHECK(type() == TypeString); doubleQuoteStringForJSON(m_stringValue, output); @@ -189,13 +189,13 @@ std::unique_ptr StringValue::clone() const return StringValue::create(m_stringValue); } -bool SerializedValue::asSerialized(String16* output) const +bool SerializedValue::asSerialized(String* output) const { *output = m_serializedValue; return true; } -void SerializedValue::writeJSON(String16Builder* output) const +void SerializedValue::writeJSON(StringBuilder* output) const { DCHECK(type() == TypeSerialized); output->append(m_serializedValue); @@ -210,42 +210,42 @@ DictionaryValue::~DictionaryValue() { } -void DictionaryValue::setBoolean(const String16& name, bool value) +void DictionaryValue::setBoolean(const String& name, bool value) { setValue(name, FundamentalValue::create(value)); } -void DictionaryValue::setInteger(const String16& name, int value) +void DictionaryValue::setInteger(const String& name, int value) { setValue(name, FundamentalValue::create(value)); } -void DictionaryValue::setDouble(const String16& name, double value) +void DictionaryValue::setDouble(const String& name, double value) { setValue(name, FundamentalValue::create(value)); } -void DictionaryValue::setString(const String16& name, const String16& value) +void DictionaryValue::setString(const String& name, const String& value) { setValue(name, StringValue::create(value)); } -void DictionaryValue::setValue(const String16& name, std::unique_ptr value) +void DictionaryValue::setValue(const String& name, std::unique_ptr value) { set(name, value); } -void DictionaryValue::setObject(const String16& name, std::unique_ptr value) +void DictionaryValue::setObject(const String& name, std::unique_ptr value) { set(name, value); } -void DictionaryValue::setArray(const String16& name, std::unique_ptr value) +void DictionaryValue::setArray(const String& name, std::unique_ptr value) { set(name, value); } -bool DictionaryValue::getBoolean(const String16& name, bool* output) const +bool DictionaryValue::getBoolean(const String& name, bool* output) const { protocol::Value* value = get(name); if (!value) @@ -253,7 +253,7 @@ bool DictionaryValue::getBoolean(const String16& name, bool* output) const return value->asBoolean(output); } -bool DictionaryValue::getInteger(const String16& name, int* output) const +bool DictionaryValue::getInteger(const String& name, int* output) const { Value* value = get(name); if (!value) @@ -261,7 +261,7 @@ bool DictionaryValue::getInteger(const String16& name, int* output) const return value->asInteger(output); } -bool DictionaryValue::getDouble(const String16& name, double* output) const +bool DictionaryValue::getDouble(const String& name, double* output) const { Value* value = get(name); if (!value) @@ -269,7 +269,7 @@ bool DictionaryValue::getDouble(const String16& name, double* output) const return value->asDouble(output); } -bool DictionaryValue::getString(const String16& name, String16* output) const +bool DictionaryValue::getString(const String& name, String* output) const { protocol::Value* value = get(name); if (!value) @@ -277,17 +277,17 @@ bool DictionaryValue::getString(const String16& name, String16* output) const return value->asString(output); } -DictionaryValue* DictionaryValue::getObject(const String16& name) const +DictionaryValue* DictionaryValue::getObject(const String& name) const { return DictionaryValue::cast(get(name)); } -protocol::ListValue* DictionaryValue::getArray(const String16& name) const +protocol::ListValue* DictionaryValue::getArray(const String& name) const { return ListValue::cast(get(name)); } -protocol::Value* DictionaryValue::get(const String16& name) const +protocol::Value* DictionaryValue::get(const String& name) const { Dictionary::const_iterator it = m_data.find(name); if (it == m_data.end()) @@ -297,38 +297,38 @@ protocol::Value* DictionaryValue::get(const String16& name) const DictionaryValue::Entry DictionaryValue::at(size_t index) const { - const String16 key = m_order[index]; + const String key = m_order[index]; return std::make_pair(key, m_data.find(key)->second.get()); } -bool DictionaryValue::booleanProperty(const String16& name, bool defaultValue) const +bool DictionaryValue::booleanProperty(const String& name, bool defaultValue) const { bool result = defaultValue; getBoolean(name, &result); return result; } -int DictionaryValue::integerProperty(const String16& name, int defaultValue) const +int DictionaryValue::integerProperty(const String& name, int defaultValue) const { int result = defaultValue; getInteger(name, &result); return result; } -double DictionaryValue::doubleProperty(const String16& name, double defaultValue) const +double DictionaryValue::doubleProperty(const String& name, double defaultValue) const { double result = defaultValue; getDouble(name, &result); return result; } -void DictionaryValue::remove(const String16& name) +void DictionaryValue::remove(const String& name) { m_data.erase(name); m_order.erase(std::remove(m_order.begin(), m_order.end(), name), m_order.end()); } -void DictionaryValue::writeJSON(String16Builder* output) const +void DictionaryValue::writeJSON(StringBuilder* output) const { output->append('{'); for (size_t i = 0; i < m_order.size(); ++i) { @@ -347,7 +347,7 @@ std::unique_ptr DictionaryValue::clone() const { std::unique_ptr result = DictionaryValue::create(); for (size_t i = 0; i < m_order.size(); ++i) { - String16 key = m_order[i]; + String key = m_order[i]; Dictionary::const_iterator value = m_data.find(key); DCHECK(value != m_data.cend() && value->second); result->setValue(key, value->second->clone()); @@ -364,7 +364,7 @@ ListValue::~ListValue() { } -void ListValue::writeJSON(String16Builder* output) const +void ListValue::writeJSON(StringBuilder* output) const { output->append('['); bool first = true; @@ -402,5 +402,6 @@ protocol::Value* ListValue::at(size_t index) return m_data[index].get(); } -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template similarity index 58% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template index 9874183a773628..8f75ef2220e26e 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Values_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template @@ -2,29 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef Values_h -#define Values_h +#ifndef {{"_".join(config.protocol.namespace)}}_Values_h +#define {{"_".join(config.protocol.namespace)}}_Values_h //#include "Allocator.h" //#include "Collections.h" -//#include "Platform.h" -//#include "String16.h" -#include "{{config.class_export.header}}" +//#include "Forward.h" -#include - -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} class ListValue; class DictionaryValue; class Value; -class {{config.class_export.macro}} Value { +class {{config.lib.export_macro}} Value { PROTOCOL_DISALLOW_COPY(Value); public: - static const int maxDepth = 1000; - virtual ~Value() { } static std::unique_ptr null() @@ -50,11 +45,11 @@ public: virtual bool asBoolean(bool* output) const; virtual bool asDouble(double* output) const; virtual bool asInteger(int* output) const; - virtual bool asString(String16* output) const; - virtual bool asSerialized(String16* output) const; + virtual bool asString(String* output) const; + virtual bool asSerialized(String* output) const; - String16 toJSONString() const; - virtual void writeJSON(String16Builder* output) const; + String toJSONString() const; + virtual void writeJSON(StringBuilder* output) const; virtual std::unique_ptr clone() const; protected: @@ -68,7 +63,7 @@ private: ValueType m_type; }; -class {{config.class_export.macro}} FundamentalValue : public Value { +class {{config.lib.export_macro}} FundamentalValue : public Value { public: static std::unique_ptr create(bool value) { @@ -88,7 +83,7 @@ public: bool asBoolean(bool* output) const override; bool asDouble(double* output) const override; bool asInteger(int* output) const override; - void writeJSON(String16Builder* output) const override; + void writeJSON(StringBuilder* output) const override; std::unique_ptr clone() const override; private: @@ -103,9 +98,9 @@ private: }; }; -class {{config.class_export.macro}} StringValue : public Value { +class {{config.lib.export_macro}} StringValue : public Value { public: - static std::unique_ptr create(const String16& value) + static std::unique_ptr create(const String& value) { return wrapUnique(new StringValue(value)); } @@ -115,38 +110,37 @@ public: return wrapUnique(new StringValue(value)); } - bool asString(String16* output) const override; - void writeJSON(String16Builder* output) const override; + bool asString(String* output) const override; + void writeJSON(StringBuilder* output) const override; std::unique_ptr clone() const override; private: - explicit StringValue(const String16& value) : Value(TypeString), m_stringValue(value) { } + explicit StringValue(const String& value) : Value(TypeString), m_stringValue(value) { } explicit StringValue(const char* value) : Value(TypeString), m_stringValue(value) { } - String16 m_stringValue; + String m_stringValue; }; -class {{config.class_export.macro}} SerializedValue : public Value { +class {{config.lib.export_macro}} SerializedValue : public Value { public: - static std::unique_ptr create(const String16& value) + static std::unique_ptr create(const String& value) { return wrapUnique(new SerializedValue(value)); } - bool asSerialized(String16* output) const override; - void writeJSON(String16Builder* output) const override; + bool asSerialized(String* output) const override; + void writeJSON(StringBuilder* output) const override; std::unique_ptr clone() const override; private: - explicit SerializedValue(const String16& value) : Value(TypeSerialized), m_serializedValue(value) { } - explicit SerializedValue(const char* value) : Value(TypeSerialized), m_serializedValue(value) { } + explicit SerializedValue(const String& value) : Value(TypeSerialized), m_serializedValue(value) { } - String16 m_serializedValue; + String m_serializedValue; }; -class {{config.class_export.macro}} DictionaryValue : public Value { +class {{config.lib.export_macro}} DictionaryValue : public Value { public: - using Entry = std::pair; + using Entry = std::pair; static std::unique_ptr create() { return wrapUnique(new DictionaryValue()); @@ -164,40 +158,40 @@ public: return wrapUnique(DictionaryValue::cast(value.release())); } - void writeJSON(String16Builder* output) const override; + void writeJSON(StringBuilder* output) const override; std::unique_ptr clone() const override; size_t size() const { return m_data.size(); } - void setBoolean(const String16& name, bool); - void setInteger(const String16& name, int); - void setDouble(const String16& name, double); - void setString(const String16& name, const String16&); - void setValue(const String16& name, std::unique_ptr); - void setObject(const String16& name, std::unique_ptr); - void setArray(const String16& name, std::unique_ptr); - - bool getBoolean(const String16& name, bool* output) const; - bool getInteger(const String16& name, int* output) const; - bool getDouble(const String16& name, double* output) const; - bool getString(const String16& name, String16* output) const; - - DictionaryValue* getObject(const String16& name) const; - ListValue* getArray(const String16& name) const; - Value* get(const String16& name) const; + void setBoolean(const String& name, bool); + void setInteger(const String& name, int); + void setDouble(const String& name, double); + void setString(const String& name, const String&); + void setValue(const String& name, std::unique_ptr); + void setObject(const String& name, std::unique_ptr); + void setArray(const String& name, std::unique_ptr); + + bool getBoolean(const String& name, bool* output) const; + bool getInteger(const String& name, int* output) const; + bool getDouble(const String& name, double* output) const; + bool getString(const String& name, String* output) const; + + DictionaryValue* getObject(const String& name) const; + ListValue* getArray(const String& name) const; + Value* get(const String& name) const; Entry at(size_t index) const; - bool booleanProperty(const String16& name, bool defaultValue) const; - int integerProperty(const String16& name, int defaultValue) const; - double doubleProperty(const String16& name, double defaultValue) const; - void remove(const String16& name); + bool booleanProperty(const String& name, bool defaultValue) const; + int integerProperty(const String& name, int defaultValue) const; + double doubleProperty(const String& name, double defaultValue) const; + void remove(const String& name); ~DictionaryValue() override; private: DictionaryValue(); template - void set(const String16& key, std::unique_ptr& value) + void set(const String& key, std::unique_ptr& value) { DCHECK(value); bool isNew = m_data.find(key) == m_data.end(); @@ -206,12 +200,12 @@ private: m_order.push_back(key); } - using Dictionary = protocol::HashMap>; + using Dictionary = protocol::HashMap>; Dictionary m_data; - std::vector m_order; + std::vector m_order; }; -class {{config.class_export.macro}} ListValue : public Value { +class {{config.lib.export_macro}} ListValue : public Value { public: static std::unique_ptr create() { @@ -232,7 +226,7 @@ public: ~ListValue() override; - void writeJSON(String16Builder* output) const override; + void writeJSON(StringBuilder* output) const override; std::unique_ptr clone() const override; void pushValue(std::unique_ptr); @@ -245,7 +239,8 @@ private: std::vector> m_data; }; -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // Values_h +#endif // {{"_".join(config.protocol.namespace)}}_Values_h diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json new file mode 100644 index 00000000000000..82d7845da3cbcd --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json @@ -0,0 +1,39 @@ +{ + "protocol": { + "path": "./relative/path/protocol/sample_protocol.json", + "package": "include/generated/files/like/this", + "output": "place/generated/files/here", + "namespace": ["sample_project", "protocol"], + "export_macro": "LIB_EXPORT", + "export_header": "lib/lib_export.h" + }, + + "exported": { + "package": "include/exported/files/like/this", + "output": "place/exported/files/here", + "string_header": "include/exported/string.h", + "string_in": "String", + "string_out": "String", + "to_string_out": "toString(%s)", + "export_macro": "LIB_EXPORT", + "export_header": "lib/lib_export.h" + }, + + "imported": { + "path": "../relative/path/imported_protocol.json", + "package": "either/include/imported/files/from/here", + "header": "or/include/them/all/together/like/this/imported_protocol.h", + "to_imported_string": "toImportedString(%s)", + "from_imported_string": "fromImportedString(%s)", + "namespace": ["imported_project", "protocol"] + }, + + "lib": { + "package": "include/lib/files/like/this", + "output": "place/generated/lib/files/here", + "string_header": "string/implementation.h", + "platform_header": "platform/implementation.h", + "export_macro": "LIB_EXPORT", + "export_header": "lib/lib_export.h" + } +} diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_expected_errors.json b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_expected_errors.json new file mode 100644 index 00000000000000..85fa2641db6029 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/sample_expected_errors.json @@ -0,0 +1,7 @@ +{ + "errors": [ + "Domain.event: event has been removed", + "Domain.command: command has been removed", + "Domain.command.param parameter->Domain.TypeName.property: required property has been removed" + ] +} \ No newline at end of file diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Exported_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template similarity index 58% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Exported_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template index 66cf7f9018537a..3357f95b5ef159 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Exported_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template @@ -4,14 +4,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef protocol_{{domain.domain}}_api_h -#define protocol_{{domain.domain}}_api_h +#ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_api_h +#define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_api_h -#include "{{config.class_export.header}}" -#include "{{config.lib_package}}/InspectorProtocol.h" +{% if config.exported.export_header %} +#include {{format_include(config.exported.export_header)}} +{% endif %} +#include {{format_include(config.exported.string_header)}} -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} namespace {{domain.domain}} { namespace API { @@ -21,7 +24,7 @@ namespace API { namespace {{type.id}}Enum { {% for literal in type.enum %} -{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}}; +{{config.exported.export_macro}} extern const char* {{ literal | dash_to_camelcase}}; {% endfor %} } // {{type.id}}Enum {% endif %} @@ -33,7 +36,7 @@ namespace {{type.id}}Enum { namespace {{command.name | to_title_case}} { namespace {{param.name | to_title_case}}Enum { {% for literal in param.enum %} -{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}}; +{{config.exported.export_macro}} extern const char* {{ literal | dash_to_camelcase}}; {% endfor %} } // {{param.name | to_title_case}}Enum } // {{command.name | to_title_case }} @@ -45,17 +48,18 @@ namespace {{param.name | to_title_case}}Enum { {% for type in domain.types %} {% if not (type.type == "object") or not ("properties" in type) or not (type.exported) %}{% continue %}{% endif %} -class {{config.class_export.macro}} {{type.id}} { +class {{config.exported.export_macro}} {{type.id}} { public: - virtual String16 toJSONString() const = 0; + virtual {{config.exported.string_out}} toJSONString() const = 0; virtual ~{{type.id}}() { } - static std::unique_ptr fromJSONString(const String16& json); + static std::unique_ptr fromJSONString(const {{config.exported.string_in}}& json); }; {% endfor %} } // namespace API } // namespace {{domain.domain}} -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(protocol_{{domain.domain}}_api_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_{{domain.domain}}_api_h) diff --git a/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template new file mode 100644 index 00000000000000..c23b8fe87c9f55 --- /dev/null +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template @@ -0,0 +1,51 @@ +// This file is generated + +// Copyright (c) 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h +#define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h + +#include "{{config.protocol.package}}/Protocol.h" +#include {{format_include(config.imported.header if config.imported.header else "\"%s/%s.h\"" % (config.imported.package, domain.domain))}} + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} + {% for type in domain.types %} + {% if not (type.type == "object") or not ("properties" in type) or not (type.exported) %}{% continue %}{% endif %} + +template<> +struct ValueConversions<{{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}> { + static std::unique_ptr<{{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}> parse(protocol::Value* value, ErrorSupport* errors) + { + if (!value) { + errors->addError("value expected"); + return nullptr; + } + String json = value->toJSONString(); + auto result = {{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}::fromJSONString({{config.imported.to_imported_string % "json"}}); + if (!result) + errors->addError("cannot parse"); + return result; + } + + static std::unique_ptr serialize(const {{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}* value) + { + auto json = value->toJSONString(); + return SerializedValue::create({{config.imported.from_imported_string % "std::move(json)"}}); + } + + static std::unique_ptr serialize(const std::unique_ptr<{{"::".join(config.imported.namespace)}}::{{domain.domain}}::API::{{type.id}}>& value) + { + return serialize(value.get()); + } +}; + {% endfor %} + +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} + +#endif // !defined({{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_cpp.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_cpp.template similarity index 93% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_cpp.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_cpp.template index 84a3acf670f144..0ea21e9337d76f 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_cpp.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_cpp.template @@ -6,8 +6,11 @@ #include "{{config.protocol.package}}/{{domain.domain}}.h" -namespace blink { -namespace protocol { +#include "{{config.protocol.package}}/Protocol.h" + +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} namespace {{domain.domain}} { // ------------- Enum values from types. @@ -93,13 +96,14 @@ std::unique_ptr<{{type.id}}> {{type.id}}::clone() const } {% if type.exported %} -String16 {{type.id}}::toJSONString() const +{{config.exported.string_out}} {{type.id}}::toJSONString() const { - return serialize()->toJSONString(); + String json = serialize()->toJSONString(); + return {{config.exported.to_string_out % "json"}}; } // static -std::unique_ptr API::{{type.id}}::fromJSONString(const String16& json) +std::unique_ptr API::{{type.id}}::fromJSONString(const {{config.exported.string_in}}& json) { ErrorSupport errors; std::unique_ptr value = parseJSON(json); @@ -169,6 +173,11 @@ void Frontend::{{event.name}}( } {% endfor %} +void Frontend::flush() +{ + m_frontendChannel->flushProtocolNotifications(); +} + // --------------------- Dispatcher. class DispatcherImpl : public protocol::DispatcherBase { @@ -183,11 +192,11 @@ public: {% endfor %} } ~DispatcherImpl() override { } - void dispatch(int callId, const String16& method, std::unique_ptr messageObject) override; + void dispatch(int callId, const String& method, std::unique_ptr messageObject) override; protected: using CallHandler = void (DispatcherImpl::*)(int callId, std::unique_ptr messageObject, ErrorSupport* errors); - using DispatchMap = protocol::HashMap; + using DispatchMap = protocol::HashMap; DispatchMap m_dispatchMap; {% for command in domain.commands %} @@ -199,9 +208,9 @@ protected: Backend* m_backend; }; -void DispatcherImpl::dispatch(int callId, const String16& method, std::unique_ptr messageObject) +void DispatcherImpl::dispatch(int callId, const String& method, std::unique_ptr messageObject) { - protocol::HashMap::iterator it = m_dispatchMap.find(method); + protocol::HashMap::iterator it = m_dispatchMap.find(method); if (it == m_dispatchMap.end()) { reportProtocolError(callId, MethodNotFound, "'" + method + "' wasn't found", nullptr); return; @@ -345,5 +354,6 @@ void Dispatcher::wire(UberDispatcher* dispatcher, Backend* backend) } } // {{domain.domain}} -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_h.template b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template similarity index 86% rename from deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_h.template rename to deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template index b5cf09621d4b2b..553ba55f7c0de6 100644 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/TypeBuilder_h.template +++ b/deps/v8_inspector/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template @@ -4,11 +4,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef protocol_{{domain.domain}}_h -#define protocol_{{domain.domain}}_h +#ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h +#define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h -#include "{{config.class_export.header}}" -#include "{{config.lib_package}}/InspectorProtocol.h" +{% if config.protocol.export_header %} +#include {{format_include(config.protocol.export_header)}} +{% endif %} +#include "{{config.protocol.package}}/Protocol.h" // For each imported domain we generate a ValueConversions struct instead of a full domain definition // and include Domain::API version from there. {% for name in domain.dependencies %} @@ -18,8 +20,9 @@ #include "{{config.exported.package}}/{{domain.domain}}.h" {% endif %} -namespace blink { -namespace protocol { +{% for namespace in config.protocol.namespace %} +namespace {{namespace}} { +{% endfor %} namespace {{domain.domain}} { // ------------- Forward and enum declarations. @@ -42,7 +45,7 @@ using {{type.id}} = {{resolve_type(type).type}}; namespace {{type.id}}Enum { {% for literal in type.enum %} -{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}}; +{{config.protocol.export_macro}} extern const char* {{ literal | dash_to_camelcase}}; {% endfor %} } // namespace {{type.id}}Enum {% endif %} @@ -54,7 +57,7 @@ namespace {{type.id}}Enum { namespace {{command.name | to_title_case}} { namespace {{param.name | to_title_case}}Enum { {% for literal in param.enum %} -{{config.class_export.macro}} extern const char* {{literal | dash_to_camelcase}}; +{{config.protocol.export_macro}} extern const char* {{literal | dash_to_camelcase}}; {% endfor %} } // {{param.name | to_title_case}}Enum } // {{command.name | to_title_case }} @@ -68,7 +71,7 @@ namespace {{param.name | to_title_case}}Enum { {% set type_def = type_definition(domain.domain + "." + type.id)%} // {{type.description}} -class {{config.class_export.macro}} {{type.id}} {% if type.exported %}: public API::{{type.id}} {% endif %}{ +class {{config.protocol.export_macro}} {{type.id}} {% if type.exported %}: public API::{{type.id}} {% endif %}{ PROTOCOL_DISALLOW_COPY({{type.id}}); public: static std::unique_ptr<{{type.id}}> parse(protocol::Value* value, ErrorSupport* errors); @@ -77,7 +80,7 @@ public: {% for property in type.properties %} {% if "enum" in property %} - struct {{config.class_export.macro}} {{property.name | to_title_case}}Enum { + struct {{config.protocol.export_macro}} {{property.name | to_title_case}}Enum { {% for literal in property.enum %} static const char* {{literal | dash_to_camelcase}}; {% endfor %} @@ -96,7 +99,7 @@ public: std::unique_ptr serialize() const; std::unique_ptr<{{type.id}}> clone() const; {% if type.exported %} - String16 toJSONString() const override; + {{config.exported.string_out}} toJSONString() const override; {% endif %} template @@ -180,13 +183,15 @@ private: // ------------- Backend interface. -class {{config.class_export.macro}} Backend { +class {{config.protocol.export_macro}} Backend { public: + virtual ~Backend() { } + {% for command in domain.commands %} {% if "redirect" in command %}{% continue %}{% endif %} {% if ("handlers" in command) and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %} {% if "async" in command %} - class {{config.class_export.macro}} {{command.name | to_title_case}}Callback : public BackendCallback { + class {{config.protocol.export_macro}} {{command.name | to_title_case}}Callback : public BackendCallback { public: virtual void sendSuccess( {%- for parameter in command.returns -%} @@ -230,14 +235,11 @@ public: {% if not has_disable(domain.commands) %} virtual void disable(ErrorString*) { } {% endif %} - -protected: - virtual ~Backend() { } }; // ------------- Frontend interface. -class {{config.class_export.macro}} Frontend { +class {{config.protocol.export_macro}} Frontend { public: Frontend(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { } {% for event in domain.events %} @@ -253,16 +255,16 @@ public: ); {% endfor %} - void flush() { m_frontendChannel->flushProtocolNotifications(); } + void flush(); private: FrontendChannel* m_frontendChannel; }; // ------------- Dispatcher. -class {{config.class_export.macro}} Dispatcher { +class {{config.protocol.export_macro}} Dispatcher { public: - static void wire(UberDispatcher*, blink::protocol::{{domain.domain}}::Backend*); + static void wire(UberDispatcher*, Backend*); private: Dispatcher() { } @@ -270,7 +272,7 @@ private: // ------------- Metainfo. -class {{config.class_export.macro}} Metainfo { +class {{config.protocol.export_macro}} Metainfo { public: using BackendClass = Backend; using FrontendClass = Frontend; @@ -281,7 +283,8 @@ public: }; } // namespace {{domain.domain}} -} // namespace protocol -} // namespace blink +{% for namespace in config.protocol.namespace %} +} // namespace {{namespace}} +{% endfor %} -#endif // !defined(protocol_{{domain.domain}}_h) +#endif // !defined({{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/LICENSE b/deps/v8_inspector/third_party/v8_inspector/LICENSE deleted file mode 100644 index a32e00ce6be362..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/PlatformExport.h b/deps/v8_inspector/third_party/v8_inspector/platform/PlatformExport.h deleted file mode 100644 index 8230fbb80fe30d..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/PlatformExport.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#ifndef PlatformExport_h -#define PlatformExport_h - -#if !defined(BLINK_PLATFORM_IMPLEMENTATION) -#define BLINK_PLATFORM_IMPLEMENTATION 0 -#endif - -#if defined(COMPONENT_BUILD) -#if defined(WIN32) -#if BLINK_PLATFORM_IMPLEMENTATION -#define PLATFORM_EXPORT __declspec(dllexport) -#else -#define PLATFORM_EXPORT __declspec(dllimport) -#endif -#else // defined(WIN32) -#define PLATFORM_EXPORT __attribute__((visibility("default"))) -#endif -#else // defined(COMPONENT_BUILD) -#define PLATFORM_EXPORT -#endif - -#if defined(_MSC_VER) -// MSVC Compiler warning C4275: -// non dll-interface class 'Bar' used as base for dll-interface class 'Foo'. -// Note that this is intended to be used only when no access to the base class' -// static data is done through derived classes or inline methods. For more info, -// see http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx -// -// This pragma will allow exporting a class that inherits from a non-exported -// base class, anywhere in the Blink platform component. This is only -// a problem when using the MSVC compiler on Windows. -#pragma warning(suppress:4275) -#endif - -#endif // PlatformExport_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/BackendCallback_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/BackendCallback_h.template deleted file mode 100644 index 0eb44bf2fcfb67..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/BackendCallback_h.template +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BackendCallback_h -#define BackendCallback_h - -//#include "ErrorSupport.h" -//#include "Platform.h" -#include "{{config.class_export.header}}" - -namespace blink { -namespace protocol { - -class {{config.class_export.macro}} BackendCallback { -public: - virtual ~BackendCallback() { } - virtual void sendFailure(const ErrorString&) = 0; -}; - -} // namespace platform -} // namespace blink - -#endif // !defined(BackendCallback_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Collections_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Collections_h.template deleted file mode 100644 index a89bef413811e3..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Collections_h.template +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef Collections_h -#define Collections_h - -#include - -#if defined(__APPLE__) && !defined(_LIBCPP_VERSION) -#include -#include - -namespace blink { -namespace protocol { - -template using HashMap = std::map; -template using HashSet = std::set; - -} // namespace protocol -} // namespace blink - -#else -#include -#include - -namespace blink { -namespace protocol { - -template using HashMap = std::unordered_map; -template using HashSet = std::unordered_set; - -} // namespace protocol -} // namespace blink - -#endif // defined(__APPLE__) && !defined(_LIBCPP_VERSION) - -// Macro that returns a compile time constant with the length of an array, but gives an error if passed a non-array. -template char (&ArrayLengthHelperFunction(T (&)[Size]))[Size]; -// GCC needs some help to deduce a 0 length array. -#if defined(__GNUC__) -template char (&ArrayLengthHelperFunction(T (&)[0]))[0]; -#endif -#define PROTOCOL_ARRAY_LENGTH(array) sizeof(::ArrayLengthHelperFunction(array)) - -#endif // !defined(Collections_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_h.template deleted file mode 100644 index f837bff388e154..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ErrorSupport_h.template +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ErrorSupport_h -#define ErrorSupport_h - -//#include "Platform.h" -//#include "String16.h" -#include "{{config.class_export.header}}" - -#include - -namespace blink { -namespace protocol { - -using ErrorString = String16; - -class {{config.class_export.macro}} ErrorSupport { -public: - ErrorSupport(); - ErrorSupport(String16* errorString); - ~ErrorSupport(); - - void push(); - void setName(const String16&); - void pop(); - void addError(const String16&); - bool hasErrors(); - String16 errors(); - -private: - std::vector m_path; - std::vector m_errors; - String16* m_errorString; -}; - -} // namespace platform -} // namespace blink - -using blink::protocol::ErrorString; - -#endif // !defined(ErrorSupport_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/FrontendChannel_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/FrontendChannel_h.template deleted file mode 100644 index ead1491ed28262..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/FrontendChannel_h.template +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FrontendChannel_h -#define FrontendChannel_h - -//#include "String16.h" -#include "{{config.class_export.header}}" - -namespace blink { -namespace protocol { - -class {{config.class_export.macro}} FrontendChannel { -public: - virtual ~FrontendChannel() { } - virtual void sendProtocolResponse(int callId, const String16& message) = 0; - virtual void sendProtocolNotification(const String16& message) = 0; - virtual void flushProtocolNotifications() = 0; -}; - -} // namespace protocol -} // namespace blink - -#endif // !defined(FrontendChannel_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Imported_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Imported_h.template deleted file mode 100644 index 2d4e11a4690807..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Imported_h.template +++ /dev/null @@ -1,47 +0,0 @@ -// This file is generated - -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef protocol_{{domain.domain}}_imported_h -#define protocol_{{domain.domain}}_imported_h - -#include "{{config.lib_package}}/InspectorProtocol.h" -#include "{{config.imported.package}}/{{domain.domain}}.h" - -namespace blink { -namespace protocol { - {% for type in domain.types %} - {% if not (type.type == "object") or not ("properties" in type) or not (type.exported) %}{% continue %}{% endif %} - -template<> -struct ValueConversions<{{domain.domain}}::API::{{type.id}}> { - static std::unique_ptr<{{domain.domain}}::API::{{type.id}}> parse(protocol::Value* value, ErrorSupport* errors) - { - if (!value) { - errors->addError("value expected"); - return nullptr; - } - std::unique_ptr<{{domain.domain}}::API::{{type.id}}> result = {{domain.domain}}::API::{{type.id}}::fromJSONString(value->toJSONString()); - if (!result) - errors->addError("cannot parse"); - return result; - } - - static std::unique_ptr serialize({{domain.domain}}::API::{{type.id}}* value) - { - return SerializedValue::create(value->toJSONString()); - } - - static std::unique_ptr serialize(const std::unique_ptr<{{domain.domain}}::API::{{type.id}}>& value) - { - return SerializedValue::create(value->toJSONString()); - } -}; - {% endfor %} - -} // namespace protocol -} // namespace blink - -#endif // !defined(protocol_{{domain.domain}}_imported_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/InspectorProtocol_cpp.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/InspectorProtocol_cpp.template deleted file mode 100644 index e7c49fdda189e5..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/InspectorProtocol_cpp.template +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "{{config.lib_package}}/InspectorProtocol.h" diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ParserTest.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ParserTest.cpp deleted file mode 100644 index 40c6af754cedbe..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/ParserTest.cpp +++ /dev/null @@ -1,501 +0,0 @@ -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { -namespace protocol { - -TEST(ParserTest, Reading) -{ - protocol::Value* tmpValue; - std::unique_ptr root; - std::unique_ptr root2; - String16 strVal; - int intVal = 0; - - // some whitespace checking - root = parseJSON(" null "); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeNull, root->type()); - - // Invalid JSON string - root = parseJSON("nu"); - EXPECT_FALSE(root.get()); - - // Simple bool - root = parseJSON("true "); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeBoolean, root->type()); - - // Embedded comment - root = parseJSON("40 /*/"); - EXPECT_FALSE(root.get()); - root = parseJSON("/* comment */null"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeNull, root->type()); - root = parseJSON("40 /* comment */"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(40, intVal); - root = parseJSON("/**/ 40 /* multi-line\n comment */ // more comment"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(40, intVal); - root = parseJSON("true // comment"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeBoolean, root->type()); - root = parseJSON("/* comment */\"sample string\""); - ASSERT_TRUE(root.get()); - EXPECT_TRUE(root->asString(&strVal)); - EXPECT_EQ("sample string", strVal); - root = parseJSON("[1, /* comment, 2 ] */ \n 3]"); - ASSERT_TRUE(root.get()); - protocol::ListValue* list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(2u, list->size()); - tmpValue = list->at(0); - ASSERT_TRUE(tmpValue); - EXPECT_TRUE(tmpValue->asInteger(&intVal)); - EXPECT_EQ(1, intVal); - tmpValue = list->at(1); - ASSERT_TRUE(tmpValue); - EXPECT_TRUE(tmpValue->asInteger(&intVal)); - EXPECT_EQ(3, intVal); - root = parseJSON("[1, /*a*/2, 3]"); - ASSERT_TRUE(root.get()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(3u, list->size()); - root = parseJSON("/* comment **/42"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(42, intVal); - root = parseJSON( - "/* comment **/\n" - "// */ 43\n" - "44"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(44, intVal); - - // Test number formats - root = parseJSON("43"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(43, intVal); - - // According to RFC4627, oct, hex, and leading zeros are invalid JSON. - root = parseJSON("043"); - EXPECT_FALSE(root.get()); - root = parseJSON("0x43"); - EXPECT_FALSE(root.get()); - root = parseJSON("00"); - EXPECT_FALSE(root.get()); - - // Test 0 (which needs to be special cased because of the leading zero - // clause). - root = parseJSON("0"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - intVal = 1; - EXPECT_TRUE(root->asInteger(&intVal)); - EXPECT_EQ(0, intVal); - - // Numbers that overflow ints should succeed, being internally promoted to - // storage as doubles - root = parseJSON("2147483648"); - ASSERT_TRUE(root.get()); - double doubleVal; - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(2147483648.0, doubleVal); - root = parseJSON("-2147483649"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(-2147483649.0, doubleVal); - - // Parse a double - root = parseJSON("43.1"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(43.1, doubleVal); - - root = parseJSON("4.3e-1"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(.43, doubleVal); - - root = parseJSON("2.1e0"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(2.1, doubleVal); - - root = parseJSON("2.1e+0001"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(21.0, doubleVal); - - root = parseJSON("0.01"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeDouble, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(0.01, doubleVal); - - root = parseJSON("1.00"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeInteger, root->type()); - doubleVal = 0.0; - EXPECT_TRUE(root->asDouble(&doubleVal)); - EXPECT_DOUBLE_EQ(1.0, doubleVal); - - // Fractional parts must have a digit before and after the decimal point. - root = parseJSON("1."); - EXPECT_FALSE(root.get()); - root = parseJSON(".1"); - EXPECT_FALSE(root.get()); - root = parseJSON("1.e10"); - EXPECT_FALSE(root.get()); - - // Exponent must have a digit following the 'e'. - root = parseJSON("1e"); - EXPECT_FALSE(root.get()); - root = parseJSON("1E"); - EXPECT_FALSE(root.get()); - root = parseJSON("1e1."); - EXPECT_FALSE(root.get()); - root = parseJSON("1e1.0"); - EXPECT_FALSE(root.get()); - - // INF/-INF/NaN are not valid - root = parseJSON("NaN"); - EXPECT_FALSE(root.get()); - root = parseJSON("nan"); - EXPECT_FALSE(root.get()); - root = parseJSON("inf"); - EXPECT_FALSE(root.get()); - - // Invalid number formats - root = parseJSON("4.3.1"); - EXPECT_FALSE(root.get()); - root = parseJSON("4e3.1"); - EXPECT_FALSE(root.get()); - - // Test string parser - root = parseJSON("\"hello world\""); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeString, root->type()); - EXPECT_TRUE(root->asString(&strVal)); - EXPECT_EQ("hello world", strVal); - - // Empty string - root = parseJSON("\"\""); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeString, root->type()); - EXPECT_TRUE(root->asString(&strVal)); - EXPECT_EQ("", strVal); - - // Test basic string escapes - root = parseJSON("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\""); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeString, root->type()); - EXPECT_TRUE(root->asString(&strVal)); - EXPECT_EQ(" \"\\/\b\f\n\r\t\v", strVal); - - // Test hex and unicode escapes including the null character. - root = parseJSON("\"\\x41\\x00\\u1234\""); - EXPECT_FALSE(root.get()); - - // Test invalid strings - root = parseJSON("\"no closing quote"); - EXPECT_FALSE(root.get()); - root = parseJSON("\"\\z invalid escape char\""); - EXPECT_FALSE(root.get()); - root = parseJSON("\"not enough escape chars\\u123\""); - EXPECT_FALSE(root.get()); - root = parseJSON("\"extra backslash at end of input\\\""); - EXPECT_FALSE(root.get()); - - // Basic array - root = parseJSON("[true, false, null]"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeArray, root->type()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(3U, list->size()); - - // Empty array - root = parseJSON("[]"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeArray, root->type()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(0U, list->size()); - - // Nested arrays - root = parseJSON("[[true], [], [false, [], [null]], null]"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeArray, root->type()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(4U, list->size()); - - // Invalid, missing close brace. - root = parseJSON("[[true], [], [false, [], [null]], null"); - EXPECT_FALSE(root.get()); - - // Invalid, too many commas - root = parseJSON("[true,, null]"); - EXPECT_FALSE(root.get()); - - // Invalid, no commas - root = parseJSON("[true null]"); - EXPECT_FALSE(root.get()); - - // Invalid, trailing comma - root = parseJSON("[true,]"); - EXPECT_FALSE(root.get()); - - root = parseJSON("[true]"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeArray, root->type()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(1U, list->size()); - tmpValue = list->at(0); - ASSERT_TRUE(tmpValue); - EXPECT_EQ(Value::TypeBoolean, tmpValue->type()); - bool boolValue = false; - EXPECT_TRUE(tmpValue->asBoolean(&boolValue)); - EXPECT_TRUE(boolValue); - - // Don't allow empty elements. - root = parseJSON("[,]"); - EXPECT_FALSE(root.get()); - root = parseJSON("[true,,]"); - EXPECT_FALSE(root.get()); - root = parseJSON("[,true,]"); - EXPECT_FALSE(root.get()); - root = parseJSON("[true,,false]"); - EXPECT_FALSE(root.get()); - - // Test objects - root = parseJSON("{}"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeObject, root->type()); - - root = parseJSON("{\"number\":9.87654321, \"null\":null , \"S\" : \"str\" }"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeObject, root->type()); - protocol::DictionaryValue* objectVal = DictionaryValue::cast(root.get()); - ASSERT_TRUE(objectVal); - doubleVal = 0.0; - EXPECT_TRUE(objectVal->getDouble("number", &doubleVal)); - EXPECT_DOUBLE_EQ(9.87654321, doubleVal); - protocol::Value* nullVal = objectVal->get("null"); - ASSERT_TRUE(nullVal); - EXPECT_EQ(Value::TypeNull, nullVal->type()); - EXPECT_TRUE(objectVal->getString("S", &strVal)); - EXPECT_EQ("str", strVal); - - // Test newline equivalence. - root2 = parseJSON( - "{\n" - " \"number\":9.87654321,\n" - " \"null\":null,\n" - " \"S\":\"str\"\n" - "}\n"); - ASSERT_TRUE(root2.get()); - EXPECT_EQ(root->toJSONString(), root2->toJSONString()); - - root2 = parseJSON( - "{\r\n" - " \"number\":9.87654321,\r\n" - " \"null\":null,\r\n" - " \"S\":\"str\"\r\n" - "}\r\n"); - ASSERT_TRUE(root2.get()); - EXPECT_EQ(root->toJSONString(), root2->toJSONString()); - - // Test nesting - root = parseJSON("{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeObject, root->type()); - objectVal = DictionaryValue::cast(root.get()); - ASSERT_TRUE(objectVal); - protocol::DictionaryValue* innerObject = objectVal->getObject("inner"); - ASSERT_TRUE(innerObject); - protocol::ListValue* innerArray = innerObject->getArray("array"); - ASSERT_TRUE(innerArray); - EXPECT_EQ(1U, innerArray->size()); - boolValue = true; - EXPECT_TRUE(objectVal->getBoolean("false", &boolValue)); - EXPECT_FALSE(boolValue); - innerObject = objectVal->getObject("d"); - EXPECT_TRUE(innerObject); - - // Test keys with periods - root = parseJSON("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeObject, root->type()); - objectVal = DictionaryValue::cast(root.get()); - ASSERT_TRUE(objectVal); - int integerValue = 0; - EXPECT_TRUE(objectVal->getInteger("a.b", &integerValue)); - EXPECT_EQ(3, integerValue); - EXPECT_TRUE(objectVal->getInteger("c", &integerValue)); - EXPECT_EQ(2, integerValue); - innerObject = objectVal->getObject("d.e.f"); - ASSERT_TRUE(innerObject); - EXPECT_EQ(1U, innerObject->size()); - EXPECT_TRUE(innerObject->getInteger("g.h.i.j", &integerValue)); - EXPECT_EQ(1, integerValue); - - root = parseJSON("{\"a\":{\"b\":2},\"a.b\":1}"); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeObject, root->type()); - objectVal = DictionaryValue::cast(root.get()); - ASSERT_TRUE(objectVal); - innerObject = objectVal->getObject("a"); - ASSERT_TRUE(innerObject); - EXPECT_TRUE(innerObject->getInteger("b", &integerValue)); - EXPECT_EQ(2, integerValue); - EXPECT_TRUE(objectVal->getInteger("a.b", &integerValue)); - EXPECT_EQ(1, integerValue); - - // Invalid, no closing brace - root = parseJSON("{\"a\": true"); - EXPECT_FALSE(root.get()); - - // Invalid, keys must be quoted - root = parseJSON("{foo:true}"); - EXPECT_FALSE(root.get()); - - // Invalid, trailing comma - root = parseJSON("{\"a\":true,}"); - EXPECT_FALSE(root.get()); - - // Invalid, too many commas - root = parseJSON("{\"a\":true,,\"b\":false}"); - EXPECT_FALSE(root.get()); - - // Invalid, no separator - root = parseJSON("{\"a\" \"b\"}"); - EXPECT_FALSE(root.get()); - - // Invalid, lone comma. - root = parseJSON("{,}"); - EXPECT_FALSE(root.get()); - root = parseJSON("{\"a\":true,,}"); - EXPECT_FALSE(root.get()); - root = parseJSON("{,\"a\":true}"); - EXPECT_FALSE(root.get()); - root = parseJSON("{\"a\":true,,\"b\":false}"); - EXPECT_FALSE(root.get()); - - // Test stack overflow - String16Builder evil; - evil.reserveCapacity(2000000); - for (int i = 0; i < 1000000; ++i) - evil.append('['); - for (int i = 0; i < 1000000; ++i) - evil.append(']'); - root = parseJSON(evil.toString()); - EXPECT_FALSE(root.get()); - - // A few thousand adjacent lists is fine. - String16Builder notEvil; - notEvil.reserveCapacity(15010); - notEvil.append('['); - for (int i = 0; i < 5000; ++i) - notEvil.append("[],"); - notEvil.append("[]]"); - root = parseJSON(notEvil.toString()); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeArray, root->type()); - list = ListValue::cast(root.get()); - ASSERT_TRUE(list); - EXPECT_EQ(5001U, list->size()); - - // Test utf8 encoded input - root = parseJSON("\"\\xe7\\xbd\\x91\\xe9\\xa1\\xb5\""); - ASSERT_FALSE(root.get()); - - // Test utf16 encoded strings. - root = parseJSON("\"\\u20ac3,14\""); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeString, root->type()); - EXPECT_TRUE(root->asString(&strVal)); - UChar tmp2[] = {0x20ac, 0x33, 0x2c, 0x31, 0x34}; - EXPECT_EQ(String16(tmp2, 5), strVal); - - root = parseJSON("\"\\ud83d\\udca9\\ud83d\\udc6c\""); - ASSERT_TRUE(root.get()); - EXPECT_EQ(Value::TypeString, root->type()); - EXPECT_TRUE(root->asString(&strVal)); - UChar tmp3[] = {0xd83d, 0xdca9, 0xd83d, 0xdc6c}; - EXPECT_EQ(String16(tmp3, 4), strVal); - - // Test literal root objects. - root = parseJSON("null"); - EXPECT_EQ(Value::TypeNull, root->type()); - - root = parseJSON("true"); - ASSERT_TRUE(root.get()); - EXPECT_TRUE(root->asBoolean(&boolValue)); - EXPECT_TRUE(boolValue); - - root = parseJSON("10"); - ASSERT_TRUE(root.get()); - EXPECT_TRUE(root->asInteger(&integerValue)); - EXPECT_EQ(10, integerValue); - - root = parseJSON("\"root\""); - ASSERT_TRUE(root.get()); - EXPECT_TRUE(root->asString(&strVal)); - EXPECT_EQ("root", strVal); -} - -TEST(ParserTest, InvalidSanity) -{ - const char* const invalidJson[] = { - "/* test *", - "{\"foo\"", - "{\"foo\":", - " [", - "\"\\u123g\"", - "{\n\"eh:\n}", - "////", - "*/**/", - "/**/", - "/*/", - "//**/" - }; - - for (size_t i = 0; i < 11; ++i) { - std::unique_ptr result = parseJSON(invalidJson[i]); - EXPECT_FALSE(result.get()); - } -} - -} // namespace protocol -} // namespace blink diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_h.template deleted file mode 100644 index 1f3a1b65c06e40..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/Parser_h.template +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef Parser_h -#define Parser_h - -//#include "Platform.h" -//#include "String16.h" -#include "{{config.class_export.header}}" - -namespace blink { -namespace protocol { - -class Value; - -{{config.class_export.macro}} std::unique_ptr parseJSON(const String16& json); - -} // namespace platform -} // namespace blink - -#endif // !defined(Parser_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_cpp.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_cpp.template deleted file mode 100644 index d795aefa0c2f25..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_cpp.template +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include -#include -#include - -namespace blink { -namespace protocol { - -namespace internal { - -void intToStr(int number, char* buffer, size_t length) -{ - std::snprintf(buffer, length, "%d", number); -} - -void doubleToStr(double number, char* buffer, size_t length) -{ - std::snprintf(buffer, length, "%f", number); -} - -void doubleToStr3(double number, char* buffer, size_t length) -{ - std::snprintf(buffer, length, "%.3g", number); -} - -void doubleToStr6(double number, char* buffer, size_t length) -{ - std::snprintf(buffer, length, "%.6g", number); -} - -double strToDouble(const char* buffer, bool* ok) -{ - char* endptr; - double result = std::strtod(buffer, &endptr); - if (ok) - *ok = !(*endptr); - return result; -} - -int strToInt(const char* buffer, bool* ok) -{ - char* endptr; - int result = std::strtol(buffer, &endptr, 10); - if (ok) - *ok = !(*endptr); - return result; -} - -} // namespace internal - -String16Builder::String16Builder() -{ -} - -void String16Builder::append(const String16& s) -{ - m_buffer.insert(m_buffer.end(), s.characters16(), s.characters16() + s.length()); -} - -void String16Builder::append(UChar c) -{ - m_buffer.push_back(c); -} - -void String16Builder::append(char c) -{ - UChar u = c; - m_buffer.push_back(u); -} - -void String16Builder::append(const UChar* characters, size_t length) -{ - m_buffer.insert(m_buffer.end(), characters, characters + length); -} - -void String16Builder::append(const char* characters, size_t length) -{ - m_buffer.reserve(m_buffer.size() + length); - for (size_t i = 0; i < length; ++i, ++characters) { - UChar u = *characters; - m_buffer.push_back(u); - } -} - -String16 String16Builder::toString() -{ - return String16(m_buffer.data(), m_buffer.size()); -} - -void String16Builder::reserveCapacity(size_t capacity) -{ - m_buffer.reserve(capacity); -} - -} // namespace protocol -} // namespace blink diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_h.template b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_h.template deleted file mode 100644 index e6f8f0c78465ae..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/String16_h.template +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef String16_h -#define String16_h - -//#include "Collections.h" -//#include "Platform.h" -#include "{{config.class_export.header}}" - -#include - -namespace blink { -namespace protocol { - -namespace internal { -{{config.class_export.macro}} void intToStr(int, char*, size_t); -{{config.class_export.macro}} void doubleToStr(double, char*, size_t); -{{config.class_export.macro}} void doubleToStr3(double, char*, size_t); -{{config.class_export.macro}} void doubleToStr6(double, char*, size_t); -{{config.class_export.macro}} double strToDouble(const char*, bool*); -{{config.class_export.macro}} int strToInt(const char*, bool*); -} // namespace internal - -template -class {{config.class_export.macro}} String16Base { -public: - static bool isASCII(C c) - { - return !(c & ~0x7F); - } - - static bool isSpaceOrNewLine(C c) - { - return isASCII(c) && c <= ' ' && (c == ' ' || (c <= 0xD && c >= 0x9)); - } - - static T fromInteger(int number) - { - char buffer[50]; - internal::intToStr(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer)); - return T(buffer); - } - - static T fromDouble(double number) - { - char buffer[100]; - internal::doubleToStr(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer)); - return T(buffer); - } - - static T fromDoublePrecision3(double number) - { - char buffer[100]; - internal::doubleToStr3(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer)); - return T(buffer); - } - - static T fromDoublePrecision6(double number) - { - char buffer[100]; - internal::doubleToStr6(number, buffer, PROTOCOL_ARRAY_LENGTH(buffer)); - return T(buffer); - } - - static double charactersToDouble(const C* characters, size_t length, bool* ok = nullptr) - { - std::vector buffer; - buffer.reserve(length + 1); - for (size_t i = 0; i < length; ++i) { - if (!isASCII(characters[i])) { - if (ok) - *ok = false; - return 0; - } - buffer.push_back(static_cast(characters[i])); - } - buffer.push_back('\0'); - return internal::strToDouble(buffer.data(), ok); - } - - static int charactersToInteger(const C* characters, size_t length, bool* ok = nullptr) - { - std::vector buffer; - buffer.reserve(length + 1); - for (size_t i = 0; i < length; ++i) { - if (!isASCII(characters[i])) { - if (ok) - *ok = false; - return 0; - } - buffer.push_back(static_cast(characters[i])); - } - buffer.push_back('\0'); - return internal::strToInt(buffer.data(), ok); - } - - double toDouble(bool* ok = nullptr) const - { - const C* characters = static_cast(*this).characters16(); - size_t length = static_cast(*this).length(); - return charactersToDouble(characters, length, ok); - } - - int toInteger(bool* ok = nullptr) const - { - const C* characters = static_cast(*this).characters16(); - size_t length = static_cast(*this).length(); - return charactersToInteger(characters, length, ok); - } - - T stripWhiteSpace() const - { - size_t length = static_cast(*this).length(); - if (!length) - return T(); - - unsigned start = 0; - unsigned end = length - 1; - const C* characters = static_cast(*this).characters16(); - - // skip white space from start - while (start <= end && isSpaceOrNewLine(characters[start])) - ++start; - - // only white space - if (start > end) - return T(); - - // skip white space from end - while (end && isSpaceOrNewLine(characters[end])) - --end; - - if (!start && end == length - 1) - return T(static_cast(*this)); - return T(characters + start, end + 1 - start); - } - - bool startsWith(const char* prefix) const - { - const C* characters = static_cast(*this).characters16(); - size_t length = static_cast(*this).length(); - for (size_t i = 0, j = 0; prefix[j] && i < length; ++i, ++j) { - if (characters[i] != prefix[j]) - return false; - } - return true; - } -}; - -} // namespace protocol -} // namespace blink - -#include "{{config.lib.string16_header}}" - -namespace blink { -namespace protocol { - -class {{config.class_export.macro}} String16Builder { -public: - String16Builder(); - void append(const String16&); - void append(UChar); - void append(char); - void append(const UChar*, size_t); - void append(const char*, size_t); - String16 toString(); - void reserveCapacity(size_t); - -private: - std::vector m_buffer; -}; - -} // namespace protocol -} // namespace blink - -using String16 = blink::protocol::String16; -using String16Builder = blink::protocol::String16Builder; - -#endif // !defined(String16_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/sample_config.json b/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/sample_config.json deleted file mode 100644 index 5ad6722cb27d5c..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/inspector_protocol/sample_config.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "protocol": { - "path": "protocol/sample_protocol.json", - "package": "include/generated/files/like/this", - "output": "place/generated/files/here" - }, - - "imported": { - "path": "../relative/path/imported_protocol.json", - "package": "include/imported/files/like/this" - }, - - "exported": { - "package": "include/exported/files/like/this", - "output": "place/exported/files/here" - }, - - "string": { - "class_name": "String16" - }, - - "lib": { - "output": "place/generated/lib/files/here", - "string16_header": "sting16/implementation.h", - "platform_header": "platform/implementation.h" - }, - - "lib_package": "include/lib/files/like/this", - - "class_export": { - "macro": "LIB_EXPORT", - "header": "lib/export.h" - } -} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/Atomics.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/Atomics.h deleted file mode 100644 index 8523df6294158e..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/Atomics.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef Atomics_h -#define Atomics_h - -#include - -#if defined(_MSC_VER) -#include -#endif - -namespace v8_inspector { - -#if defined(_MSC_VER) - -inline int atomicIncrement(int volatile* addend) { return InterlockedIncrement(reinterpret_cast(addend)); } - -#else - -inline int atomicAdd(int volatile* addend, int increment) { return __sync_add_and_fetch(addend, increment); } -inline int atomicIncrement(int volatile* addend) { return atomicAdd(addend, 1); } - -#endif - -} // namespace v8_inspector - -#endif /* Atomics_h */ diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.cpp deleted file mode 100644 index dfe5b923be1ba9..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.cpp +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "platform/v8_inspector/InjectedScript.h" - -#include "platform/v8_inspector/InjectedScriptNative.h" -#include "platform/v8_inspector/InjectedScriptSource.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/RemoteObjectId.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8Console.h" -#include "platform/v8_inspector/V8FunctionCall.h" -#include "platform/v8_inspector/V8InjectedScriptHost.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -using blink::protocol::Array; -using blink::protocol::Debugger::CallFrame; -using blink::protocol::Runtime::PropertyDescriptor; -using blink::protocol::Runtime::InternalPropertyDescriptor; -using blink::protocol::Runtime::RemoteObject; -using blink::protocol::Maybe; - -namespace v8_inspector { - -static bool hasInternalError(ErrorString* errorString, bool hasError) -{ - if (hasError) - *errorString = "Internal error"; - return hasError; -} - -std::unique_ptr InjectedScript::create(InspectedContext* inspectedContext) -{ - v8::Isolate* isolate = inspectedContext->isolate(); - v8::HandleScope handles(isolate); - v8::Local context = inspectedContext->context(); - v8::Context::Scope scope(context); - - std::unique_ptr injectedScriptNative(new InjectedScriptNative(isolate)); - v8::Local scriptHostWrapper = V8InjectedScriptHost::create(context, inspectedContext->inspector()); - injectedScriptNative->setOnInjectedScriptHost(scriptHostWrapper); - - // Inject javascript into the context. The compiled script is supposed to evaluate into - // a single anonymous function(it's anonymous to avoid cluttering the global object with - // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, - // injected script id and explicit reference to the inspected global object. The function is expected - // to create and configure InjectedScript instance that is going to be used by the inspector. - String16 injectedScriptSource(reinterpret_cast(InjectedScriptSource_js), sizeof(InjectedScriptSource_js)); - v8::Local value; - if (!inspectedContext->inspector()->compileAndRunInternalScript(context, toV8String(isolate, injectedScriptSource)).ToLocal(&value)) - return nullptr; - DCHECK(value->IsFunction()); - v8::Local function = v8::Local::Cast(value); - v8::Local windowGlobal = context->Global(); - v8::Local info[] = { scriptHostWrapper, windowGlobal, v8::Number::New(isolate, inspectedContext->contextId()) }; - v8::MicrotasksScope microtasksScope(isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local injectedScriptValue; - if (!function->Call(context, windowGlobal, PROTOCOL_ARRAY_LENGTH(info), info).ToLocal(&injectedScriptValue)) - return nullptr; - if (!injectedScriptValue->IsObject()) - return nullptr; - return wrapUnique(new InjectedScript(inspectedContext, injectedScriptValue.As(), std::move(injectedScriptNative))); -} - -InjectedScript::InjectedScript(InspectedContext* context, v8::Local object, std::unique_ptr injectedScriptNative) - : m_context(context) - , m_value(context->isolate(), object) - , m_native(std::move(injectedScriptNative)) -{ -} - -InjectedScript::~InjectedScript() -{ -} - -void InjectedScript::getProperties(ErrorString* errorString, v8::Local object, const String16& groupName, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, std::unique_ptr>* properties, Maybe* exceptionDetails) -{ - v8::HandleScope handles(m_context->isolate()); - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "getProperties"); - function.appendArgument(object); - function.appendArgument(groupName); - function.appendArgument(ownProperties); - function.appendArgument(accessorPropertiesOnly); - function.appendArgument(generatePreview); - - v8::TryCatch tryCatch(m_context->isolate()); - v8::Local resultValue = function.callWithoutExceptionHandling(); - if (tryCatch.HasCaught()) { - *exceptionDetails = createExceptionDetails(errorString, tryCatch, groupName, generatePreview); - // FIXME: make properties optional - *properties = Array::create(); - return; - } - - std::unique_ptr protocolValue = toProtocolValue(m_context->context(), resultValue); - if (hasInternalError(errorString, !protocolValue)) - return; - protocol::ErrorSupport errors(errorString); - std::unique_ptr> result = Array::parse(protocolValue.get(), &errors); - if (!hasInternalError(errorString, errors.hasErrors())) - *properties = std::move(result); -} - -void InjectedScript::releaseObject(const String16& objectId) -{ - std::unique_ptr parsedObjectId = protocol::parseJSON(objectId); - if (!parsedObjectId) - return; - protocol::DictionaryValue* object = protocol::DictionaryValue::cast(parsedObjectId.get()); - if (!object) - return; - int boundId = 0; - if (!object->getInteger("id", &boundId)) - return; - m_native->unbind(boundId); -} - -std::unique_ptr InjectedScript::wrapObject(ErrorString* errorString, v8::Local value, const String16& groupName, bool forceValueType, bool generatePreview) const -{ - v8::HandleScope handles(m_context->isolate()); - v8::Local wrappedObject; - if (!wrapValue(errorString, value, groupName, forceValueType, generatePreview).ToLocal(&wrappedObject)) - return nullptr; - protocol::ErrorSupport errors; - std::unique_ptr remoteObject = protocol::Runtime::RemoteObject::parse(toProtocolValue(m_context->context(), wrappedObject).get(), &errors); - if (!remoteObject) - *errorString = "Object has too long reference chain"; - return remoteObject; -} - -bool InjectedScript::wrapObjectProperty(ErrorString* errorString, v8::Local object, v8::Local key, const String16& groupName, bool forceValueType, bool generatePreview) const -{ - v8::Local property; - if (hasInternalError(errorString, !object->Get(m_context->context(), key).ToLocal(&property))) - return false; - v8::Local wrappedProperty; - if (!wrapValue(errorString, property, groupName, forceValueType, generatePreview).ToLocal(&wrappedProperty)) - return false; - v8::Maybe success = object->Set(m_context->context(), key, wrappedProperty); - if (hasInternalError(errorString, success.IsNothing() || !success.FromJust())) - return false; - return true; -} - -bool InjectedScript::wrapPropertyInArray(ErrorString* errorString, v8::Local array, v8::Local property, const String16& groupName, bool forceValueType, bool generatePreview) const -{ - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "wrapPropertyInArray"); - function.appendArgument(array); - function.appendArgument(property); - function.appendArgument(groupName); - function.appendArgument(forceValueType); - function.appendArgument(generatePreview); - bool hadException = false; - function.call(hadException); - return !hasInternalError(errorString, hadException); -} - -bool InjectedScript::wrapObjectsInArray(ErrorString* errorString, v8::Local array, const String16& groupName, bool forceValueType, bool generatePreview) const -{ - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "wrapObjectsInArray"); - function.appendArgument(array); - function.appendArgument(groupName); - function.appendArgument(forceValueType); - function.appendArgument(generatePreview); - bool hadException = false; - function.call(hadException); - return !hasInternalError(errorString, hadException); -} - -v8::MaybeLocal InjectedScript::wrapValue(ErrorString* errorString, v8::Local value, const String16& groupName, bool forceValueType, bool generatePreview) const -{ - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "wrapObject"); - function.appendArgument(value); - function.appendArgument(groupName); - function.appendArgument(forceValueType); - function.appendArgument(generatePreview); - bool hadException = false; - v8::Local r = function.call(hadException); - if (hasInternalError(errorString, hadException || r.IsEmpty())) - return v8::MaybeLocal(); - return r; -} - -std::unique_ptr InjectedScript::wrapTable(v8::Local table, v8::Local columns) const -{ - v8::HandleScope handles(m_context->isolate()); - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "wrapTable"); - function.appendArgument(table); - if (columns.IsEmpty()) - function.appendArgument(false); - else - function.appendArgument(columns); - bool hadException = false; - v8::Local r = function.call(hadException); - if (hadException) - return nullptr; - protocol::ErrorSupport errors; - return protocol::Runtime::RemoteObject::parse(toProtocolValue(m_context->context(), r).get(), &errors); -} - -bool InjectedScript::findObject(ErrorString* errorString, const RemoteObjectId& objectId, v8::Local* outObject) const -{ - *outObject = m_native->objectForId(objectId.id()); - if (outObject->IsEmpty()) - *errorString = "Could not find object with given id"; - return !outObject->IsEmpty(); -} - -String16 InjectedScript::objectGroupName(const RemoteObjectId& objectId) const -{ - return m_native->groupName(objectId.id()); -} - -void InjectedScript::releaseObjectGroup(const String16& objectGroup) -{ - m_native->releaseObjectGroup(objectGroup); - if (objectGroup == "console") - m_lastEvaluationResult.Reset(); -} - -void InjectedScript::setCustomObjectFormatterEnabled(bool enabled) -{ - v8::HandleScope handles(m_context->isolate()); - V8FunctionCall function(m_context->inspector(), m_context->context(), v8Value(), "setCustomObjectFormatterEnabled"); - function.appendArgument(enabled); - bool hadException = false; - function.call(hadException); - DCHECK(!hadException); -} - -v8::Local InjectedScript::v8Value() const -{ - return m_value.Get(m_context->isolate()); -} - -v8::Local InjectedScript::lastEvaluationResult() const -{ - if (m_lastEvaluationResult.IsEmpty()) - return v8::Undefined(m_context->isolate()); - return m_lastEvaluationResult.Get(m_context->isolate()); -} - -v8::MaybeLocal InjectedScript::resolveCallArgument(ErrorString* errorString, protocol::Runtime::CallArgument* callArgument) -{ - if (callArgument->hasObjectId()) { - std::unique_ptr remoteObjectId = RemoteObjectId::parse(errorString, callArgument->getObjectId("")); - if (!remoteObjectId) - return v8::MaybeLocal(); - if (remoteObjectId->contextId() != m_context->contextId()) { - *errorString = "Argument should belong to the same JavaScript world as target object"; - return v8::MaybeLocal(); - } - v8::Local object; - if (!findObject(errorString, *remoteObjectId, &object)) - return v8::MaybeLocal(); - return object; - } - if (callArgument->hasValue() || callArgument->hasUnserializableValue()) { - String16 value = callArgument->hasValue() ? - callArgument->getValue(nullptr)->toJSONString() : - "Number(\"" + callArgument->getUnserializableValue("") + "\")"; - v8::Local object; - if (!m_context->inspector()->compileAndRunInternalScript(m_context->context(), toV8String(m_context->isolate(), value)).ToLocal(&object)) { - *errorString = "Couldn't parse value object in call argument"; - return v8::MaybeLocal(); - } - return object; - } - return v8::Undefined(m_context->isolate()); -} - -std::unique_ptr InjectedScript::createExceptionDetails(ErrorString* errorString, const v8::TryCatch& tryCatch, const String16& objectGroup, bool generatePreview) -{ - if (!tryCatch.HasCaught()) - return nullptr; - v8::Local message = tryCatch.Message(); - v8::Local exception = tryCatch.Exception(); - String16 messageText = message.IsEmpty() ? String16() : toProtocolString(message->Get()); - std::unique_ptr exceptionDetails = protocol::Runtime::ExceptionDetails::create() - .setExceptionId(m_context->inspector()->nextExceptionId()) - .setText(exception.IsEmpty() ? messageText : String16("Uncaught")) - .setLineNumber(message.IsEmpty() ? 0 : message->GetLineNumber(m_context->context()).FromMaybe(1) - 1) - .setColumnNumber(message.IsEmpty() ? 0 : message->GetStartColumn(m_context->context()).FromMaybe(0)) - .build(); - if (!message.IsEmpty()) { - exceptionDetails->setScriptId(String16::fromInteger(message->GetScriptOrigin().ScriptID()->Value())); - v8::Local stackTrace = message->GetStackTrace(); - if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) - exceptionDetails->setStackTrace(m_context->inspector()->debugger()->createStackTrace(stackTrace)->buildInspectorObjectImpl()); - } - if (!exception.IsEmpty()) { - std::unique_ptr wrapped = wrapObject(errorString, exception, objectGroup, false /* forceValueType */, generatePreview && !exception->IsNativeError()); - if (!wrapped) - return nullptr; - exceptionDetails->setException(std::move(wrapped)); - } - return exceptionDetails; -} - -void InjectedScript::wrapEvaluateResult(ErrorString* errorString, v8::MaybeLocal maybeResultValue, const v8::TryCatch& tryCatch, const String16& objectGroup, bool returnByValue, bool generatePreview, std::unique_ptr* result, Maybe* exceptionDetails) -{ - v8::Local resultValue; - if (!tryCatch.HasCaught()) { - if (hasInternalError(errorString, !maybeResultValue.ToLocal(&resultValue))) - return; - std::unique_ptr remoteObject = wrapObject(errorString, resultValue, objectGroup, returnByValue, generatePreview); - if (!remoteObject) - return; - if (objectGroup == "console") - m_lastEvaluationResult.Reset(m_context->isolate(), resultValue); - *result = std::move(remoteObject); - } else { - v8::Local exception = tryCatch.Exception(); - std::unique_ptr remoteObject = wrapObject(errorString, exception, objectGroup, false, generatePreview && !exception->IsNativeError()); - if (!remoteObject) - return; - // We send exception in result for compatibility reasons, even though it's accessible through exceptionDetails.exception. - *result = std::move(remoteObject); - *exceptionDetails = createExceptionDetails(errorString, tryCatch, objectGroup, generatePreview); - } -} - -v8::Local InjectedScript::commandLineAPI() -{ - if (m_commandLineAPI.IsEmpty()) - m_commandLineAPI.Reset(m_context->isolate(), V8Console::createCommandLineAPI(m_context)); - return m_commandLineAPI.Get(m_context->isolate()); -} - -InjectedScript::Scope::Scope(ErrorString* errorString, V8InspectorImpl* inspector, int contextGroupId) - : m_errorString(errorString) - , m_inspector(inspector) - , m_contextGroupId(contextGroupId) - , m_injectedScript(nullptr) - , m_handleScope(inspector->isolate()) - , m_tryCatch(inspector->isolate()) - , m_ignoreExceptionsAndMuteConsole(false) - , m_previousPauseOnExceptionsState(V8Debugger::DontPauseOnExceptions) - , m_userGesture(false) -{ -} - -bool InjectedScript::Scope::initialize() -{ - cleanup(); - // TODO(dgozman): what if we reattach to the same context group during evaluate? Introduce a session id? - V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup(m_contextGroupId); - if (!session) { - *m_errorString = "Internal error"; - return false; - } - findInjectedScript(session); - if (!m_injectedScript) - return false; - m_context = m_injectedScript->context()->context(); - m_context->Enter(); - return true; -} - -bool InjectedScript::Scope::installCommandLineAPI() -{ - DCHECK(m_injectedScript && !m_context.IsEmpty() && !m_commandLineAPIScope.get()); - m_commandLineAPIScope.reset(new V8Console::CommandLineAPIScope(m_context, m_injectedScript->commandLineAPI(), m_context->Global())); - return true; -} - -void InjectedScript::Scope::ignoreExceptionsAndMuteConsole() -{ - DCHECK(!m_ignoreExceptionsAndMuteConsole); - m_ignoreExceptionsAndMuteConsole = true; - m_inspector->client()->muteMetrics(m_contextGroupId); - m_inspector->muteExceptions(m_contextGroupId); - m_previousPauseOnExceptionsState = setPauseOnExceptionsState(V8Debugger::DontPauseOnExceptions); -} - -V8Debugger::PauseOnExceptionsState InjectedScript::Scope::setPauseOnExceptionsState(V8Debugger::PauseOnExceptionsState newState) -{ - if (!m_inspector->debugger()->enabled()) - return newState; - V8Debugger::PauseOnExceptionsState presentState = m_inspector->debugger()->getPauseOnExceptionsState(); - if (presentState != newState) - m_inspector->debugger()->setPauseOnExceptionsState(newState); - return presentState; -} - -void InjectedScript::Scope::pretendUserGesture() -{ - DCHECK(!m_userGesture); - m_userGesture = true; - m_inspector->client()->beginUserGesture(); -} - -void InjectedScript::Scope::cleanup() -{ - m_commandLineAPIScope.reset(); - if (!m_context.IsEmpty()) { - m_context->Exit(); - m_context.Clear(); - } -} - -InjectedScript::Scope::~Scope() -{ - if (m_ignoreExceptionsAndMuteConsole) { - setPauseOnExceptionsState(m_previousPauseOnExceptionsState); - m_inspector->client()->unmuteMetrics(m_contextGroupId); - m_inspector->unmuteExceptions(m_contextGroupId); - } - if (m_userGesture) - m_inspector->client()->endUserGesture(); - cleanup(); -} - -InjectedScript::ContextScope::ContextScope(ErrorString* errorString, V8InspectorImpl* inspector, int contextGroupId, int executionContextId) - : InjectedScript::Scope(errorString, inspector, contextGroupId) - , m_executionContextId(executionContextId) -{ -} - -InjectedScript::ContextScope::~ContextScope() -{ -} - -void InjectedScript::ContextScope::findInjectedScript(V8InspectorSessionImpl* session) -{ - m_injectedScript = session->findInjectedScript(m_errorString, m_executionContextId); -} - -InjectedScript::ObjectScope::ObjectScope(ErrorString* errorString, V8InspectorImpl* inspector, int contextGroupId, const String16& remoteObjectId) - : InjectedScript::Scope(errorString, inspector, contextGroupId) - , m_remoteObjectId(remoteObjectId) -{ -} - -InjectedScript::ObjectScope::~ObjectScope() -{ -} - -void InjectedScript::ObjectScope::findInjectedScript(V8InspectorSessionImpl* session) -{ - std::unique_ptr remoteId = RemoteObjectId::parse(m_errorString, m_remoteObjectId); - if (!remoteId) - return; - InjectedScript* injectedScript = session->findInjectedScript(m_errorString, remoteId.get()); - if (!injectedScript) - return; - m_objectGroupName = injectedScript->objectGroupName(*remoteId); - if (!injectedScript->findObject(m_errorString, *remoteId, &m_object)) - return; - m_injectedScript = injectedScript; -} - -InjectedScript::CallFrameScope::CallFrameScope(ErrorString* errorString, V8InspectorImpl* inspector, int contextGroupId, const String16& remoteObjectId) - : InjectedScript::Scope(errorString, inspector, contextGroupId) - , m_remoteCallFrameId(remoteObjectId) -{ -} - -InjectedScript::CallFrameScope::~CallFrameScope() -{ -} - -void InjectedScript::CallFrameScope::findInjectedScript(V8InspectorSessionImpl* session) -{ - std::unique_ptr remoteId = RemoteCallFrameId::parse(m_errorString, m_remoteCallFrameId); - if (!remoteId) - return; - m_frameOrdinal = static_cast(remoteId->frameOrdinal()); - m_injectedScript = session->findInjectedScript(m_errorString, remoteId.get()); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.h deleted file mode 100644 index 9c674d313eb629..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScript.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef InjectedScript_h -#define InjectedScript_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/InjectedScriptNative.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/V8Console.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/protocol/Runtime.h" - -#include - -namespace v8_inspector { - -class RemoteObjectId; -class V8FunctionCall; -class V8InspectorImpl; -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; -using blink::protocol::Maybe; - -class InjectedScript final { - PROTOCOL_DISALLOW_COPY(InjectedScript); -public: - static std::unique_ptr create(InspectedContext*); - ~InjectedScript(); - - InspectedContext* context() const { return m_context; } - - void getProperties(ErrorString*, v8::Local, const String16& groupName, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, std::unique_ptr>* result, Maybe*); - void releaseObject(const String16& objectId); - - std::unique_ptr wrapObject(ErrorString*, v8::Local, const String16& groupName, bool forceValueType = false, bool generatePreview = false) const; - bool wrapObjectProperty(ErrorString*, v8::Local, v8::Local key, const String16& groupName, bool forceValueType = false, bool generatePreview = false) const; - bool wrapPropertyInArray(ErrorString*, v8::Local, v8::Local property, const String16& groupName, bool forceValueType = false, bool generatePreview = false) const; - bool wrapObjectsInArray(ErrorString*, v8::Local, const String16& groupName, bool forceValueType = false, bool generatePreview = false) const; - std::unique_ptr wrapTable(v8::Local table, v8::Local columns) const; - - bool findObject(ErrorString*, const RemoteObjectId&, v8::Local*) const; - String16 objectGroupName(const RemoteObjectId&) const; - void releaseObjectGroup(const String16&); - void setCustomObjectFormatterEnabled(bool); - v8::MaybeLocal resolveCallArgument(ErrorString*, protocol::Runtime::CallArgument*); - - std::unique_ptr createExceptionDetails(ErrorString*, const v8::TryCatch&, const String16& groupName, bool generatePreview); - void wrapEvaluateResult(ErrorString*, - v8::MaybeLocal maybeResultValue, - const v8::TryCatch&, - const String16& objectGroup, - bool returnByValue, - bool generatePreview, - std::unique_ptr* result, - Maybe*); - v8::Local lastEvaluationResult() const; - - class Scope { - public: - bool initialize(); - bool installCommandLineAPI(); - void ignoreExceptionsAndMuteConsole(); - void pretendUserGesture(); - v8::Local context() const { return m_context; } - InjectedScript* injectedScript() const { return m_injectedScript; } - const v8::TryCatch& tryCatch() const { return m_tryCatch; } - - protected: - Scope(ErrorString*, V8InspectorImpl*, int contextGroupId); - ~Scope(); - virtual void findInjectedScript(V8InspectorSessionImpl*) = 0; - - ErrorString* m_errorString; - V8InspectorImpl* m_inspector; - int m_contextGroupId; - InjectedScript* m_injectedScript; - - private: - void cleanup(); - V8Debugger::PauseOnExceptionsState setPauseOnExceptionsState(V8Debugger::PauseOnExceptionsState); - - v8::HandleScope m_handleScope; - v8::TryCatch m_tryCatch; - v8::Local m_context; - std::unique_ptr m_commandLineAPIScope; - bool m_ignoreExceptionsAndMuteConsole; - V8Debugger::PauseOnExceptionsState m_previousPauseOnExceptionsState; - bool m_userGesture; - }; - - class ContextScope: public Scope { - PROTOCOL_DISALLOW_COPY(ContextScope); - public: - ContextScope(ErrorString*, V8InspectorImpl*, int contextGroupId, int executionContextId); - ~ContextScope(); - private: - void findInjectedScript(V8InspectorSessionImpl*) override; - int m_executionContextId; - }; - - class ObjectScope: public Scope { - PROTOCOL_DISALLOW_COPY(ObjectScope); - public: - ObjectScope(ErrorString*, V8InspectorImpl*, int contextGroupId, const String16& remoteObjectId); - ~ObjectScope(); - const String16& objectGroupName() const { return m_objectGroupName; } - v8::Local object() const { return m_object; } - private: - void findInjectedScript(V8InspectorSessionImpl*) override; - String16 m_remoteObjectId; - String16 m_objectGroupName; - v8::Local m_object; - }; - - class CallFrameScope: public Scope { - PROTOCOL_DISALLOW_COPY(CallFrameScope); - public: - CallFrameScope(ErrorString*, V8InspectorImpl*, int contextGroupId, const String16& remoteCallFrameId); - ~CallFrameScope(); - size_t frameOrdinal() const { return m_frameOrdinal; } - private: - void findInjectedScript(V8InspectorSessionImpl*) override; - String16 m_remoteCallFrameId; - size_t m_frameOrdinal; - }; - -private: - InjectedScript(InspectedContext*, v8::Local, std::unique_ptr); - v8::Local v8Value() const; - v8::MaybeLocal wrapValue(ErrorString*, v8::Local, const String16& groupName, bool forceValueType, bool generatePreview) const; - v8::Local commandLineAPI(); - - InspectedContext* m_context; - v8::Global m_value; - v8::Global m_lastEvaluationResult; - std::unique_ptr m_native; - v8::Global m_commandLineAPI; -}; - -} // namespace v8_inspector - -#endif diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.cpp deleted file mode 100644 index 44f1c8b97d9182..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/InjectedScriptNative.h" - -namespace v8_inspector { - -InjectedScriptNative::InjectedScriptNative(v8::Isolate* isolate) - : m_lastBoundObjectId(1) - , m_isolate(isolate) -{ -} - -static const char privateKeyName[] = "v8-inspector#injectedScript"; - -InjectedScriptNative::~InjectedScriptNative() { } - -void InjectedScriptNative::setOnInjectedScriptHost(v8::Local injectedScriptHost) -{ - v8::HandleScope handleScope(m_isolate); - v8::Local external = v8::External::New(m_isolate, this); - v8::Local privateKey = v8::Private::ForApi(m_isolate, v8::String::NewFromUtf8(m_isolate, privateKeyName, v8::NewStringType::kInternalized).ToLocalChecked()); - injectedScriptHost->SetPrivate(m_isolate->GetCurrentContext(), privateKey, external); -} - -InjectedScriptNative* InjectedScriptNative::fromInjectedScriptHost(v8::Local injectedScriptObject) -{ - v8::Isolate* isolate = injectedScriptObject->GetIsolate(); - v8::HandleScope handleScope(isolate); - v8::Local context = isolate->GetCurrentContext(); - v8::Local privateKey = v8::Private::ForApi(isolate, v8::String::NewFromUtf8(isolate, privateKeyName, v8::NewStringType::kInternalized).ToLocalChecked()); - v8::Local value = injectedScriptObject->GetPrivate(context, privateKey).ToLocalChecked(); - DCHECK(value->IsExternal()); - v8::Local external = value.As(); - return static_cast(external->Value()); -} - -int InjectedScriptNative::bind(v8::Local value, const String16& groupName) -{ - if (m_lastBoundObjectId <= 0) - m_lastBoundObjectId = 1; - int id = m_lastBoundObjectId++; - m_idToWrappedObject[id] = wrapUnique(new v8::Global(m_isolate, value)); - addObjectToGroup(id, groupName); - return id; -} - -void InjectedScriptNative::unbind(int id) -{ - m_idToWrappedObject.erase(id); - m_idToObjectGroupName.erase(id); -} - -v8::Local InjectedScriptNative::objectForId(int id) -{ - auto iter = m_idToWrappedObject.find(id); - return iter != m_idToWrappedObject.end() ? iter->second->Get(m_isolate) : v8::Local(); -} - -void InjectedScriptNative::addObjectToGroup(int objectId, const String16& groupName) -{ - if (groupName.isEmpty()) - return; - if (objectId <= 0) - return; - m_idToObjectGroupName[objectId] = groupName; - m_nameToObjectGroup[groupName].push_back(objectId); // Creates an empty vector if key is not there -} - -void InjectedScriptNative::releaseObjectGroup(const String16& groupName) -{ - if (groupName.isEmpty()) - return; - NameToObjectGroup::iterator groupIt = m_nameToObjectGroup.find(groupName); - if (groupIt == m_nameToObjectGroup.end()) - return; - for (int id : groupIt->second) - unbind(id); - m_nameToObjectGroup.erase(groupIt); -} - -String16 InjectedScriptNative::groupName(int objectId) const -{ - if (objectId <= 0) - return String16(); - IdToObjectGroupName::const_iterator iterator = m_idToObjectGroupName.find(objectId); - return iterator != m_idToObjectGroupName.end() ? iterator->second : String16(); -} - -} // namespace v8_inspector - diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.h deleted file mode 100644 index 036939366e0b50..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InjectedScriptNative.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef InjectedScriptNative_h -#define InjectedScriptNative_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -#include - -namespace v8_inspector { - -namespace protocol = blink::protocol; - -class InjectedScriptNative final { -public: - explicit InjectedScriptNative(v8::Isolate*); - ~InjectedScriptNative(); - - void setOnInjectedScriptHost(v8::Local); - static InjectedScriptNative* fromInjectedScriptHost(v8::Local); - - int bind(v8::Local, const String16& groupName); - void unbind(int id); - v8::Local objectForId(int id); - - void releaseObjectGroup(const String16& groupName); - String16 groupName(int objectId) const; - -private: - void addObjectToGroup(int objectId, const String16& groupName); - - int m_lastBoundObjectId; - v8::Isolate* m_isolate; - protocol::HashMap>> m_idToWrappedObject; - typedef protocol::HashMap IdToObjectGroupName; - IdToObjectGroupName m_idToObjectGroupName; - typedef protocol::HashMap> NameToObjectGroup; - NameToObjectGroup m_nameToObjectGroup; -}; - -} // namespace v8_inspector - -#endif diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.cpp deleted file mode 100644 index f2bf9527696a53..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/InspectedContext.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/V8Console.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8ContextInfo.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -void InspectedContext::weakCallback(const v8::WeakCallbackInfo& data) -{ - InspectedContext* context = data.GetParameter(); - if (!context->m_context.IsEmpty()) { - context->m_context.Reset(); - data.SetSecondPassCallback(&InspectedContext::weakCallback); - } else { - context->m_inspector->discardInspectedContext(context->m_contextGroupId, context->m_contextId); - } -} - -void InspectedContext::consoleWeakCallback(const v8::WeakCallbackInfo& data) -{ - data.GetParameter()->m_console.Reset(); -} - -InspectedContext::InspectedContext(V8InspectorImpl* inspector, const V8ContextInfo& info, int contextId) - : m_inspector(inspector) - , m_context(info.context->GetIsolate(), info.context) - , m_contextId(contextId) - , m_contextGroupId(info.contextGroupId) - , m_origin(info.origin) - , m_humanReadableName(info.humanReadableName) - , m_auxData(info.auxData) - , m_reported(false) -{ - m_context.SetWeak(this, &InspectedContext::weakCallback, v8::WeakCallbackType::kParameter); - - v8::Isolate* isolate = m_inspector->isolate(); - v8::Local global = info.context->Global(); - v8::Local console = V8Console::createConsole(this, info.hasMemoryOnConsole); - if (!global->Set(info.context, toV8StringInternalized(isolate, "console"), console).FromMaybe(false)) - return; - m_console.Reset(isolate, console); - m_console.SetWeak(this, &InspectedContext::consoleWeakCallback, v8::WeakCallbackType::kParameter); -} - -InspectedContext::~InspectedContext() -{ - if (!m_context.IsEmpty() && !m_console.IsEmpty()) { - v8::HandleScope scope(isolate()); - V8Console::clearInspectedContextIfNeeded(context(), m_console.Get(isolate())); - } -} - -v8::Local InspectedContext::context() const -{ - return m_context.Get(isolate()); -} - -v8::Isolate* InspectedContext::isolate() const -{ - return m_inspector->isolate(); -} - -void InspectedContext::createInjectedScript() -{ - DCHECK(!m_injectedScript); - m_injectedScript = InjectedScript::create(this); -} - -void InspectedContext::discardInjectedScript() -{ - m_injectedScript.reset(); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.h deleted file mode 100644 index fcb8af6c01fc75..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/InspectedContext.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef InspectedContext_h -#define InspectedContext_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -namespace v8_inspector { - -class InjectedScript; -class InjectedScriptHost; -class V8ContextInfo; -class V8InspectorImpl; - -namespace protocol = blink::protocol; - -class InspectedContext { - PROTOCOL_DISALLOW_COPY(InspectedContext); -public: - ~InspectedContext(); - - v8::Local context() const; - int contextId() const { return m_contextId; } - int contextGroupId() const { return m_contextGroupId; } - String16 origin() const { return m_origin; } - String16 humanReadableName() const { return m_humanReadableName; } - String16 auxData() const { return m_auxData; } - - bool isReported() const { return m_reported; } - void setReported(bool reported) { m_reported = reported; } - - v8::Isolate* isolate() const; - V8InspectorImpl* inspector() const { return m_inspector; } - - InjectedScript* getInjectedScript() { return m_injectedScript.get(); } - void createInjectedScript(); - void discardInjectedScript(); - -private: - friend class V8InspectorImpl; - InspectedContext(V8InspectorImpl*, const V8ContextInfo&, int contextId); - static void weakCallback(const v8::WeakCallbackInfo&); - static void consoleWeakCallback(const v8::WeakCallbackInfo&); - - V8InspectorImpl* m_inspector; - v8::Global m_context; - int m_contextId; - int m_contextGroupId; - const String16 m_origin; - const String16 m_humanReadableName; - const String16 m_auxData; - bool m_reported; - std::unique_ptr m_injectedScript; - v8::Global m_console; -}; - -} // namespace v8_inspector - -#endif diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/JavaScriptCallFrame.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/JavaScriptCallFrame.cpp deleted file mode 100644 index 573b14a9e8c20b..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/JavaScriptCallFrame.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2010, Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "platform/v8_inspector/JavaScriptCallFrame.h" - -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8StringUtil.h" - -#include - -namespace v8_inspector { - -JavaScriptCallFrame::JavaScriptCallFrame(v8::Local debuggerContext, v8::Local callFrame) - : m_isolate(debuggerContext->GetIsolate()) - , m_debuggerContext(m_isolate, debuggerContext) - , m_callFrame(m_isolate, callFrame) -{ -} - -JavaScriptCallFrame::~JavaScriptCallFrame() -{ -} - -int JavaScriptCallFrame::callV8FunctionReturnInt(const char* name) const -{ - v8::HandleScope handleScope(m_isolate); - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local context = v8::Local::New(m_isolate, m_debuggerContext); - v8::Local callFrame = v8::Local::New(m_isolate, m_callFrame); - v8::Local func = v8::Local::Cast(callFrame->Get(toV8StringInternalized(m_isolate, name))); - v8::Local result; - if (!func->Call(context, callFrame, 0, nullptr).ToLocal(&result) || !result->IsInt32()) - return 0; - return result.As()->Value(); -} - -int JavaScriptCallFrame::sourceID() const -{ - return callV8FunctionReturnInt("sourceID"); -} - -int JavaScriptCallFrame::line() const -{ - return callV8FunctionReturnInt("line"); -} - -int JavaScriptCallFrame::column() const -{ - return callV8FunctionReturnInt("column"); -} - -int JavaScriptCallFrame::contextId() const -{ - return callV8FunctionReturnInt("contextId"); -} - -bool JavaScriptCallFrame::isAtReturn() const -{ - v8::HandleScope handleScope(m_isolate); - v8::Local result = v8::Local::New(m_isolate, m_callFrame)->Get(toV8StringInternalized(m_isolate, "isAtReturn")); - if (result.IsEmpty() || !result->IsBoolean()) - return false; - return result->BooleanValue(); -} - -v8::Local JavaScriptCallFrame::details() const -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local callFrame = v8::Local::New(m_isolate, m_callFrame); - v8::Local func = v8::Local::Cast(callFrame->Get(toV8StringInternalized(m_isolate, "details"))); - return v8::Local::Cast(func->Call(m_debuggerContext.Get(m_isolate), callFrame, 0, nullptr).ToLocalChecked()); -} - -v8::MaybeLocal JavaScriptCallFrame::evaluate(v8::Local expression) -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kRunMicrotasks); - v8::Local callFrame = v8::Local::New(m_isolate, m_callFrame); - v8::Local evalFunction = v8::Local::Cast(callFrame->Get(toV8StringInternalized(m_isolate, "evaluate"))); - return evalFunction->Call(m_debuggerContext.Get(m_isolate), callFrame, 1, &expression); -} - -v8::MaybeLocal JavaScriptCallFrame::restart() -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local callFrame = v8::Local::New(m_isolate, m_callFrame); - v8::Local restartFunction = v8::Local::Cast(callFrame->Get(toV8StringInternalized(m_isolate, "restart"))); - v8::Debug::SetLiveEditEnabled(m_isolate, true); - v8::MaybeLocal result = restartFunction->Call(m_debuggerContext.Get(m_isolate), callFrame, 0, nullptr); - v8::Debug::SetLiveEditEnabled(m_isolate, false); - return result; -} - -v8::MaybeLocal JavaScriptCallFrame::setVariableValue(int scopeNumber, v8::Local variableName, v8::Local newValue) -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local callFrame = v8::Local::New(m_isolate, m_callFrame); - v8::Local setVariableValueFunction = v8::Local::Cast(callFrame->Get(toV8StringInternalized(m_isolate, "setVariableValue"))); - v8::Local argv[] = { - v8::Local(v8::Integer::New(m_isolate, scopeNumber)), - variableName, - newValue - }; - return setVariableValueFunction->Call(m_debuggerContext.Get(m_isolate), callFrame, PROTOCOL_ARRAY_LENGTH(argv), argv); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformSTL.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformSTL.h deleted file mode 100644 index bfba971e698add..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformSTL.h +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PlatformSTL_h -#define PlatformSTL_h - -#include - -#define PLATFORM_EXPORT -#ifndef CHECK -#define CHECK(condition) ((void) 0) -#endif -#define DCHECK(condition) ((void) 0) -#define NOTREACHED() -#define DCHECK_EQ(i, j) DCHECK(i == j) -#define DCHECK_GE(i, j) DCHECK(i >= j) -#define DCHECK_LT(i, j) DCHECK(i < j) -#define DCHECK_GT(i, j) DCHECK(i > j) -template -inline void USE(T) { } - -#define DEFINE_STATIC_LOCAL(type, name, arguments) \ - static type name; - -#if defined(__APPLE__) && !defined(_LIBCPP_VERSION) - -namespace std { - -template -struct is_convertible { -private: - struct True_ { - char x[2]; - }; - struct False_ { - }; - - static True_ helper(T2 const &); - static False_ helper(...); - -public: - static bool const value = ( - sizeof(True_) == sizeof(is_convertible::helper(T1())) - ); -}; - -template -struct enable_if { -}; - -template -struct enable_if { - typedef T type; -}; - -template -struct remove_extent { - typedef T type; -}; - -template -struct remove_extent { - typedef T type; -}; - -template -struct remove_extent { - typedef T type; -}; - -typedef decltype(nullptr) nullptr_t; - -template -struct integral_constant { - static constexpr T value = v; - typedef T value_type; - typedef integral_constant type; - constexpr operator value_type() const noexcept { return value; } - constexpr value_type operator()() const noexcept { return value; } -}; - -typedef integral_constant true_type; -typedef integral_constant false_type; - -template -struct is_array : false_type {}; - -template -struct is_array : true_type {}; - -template -struct is_array : true_type {}; - -template -struct OwnedPtrDeleter { - static void deletePtr(T* ptr) - { - static_assert(sizeof(T) > 0, "type must be complete"); - delete ptr; - } -}; - -template -struct OwnedPtrDeleter { - static void deletePtr(T* ptr) - { - static_assert(sizeof(T) > 0, "type must be complete"); - delete[] ptr; - } -}; - -template -struct OwnedPtrDeleter { - static_assert(sizeof(T) < 0, "do not use array with size as type"); -}; - -template class unique_ptr { -public: - typedef typename remove_extent::type ValueType; - typedef ValueType* PtrType; - - unique_ptr() : m_ptr(nullptr) {} - unique_ptr(std::nullptr_t) : m_ptr(nullptr) {} - unique_ptr(const unique_ptr&); - unique_ptr(unique_ptr&&); - template ::value>::type> unique_ptr(unique_ptr&&); - - ~unique_ptr() - { - OwnedPtrDeleter::deletePtr(m_ptr); - m_ptr = nullptr; - } - - PtrType get() const { return m_ptr; } - - void reset(PtrType = nullptr); - PtrType release() - { - return this->internalRelease(); - } - - ValueType& operator*() const { DCHECK(m_ptr); return *m_ptr; } - PtrType operator->() const { DCHECK(m_ptr); return m_ptr; } - - ValueType& operator[](std::ptrdiff_t i) const; - - bool operator!() const { return !m_ptr; } - explicit operator bool() const { return m_ptr; } - - unique_ptr& operator=(std::nullptr_t) { reset(); return *this; } - - unique_ptr& operator=(const unique_ptr&); - unique_ptr& operator=(unique_ptr&&); - template unique_ptr& operator=(unique_ptr&&); - - void swap(unique_ptr& o) { std::swap(m_ptr, o.m_ptr); } - - static T* hashTableDeletedValue() { return reinterpret_cast(-1); } - - explicit unique_ptr(PtrType ptr) : m_ptr(ptr) {} // NOLINT - -private: - PtrType internalRelease() const - { - PtrType ptr = m_ptr; - m_ptr = nullptr; - return ptr; - } - - // We should never have two unique_ptrs for the same underlying object - // (otherwise we'll get double-destruction), so these equality operators - // should never be needed. - template bool operator==(const unique_ptr&) const - { - static_assert(!sizeof(U*), "unique_ptrs should never be equal"); - return false; - } - template bool operator!=(const unique_ptr&) const - { - static_assert(!sizeof(U*), "unique_ptrs should never be equal"); - return false; - } - - mutable PtrType m_ptr; -}; - - -template inline void unique_ptr::reset(PtrType ptr) -{ - PtrType p = m_ptr; - m_ptr = ptr; - DCHECK(!p || m_ptr != p); - OwnedPtrDeleter::deletePtr(p); -} - -template inline typename unique_ptr::ValueType& unique_ptr::operator[](std::ptrdiff_t i) const -{ - static_assert(is_array::value, "elements access is possible for arrays only"); - DCHECK(m_ptr); - DCHECK_GE(i, 0); - return m_ptr[i]; -} - -template inline unique_ptr::unique_ptr(const unique_ptr& o) // NOLINT - : m_ptr(o.internalRelease()) -{ -} - -template inline unique_ptr::unique_ptr(unique_ptr&& o) // NOLINT - : m_ptr(o.internalRelease()) -{ -} - -template -template inline unique_ptr::unique_ptr(unique_ptr&& o) - : m_ptr(o.release()) -{ - static_assert(!is_array::value, "pointers to array must never be converted"); -} - -template inline unique_ptr& unique_ptr::operator=(const unique_ptr& o) -{ - reset(o.internalRelease()); - return *this; -} - -template inline unique_ptr& unique_ptr::operator=(unique_ptr&& o) -{ - reset(o.internalRelease()); - return *this; -} - -template -template inline unique_ptr& unique_ptr::operator=(unique_ptr&& o) -{ - static_assert(!is_array::value, "pointers to array must never be converted"); - PtrType ptr = m_ptr; - m_ptr = o.release(); - DCHECK(!ptr || m_ptr != ptr); - OwnedPtrDeleter::deletePtr(ptr); - - return *this; -} - -template inline void swap(unique_ptr& a, unique_ptr& b) -{ - a.swap(b); -} - -template inline bool operator==(const unique_ptr& a, U* b) -{ - return a.get() == b; -} - -template inline bool operator==(T* a, const unique_ptr& b) -{ - return a == b.get(); -} - -template inline bool operator!=(const unique_ptr& a, U* b) -{ - return a.get() != b; -} - -template inline bool operator!=(T* a, const unique_ptr& b) -{ - return a != b.get(); -} - -template inline typename unique_ptr::PtrType getPtr(const unique_ptr& p) -{ - return p.get(); -} - -template -unique_ptr move(unique_ptr& ptr) -{ - return unique_ptr(ptr.release()); -} - -} - -#endif // defined(__APPLE__) && !defined(_LIBCPP_VERSION) - -template -std::unique_ptr wrapUnique(T* ptr) -{ - return std::unique_ptr(ptr); -} - -// emulate snprintf() on windows, _snprintf() doesn't zero-terminate the buffer -// on overflow... -// VS 2015 added a standard conform snprintf -#if defined(_WIN32) && defined( _MSC_VER ) && (_MSC_VER < 1900) -#include -namespace std { - -inline static int snprintf(char *buffer, size_t n, const char *format, ...) -{ - va_list argp; - va_start(argp, format); - int ret = _vscprintf(format, argp); - vsnprintf_s(buffer, n, _TRUNCATE, format, argp); - va_end(argp); - return ret; -} -} // namespace std -#endif // (_WIN32) && defined( _MSC_VER ) && (_MSC_VER < 1900) - -#ifdef __sun -namespace std { -using ::snprintf; -} // namespace std -#endif // __sun - -#endif // PlatformSTL_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformWTF.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformWTF.h deleted file mode 100644 index 3cd659e6881e54..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/PlatformWTF.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PlatformWTF_h -#define PlatformWTF_h - -#include "platform/PlatformExport.h" -#include "wtf/Assertions.h" -#include "wtf/PtrUtil.h" - -#include - -#endif // PlatformWTF_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.cpp deleted file mode 100644 index ccdd5bef101264..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/RemoteObjectId.h" - -namespace v8_inspector { - -RemoteObjectIdBase::RemoteObjectIdBase() : m_injectedScriptId(0) { } - -std::unique_ptr RemoteObjectIdBase::parseInjectedScriptId(const String16& objectId) -{ - std::unique_ptr parsedValue = protocol::parseJSON(objectId); - if (!parsedValue || parsedValue->type() != protocol::Value::TypeObject) - return nullptr; - - std::unique_ptr parsedObjectId(protocol::DictionaryValue::cast(parsedValue.release())); - bool success = parsedObjectId->getInteger("injectedScriptId", &m_injectedScriptId); - if (success) - return parsedObjectId; - return nullptr; -} - -RemoteObjectId::RemoteObjectId() : RemoteObjectIdBase(), m_id(0) { } - -std::unique_ptr RemoteObjectId::parse(ErrorString* errorString, const String16& objectId) -{ - std::unique_ptr result(new RemoteObjectId()); - std::unique_ptr parsedObjectId = result->parseInjectedScriptId(objectId); - if (!parsedObjectId) { - *errorString = "Invalid remote object id"; - return nullptr; - } - - bool success = parsedObjectId->getInteger("id", &result->m_id); - if (!success) { - *errorString = "Invalid remote object id"; - return nullptr; - } - return result; -} - -RemoteCallFrameId::RemoteCallFrameId() : RemoteObjectIdBase(), m_frameOrdinal(0) { } - -std::unique_ptr RemoteCallFrameId::parse(ErrorString* errorString, const String16& objectId) -{ - std::unique_ptr result(new RemoteCallFrameId()); - std::unique_ptr parsedObjectId = result->parseInjectedScriptId(objectId); - if (!parsedObjectId) { - *errorString = "Invalid call frame id"; - return nullptr; - } - - bool success = parsedObjectId->getInteger("ordinal", &result->m_frameOrdinal); - if (!success) { - *errorString = "Invalid call frame id"; - return nullptr; - } - - return result; -} - -String16 RemoteCallFrameId::serialize(int injectedScriptId, int frameOrdinal) -{ - return "{\"ordinal\":" + String16::fromInteger(frameOrdinal) + ",\"injectedScriptId\":" + String16::fromInteger(injectedScriptId) + "}"; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.h deleted file mode 100644 index 128326ab4bcd0e..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/RemoteObjectId.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef RemoteObjectId_h -#define RemoteObjectId_h - -#include "platform/inspector_protocol/InspectorProtocol.h" - -namespace v8_inspector { - -namespace protocol = blink::protocol; - -class RemoteObjectIdBase { -public: - int contextId() const { return m_injectedScriptId; } - -protected: - RemoteObjectIdBase(); - ~RemoteObjectIdBase() { } - - std::unique_ptr parseInjectedScriptId(const String16&); - - int m_injectedScriptId; -}; - -class RemoteObjectId final : public RemoteObjectIdBase { -public: - static std::unique_ptr parse(ErrorString*, const String16&); - ~RemoteObjectId() { } - int id() const { return m_id; } - -private: - RemoteObjectId(); - - int m_id; -}; - -class RemoteCallFrameId final : public RemoteObjectIdBase { -public: - static std::unique_ptr parse(ErrorString*, const String16&); - ~RemoteCallFrameId() { } - - int frameOrdinal() const { return m_frameOrdinal; } - - static String16 serialize(int injectedScriptId, int frameOrdinal); -private: - RemoteCallFrameId(); - - int m_frameOrdinal; -}; - -} // namespace v8_inspector - -#endif // !defined(RemoteObjectId_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.cpp deleted file mode 100644 index 990932d47f18c6..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.cpp +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/inspector_protocol/InspectorProtocol.h" - -#include -#include -#include -#include - -namespace blink { -namespace protocol { - -const UChar replacementCharacter = 0xFFFD; -using UChar32 = uint32_t; - -inline int inlineUTF8SequenceLengthNonASCII(char b0) -{ - if ((b0 & 0xC0) != 0xC0) - return 0; - if ((b0 & 0xE0) == 0xC0) - return 2; - if ((b0 & 0xF0) == 0xE0) - return 3; - if ((b0 & 0xF8) == 0xF0) - return 4; - return 0; -} - -inline int inlineUTF8SequenceLength(char b0) -{ - return String16::isASCII(b0) ? 1 : inlineUTF8SequenceLengthNonASCII(b0); -} - -// Once the bits are split out into bytes of UTF-8, this is a mask OR-ed -// into the first byte, depending on how many bytes follow. There are -// as many entries in this table as there are UTF-8 sequence types. -// (I.e., one byte sequence, two byte... etc.). Remember that sequences -// for *legal* UTF-8 will be 4 or fewer bytes total. -static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - -typedef enum { - conversionOK, // conversion successful - sourceExhausted, // partial character in source, but hit end - targetExhausted, // insuff. room in target for conversion - sourceIllegal // source sequence is illegal/malformed -} ConversionResult; - -ConversionResult convertUTF16ToUTF8( - const UChar** sourceStart, const UChar* sourceEnd, - char** targetStart, char* targetEnd, bool strict) -{ - ConversionResult result = conversionOK; - const UChar* source = *sourceStart; - char* target = *targetStart; - while (source < sourceEnd) { - UChar32 ch; - unsigned short bytesToWrite = 0; - const UChar32 byteMask = 0xBF; - const UChar32 byteMark = 0x80; - const UChar* oldSource = source; // In case we have to back up because of target overflow. - ch = static_cast(*source++); - // If we have a surrogate pair, convert to UChar32 first. - if (ch >= 0xD800 && ch <= 0xDBFF) { - // If the 16 bits following the high surrogate are in the source buffer... - if (source < sourceEnd) { - UChar32 ch2 = static_cast(*source); - // If it's a low surrogate, convert to UChar32. - if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { - ch = ((ch - 0xD800) << 10) + (ch2 - 0xDC00) + 0x0010000; - ++source; - } else if (strict) { // it's an unpaired high surrogate - --source; // return to the illegal value itself - result = sourceIllegal; - break; - } - } else { // We don't have the 16 bits following the high surrogate. - --source; // return to the high surrogate - result = sourceExhausted; - break; - } - } else if (strict) { - // UTF-16 surrogate values are illegal in UTF-32 - if (ch >= 0xDC00 && ch <= 0xDFFF) { - --source; // return to the illegal value itself - result = sourceIllegal; - break; - } - } - // Figure out how many bytes the result will require - if (ch < (UChar32)0x80) { - bytesToWrite = 1; - } else if (ch < (UChar32)0x800) { - bytesToWrite = 2; - } else if (ch < (UChar32)0x10000) { - bytesToWrite = 3; - } else if (ch < (UChar32)0x110000) { - bytesToWrite = 4; - } else { - bytesToWrite = 3; - ch = replacementCharacter; - } - - target += bytesToWrite; - if (target > targetEnd) { - source = oldSource; // Back up source pointer! - target -= bytesToWrite; - result = targetExhausted; - break; - } - switch (bytesToWrite) { // note: everything falls through. - case 4: - *--target = (char)((ch | byteMark) & byteMask); - ch >>= 6; - case 3: - *--target = (char)((ch | byteMark) & byteMask); - ch >>= 6; - case 2: - *--target = (char)((ch | byteMark) & byteMask); - ch >>= 6; - case 1: - *--target = (char)(ch | firstByteMark[bytesToWrite]); - } - target += bytesToWrite; - } - *sourceStart = source; - *targetStart = target; - return result; -} - -/** - * Is this code point a BMP code point (U+0000..U+ffff)? - * @param c 32-bit code point - * @return TRUE or FALSE - * @stable ICU 2.8 - */ -#define U_IS_BMP(c) ((uint32_t)(c) <= 0xffff) - -/** - * Is this code point a supplementary code point (U+10000..U+10ffff)? - * @param c 32-bit code point - * @return TRUE or FALSE - * @stable ICU 2.8 - */ -#define U_IS_SUPPLEMENTARY(c) ((uint32_t)((c) - 0x10000) <= 0xfffff) - -/** - * Is this code point a surrogate (U+d800..U+dfff)? - * @param c 32-bit code point - * @return TRUE or FALSE - * @stable ICU 2.4 - */ -#define U_IS_SURROGATE(c) (((c) & 0xfffff800) == 0xd800) - -/** - * Get the lead surrogate (0xd800..0xdbff) for a - * supplementary code point (0x10000..0x10ffff). - * @param supplementary 32-bit code point (U+10000..U+10ffff) - * @return lead surrogate (U+d800..U+dbff) for supplementary - * @stable ICU 2.4 - */ -#define U16_LEAD(supplementary) (UChar)(((supplementary) >> 10) + 0xd7c0) - -/** - * Get the trail surrogate (0xdc00..0xdfff) for a - * supplementary code point (0x10000..0x10ffff). - * @param supplementary 32-bit code point (U+10000..U+10ffff) - * @return trail surrogate (U+dc00..U+dfff) for supplementary - * @stable ICU 2.4 - */ -#define U16_TRAIL(supplementary) (UChar)(((supplementary) & 0x3ff) | 0xdc00) - -// This must be called with the length pre-determined by the first byte. -// If presented with a length > 4, this returns false. The Unicode -// definition of UTF-8 goes up to 4-byte sequences. -static bool isLegalUTF8(const unsigned char* source, int length) -{ - unsigned char a; - const unsigned char* srcptr = source + length; - switch (length) { - default: - return false; - // Everything else falls through when "true"... - case 4: - if ((a = (*--srcptr)) < 0x80 || a > 0xBF) - return false; - case 3: - if ((a = (*--srcptr)) < 0x80 || a > 0xBF) - return false; - case 2: - if ((a = (*--srcptr)) > 0xBF) - return false; - - // no fall-through in this inner switch - switch (*source) { - case 0xE0: - if (a < 0xA0) - return false; - break; - case 0xED: - if (a > 0x9F) - return false; - break; - case 0xF0: - if (a < 0x90) - return false; - break; - case 0xF4: - if (a > 0x8F) - return false; - break; - default: - if (a < 0x80) - return false; - } - - case 1: - if (*source >= 0x80 && *source < 0xC2) - return false; - } - if (*source > 0xF4) - return false; - return true; -} - -// Magic values subtracted from a buffer value during UTF8 conversion. -// This table contains as many values as there might be trailing bytes -// in a UTF-8 sequence. -static const UChar32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, static_cast(0xFA082080UL), static_cast(0x82082080UL) }; - -static inline UChar32 readUTF8Sequence(const char*& sequence, unsigned length) -{ - UChar32 character = 0; - - // The cases all fall through. - switch (length) { - case 6: - character += static_cast(*sequence++); - character <<= 6; - case 5: - character += static_cast(*sequence++); - character <<= 6; - case 4: - character += static_cast(*sequence++); - character <<= 6; - case 3: - character += static_cast(*sequence++); - character <<= 6; - case 2: - character += static_cast(*sequence++); - character <<= 6; - case 1: - character += static_cast(*sequence++); - } - - return character - offsetsFromUTF8[length - 1]; -} - -ConversionResult convertUTF8ToUTF16( - const char** sourceStart, const char* sourceEnd, - UChar** targetStart, UChar* targetEnd, bool* sourceAllASCII, bool strict) -{ - ConversionResult result = conversionOK; - const char* source = *sourceStart; - UChar* target = *targetStart; - UChar orAllData = 0; - while (source < sourceEnd) { - int utf8SequenceLength = inlineUTF8SequenceLength(*source); - if (sourceEnd - source < utf8SequenceLength) { - result = sourceExhausted; - break; - } - // Do this check whether lenient or strict - if (!isLegalUTF8(reinterpret_cast(source), utf8SequenceLength)) { - result = sourceIllegal; - break; - } - - UChar32 character = readUTF8Sequence(source, utf8SequenceLength); - - if (target >= targetEnd) { - source -= utf8SequenceLength; // Back up source pointer! - result = targetExhausted; - break; - } - - if (U_IS_BMP(character)) { - // UTF-16 surrogate values are illegal in UTF-32 - if (U_IS_SURROGATE(character)) { - if (strict) { - source -= utf8SequenceLength; // return to the illegal value itself - result = sourceIllegal; - break; - } - *target++ = replacementCharacter; - orAllData |= replacementCharacter; - } else { - *target++ = static_cast(character); // normal case - orAllData |= character; - } - } else if (U_IS_SUPPLEMENTARY(character)) { - // target is a character in range 0xFFFF - 0x10FFFF - if (target + 1 >= targetEnd) { - source -= utf8SequenceLength; // Back up source pointer! - result = targetExhausted; - break; - } - *target++ = U16_LEAD(character); - *target++ = U16_TRAIL(character); - orAllData = 0xffff; - } else { - if (strict) { - source -= utf8SequenceLength; // return to the start - result = sourceIllegal; - break; // Bail out; shouldn't continue - } else { - *target++ = replacementCharacter; - orAllData |= replacementCharacter; - } - } - } - *sourceStart = source; - *targetStart = target; - - if (sourceAllASCII) - *sourceAllASCII = !(orAllData & ~0x7f); - - return result; -} - -// Helper to write a three-byte UTF-8 code point to the buffer, caller must check room is available. -static inline void putUTF8Triple(char*& buffer, UChar ch) -{ - DCHECK_GE(ch, 0x0800); - *buffer++ = static_cast(((ch >> 12) & 0x0F) | 0xE0); - *buffer++ = static_cast(((ch >> 6) & 0x3F) | 0x80); - *buffer++ = static_cast((ch & 0x3F) | 0x80); -} - -String16 String16::fromUTF8(const char* stringStart, size_t length) -{ - if (!stringStart || !length) - return String16(); - - std::vector buffer(length); - UChar* bufferStart = buffer.data(); - - UChar* bufferCurrent = bufferStart; - const char* stringCurrent = stringStart; - if (convertUTF8ToUTF16(&stringCurrent, stringStart + length, &bufferCurrent, bufferCurrent + buffer.size(), 0, true) != conversionOK) - return String16(); - - unsigned utf16Length = bufferCurrent - bufferStart; - return String16(bufferStart, utf16Length); -} - -std::string String16::utf8() const -{ - unsigned length = this->length(); - - if (!length) - return std::string(""); - - // Allocate a buffer big enough to hold all the characters - // (an individual UTF-16 UChar can only expand to 3 UTF-8 bytes). - // Optimization ideas, if we find this function is hot: - // * We could speculatively create a CStringBuffer to contain 'length' - // characters, and resize if necessary (i.e. if the buffer contains - // non-ascii characters). (Alternatively, scan the buffer first for - // ascii characters, so we know this will be sufficient). - // * We could allocate a CStringBuffer with an appropriate size to - // have a good chance of being able to write the string into the - // buffer without reallocing (say, 1.5 x length). - if (length > std::numeric_limits::max() / 3) - return std::string(); - std::vector bufferVector(length * 3); - char* buffer = bufferVector.data(); - const UChar* characters = m_impl.data(); - - ConversionResult result = convertUTF16ToUTF8(&characters, characters + length, &buffer, buffer + bufferVector.size(), false); - DCHECK(result != targetExhausted); // (length * 3) should be sufficient for any conversion - - // Only produced from strict conversion. - DCHECK(result != sourceIllegal); - - // Check for an unconverted high surrogate. - if (result == sourceExhausted) { - // This should be one unpaired high surrogate. Treat it the same - // was as an unpaired high surrogate would have been handled in - // the middle of a string with non-strict conversion - which is - // to say, simply encode it to UTF-8. - DCHECK((characters + 1) == (m_impl.data() + length)); - DCHECK((*characters >= 0xD800) && (*characters <= 0xDBFF)); - // There should be room left, since one UChar hasn't been - // converted. - DCHECK((buffer + 3) <= (buffer + bufferVector.size())); - putUTF8Triple(buffer, *characters); - } - - return std::string(bufferVector.data(), buffer - bufferVector.data()); -} - -} // namespace protocol -} // namespace blink diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.h deleted file mode 100644 index ffde6c72f52afd..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16STL.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef String16STL_h -#define String16STL_h - -#include -#include -#include -#include -#include -#include -#include - -using UChar = uint16_t; - -namespace blink { -namespace protocol { - -class String16 : public String16Base { -public: - static const size_t kNotFound = static_cast(-1); - - String16() { } - String16(const String16& other) : m_impl(other.m_impl) { } - String16(const UChar* characters, size_t size) : m_impl(characters, size) { } - String16(const UChar* characters) : m_impl(characters) { } - String16(const char* characters) : String16(characters, std::strlen(characters)) { } - String16(const char* characters, size_t size) - { - m_impl.resize(size); - for (size_t i = 0; i < size; ++i) - m_impl[i] = characters[i]; - } - - String16 isolatedCopy() const { return String16(m_impl); } - const UChar* characters16() const { return m_impl.c_str(); } - size_t length() const { return m_impl.length(); } - bool isEmpty() const { return !m_impl.length(); } - UChar operator[](unsigned index) const { return m_impl[index]; } - String16 substring(unsigned pos, unsigned len = UINT_MAX) const { return String16(m_impl.substr(pos, len)); } - size_t find(const String16& str, unsigned start = 0) const { return m_impl.find(str.m_impl, start); } - size_t reverseFind(const String16& str, unsigned start = UINT_MAX) const { return m_impl.rfind(str.m_impl, start); } - - // Convenience methods. - std::string utf8() const; - static String16 fromUTF8(const char* stringStart, size_t length); - - const std::basic_string& impl() const { return m_impl; } - explicit String16(const std::basic_string& impl) : m_impl(impl) { } - - std::size_t hash() const - { - if (!has_hash) { - size_t hash = 0; - for (size_t i = 0; i < length(); ++i) - hash = 31 * hash + m_impl[i]; - hash_code = hash; - has_hash = true; - } - return hash_code; - } - -private: - std::basic_string m_impl; - mutable bool has_hash = false; - mutable std::size_t hash_code = 0; -}; - -inline bool operator==(const String16& a, const String16& b) { return a.impl() == b.impl(); } -inline bool operator<(const String16& a, const String16& b) { return a.impl() < b.impl(); } -inline bool operator!=(const String16& a, const String16& b) { return a.impl() != b.impl(); } -inline bool operator==(const String16& a, const char* b) { return a.impl() == String16(b).impl(); } -inline String16 operator+(const String16& a, const char* b) { return String16(a.impl() + String16(b).impl()); } -inline String16 operator+(const char* a, const String16& b) { return String16(String16(a).impl() + b.impl()); } -inline String16 operator+(const String16& a, const String16& b) { return String16(a.impl() + b.impl()); } - -} // namespace protocol -} // namespace blink - -#if !defined(__APPLE__) || defined(_LIBCPP_VERSION) - -namespace std { -template<> struct hash { - std::size_t operator()(const blink::protocol::String16& string) const - { - return string.hash(); - } -}; - -} // namespace std - -#endif // !defined(__APPLE__) || defined(_LIBCPP_VERSION) - -class InspectorProtocolConvenienceStringType { -public: - // This class should not be ever instantiated, so we don't implement constructors. - InspectorProtocolConvenienceStringType(); - InspectorProtocolConvenienceStringType(const blink::protocol::String16& other); - operator blink::protocol::String16() const { return blink::protocol::String16(); }; -}; - -#endif // !defined(String16STL_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16WTF.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16WTF.h deleted file mode 100644 index b65383a3cfa0b6..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/String16WTF.h +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef String16WTF_h -#define String16WTF_h - -#include "platform/Decimal.h" -#include "public/platform/WebString.h" -#include "wtf/text/StringBuilder.h" -#include "wtf/text/StringConcatenate.h" -#include "wtf/text/StringHash.h" -#include "wtf/text/StringToNumber.h" -#include "wtf/text/StringView.h" -#include "wtf/text/WTFString.h" - -namespace blink { -namespace protocol { - -class PLATFORM_EXPORT String16 : public String16Base { -public: - static const size_t kNotFound = WTF::kNotFound; - - String16() { } - String16(const String16& other) : m_impl(other.m_impl) { } - String16(const UChar* characters, unsigned length) : m_impl(characters, length) { } - String16(const char* characters) : String16(characters, strlen(characters)) { } - String16(const char* characters, size_t length) - { - UChar* data; - m_impl = WTF::String::createUninitialized(length, data); - for (size_t i = 0; i < length; ++i) - data[i] = characters[i]; - } - - ~String16() { } - - String16 isolatedCopy() const { return String16(m_impl.isolatedCopy()); } - const UChar* characters16() const { return m_impl.isEmpty() ? nullptr : m_impl.characters16(); } - size_t length() const { return m_impl.length(); } - bool isEmpty() const { return m_impl.isEmpty(); } - UChar operator[](unsigned index) const { return m_impl[index]; } - String16 substring(unsigned pos, unsigned len = UINT_MAX) const { return m_impl.substring(pos, len); } - size_t find(const String16& str, unsigned start = 0) const { return m_impl.find(str.impl(), start); } - size_t reverseFind(const String16& str, unsigned start = UINT_MAX) const { return m_impl.reverseFind(str.impl(), start); } - - // WTF convenience constructors and helper methods. - String16(const WebString& other) : String16(String(other)) { } - template - String16(const WTF::StringAppend& impl) : String16(String(impl)) { } - String16(const WTF::AtomicString& impl) : String16(String(impl)) { } - String16(const WTF::String& impl) : m_impl(impl) { m_impl.ensure16Bit(); } - String16(WTF::HashTableDeletedValueType) : m_impl(WTF::HashTableDeletedValue) { } - bool isHashTableDeletedValue() const { return m_impl.isHashTableDeletedValue(); } - operator WTF::String() const { return m_impl; } - operator WTF::StringView() const { return StringView(m_impl); } - operator WebString() { return m_impl; } - const WTF::String& impl() const { return m_impl; } - -private: - WTF::String m_impl; -}; - -inline bool operator==(const String16& a, const String16& b) { return a.impl() == b.impl(); } -inline bool operator!=(const String16& a, const String16& b) { return a.impl() != b.impl(); } -inline bool operator==(const String16& a, const char* b) { return a.impl() == b; } -inline String16 operator+(const String16& a, const char* b) { return String16(a.impl() + b); } -inline String16 operator+(const char* a, const String16& b) { return String16(a + b.impl()); } -inline String16 operator+(const String16& a, const String16& b) { return String16(a.impl() + b.impl()); } - -} // namespace protocol -} // namespace blink - -namespace std { -template<> struct hash { - std::size_t operator()(const blink::protocol::String16& string) const - { - return StringHash::hash(string.impl()); - } -}; -} // namespace std - -using InspectorProtocolConvenienceStringType = WTF::String; - -// WTF helpers below this line. - -namespace WTF { - -struct String16Hash { - static unsigned hash(const blink::protocol::String16& key) { return StringHash::hash(key.impl()); } - static bool equal(const blink::protocol::String16& a, const blink::protocol::String16& b) - { - return StringHash::equal(a.impl(), b.impl()); - } - static const bool safeToCompareToEmptyOrDeleted = false; -}; - -template struct DefaultHash; -template<> struct DefaultHash { - typedef String16Hash Hash; -}; - -template<> -struct HashTraits : SimpleClassHashTraits { - static const bool hasIsEmptyValueFunction = true; - static bool isEmptyValue(const blink::protocol::String16& a) { return a.impl().isNull(); } -}; - -} // namespace WTF - -#endif // !defined(String16WTF_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Compat.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Compat.h deleted file mode 100644 index d623da1a616f39..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Compat.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8Compat_h -#define V8Compat_h - -#include - -#if V8_MAJOR_VERSION < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 1) -namespace v8 { - -// In standalone V8 inspector this is expected to be noop anyways... -class V8_EXPORT MicrotasksScope { -public: - enum Type { kRunMicrotasks, kDoNotRunMicrotasks }; - - MicrotasksScope(Isolate* isolate, Type type) - { - // No-op - } -}; - -} // namespace v8 -#define V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, callback, data, length) \ - v8::Function::New((context), (callback), (data), (length)) -#else -#define V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, callback, data, length) \ - v8::Function::New((context), (callback), (data), (length), v8::ConstructorBehavior::kThrow) -#endif // V8_MAJOR_VERSION < 5 || (V8_MAJOR_VERSION == 5 && V8_MINOR_VERSION < 1) - -#endif // V8Compat_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.cpp deleted file mode 100644 index 73a90e225e11ae..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.cpp +++ /dev/null @@ -1,831 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8Console.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8ConsoleMessage.h" -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8ProfilerAgentImpl.h" -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -namespace { - -v8::Local inspectedContextPrivateKey(v8::Isolate* isolate) -{ - return v8::Private::ForApi(isolate, toV8StringInternalized(isolate, "V8Console#InspectedContext")); -} - -class ConsoleHelper { - PROTOCOL_DISALLOW_COPY(ConsoleHelper); -public: - ConsoleHelper(const v8::FunctionCallbackInfo& info) - : m_info(info) - , m_isolate(info.GetIsolate()) - , m_context(info.GetIsolate()->GetCurrentContext()) - , m_inspectedContext(nullptr) - , m_inspectorClient(nullptr) - { - } - - v8::Local ensureConsole() - { - if (m_console.IsEmpty()) { - DCHECK(!m_info.Data().IsEmpty()); - DCHECK(!m_info.Data()->IsUndefined()); - m_console = m_info.Data().As(); - } - return m_console; - } - - InspectedContext* ensureInspectedContext() - { - if (m_inspectedContext) - return m_inspectedContext; - v8::Local console = ensureConsole(); - - v8::Local key = inspectedContextPrivateKey(m_isolate); - v8::Local inspectedContextValue; - if (!console->GetPrivate(m_context, key).ToLocal(&inspectedContextValue)) - return nullptr; - DCHECK(inspectedContextValue->IsExternal()); - m_inspectedContext = static_cast(inspectedContextValue.As()->Value()); - return m_inspectedContext; - } - - V8InspectorClient* ensureDebuggerClient() - { - if (m_inspectorClient) - return m_inspectorClient; - InspectedContext* inspectedContext = ensureInspectedContext(); - if (!inspectedContext) - return nullptr; - m_inspectorClient = inspectedContext->inspector()->client(); - return m_inspectorClient; - } - - void reportCall(ConsoleAPIType type) - { - if (!m_info.Length()) - return; - std::vector> arguments; - for (int i = 0; i < m_info.Length(); ++i) - arguments.push_back(m_info[i]); - reportCall(type, arguments); - } - - void reportCallWithDefaultArgument(ConsoleAPIType type, const String16& message) - { - std::vector> arguments; - for (int i = 0; i < m_info.Length(); ++i) - arguments.push_back(m_info[i]); - if (!m_info.Length()) - arguments.push_back(toV8String(m_isolate, message)); - reportCall(type, arguments); - } - - void reportCallWithArgument(ConsoleAPIType type, const String16& message) - { - std::vector> arguments(1, toV8String(m_isolate, message)); - reportCall(type, arguments); - } - - void reportCall(ConsoleAPIType type, const std::vector>& arguments) - { - InspectedContext* inspectedContext = ensureInspectedContext(); - if (!inspectedContext) - return; - V8InspectorImpl* inspector = inspectedContext->inspector(); - std::unique_ptr message = V8ConsoleMessage::createForConsoleAPI(inspector->client()->currentTimeMS(), type, arguments, inspector->debugger()->captureStackTrace(false), inspectedContext); - inspector->ensureConsoleMessageStorage(inspectedContext->contextGroupId())->addMessage(std::move(message)); - } - - void reportDeprecatedCall(const char* id, const String16& message) - { - if (checkAndSetPrivateFlagOnConsole(id, false)) - return; - std::vector> arguments(1, toV8String(m_isolate, message)); - reportCall(ConsoleAPIType::kWarning, arguments); - } - - bool firstArgToBoolean(bool defaultValue) - { - if (m_info.Length() < 1) - return defaultValue; - if (m_info[0]->IsBoolean()) - return m_info[0].As()->Value(); - return m_info[0]->BooleanValue(m_context).FromMaybe(defaultValue); - } - - String16 firstArgToString(const String16& defaultValue) - { - if (m_info.Length() < 1) - return defaultValue; - v8::Local titleValue; - if (m_info[0]->IsObject()) { - if (!m_info[0].As()->ObjectProtoToString(m_context).ToLocal(&titleValue)) - return defaultValue; - } else { - if (!m_info[0]->ToString(m_context).ToLocal(&titleValue)) - return defaultValue; - } - return toProtocolString(titleValue); - } - - v8::MaybeLocal firstArgAsObject() - { - if (m_info.Length() < 1 || !m_info[0]->IsObject()) - return v8::MaybeLocal(); - return m_info[0].As(); - } - - v8::MaybeLocal firstArgAsFunction() - { - if (m_info.Length() < 1 || !m_info[0]->IsFunction()) - return v8::MaybeLocal(); - return m_info[0].As(); - } - - v8::MaybeLocal privateMap(const char* name) - { - v8::Local console = ensureConsole(); - v8::Local privateKey = v8::Private::ForApi(m_isolate, toV8StringInternalized(m_isolate, name)); - v8::Local mapValue; - if (!console->GetPrivate(m_context, privateKey).ToLocal(&mapValue)) - return v8::MaybeLocal(); - if (mapValue->IsUndefined()) { - v8::Local map = v8::Map::New(m_isolate); - if (!console->SetPrivate(m_context, privateKey, map).FromMaybe(false)) - return v8::MaybeLocal(); - return map; - } - return mapValue->IsMap() ? mapValue.As() : v8::MaybeLocal(); - } - - int64_t getIntFromMap(v8::Local map, const String16& key, int64_t defaultValue) - { - v8::Local v8Key = toV8String(m_isolate, key); - if (!map->Has(m_context, v8Key).FromMaybe(false)) - return defaultValue; - v8::Local intValue; - if (!map->Get(m_context, v8Key).ToLocal(&intValue)) - return defaultValue; - return intValue.As()->Value(); - } - - void setIntOnMap(v8::Local map, const String16& key, int64_t value) - { - v8::Local v8Key = toV8String(m_isolate, key); - if (!map->Set(m_context, v8Key, v8::Integer::New(m_isolate, value)).ToLocal(&map)) - return; - } - - double getDoubleFromMap(v8::Local map, const String16& key, double defaultValue) - { - v8::Local v8Key = toV8String(m_isolate, key); - if (!map->Has(m_context, v8Key).FromMaybe(false)) - return defaultValue; - v8::Local intValue; - if (!map->Get(m_context, v8Key).ToLocal(&intValue)) - return defaultValue; - return intValue.As()->Value(); - } - - void setDoubleOnMap(v8::Local map, const String16& key, double value) - { - v8::Local v8Key = toV8String(m_isolate, key); - if (!map->Set(m_context, v8Key, v8::Number::New(m_isolate, value)).ToLocal(&map)) - return; - } - - V8ProfilerAgentImpl* profilerAgent() - { - if (V8InspectorSessionImpl* session = currentSession()) { - if (session && session->profilerAgent()->enabled()) - return session->profilerAgent(); - } - return nullptr; - } - - V8DebuggerAgentImpl* debuggerAgent() - { - if (V8InspectorSessionImpl* session = currentSession()) { - if (session && session->debuggerAgent()->enabled()) - return session->debuggerAgent(); - } - return nullptr; - } - - V8InspectorSessionImpl* currentSession() - { - InspectedContext* inspectedContext = ensureInspectedContext(); - if (!inspectedContext) - return nullptr; - return inspectedContext->inspector()->sessionForContextGroup(inspectedContext->contextGroupId()); - } - -private: - const v8::FunctionCallbackInfo& m_info; - v8::Isolate* m_isolate; - v8::Local m_context; - v8::Local m_console; - InspectedContext* m_inspectedContext; - V8InspectorClient* m_inspectorClient; - - bool checkAndSetPrivateFlagOnConsole(const char* name, bool defaultValue) - { - v8::Local console = ensureConsole(); - v8::Local key = v8::Private::ForApi(m_isolate, toV8StringInternalized(m_isolate, name)); - v8::Local flagValue; - if (!console->GetPrivate(m_context, key).ToLocal(&flagValue)) - return defaultValue; - DCHECK(flagValue->IsUndefined() || flagValue->IsBoolean()); - if (flagValue->IsBoolean()) { - DCHECK(flagValue.As()->Value()); - return true; - } - if (!console->SetPrivate(m_context, key, v8::True(m_isolate)).FromMaybe(false)) - return defaultValue; - return false; - } -}; - -void returnDataCallback(const v8::FunctionCallbackInfo& info) -{ - info.GetReturnValue().Set(info.Data()); -} - -void createBoundFunctionProperty(v8::Local context, v8::Local console, const char* name, v8::FunctionCallback callback, const char* description = nullptr) -{ - v8::Local funcName = toV8StringInternalized(context->GetIsolate(), name); - v8::Local func; - if (!V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, callback, console, 0).ToLocal(&func)) - return; - func->SetName(funcName); - if (description) { - v8::Local returnValue = toV8String(context->GetIsolate(), description); - v8::Local toStringFunction; - if (V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, returnDataCallback, returnValue, 0).ToLocal(&toStringFunction)) - func->Set(toV8StringInternalized(context->GetIsolate(), "toString"), toStringFunction); - } - if (!console->Set(context, funcName, func).FromMaybe(false)) - return; -} - -} // namespace - -void V8Console::debugCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kDebug); -} - -void V8Console::errorCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kError); -} - -void V8Console::infoCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kInfo); -} - -void V8Console::logCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kLog); -} - -void V8Console::warnCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kWarning); -} - -void V8Console::dirCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kDir); -} - -void V8Console::dirxmlCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kDirXML); -} - -void V8Console::tableCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCall(ConsoleAPIType::kTable); -} - -void V8Console::traceCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCallWithDefaultArgument(ConsoleAPIType::kTrace, String16("console.trace")); -} - -void V8Console::groupCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCallWithDefaultArgument(ConsoleAPIType::kStartGroup, String16("console.group")); -} - -void V8Console::groupCollapsedCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCallWithDefaultArgument(ConsoleAPIType::kStartGroupCollapsed, String16("console.groupCollapsed")); -} - -void V8Console::groupEndCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCallWithDefaultArgument(ConsoleAPIType::kEndGroup, String16("console.groupEnd")); -} - -void V8Console::clearCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportCallWithDefaultArgument(ConsoleAPIType::kClear, String16("console.clear")); -} - -void V8Console::countCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - - String16 title = helper.firstArgToString(String16()); - String16 identifier; - if (title.isEmpty()) { - std::unique_ptr stackTrace = V8StackTraceImpl::capture(nullptr, 0, 1); - if (stackTrace) - identifier = stackTrace->topSourceURL() + ":" + String16::fromInteger(stackTrace->topLineNumber()); - } else { - identifier = title + "@"; - } - - v8::Local countMap; - if (!helper.privateMap("V8Console#countMap").ToLocal(&countMap)) - return; - int64_t count = helper.getIntFromMap(countMap, identifier, 0) + 1; - helper.setIntOnMap(countMap, identifier, count); - helper.reportCallWithArgument(ConsoleAPIType::kCount, title + ": " + String16::fromInteger(count)); -} - -void V8Console::assertCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - if (helper.firstArgToBoolean(false)) - return; - - std::vector> arguments; - for (int i = 1; i < info.Length(); ++i) - arguments.push_back(info[i]); - if (info.Length() < 2) - arguments.push_back(toV8String(info.GetIsolate(), String16("console.assert"))); - helper.reportCall(ConsoleAPIType::kAssert, arguments); - - if (V8DebuggerAgentImpl* debuggerAgent = helper.debuggerAgent()) - debuggerAgent->breakProgramOnException(protocol::Debugger::Paused::ReasonEnum::Assert, nullptr); -} - -void V8Console::markTimelineCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportDeprecatedCall("V8Console#markTimelineDeprecated", "'console.markTimeline' is deprecated. Please use 'console.timeStamp' instead."); - timeStampCallback(info); -} - -void V8Console::profileCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - if (V8ProfilerAgentImpl* profilerAgent = helper.profilerAgent()) - profilerAgent->consoleProfile(helper.firstArgToString(String16())); -} - -void V8Console::profileEndCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - if (V8ProfilerAgentImpl* profilerAgent = helper.profilerAgent()) - profilerAgent->consoleProfileEnd(helper.firstArgToString(String16())); -} - -static void timeFunction(const v8::FunctionCallbackInfo& info, bool timelinePrefix) -{ - ConsoleHelper helper(info); - if (V8InspectorClient* client = helper.ensureDebuggerClient()) { - String16 protocolTitle = helper.firstArgToString("default"); - if (timelinePrefix) - protocolTitle = "Timeline '" + protocolTitle + "'"; - client->consoleTime(protocolTitle); - - v8::Local timeMap; - if (!helper.privateMap("V8Console#timeMap").ToLocal(&timeMap)) - return; - helper.setDoubleOnMap(timeMap, protocolTitle, client->currentTimeMS()); - } -} - -static void timeEndFunction(const v8::FunctionCallbackInfo& info, bool timelinePrefix) -{ - ConsoleHelper helper(info); - if (V8InspectorClient* client = helper.ensureDebuggerClient()) { - String16 protocolTitle = helper.firstArgToString("default"); - if (timelinePrefix) - protocolTitle = "Timeline '" + protocolTitle + "'"; - client->consoleTimeEnd(protocolTitle); - - v8::Local timeMap; - if (!helper.privateMap("V8Console#timeMap").ToLocal(&timeMap)) - return; - double elapsed = client->currentTimeMS() - helper.getDoubleFromMap(timeMap, protocolTitle, 0.0); - String16 message = protocolTitle + ": " + String16::fromDoublePrecision3(elapsed) + "ms"; - helper.reportCallWithArgument(ConsoleAPIType::kTimeEnd, message); - } -} - -void V8Console::timelineCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportDeprecatedCall("V8Console#timeline", "'console.timeline' is deprecated. Please use 'console.time' instead."); - timeFunction(info, true); -} - -void V8Console::timelineEndCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper(info).reportDeprecatedCall("V8Console#timelineEnd", "'console.timelineEnd' is deprecated. Please use 'console.timeEnd' instead."); - timeEndFunction(info, true); -} - -void V8Console::timeCallback(const v8::FunctionCallbackInfo& info) -{ - timeFunction(info, false); -} - -void V8Console::timeEndCallback(const v8::FunctionCallbackInfo& info) -{ - timeEndFunction(info, false); -} - -void V8Console::timeStampCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - if (V8InspectorClient* client = helper.ensureDebuggerClient()) - client->consoleTimeStamp(helper.firstArgToString(String16())); -} - -void V8Console::memoryGetterCallback(const v8::FunctionCallbackInfo& info) -{ - if (V8InspectorClient* client = ConsoleHelper(info).ensureDebuggerClient()) { - v8::Local memoryValue; - if (!client->memoryInfo(info.GetIsolate(), info.GetIsolate()->GetCurrentContext()).ToLocal(&memoryValue)) - return; - info.GetReturnValue().Set(memoryValue); - } -} - -void V8Console::memorySetterCallback(const v8::FunctionCallbackInfo& info) -{ - // We can't make the attribute readonly as it breaks existing code that relies on being able to assign to console.memory in strict mode. Instead, the setter just ignores the passed value. http://crbug.com/468611 -} - -void V8Console::keysCallback(const v8::FunctionCallbackInfo& info) -{ - v8::Isolate* isolate = info.GetIsolate(); - info.GetReturnValue().Set(v8::Array::New(isolate)); - - ConsoleHelper helper(info); - v8::Local obj; - if (!helper.firstArgAsObject().ToLocal(&obj)) - return; - v8::Local names; - if (!obj->GetOwnPropertyNames(isolate->GetCurrentContext()).ToLocal(&names)) - return; - info.GetReturnValue().Set(names); -} - -void V8Console::valuesCallback(const v8::FunctionCallbackInfo& info) -{ - v8::Isolate* isolate = info.GetIsolate(); - info.GetReturnValue().Set(v8::Array::New(isolate)); - - ConsoleHelper helper(info); - v8::Local obj; - if (!helper.firstArgAsObject().ToLocal(&obj)) - return; - v8::Local names; - v8::Local context = isolate->GetCurrentContext(); - if (!obj->GetOwnPropertyNames(context).ToLocal(&names)) - return; - v8::Local values = v8::Array::New(isolate, names->Length()); - for (size_t i = 0; i < names->Length(); ++i) { - v8::Local key; - if (!names->Get(context, i).ToLocal(&key)) - continue; - v8::Local value; - if (!obj->Get(context, key).ToLocal(&value)) - continue; - if (!values->Set(context, i, value).FromMaybe(false)) - continue; - } - info.GetReturnValue().Set(values); -} - -static void setFunctionBreakpoint(ConsoleHelper& helper, v8::Local function, V8DebuggerAgentImpl::BreakpointSource source, const String16& condition, bool enable) -{ - V8DebuggerAgentImpl* debuggerAgent = helper.debuggerAgent(); - if (!debuggerAgent) - return; - String16 scriptId = String16::fromInteger(function->ScriptId()); - int lineNumber = function->GetScriptLineNumber(); - int columnNumber = function->GetScriptColumnNumber(); - if (lineNumber == v8::Function::kLineOffsetNotFound || columnNumber == v8::Function::kLineOffsetNotFound) - return; - if (enable) - debuggerAgent->setBreakpointAt(scriptId, lineNumber, columnNumber, source, condition); - else - debuggerAgent->removeBreakpointAt(scriptId, lineNumber, columnNumber, source); -} - -void V8Console::debugFunctionCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - v8::Local function; - if (!helper.firstArgAsFunction().ToLocal(&function)) - return; - setFunctionBreakpoint(helper, function, V8DebuggerAgentImpl::DebugCommandBreakpointSource, String16(), true); -} - -void V8Console::undebugFunctionCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - v8::Local function; - if (!helper.firstArgAsFunction().ToLocal(&function)) - return; - setFunctionBreakpoint(helper, function, V8DebuggerAgentImpl::DebugCommandBreakpointSource, String16(), false); -} - -void V8Console::monitorFunctionCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - v8::Local function; - if (!helper.firstArgAsFunction().ToLocal(&function)) - return; - v8::Local name = function->GetName(); - if (!name->IsString() || !v8::Local::Cast(name)->Length()) - name = function->GetInferredName(); - String16 functionName = toProtocolStringWithTypeCheck(name); - String16Builder builder; - builder.append("console.log(\"function "); - if (functionName.isEmpty()) - builder.append("(anonymous function)"); - else - builder.append(functionName); - builder.append(" called\" + (arguments.length > 0 ? \" with arguments: \" + Array.prototype.join.call(arguments, \", \") : \"\")) && false"); - setFunctionBreakpoint(helper, function, V8DebuggerAgentImpl::MonitorCommandBreakpointSource, builder.toString(), true); -} - -void V8Console::unmonitorFunctionCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - v8::Local function; - if (!helper.firstArgAsFunction().ToLocal(&function)) - return; - setFunctionBreakpoint(helper, function, V8DebuggerAgentImpl::MonitorCommandBreakpointSource, String16(), false); -} - -void V8Console::lastEvaluationResultCallback(const v8::FunctionCallbackInfo& info) -{ - ConsoleHelper helper(info); - InspectedContext* context = helper.ensureInspectedContext(); - if (!context) - return; - if (InjectedScript* injectedScript = context->getInjectedScript()) - info.GetReturnValue().Set(injectedScript->lastEvaluationResult()); -} - -static void inspectImpl(const v8::FunctionCallbackInfo& info, bool copyToClipboard) -{ - if (info.Length() < 1) - return; - if (!copyToClipboard) - info.GetReturnValue().Set(info[0]); - - ConsoleHelper helper(info); - InspectedContext* context = helper.ensureInspectedContext(); - if (!context) - return; - InjectedScript* injectedScript = context->getInjectedScript(); - if (!injectedScript) - return; - ErrorString errorString; - std::unique_ptr wrappedObject = injectedScript->wrapObject(&errorString, info[0], "", false /** forceValueType */, false /** generatePreview */); - if (!wrappedObject || !errorString.isEmpty()) - return; - - std::unique_ptr hints = protocol::DictionaryValue::create(); - if (copyToClipboard) - hints->setBoolean("copyToClipboard", true); - if (V8InspectorSessionImpl* session = helper.currentSession()) - session->runtimeAgent()->inspect(std::move(wrappedObject), std::move(hints)); -} - -void V8Console::inspectCallback(const v8::FunctionCallbackInfo& info) -{ - inspectImpl(info, false); -} - -void V8Console::copyCallback(const v8::FunctionCallbackInfo& info) -{ - inspectImpl(info, true); -} - -void V8Console::inspectedObject(const v8::FunctionCallbackInfo& info, unsigned num) -{ - DCHECK(num < V8InspectorSessionImpl::kInspectedObjectBufferSize); - ConsoleHelper helper(info); - if (V8InspectorSessionImpl* session = helper.currentSession()) { - V8InspectorSession::Inspectable* object = session->inspectedObject(num); - v8::Isolate* isolate = info.GetIsolate(); - if (object) - info.GetReturnValue().Set(object->get(isolate->GetCurrentContext())); - else - info.GetReturnValue().Set(v8::Undefined(isolate)); - } -} - -v8::Local V8Console::createConsole(InspectedContext* inspectedContext, bool hasMemoryAttribute) -{ - v8::Local context = inspectedContext->context(); - v8::Context::Scope contextScope(context); - v8::Isolate* isolate = context->GetIsolate(); - v8::MicrotasksScope microtasksScope(isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - - v8::Local console = v8::Object::New(isolate); - bool success = console->SetPrototype(context, v8::Object::New(isolate)).FromMaybe(false); - DCHECK(success); - - createBoundFunctionProperty(context, console, "debug", V8Console::debugCallback); - createBoundFunctionProperty(context, console, "error", V8Console::errorCallback); - createBoundFunctionProperty(context, console, "info", V8Console::infoCallback); - createBoundFunctionProperty(context, console, "log", V8Console::logCallback); - createBoundFunctionProperty(context, console, "warn", V8Console::warnCallback); - createBoundFunctionProperty(context, console, "dir", V8Console::dirCallback); - createBoundFunctionProperty(context, console, "dirxml", V8Console::dirxmlCallback); - createBoundFunctionProperty(context, console, "table", V8Console::tableCallback); - createBoundFunctionProperty(context, console, "trace", V8Console::traceCallback); - createBoundFunctionProperty(context, console, "group", V8Console::groupCallback); - createBoundFunctionProperty(context, console, "groupCollapsed", V8Console::groupCollapsedCallback); - createBoundFunctionProperty(context, console, "groupEnd", V8Console::groupEndCallback); - createBoundFunctionProperty(context, console, "clear", V8Console::clearCallback); - createBoundFunctionProperty(context, console, "count", V8Console::countCallback); - createBoundFunctionProperty(context, console, "assert", V8Console::assertCallback); - createBoundFunctionProperty(context, console, "markTimeline", V8Console::markTimelineCallback); - createBoundFunctionProperty(context, console, "profile", V8Console::profileCallback); - createBoundFunctionProperty(context, console, "profileEnd", V8Console::profileEndCallback); - createBoundFunctionProperty(context, console, "timeline", V8Console::timelineCallback); - createBoundFunctionProperty(context, console, "timelineEnd", V8Console::timelineEndCallback); - createBoundFunctionProperty(context, console, "time", V8Console::timeCallback); - createBoundFunctionProperty(context, console, "timeEnd", V8Console::timeEndCallback); - createBoundFunctionProperty(context, console, "timeStamp", V8Console::timeStampCallback); - - if (hasMemoryAttribute) - console->SetAccessorProperty(toV8StringInternalized(isolate, "memory"), V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, V8Console::memoryGetterCallback, console, 0).ToLocalChecked(), V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, V8Console::memorySetterCallback, v8::Local(), 0).ToLocalChecked(), static_cast(v8::None), v8::DEFAULT); - - console->SetPrivate(context, inspectedContextPrivateKey(isolate), v8::External::New(isolate, inspectedContext)); - return console; -} - -void V8Console::clearInspectedContextIfNeeded(v8::Local context, v8::Local console) -{ - v8::Isolate* isolate = context->GetIsolate(); - console->SetPrivate(context, inspectedContextPrivateKey(isolate), v8::External::New(isolate, nullptr)); -} - -v8::Local V8Console::createCommandLineAPI(InspectedContext* inspectedContext) -{ - v8::Local context = inspectedContext->context(); - v8::Isolate* isolate = context->GetIsolate(); - v8::MicrotasksScope microtasksScope(isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - - v8::Local commandLineAPI = v8::Object::New(isolate); - bool success = commandLineAPI->SetPrototype(context, v8::Null(isolate)).FromMaybe(false); - DCHECK(success); - - createBoundFunctionProperty(context, commandLineAPI, "dir", V8Console::dirCallback, "function dir(value) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "dirxml", V8Console::dirxmlCallback, "function dirxml(value) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "profile", V8Console::profileCallback, "function profile(title) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "profileEnd", V8Console::profileEndCallback, "function profileEnd(title) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "clear", V8Console::clearCallback, "function clear() { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "table", V8Console::tableCallback, "function table(data, [columns]) { [Command Line API] }"); - - createBoundFunctionProperty(context, commandLineAPI, "keys", V8Console::keysCallback, "function keys(object) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "values", V8Console::valuesCallback, "function values(object) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "debug", V8Console::debugFunctionCallback, "function debug(function) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "undebug", V8Console::undebugFunctionCallback, "function undebug(function) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "monitor", V8Console::monitorFunctionCallback, "function monitor(function) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "unmonitor", V8Console::unmonitorFunctionCallback, "function unmonitor(function) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "inspect", V8Console::inspectCallback, "function inspect(object) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "copy", V8Console::copyCallback, "function copy(value) { [Command Line API] }"); - createBoundFunctionProperty(context, commandLineAPI, "$_", V8Console::lastEvaluationResultCallback); - createBoundFunctionProperty(context, commandLineAPI, "$0", V8Console::inspectedObject0); - createBoundFunctionProperty(context, commandLineAPI, "$1", V8Console::inspectedObject1); - createBoundFunctionProperty(context, commandLineAPI, "$2", V8Console::inspectedObject2); - createBoundFunctionProperty(context, commandLineAPI, "$3", V8Console::inspectedObject3); - createBoundFunctionProperty(context, commandLineAPI, "$4", V8Console::inspectedObject4); - - inspectedContext->inspector()->client()->installAdditionalCommandLineAPI(context, commandLineAPI); - - commandLineAPI->SetPrivate(context, inspectedContextPrivateKey(isolate), v8::External::New(isolate, inspectedContext)); - return commandLineAPI; -} - -static bool isCommandLineAPIGetter(const String16& name) -{ - if (name.length() != 2) - return false; - // $0 ... $4, $_ - return name[0] == '$' && ((name[1] >= '0' && name[1] <= '4') || name[1] == '_'); -} - -void V8Console::CommandLineAPIScope::accessorGetterCallback(v8::Local name, const v8::PropertyCallbackInfo& info) -{ - CommandLineAPIScope* scope = static_cast(info.Data().As()->Value()); - DCHECK(scope); - - v8::Local context = info.GetIsolate()->GetCurrentContext(); - if (scope->m_cleanup) { - bool removed = info.Holder()->Delete(context, name).FromMaybe(false); - DCHECK(removed); - return; - } - v8::Local commandLineAPI = scope->m_commandLineAPI; - - v8::Local value; - if (!commandLineAPI->Get(context, name).ToLocal(&value)) - return; - if (isCommandLineAPIGetter(toProtocolStringWithTypeCheck(name))) { - DCHECK(value->IsFunction()); - v8::MicrotasksScope microtasks(info.GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks); - if (value.As()->Call(context, commandLineAPI, 0, nullptr).ToLocal(&value)) - info.GetReturnValue().Set(value); - } else { - info.GetReturnValue().Set(value); - } -} - -void V8Console::CommandLineAPIScope::accessorSetterCallback(v8::Local name, v8::Local value, const v8::PropertyCallbackInfo& info) -{ - CommandLineAPIScope* scope = static_cast(info.Data().As()->Value()); - v8::Local context = info.GetIsolate()->GetCurrentContext(); - if (!info.Holder()->Delete(context, name).FromMaybe(false)) - return; - if (!info.Holder()->CreateDataProperty(context, name, value).FromMaybe(false)) - return; - bool removed = scope->m_installedMethods->Delete(context, name).FromMaybe(false); - DCHECK(removed); -} - -V8Console::CommandLineAPIScope::CommandLineAPIScope(v8::Local context, v8::Local commandLineAPI, v8::Local global) - : m_context(context) - , m_commandLineAPI(commandLineAPI) - , m_global(global) - , m_installedMethods(v8::Set::New(context->GetIsolate())) - , m_cleanup(false) -{ - v8::Local names; - if (!m_commandLineAPI->GetOwnPropertyNames(context).ToLocal(&names)) - return; - v8::Local externalThis = v8::External::New(context->GetIsolate(), this); - for (size_t i = 0; i < names->Length(); ++i) { - v8::Local name; - if (!names->Get(context, i).ToLocal(&name) || !name->IsName()) - continue; - if (m_global->Has(context, name).FromMaybe(true)) - continue; - if (!m_installedMethods->Add(context, name).ToLocal(&m_installedMethods)) - continue; - if (!m_global->SetAccessor(context, v8::Local::Cast(name), CommandLineAPIScope::accessorGetterCallback, - CommandLineAPIScope::accessorSetterCallback, externalThis, - v8::DEFAULT, v8::DontEnum).FromMaybe(false)) { - bool removed = m_installedMethods->Delete(context, name).FromMaybe(false); - DCHECK(removed); - continue; - } - } -} - -V8Console::CommandLineAPIScope::~CommandLineAPIScope() -{ - m_cleanup = true; - v8::Local names = m_installedMethods->AsArray(); - for (size_t i = 0; i < names->Length(); ++i) { - v8::Local name; - if (!names->Get(m_context, i).ToLocal(&name) || !name->IsName()) - continue; - if (name->IsString()) { - v8::Local descriptor; - bool success = m_global->GetOwnPropertyDescriptor(m_context, v8::Local::Cast(name)).ToLocal(&descriptor); - DCHECK(success); - } - } -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.h deleted file mode 100644 index 757a5e43789ff2..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Console.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8Console_h -#define V8Console_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -namespace v8_inspector { - -class InspectedContext; - -namespace protocol = blink::protocol; - -// Console API -// https://console.spec.whatwg.org/#console-interface -class V8Console { -public: - static v8::Local createConsole(InspectedContext*, bool hasMemoryAttribute); - static void clearInspectedContextIfNeeded(v8::Local, v8::Local console); - static v8::Local createCommandLineAPI(InspectedContext*); - - class CommandLineAPIScope { - PROTOCOL_DISALLOW_COPY(CommandLineAPIScope); - public: - CommandLineAPIScope(v8::Local, v8::Local commandLineAPI, v8::Local global); - ~CommandLineAPIScope(); - - private: - static void accessorGetterCallback(v8::Local, const v8::PropertyCallbackInfo&); - static void accessorSetterCallback(v8::Local, v8::Local, const v8::PropertyCallbackInfo&); - - v8::Local m_context; - v8::Local m_commandLineAPI; - v8::Local m_global; - v8::Local m_installedMethods; - bool m_cleanup; - }; - -private: - static void debugCallback(const v8::FunctionCallbackInfo&); - static void errorCallback(const v8::FunctionCallbackInfo&); - static void infoCallback(const v8::FunctionCallbackInfo&); - static void logCallback(const v8::FunctionCallbackInfo&); - static void warnCallback(const v8::FunctionCallbackInfo&); - static void dirCallback(const v8::FunctionCallbackInfo&); - static void dirxmlCallback(const v8::FunctionCallbackInfo&); - static void tableCallback(const v8::FunctionCallbackInfo&); - static void traceCallback(const v8::FunctionCallbackInfo&); - static void groupCallback(const v8::FunctionCallbackInfo&); - static void groupCollapsedCallback(const v8::FunctionCallbackInfo&); - static void groupEndCallback(const v8::FunctionCallbackInfo&); - static void clearCallback(const v8::FunctionCallbackInfo&); - static void countCallback(const v8::FunctionCallbackInfo&); - static void assertCallback(const v8::FunctionCallbackInfo&); - static void markTimelineCallback(const v8::FunctionCallbackInfo&); - static void profileCallback(const v8::FunctionCallbackInfo&); - static void profileEndCallback(const v8::FunctionCallbackInfo&); - static void timelineCallback(const v8::FunctionCallbackInfo&); - static void timelineEndCallback(const v8::FunctionCallbackInfo&); - static void timeCallback(const v8::FunctionCallbackInfo&); - static void timeEndCallback(const v8::FunctionCallbackInfo&); - static void timeStampCallback(const v8::FunctionCallbackInfo&); - // TODO(foolip): There is no spec for the Memory Info API, see blink-dev: - // https://groups.google.com/a/chromium.org/d/msg/blink-dev/g5YRCGpC9vs/b4OJz71NmPwJ - static void memoryGetterCallback(const v8::FunctionCallbackInfo&); - static void memorySetterCallback(const v8::FunctionCallbackInfo&); - - // CommandLineAPI - static void keysCallback(const v8::FunctionCallbackInfo&); - static void valuesCallback(const v8::FunctionCallbackInfo&); - static void debugFunctionCallback(const v8::FunctionCallbackInfo&); - static void undebugFunctionCallback(const v8::FunctionCallbackInfo&); - static void monitorFunctionCallback(const v8::FunctionCallbackInfo&); - static void unmonitorFunctionCallback(const v8::FunctionCallbackInfo&); - static void lastEvaluationResultCallback(const v8::FunctionCallbackInfo&); - static void inspectCallback(const v8::FunctionCallbackInfo&); - static void copyCallback(const v8::FunctionCallbackInfo&); - static void inspectedObject(const v8::FunctionCallbackInfo&, unsigned num); - static void inspectedObject0(const v8::FunctionCallbackInfo& info) { inspectedObject(info, 0); } - static void inspectedObject1(const v8::FunctionCallbackInfo& info) { inspectedObject(info, 1); } - static void inspectedObject2(const v8::FunctionCallbackInfo& info) { inspectedObject(info, 2); } - static void inspectedObject3(const v8::FunctionCallbackInfo& info) { inspectedObject(info, 3); } - static void inspectedObject4(const v8::FunctionCallbackInfo& info) { inspectedObject(info, 4); } -}; - -} // namespace v8_inspector - -#endif // V8Console_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.cpp deleted file mode 100644 index 820b254c939983..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8ConsoleAgentImpl.h" - -#include "platform/v8_inspector/V8ConsoleMessage.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" - -namespace v8_inspector { - -namespace ConsoleAgentState { -static const char consoleEnabled[] = "consoleEnabled"; -} - -V8ConsoleAgentImpl::V8ConsoleAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) - : m_session(session) - , m_state(state) - , m_frontend(frontendChannel) - , m_enabled(false) -{ -} - -V8ConsoleAgentImpl::~V8ConsoleAgentImpl() -{ -} - -void V8ConsoleAgentImpl::enable(ErrorString* errorString) -{ - if (m_enabled) - return; - m_state->setBoolean(ConsoleAgentState::consoleEnabled, true); - m_enabled = true; - m_session->inspector()->enableStackCapturingIfNeeded(); - reportAllMessages(); -} - -void V8ConsoleAgentImpl::disable(ErrorString* errorString) -{ - if (!m_enabled) - return; - m_session->inspector()->disableStackCapturingIfNeeded(); - m_state->setBoolean(ConsoleAgentState::consoleEnabled, false); - m_enabled = false; -} - -void V8ConsoleAgentImpl::clearMessages(ErrorString* errorString) -{ -} - -void V8ConsoleAgentImpl::restore() -{ - if (!m_state->booleanProperty(ConsoleAgentState::consoleEnabled, false)) - return; - ErrorString ignored; - enable(&ignored); -} - -void V8ConsoleAgentImpl::messageAdded(V8ConsoleMessage* message) -{ - if (m_enabled) - reportMessage(message, true); -} - -bool V8ConsoleAgentImpl::enabled() -{ - return m_enabled; -} - -void V8ConsoleAgentImpl::reportAllMessages() -{ - V8ConsoleMessageStorage* storage = m_session->inspector()->ensureConsoleMessageStorage(m_session->contextGroupId()); - for (const auto& message : storage->messages()) { - if (message->origin() == V8MessageOrigin::kConsole) - reportMessage(message.get(), false); - } -} - -void V8ConsoleAgentImpl::reportMessage(V8ConsoleMessage* message, bool generatePreview) -{ - DCHECK(message->origin() == V8MessageOrigin::kConsole); - message->reportToFrontend(&m_frontend); - m_frontend.flush(); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.h deleted file mode 100644 index 0381394ff3f776..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleAgentImpl.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8ConsoleAgentImpl_h -#define V8ConsoleAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Console.h" - -namespace v8_inspector { - -class V8ConsoleMessage; -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; - -class V8ConsoleAgentImpl : public protocol::Console::Backend { - PROTOCOL_DISALLOW_COPY(V8ConsoleAgentImpl); -public: - V8ConsoleAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8ConsoleAgentImpl() override; - - void enable(ErrorString*) override; - void disable(ErrorString*) override; - void clearMessages(ErrorString*) override; - - void restore(); - void messageAdded(V8ConsoleMessage*); - void reset(); - bool enabled(); - -private: - void reportAllMessages(); - void reportMessage(V8ConsoleMessage*, bool generatePreview); - - V8InspectorSessionImpl* m_session; - protocol::DictionaryValue* m_state; - protocol::Console::Frontend m_frontend; - bool m_enabled; -}; - -} // namespace v8_inspector - - -#endif // !defined(V8ConsoleAgentImpl_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.cpp deleted file mode 100644 index 160ec7417df6b9..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.cpp +++ /dev/null @@ -1,443 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8ConsoleMessage.h" - -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/V8ConsoleAgentImpl.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -namespace { - -String16 consoleAPITypeValue(ConsoleAPIType type) -{ - switch (type) { - case ConsoleAPIType::kLog: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Log; - case ConsoleAPIType::kDebug: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; - case ConsoleAPIType::kInfo: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Info; - case ConsoleAPIType::kError: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Error; - case ConsoleAPIType::kWarning: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Warning; - case ConsoleAPIType::kClear: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Clear; - case ConsoleAPIType::kDir: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Dir; - case ConsoleAPIType::kDirXML: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Dirxml; - case ConsoleAPIType::kTable: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Table; - case ConsoleAPIType::kTrace: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Trace; - case ConsoleAPIType::kStartGroup: return protocol::Runtime::ConsoleAPICalled::TypeEnum::StartGroup; - case ConsoleAPIType::kStartGroupCollapsed: return protocol::Runtime::ConsoleAPICalled::TypeEnum::StartGroupCollapsed; - case ConsoleAPIType::kEndGroup: return protocol::Runtime::ConsoleAPICalled::TypeEnum::EndGroup; - case ConsoleAPIType::kAssert: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Assert; - case ConsoleAPIType::kTimeEnd: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; - case ConsoleAPIType::kCount: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; - } - return protocol::Runtime::ConsoleAPICalled::TypeEnum::Log; -} - -const unsigned maxConsoleMessageCount = 1000; -const unsigned maxArrayItemsLimit = 10000; -const unsigned maxStackDepthLimit = 32; - -class V8ValueStringBuilder { -public: - static String16 toString(v8::Local value, v8::Isolate* isolate) - { - V8ValueStringBuilder builder(isolate); - if (!builder.append(value)) - return String16(); - return builder.toString(); - } - -private: - enum { - IgnoreNull = 1 << 0, - IgnoreUndefined = 1 << 1, - }; - - V8ValueStringBuilder(v8::Isolate* isolate) - : m_arrayLimit(maxArrayItemsLimit) - , m_isolate(isolate) - , m_tryCatch(isolate) - { - } - - bool append(v8::Local value, unsigned ignoreOptions = 0) - { - if (value.IsEmpty()) - return true; - if ((ignoreOptions & IgnoreNull) && value->IsNull()) - return true; - if ((ignoreOptions & IgnoreUndefined) && value->IsUndefined()) - return true; - if (value->IsString()) - return append(v8::Local::Cast(value)); - if (value->IsStringObject()) - return append(v8::Local::Cast(value)->ValueOf()); - if (value->IsSymbol()) - return append(v8::Local::Cast(value)); - if (value->IsSymbolObject()) - return append(v8::Local::Cast(value)->ValueOf()); - if (value->IsNumberObject()) { - m_builder.append(String16::fromDoublePrecision6(v8::Local::Cast(value)->ValueOf())); - return true; - } - if (value->IsBooleanObject()) { - m_builder.append(v8::Local::Cast(value)->ValueOf() ? "true" : "false"); - return true; - } - if (value->IsArray()) - return append(v8::Local::Cast(value)); - if (value->IsProxy()) { - m_builder.append("[object Proxy]"); - return true; - } - if (value->IsObject() - && !value->IsDate() - && !value->IsFunction() - && !value->IsNativeError() - && !value->IsRegExp()) { - v8::Local object = v8::Local::Cast(value); - v8::Local stringValue; - if (object->ObjectProtoToString(m_isolate->GetCurrentContext()).ToLocal(&stringValue)) - return append(stringValue); - } - v8::Local stringValue; - if (!value->ToString(m_isolate->GetCurrentContext()).ToLocal(&stringValue)) - return false; - return append(stringValue); - } - - bool append(v8::Local array) - { - for (const auto& it : m_visitedArrays) { - if (it == array) - return true; - } - uint32_t length = array->Length(); - if (length > m_arrayLimit) - return false; - if (m_visitedArrays.size() > maxStackDepthLimit) - return false; - - bool result = true; - m_arrayLimit -= length; - m_visitedArrays.push_back(array); - for (uint32_t i = 0; i < length; ++i) { - if (i) - m_builder.append(','); - if (!append(array->Get(i), IgnoreNull | IgnoreUndefined)) { - result = false; - break; - } - } - m_visitedArrays.pop_back(); - return result; - } - - bool append(v8::Local symbol) - { - m_builder.append("Symbol("); - bool result = append(symbol->Name(), IgnoreUndefined); - m_builder.append(')'); - return result; - } - - bool append(v8::Local string) - { - if (m_tryCatch.HasCaught()) - return false; - if (!string.IsEmpty()) - m_builder.append(toProtocolString(string)); - return true; - } - - String16 toString() - { - if (m_tryCatch.HasCaught()) - return String16(); - return m_builder.toString(); - } - - uint32_t m_arrayLimit; - v8::Isolate* m_isolate; - String16Builder m_builder; - std::vector> m_visitedArrays; - v8::TryCatch m_tryCatch; -}; - -} // namespace - -V8ConsoleMessage::V8ConsoleMessage(V8MessageOrigin origin, double timestamp, const String16& message) - : m_origin(origin) - , m_timestamp(timestamp) - , m_message(message) - , m_lineNumber(0) - , m_columnNumber(0) - , m_scriptId(0) - , m_contextId(0) - , m_type(ConsoleAPIType::kLog) - , m_exceptionId(0) - , m_revokedExceptionId(0) -{ -} - -V8ConsoleMessage::~V8ConsoleMessage() -{ -} - -void V8ConsoleMessage::setLocation(const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr stackTrace, int scriptId) -{ - m_url = url; - m_lineNumber = lineNumber; - m_columnNumber = columnNumber; - m_stackTrace = std::move(stackTrace); - m_scriptId = scriptId; -} - -void V8ConsoleMessage::reportToFrontend(protocol::Console::Frontend* frontend) const -{ - DCHECK(m_origin == V8MessageOrigin::kConsole); - String16 level = protocol::Console::ConsoleMessage::LevelEnum::Log; - if (m_type == ConsoleAPIType::kDebug || m_type == ConsoleAPIType::kCount || m_type == ConsoleAPIType::kTimeEnd) - level = protocol::Console::ConsoleMessage::LevelEnum::Debug; - else if (m_type == ConsoleAPIType::kError || m_type == ConsoleAPIType::kAssert) - level = protocol::Console::ConsoleMessage::LevelEnum::Error; - else if (m_type == ConsoleAPIType::kWarning) - level = protocol::Console::ConsoleMessage::LevelEnum::Warning; - else if (m_type == ConsoleAPIType::kInfo) - level = protocol::Console::ConsoleMessage::LevelEnum::Info; - std::unique_ptr result = - protocol::Console::ConsoleMessage::create() - .setSource(protocol::Console::ConsoleMessage::SourceEnum::ConsoleApi) - .setLevel(level) - .setText(m_message) - .build(); - result->setLine(static_cast(m_lineNumber)); - result->setColumn(static_cast(m_columnNumber)); - result->setUrl(m_url); - frontend->messageAdded(std::move(result)); -} - -std::unique_ptr> V8ConsoleMessage::wrapArguments(V8InspectorSessionImpl* session, bool generatePreview) const -{ - if (!m_arguments.size() || !m_contextId) - return nullptr; - InspectedContext* inspectedContext = session->inspector()->getContext(session->contextGroupId(), m_contextId); - if (!inspectedContext) - return nullptr; - - v8::Isolate* isolate = inspectedContext->isolate(); - v8::HandleScope handles(isolate); - v8::Local context = inspectedContext->context(); - - std::unique_ptr> args = protocol::Array::create(); - if (m_type == ConsoleAPIType::kTable && generatePreview) { - v8::Local table = m_arguments[0]->Get(isolate); - v8::Local columns = m_arguments.size() > 1 ? m_arguments[1]->Get(isolate) : v8::Local(); - std::unique_ptr wrapped = session->wrapTable(context, table, columns); - if (wrapped) - args->addItem(std::move(wrapped)); - else - args = nullptr; - } else { - for (size_t i = 0; i < m_arguments.size(); ++i) { - std::unique_ptr wrapped = session->wrapObject(context, m_arguments[i]->Get(isolate), "console", generatePreview); - if (!wrapped) { - args = nullptr; - break; - } - args->addItem(std::move(wrapped)); - } - } - return args; -} - -void V8ConsoleMessage::reportToFrontend(protocol::Runtime::Frontend* frontend, V8InspectorSessionImpl* session, bool generatePreview) const -{ - if (m_origin == V8MessageOrigin::kException) { - std::unique_ptr exception = wrapException(session, generatePreview); - std::unique_ptr exceptionDetails = protocol::Runtime::ExceptionDetails::create() - .setExceptionId(m_exceptionId) - .setText(exception ? m_message : m_detailedMessage) - .setLineNumber(m_lineNumber ? m_lineNumber - 1 : 0) - .setColumnNumber(m_columnNumber ? m_columnNumber - 1 : 0) - .build(); - if (m_scriptId) - exceptionDetails->setScriptId(String16::fromInteger(m_scriptId)); - if (!m_url.isEmpty()) - exceptionDetails->setUrl(m_url); - if (m_stackTrace) - exceptionDetails->setStackTrace(m_stackTrace->buildInspectorObjectImpl()); - if (m_contextId) - exceptionDetails->setExecutionContextId(m_contextId); - if (exception) - exceptionDetails->setException(std::move(exception)); - frontend->exceptionThrown(m_timestamp, std::move(exceptionDetails)); - return; - } - if (m_origin == V8MessageOrigin::kRevokedException) { - frontend->exceptionRevoked(m_message, m_revokedExceptionId); - return; - } - if (m_origin == V8MessageOrigin::kConsole) { - std::unique_ptr> arguments = wrapArguments(session, generatePreview); - if (!arguments) { - arguments = protocol::Array::create(); - if (!m_message.isEmpty()) { - std::unique_ptr messageArg = protocol::Runtime::RemoteObject::create().setType(protocol::Runtime::RemoteObject::TypeEnum::String).build(); - messageArg->setValue(protocol::StringValue::create(m_message)); - arguments->addItem(std::move(messageArg)); - } - } - frontend->consoleAPICalled(consoleAPITypeValue(m_type), std::move(arguments), m_contextId, m_timestamp, m_stackTrace ? m_stackTrace->buildInspectorObjectImpl() : nullptr); - return; - } - NOTREACHED(); -} - -std::unique_ptr V8ConsoleMessage::wrapException(V8InspectorSessionImpl* session, bool generatePreview) const -{ - if (!m_arguments.size() || !m_contextId) - return nullptr; - DCHECK_EQ(1u, m_arguments.size()); - InspectedContext* inspectedContext = session->inspector()->getContext(session->contextGroupId(), m_contextId); - if (!inspectedContext) - return nullptr; - - v8::Isolate* isolate = inspectedContext->isolate(); - v8::HandleScope handles(isolate); - // TODO(dgozman): should we use different object group? - return session->wrapObject(inspectedContext->context(), m_arguments[0]->Get(isolate), "console", generatePreview); -} - -V8MessageOrigin V8ConsoleMessage::origin() const -{ - return m_origin; -} - -ConsoleAPIType V8ConsoleMessage::type() const -{ - return m_type; -} - -// static -std::unique_ptr V8ConsoleMessage::createForConsoleAPI(double timestamp, ConsoleAPIType type, const std::vector>& arguments, std::unique_ptr stackTrace, InspectedContext* context) -{ - std::unique_ptr message = wrapUnique(new V8ConsoleMessage(V8MessageOrigin::kConsole, timestamp, String16())); - if (stackTrace && !stackTrace->isEmpty()) { - message->m_url = stackTrace->topSourceURL(); - message->m_lineNumber = stackTrace->topLineNumber(); - message->m_columnNumber = stackTrace->topColumnNumber(); - } - message->m_stackTrace = std::move(stackTrace); - message->m_type = type; - message->m_contextId = context->contextId(); - for (size_t i = 0; i < arguments.size(); ++i) - message->m_arguments.push_back(wrapUnique(new v8::Global(context->isolate(), arguments.at(i)))); - if (arguments.size()) - message->m_message = V8ValueStringBuilder::toString(arguments[0], context->isolate()); - - V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog; - if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || type == ConsoleAPIType::kTimeEnd) - clientType = V8ConsoleAPIType::kDebug; - else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert) - clientType = V8ConsoleAPIType::kError; - else if (type == ConsoleAPIType::kWarning) - clientType = V8ConsoleAPIType::kWarning; - else if (type == ConsoleAPIType::kInfo) - clientType = V8ConsoleAPIType::kInfo; - else if (type == ConsoleAPIType::kClear) - clientType = V8ConsoleAPIType::kClear; - context->inspector()->client()->consoleAPIMessage(context->contextGroupId(), clientType, message->m_message, message->m_url, message->m_lineNumber, message->m_columnNumber, message->m_stackTrace.get()); - - return message; -} - -// static -std::unique_ptr V8ConsoleMessage::createForException(double timestamp, const String16& detailedMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr stackTrace, int scriptId, v8::Isolate* isolate, const String16& message, int contextId, v8::Local exception, unsigned exceptionId) -{ - std::unique_ptr consoleMessage = wrapUnique(new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message)); - consoleMessage->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), scriptId); - consoleMessage->m_exceptionId = exceptionId; - consoleMessage->m_detailedMessage = detailedMessage; - if (contextId && !exception.IsEmpty()) { - consoleMessage->m_contextId = contextId; - consoleMessage->m_arguments.push_back(wrapUnique(new v8::Global(isolate, exception))); - } - return consoleMessage; -} - -// static -std::unique_ptr V8ConsoleMessage::createForRevokedException(double timestamp, const String16& messageText, unsigned revokedExceptionId) -{ - std::unique_ptr message = wrapUnique(new V8ConsoleMessage(V8MessageOrigin::kRevokedException, timestamp, messageText)); - message->m_revokedExceptionId = revokedExceptionId; - return message; -} - -void V8ConsoleMessage::contextDestroyed(int contextId) -{ - if (contextId != m_contextId) - return; - m_contextId = 0; - if (m_message.isEmpty()) - m_message = ""; - Arguments empty; - m_arguments.swap(empty); -} - -// ------------------------ V8ConsoleMessageStorage ---------------------------- - -V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, int contextGroupId) - : m_inspector(inspector) - , m_contextGroupId(contextGroupId) - , m_expiredCount(0) -{ -} - -V8ConsoleMessageStorage::~V8ConsoleMessageStorage() -{ - clear(); -} - -void V8ConsoleMessageStorage::addMessage(std::unique_ptr message) -{ - if (message->type() == ConsoleAPIType::kClear) - clear(); - - V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup(m_contextGroupId); - if (session) { - if (message->origin() == V8MessageOrigin::kConsole) - session->consoleAgent()->messageAdded(message.get()); - session->runtimeAgent()->messageAdded(message.get()); - } - - DCHECK(m_messages.size() <= maxConsoleMessageCount); - if (m_messages.size() == maxConsoleMessageCount) { - ++m_expiredCount; - m_messages.pop_front(); - } - m_messages.push_back(std::move(message)); -} - -void V8ConsoleMessageStorage::clear() -{ - m_messages.clear(); - m_expiredCount = 0; - if (V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup(m_contextGroupId)) - session->releaseObjectGroup("console"); -} - -void V8ConsoleMessageStorage::contextDestroyed(int contextId) -{ - for (size_t i = 0; i < m_messages.size(); ++i) - m_messages[i]->contextDestroyed(contextId); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.h deleted file mode 100644 index 941b61609a1401..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ConsoleMessage.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8ConsoleMessage_h -#define V8ConsoleMessage_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Console.h" -#include "platform/v8_inspector/protocol/Runtime.h" -#include -#include - -namespace v8_inspector { - -class InspectedContext; -class V8InspectorImpl; -class V8InspectorSessionImpl; -class V8StackTraceImpl; - -namespace protocol = blink::protocol; - -enum class V8MessageOrigin { kConsole, kException, kRevokedException }; - -enum class ConsoleAPIType { kLog, kDebug, kInfo, kError, kWarning, kDir, kDirXML, kTable, kTrace, kStartGroup, kStartGroupCollapsed, kEndGroup, kClear, kAssert, kTimeEnd, kCount }; - -class V8ConsoleMessage { -public: - ~V8ConsoleMessage(); - - static std::unique_ptr createForConsoleAPI( - double timestamp, - ConsoleAPIType, - const std::vector>& arguments, - std::unique_ptr, - InspectedContext*); - - static std::unique_ptr createForException( - double timestamp, - const String16& detailedMessage, - const String16& url, - unsigned lineNumber, - unsigned columnNumber, - std::unique_ptr, - int scriptId, - v8::Isolate*, - const String16& message, - int contextId, - v8::Local exception, - unsigned exceptionId); - - static std::unique_ptr createForRevokedException( - double timestamp, - const String16& message, - unsigned revokedExceptionId); - - V8MessageOrigin origin() const; - void reportToFrontend(protocol::Console::Frontend*) const; - void reportToFrontend(protocol::Runtime::Frontend*, V8InspectorSessionImpl*, bool generatePreview) const; - ConsoleAPIType type() const; - void contextDestroyed(int contextId); - -private: - V8ConsoleMessage(V8MessageOrigin, double timestamp, const String16& message); - - using Arguments = std::vector>>; - std::unique_ptr> wrapArguments(V8InspectorSessionImpl*, bool generatePreview) const; - std::unique_ptr wrapException(V8InspectorSessionImpl*, bool generatePreview) const; - void setLocation(const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr, int scriptId); - - V8MessageOrigin m_origin; - double m_timestamp; - String16 m_message; - String16 m_url; - unsigned m_lineNumber; - unsigned m_columnNumber; - std::unique_ptr m_stackTrace; - int m_scriptId; - int m_contextId; - ConsoleAPIType m_type; - unsigned m_exceptionId; - unsigned m_revokedExceptionId; - Arguments m_arguments; - String16 m_detailedMessage; -}; - -class V8ConsoleMessageStorage { -public: - V8ConsoleMessageStorage(V8InspectorImpl*, int contextGroupId); - ~V8ConsoleMessageStorage(); - - int contextGroupId() { return m_contextGroupId; } - int expiredCount() { return m_expiredCount; } - const std::deque>& messages() const { return m_messages; } - - void addMessage(std::unique_ptr); - void contextDestroyed(int contextId); - void clear(); - -private: - V8InspectorImpl* m_inspector; - int m_contextGroupId; - int m_expiredCount; - std::deque> m_messages; -}; - -} // namespace v8_inspector - -#endif // V8ConsoleMessage_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.cpp deleted file mode 100644 index 65fa210a14eccf..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.cpp +++ /dev/null @@ -1,839 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8Debugger.h" - -#include "platform/v8_inspector/DebuggerScript.h" -#include "platform/v8_inspector/ScriptBreakpoint.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InternalValueType.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/V8ValueCopier.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -namespace { -const char stepIntoV8MethodName[] = "stepIntoStatement"; -const char stepOutV8MethodName[] = "stepOutOfFunction"; -static const char v8AsyncTaskEventEnqueue[] = "enqueue"; -static const char v8AsyncTaskEventWillHandle[] = "willHandle"; -static const char v8AsyncTaskEventDidHandle[] = "didHandle"; - -inline v8::Local v8Boolean(bool value, v8::Isolate* isolate) -{ - return value ? v8::True(isolate) : v8::False(isolate); -} - -} // namespace - -static bool inLiveEditScope = false; - -v8::MaybeLocal V8Debugger::callDebuggerMethod(const char* functionName, int argc, v8::Local argv[]) -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local debuggerScript = m_debuggerScript.Get(m_isolate); - v8::Local function = v8::Local::Cast(debuggerScript->Get(toV8StringInternalized(m_isolate, functionName))); - DCHECK(m_isolate->InContext()); - return function->Call(m_isolate->GetCurrentContext(), debuggerScript, argc, argv); -} - -V8Debugger::V8Debugger(v8::Isolate* isolate, V8InspectorImpl* inspector) - : m_isolate(isolate) - , m_inspector(inspector) - , m_lastContextId(0) - , m_enableCount(0) - , m_breakpointsActivated(true) - , m_runningNestedMessageLoop(false) - , m_ignoreScriptParsedEventsCounter(0) - , m_maxAsyncCallStackDepth(0) -{ -} - -V8Debugger::~V8Debugger() -{ -} - -void V8Debugger::enable() -{ - if (m_enableCount++) - return; - DCHECK(!enabled()); - v8::HandleScope scope(m_isolate); - v8::Debug::SetDebugEventListener(m_isolate, &V8Debugger::v8DebugEventCallback, v8::External::New(m_isolate, this)); - m_debuggerContext.Reset(m_isolate, v8::Debug::GetDebugContext(m_isolate)); - compileDebuggerScript(); -} - -void V8Debugger::disable() -{ - if (--m_enableCount) - return; - DCHECK(enabled()); - clearBreakpoints(); - m_debuggerScript.Reset(); - m_debuggerContext.Reset(); - allAsyncTasksCanceled(); - v8::Debug::SetDebugEventListener(m_isolate, nullptr); -} - -bool V8Debugger::enabled() const -{ - return !m_debuggerScript.IsEmpty(); -} - -// static -int V8Debugger::contextId(v8::Local context) -{ - v8::Local data = context->GetEmbedderData(static_cast(v8::Context::kDebugIdIndex)); - if (data.IsEmpty() || !data->IsString()) - return 0; - String16 dataString = toProtocolString(data.As()); - if (dataString.isEmpty()) - return 0; - size_t commaPos = dataString.find(","); - if (commaPos == String16::kNotFound) - return 0; - size_t commaPos2 = dataString.find(",", commaPos + 1); - if (commaPos2 == String16::kNotFound) - return 0; - return dataString.substring(commaPos + 1, commaPos2 - commaPos - 1).toInteger(); -} - -// static -int V8Debugger::getGroupId(v8::Local context) -{ - v8::Local data = context->GetEmbedderData(static_cast(v8::Context::kDebugIdIndex)); - if (data.IsEmpty() || !data->IsString()) - return 0; - String16 dataString = toProtocolString(data.As()); - if (dataString.isEmpty()) - return 0; - size_t commaPos = dataString.find(","); - if (commaPos == String16::kNotFound) - return 0; - return dataString.substring(0, commaPos).toInteger(); -} - -void V8Debugger::getCompiledScripts(int contextGroupId, std::vector>& result) -{ - v8::HandleScope scope(m_isolate); - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local debuggerScript = m_debuggerScript.Get(m_isolate); - DCHECK(!debuggerScript->IsUndefined()); - v8::Local getScriptsFunction = v8::Local::Cast(debuggerScript->Get(toV8StringInternalized(m_isolate, "getScripts"))); - v8::Local argv[] = { v8::Integer::New(m_isolate, contextGroupId) }; - v8::Local value; - if (!getScriptsFunction->Call(debuggerContext(), debuggerScript, PROTOCOL_ARRAY_LENGTH(argv), argv).ToLocal(&value)) - return; - DCHECK(value->IsArray()); - v8::Local scriptsArray = v8::Local::Cast(value); - result.reserve(scriptsArray->Length()); - for (unsigned i = 0; i < scriptsArray->Length(); ++i) { - v8::Local scriptObject = v8::Local::Cast(scriptsArray->Get(v8::Integer::New(m_isolate, i))); - result.push_back(wrapUnique(new V8DebuggerScript(m_isolate, scriptObject, inLiveEditScope))); - } -} - -String16 V8Debugger::setBreakpoint(const String16& sourceID, const ScriptBreakpoint& scriptBreakpoint, int* actualLineNumber, int* actualColumnNumber) -{ - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local info = v8::Object::New(m_isolate); - info->Set(toV8StringInternalized(m_isolate, "sourceID"), toV8String(m_isolate, sourceID)); - info->Set(toV8StringInternalized(m_isolate, "lineNumber"), v8::Integer::New(m_isolate, scriptBreakpoint.lineNumber)); - info->Set(toV8StringInternalized(m_isolate, "columnNumber"), v8::Integer::New(m_isolate, scriptBreakpoint.columnNumber)); - info->Set(toV8StringInternalized(m_isolate, "condition"), toV8String(m_isolate, scriptBreakpoint.condition)); - - v8::Local setBreakpointFunction = v8::Local::Cast(m_debuggerScript.Get(m_isolate)->Get(toV8StringInternalized(m_isolate, "setBreakpoint"))); - v8::Local breakpointId = v8::Debug::Call(debuggerContext(), setBreakpointFunction, info).ToLocalChecked(); - if (!breakpointId->IsString()) - return ""; - *actualLineNumber = info->Get(toV8StringInternalized(m_isolate, "lineNumber"))->Int32Value(); - *actualColumnNumber = info->Get(toV8StringInternalized(m_isolate, "columnNumber"))->Int32Value(); - return toProtocolString(breakpointId.As()); -} - -void V8Debugger::removeBreakpoint(const String16& breakpointId) -{ - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local info = v8::Object::New(m_isolate); - info->Set(toV8StringInternalized(m_isolate, "breakpointId"), toV8String(m_isolate, breakpointId)); - - v8::Local removeBreakpointFunction = v8::Local::Cast(m_debuggerScript.Get(m_isolate)->Get(toV8StringInternalized(m_isolate, "removeBreakpoint"))); - v8::Debug::Call(debuggerContext(), removeBreakpointFunction, info).ToLocalChecked(); -} - -void V8Debugger::clearBreakpoints() -{ - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local clearBreakpoints = v8::Local::Cast(m_debuggerScript.Get(m_isolate)->Get(toV8StringInternalized(m_isolate, "clearBreakpoints"))); - v8::Debug::Call(debuggerContext(), clearBreakpoints).ToLocalChecked(); -} - -void V8Debugger::setBreakpointsActivated(bool activated) -{ - if (!enabled()) { - NOTREACHED(); - return; - } - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local info = v8::Object::New(m_isolate); - info->Set(toV8StringInternalized(m_isolate, "enabled"), v8::Boolean::New(m_isolate, activated)); - v8::Local setBreakpointsActivated = v8::Local::Cast(m_debuggerScript.Get(m_isolate)->Get(toV8StringInternalized(m_isolate, "setBreakpointsActivated"))); - v8::Debug::Call(debuggerContext(), setBreakpointsActivated, info).ToLocalChecked(); - - m_breakpointsActivated = activated; -} - -V8Debugger::PauseOnExceptionsState V8Debugger::getPauseOnExceptionsState() -{ - DCHECK(enabled()); - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local argv[] = { v8::Undefined(m_isolate) }; - v8::Local result = callDebuggerMethod("pauseOnExceptionsState", 0, argv).ToLocalChecked(); - return static_cast(result->Int32Value()); -} - -void V8Debugger::setPauseOnExceptionsState(PauseOnExceptionsState pauseOnExceptionsState) -{ - DCHECK(enabled()); - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local argv[] = { v8::Int32::New(m_isolate, pauseOnExceptionsState) }; - callDebuggerMethod("setPauseOnExceptionsState", 1, argv); -} - -void V8Debugger::setPauseOnNextStatement(bool pause) -{ - if (m_runningNestedMessageLoop) - return; - if (pause) - v8::Debug::DebugBreak(m_isolate); - else - v8::Debug::CancelDebugBreak(m_isolate); -} - -bool V8Debugger::canBreakProgram() -{ - if (!m_breakpointsActivated) - return false; - return m_isolate->InContext(); -} - -void V8Debugger::breakProgram() -{ - if (isPaused()) { - DCHECK(!m_runningNestedMessageLoop); - v8::Local exception; - v8::Local hitBreakpoints; - handleProgramBreak(m_pausedContext, m_executionState, exception, hitBreakpoints); - return; - } - - if (!canBreakProgram()) - return; - - v8::HandleScope scope(m_isolate); - v8::Local breakFunction; - if (!V8_FUNCTION_NEW_REMOVE_PROTOTYPE(m_isolate->GetCurrentContext(), &V8Debugger::breakProgramCallback, v8::External::New(m_isolate, this), 0).ToLocal(&breakFunction)) - return; - v8::Debug::Call(debuggerContext(), breakFunction).ToLocalChecked(); -} - -void V8Debugger::continueProgram() -{ - if (isPaused()) - m_inspector->client()->quitMessageLoopOnPause(); - m_pausedContext.Clear(); - m_executionState.Clear(); -} - -void V8Debugger::stepIntoStatement() -{ - DCHECK(isPaused()); - DCHECK(!m_executionState.IsEmpty()); - v8::HandleScope handleScope(m_isolate); - v8::Local argv[] = { m_executionState }; - callDebuggerMethod(stepIntoV8MethodName, 1, argv); - continueProgram(); -} - -void V8Debugger::stepOverStatement() -{ - DCHECK(isPaused()); - DCHECK(!m_executionState.IsEmpty()); - v8::HandleScope handleScope(m_isolate); - v8::Local argv[] = { m_executionState }; - callDebuggerMethod("stepOverStatement", 1, argv); - continueProgram(); -} - -void V8Debugger::stepOutOfFunction() -{ - DCHECK(isPaused()); - DCHECK(!m_executionState.IsEmpty()); - v8::HandleScope handleScope(m_isolate); - v8::Local argv[] = { m_executionState }; - callDebuggerMethod(stepOutV8MethodName, 1, argv); - continueProgram(); -} - -void V8Debugger::clearStepping() -{ - DCHECK(enabled()); - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local argv[] = { v8::Undefined(m_isolate) }; - callDebuggerMethod("clearStepping", 0, argv); -} - -bool V8Debugger::setScriptSource(const String16& sourceID, v8::Local newSource, bool dryRun, ErrorString* error, Maybe* exceptionDetails, JavaScriptCallFrames* newCallFrames, Maybe* stackChanged) -{ - class EnableLiveEditScope { - public: - explicit EnableLiveEditScope(v8::Isolate* isolate) : m_isolate(isolate) - { - v8::Debug::SetLiveEditEnabled(m_isolate, true); - inLiveEditScope = true; - } - ~EnableLiveEditScope() - { - v8::Debug::SetLiveEditEnabled(m_isolate, false); - inLiveEditScope = false; - } - private: - v8::Isolate* m_isolate; - }; - - DCHECK(enabled()); - v8::HandleScope scope(m_isolate); - - std::unique_ptr contextScope; - if (!isPaused()) - contextScope = wrapUnique(new v8::Context::Scope(debuggerContext())); - - v8::Local argv[] = { toV8String(m_isolate, sourceID), newSource, v8Boolean(dryRun, m_isolate) }; - - v8::Local v8result; - { - EnableLiveEditScope enableLiveEditScope(m_isolate); - v8::TryCatch tryCatch(m_isolate); - tryCatch.SetVerbose(false); - v8::MaybeLocal maybeResult = callDebuggerMethod("liveEditScriptSource", 3, argv); - if (tryCatch.HasCaught()) { - v8::Local message = tryCatch.Message(); - if (!message.IsEmpty()) - *error = toProtocolStringWithTypeCheck(message->Get()); - else - *error = "Unknown error."; - return false; - } - v8result = maybeResult.ToLocalChecked(); - } - DCHECK(!v8result.IsEmpty()); - v8::Local resultTuple = v8result->ToObject(m_isolate); - int code = static_cast(resultTuple->Get(0)->ToInteger(m_isolate)->Value()); - switch (code) { - case 0: - { - *stackChanged = resultTuple->Get(1)->BooleanValue(); - // Call stack may have changed after if the edited function was on the stack. - if (!dryRun && isPaused()) { - JavaScriptCallFrames frames = currentCallFrames(); - newCallFrames->swap(frames); - } - return true; - } - // Compile error. - case 1: - { - *exceptionDetails = protocol::Runtime::ExceptionDetails::create() - .setExceptionId(m_inspector->nextExceptionId()) - .setText(toProtocolStringWithTypeCheck(resultTuple->Get(2))) - .setLineNumber(resultTuple->Get(3)->ToInteger(m_isolate)->Value() - 1) - .setColumnNumber(resultTuple->Get(4)->ToInteger(m_isolate)->Value() - 1).build(); - return false; - } - } - *error = "Unknown error."; - return false; -} - -JavaScriptCallFrames V8Debugger::currentCallFrames(int limit) -{ - if (!m_isolate->InContext()) - return JavaScriptCallFrames(); - v8::Local currentCallFramesV8; - if (m_executionState.IsEmpty()) { - v8::Local currentCallFramesFunction = v8::Local::Cast(m_debuggerScript.Get(m_isolate)->Get(toV8StringInternalized(m_isolate, "currentCallFrames"))); - currentCallFramesV8 = v8::Debug::Call(debuggerContext(), currentCallFramesFunction, v8::Integer::New(m_isolate, limit)).ToLocalChecked(); - } else { - v8::Local argv[] = { m_executionState, v8::Integer::New(m_isolate, limit) }; - currentCallFramesV8 = callDebuggerMethod("currentCallFrames", PROTOCOL_ARRAY_LENGTH(argv), argv).ToLocalChecked(); - } - DCHECK(!currentCallFramesV8.IsEmpty()); - if (!currentCallFramesV8->IsArray()) - return JavaScriptCallFrames(); - v8::Local callFramesArray = currentCallFramesV8.As(); - JavaScriptCallFrames callFrames; - for (size_t i = 0; i < callFramesArray->Length(); ++i) { - v8::Local callFrameValue; - if (!callFramesArray->Get(debuggerContext(), i).ToLocal(&callFrameValue)) - return JavaScriptCallFrames(); - if (!callFrameValue->IsObject()) - return JavaScriptCallFrames(); - v8::Local callFrameObject = callFrameValue.As(); - callFrames.push_back(JavaScriptCallFrame::create(debuggerContext(), v8::Local::Cast(callFrameObject))); - } - return callFrames; -} - -static V8Debugger* toV8Debugger(v8::Local data) -{ - void* p = v8::Local::Cast(data)->Value(); - return static_cast(p); -} - -void V8Debugger::breakProgramCallback(const v8::FunctionCallbackInfo& info) -{ - DCHECK_EQ(info.Length(), 2); - V8Debugger* thisPtr = toV8Debugger(info.Data()); - if (!thisPtr->enabled()) - return; - v8::Local pausedContext = thisPtr->m_isolate->GetCurrentContext(); - v8::Local exception; - v8::Local hitBreakpoints; - thisPtr->handleProgramBreak(pausedContext, v8::Local::Cast(info[0]), exception, hitBreakpoints); -} - -void V8Debugger::handleProgramBreak(v8::Local pausedContext, v8::Local executionState, v8::Local exception, v8::Local hitBreakpointNumbers, bool isPromiseRejection) -{ - // Don't allow nested breaks. - if (m_runningNestedMessageLoop) - return; - - V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup(getGroupId(pausedContext)); - if (!agent) - return; - - std::vector breakpointIds; - if (!hitBreakpointNumbers.IsEmpty()) { - breakpointIds.reserve(hitBreakpointNumbers->Length()); - for (size_t i = 0; i < hitBreakpointNumbers->Length(); i++) { - v8::Local hitBreakpointNumber = hitBreakpointNumbers->Get(i); - DCHECK(!hitBreakpointNumber.IsEmpty() && hitBreakpointNumber->IsInt32()); - breakpointIds.push_back(String16::fromInteger(hitBreakpointNumber->Int32Value())); - } - } - - m_pausedContext = pausedContext; - m_executionState = executionState; - V8DebuggerAgentImpl::SkipPauseRequest result = agent->didPause(pausedContext, exception, breakpointIds, isPromiseRejection); - if (result == V8DebuggerAgentImpl::RequestNoSkip) { - m_runningNestedMessageLoop = true; - int groupId = getGroupId(pausedContext); - DCHECK(groupId); - m_inspector->client()->runMessageLoopOnPause(groupId); - // The agent may have been removed in the nested loop. - agent = m_inspector->enabledDebuggerAgentForGroup(getGroupId(pausedContext)); - if (agent) - agent->didContinue(); - m_runningNestedMessageLoop = false; - } - m_pausedContext.Clear(); - m_executionState.Clear(); - - if (result == V8DebuggerAgentImpl::RequestStepFrame) { - v8::Local argv[] = { executionState }; - callDebuggerMethod("stepFrameStatement", 1, argv); - } else if (result == V8DebuggerAgentImpl::RequestStepInto) { - v8::Local argv[] = { executionState }; - callDebuggerMethod(stepIntoV8MethodName, 1, argv); - } else if (result == V8DebuggerAgentImpl::RequestStepOut) { - v8::Local argv[] = { executionState }; - callDebuggerMethod(stepOutV8MethodName, 1, argv); - } -} - -void V8Debugger::v8DebugEventCallback(const v8::Debug::EventDetails& eventDetails) -{ - V8Debugger* thisPtr = toV8Debugger(eventDetails.GetCallbackData()); - thisPtr->handleV8DebugEvent(eventDetails); -} - -v8::Local V8Debugger::callInternalGetterFunction(v8::Local object, const char* functionName) -{ - v8::MicrotasksScope microtasks(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::Local getterValue = object->Get(toV8StringInternalized(m_isolate, functionName)); - DCHECK(!getterValue.IsEmpty() && getterValue->IsFunction()); - return v8::Local::Cast(getterValue)->Call(m_isolate->GetCurrentContext(), object, 0, 0).ToLocalChecked(); -} - -void V8Debugger::handleV8DebugEvent(const v8::Debug::EventDetails& eventDetails) -{ - if (!enabled()) - return; - v8::DebugEvent event = eventDetails.GetEvent(); - if (event != v8::AsyncTaskEvent && event != v8::Break && event != v8::Exception && event != v8::AfterCompile && event != v8::BeforeCompile && event != v8::CompileError) - return; - - v8::Local eventContext = eventDetails.GetEventContext(); - DCHECK(!eventContext.IsEmpty()); - - if (event == v8::AsyncTaskEvent) { - v8::HandleScope scope(m_isolate); - handleV8AsyncTaskEvent(eventContext, eventDetails.GetExecutionState(), eventDetails.GetEventData()); - return; - } - - V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup(getGroupId(eventContext)); - if (agent) { - v8::HandleScope scope(m_isolate); - if (m_ignoreScriptParsedEventsCounter == 0 && (event == v8::AfterCompile || event == v8::CompileError)) { - v8::Context::Scope contextScope(debuggerContext()); - v8::Local argv[] = { eventDetails.GetEventData() }; - v8::Local value = callDebuggerMethod("getAfterCompileScript", 1, argv).ToLocalChecked(); - if (value->IsNull()) - return; - DCHECK(value->IsObject()); - v8::Local scriptObject = v8::Local::Cast(value); - agent->didParseSource(wrapUnique(new V8DebuggerScript(m_isolate, scriptObject, inLiveEditScope)), event == v8::AfterCompile); - } else if (event == v8::Exception) { - v8::Local eventData = eventDetails.GetEventData(); - v8::Local exception = callInternalGetterFunction(eventData, "exception"); - v8::Local promise = callInternalGetterFunction(eventData, "promise"); - bool isPromiseRejection = !promise.IsEmpty() && promise->IsObject(); - handleProgramBreak(eventContext, eventDetails.GetExecutionState(), exception, v8::Local(), isPromiseRejection); - } else if (event == v8::Break) { - v8::Local argv[] = { eventDetails.GetEventData() }; - v8::Local hitBreakpoints = callDebuggerMethod("getBreakpointNumbers", 1, argv).ToLocalChecked(); - DCHECK(hitBreakpoints->IsArray()); - handleProgramBreak(eventContext, eventDetails.GetExecutionState(), v8::Local(), hitBreakpoints.As()); - } - } -} - -void V8Debugger::handleV8AsyncTaskEvent(v8::Local context, v8::Local executionState, v8::Local eventData) -{ - if (!m_maxAsyncCallStackDepth) - return; - - String16 type = toProtocolStringWithTypeCheck(callInternalGetterFunction(eventData, "type")); - String16 name = toProtocolStringWithTypeCheck(callInternalGetterFunction(eventData, "name")); - int id = callInternalGetterFunction(eventData, "id")->ToInteger(m_isolate)->Value(); - // The scopes for the ids are defined by the eventData.name namespaces. There are currently two namespaces: "Object." and "Promise.". - void* ptr = reinterpret_cast(id * 4 + (name[0] == 'P' ? 2 : 0) + 1); - if (type == v8AsyncTaskEventEnqueue) - asyncTaskScheduled(name, ptr, false); - else if (type == v8AsyncTaskEventWillHandle) - asyncTaskStarted(ptr); - else if (type == v8AsyncTaskEventDidHandle) - asyncTaskFinished(ptr); - else - NOTREACHED(); -} - -V8StackTraceImpl* V8Debugger::currentAsyncCallChain() -{ - if (!m_currentStacks.size()) - return nullptr; - return m_currentStacks.back().get(); -} - -void V8Debugger::compileDebuggerScript() -{ - if (!m_debuggerScript.IsEmpty()) { - NOTREACHED(); - return; - } - - v8::HandleScope scope(m_isolate); - v8::Context::Scope contextScope(debuggerContext()); - - v8::Local scriptValue = v8::String::NewFromUtf8(m_isolate, DebuggerScript_js, v8::NewStringType::kInternalized, sizeof(DebuggerScript_js)).ToLocalChecked(); - v8::Local value; - if (!m_inspector->compileAndRunInternalScript(debuggerContext(), scriptValue).ToLocal(&value)) { - NOTREACHED(); - return; - } - DCHECK(value->IsObject()); - m_debuggerScript.Reset(m_isolate, value.As()); -} - -v8::Local V8Debugger::debuggerContext() const -{ - DCHECK(!m_debuggerContext.IsEmpty()); - return m_debuggerContext.Get(m_isolate); -} - -v8::MaybeLocal V8Debugger::functionScopes(v8::Local context, v8::Local function) -{ - if (!enabled()) { - NOTREACHED(); - return v8::Local::New(m_isolate, v8::Undefined(m_isolate)); - } - v8::Local argv[] = { function }; - v8::Local scopesValue; - if (!callDebuggerMethod("getFunctionScopes", 1, argv).ToLocal(&scopesValue)) - return v8::MaybeLocal(); - v8::Local copied; - if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, scopesValue).ToLocal(&copied) || !copied->IsArray()) - return v8::MaybeLocal(); - if (!markAsInternal(context, v8::Local::Cast(copied), V8InternalValueType::kScopeList)) - return v8::MaybeLocal(); - if (!markArrayEntriesAsInternal(context, v8::Local::Cast(copied), V8InternalValueType::kScope)) - return v8::MaybeLocal(); - return copied; -} - -v8::MaybeLocal V8Debugger::internalProperties(v8::Local context, v8::Local value) -{ - v8::Local properties; - if (!v8::Debug::GetInternalProperties(m_isolate, value).ToLocal(&properties)) - return v8::MaybeLocal(); - if (value->IsFunction()) { - v8::Local function = value.As(); - v8::Local location = functionLocation(context, function); - if (location->IsObject()) { - properties->Set(properties->Length(), toV8StringInternalized(m_isolate, "[[FunctionLocation]]")); - properties->Set(properties->Length(), location); - } - if (function->IsGeneratorFunction()) { - properties->Set(properties->Length(), toV8StringInternalized(m_isolate, "[[IsGenerator]]")); - properties->Set(properties->Length(), v8::True(m_isolate)); - } - } - if (!enabled()) - return properties; - if (value->IsMap() || value->IsWeakMap() || value->IsSet() || value->IsWeakSet() || value->IsSetIterator() || value->IsMapIterator()) { - v8::Local entries = collectionEntries(context, v8::Local::Cast(value)); - if (entries->IsArray()) { - properties->Set(properties->Length(), toV8StringInternalized(m_isolate, "[[Entries]]")); - properties->Set(properties->Length(), entries); - } - } - if (value->IsGeneratorObject()) { - v8::Local location = generatorObjectLocation(context, v8::Local::Cast(value)); - if (location->IsObject()) { - properties->Set(properties->Length(), toV8StringInternalized(m_isolate, "[[GeneratorLocation]]")); - properties->Set(properties->Length(), location); - } - } - if (value->IsFunction()) { - v8::Local function = value.As(); - v8::Local boundFunction = function->GetBoundFunction(); - v8::Local scopes; - if (boundFunction->IsUndefined() && functionScopes(context, function).ToLocal(&scopes)) { - properties->Set(properties->Length(), toV8StringInternalized(m_isolate, "[[Scopes]]")); - properties->Set(properties->Length(), scopes); - } - } - return properties; -} - -v8::Local V8Debugger::collectionEntries(v8::Local context, v8::Local object) -{ - if (!enabled()) { - NOTREACHED(); - return v8::Undefined(m_isolate); - } - v8::Local argv[] = { object }; - v8::Local entriesValue = callDebuggerMethod("getCollectionEntries", 1, argv).ToLocalChecked(); - v8::Local copied; - if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, entriesValue).ToLocal(&copied) || !copied->IsArray()) - return v8::Undefined(m_isolate); - if (!markArrayEntriesAsInternal(context, v8::Local::Cast(copied), V8InternalValueType::kEntry)) - return v8::Undefined(m_isolate); - return copied; -} - -v8::Local V8Debugger::generatorObjectLocation(v8::Local context, v8::Local object) -{ - if (!enabled()) { - NOTREACHED(); - return v8::Null(m_isolate); - } - v8::Local argv[] = { object }; - v8::Local location = callDebuggerMethod("getGeneratorObjectLocation", 1, argv).ToLocalChecked(); - v8::Local copied; - if (!copyValueFromDebuggerContext(m_isolate, debuggerContext(), context, location).ToLocal(&copied) || !copied->IsObject()) - return v8::Null(m_isolate); - if (!markAsInternal(context, v8::Local::Cast(copied), V8InternalValueType::kLocation)) - return v8::Null(m_isolate); - return copied; -} - -v8::Local V8Debugger::functionLocation(v8::Local context, v8::Local function) -{ - int scriptId = function->ScriptId(); - if (scriptId == v8::UnboundScript::kNoScriptId) - return v8::Null(m_isolate); - int lineNumber = function->GetScriptLineNumber(); - int columnNumber = function->GetScriptColumnNumber(); - if (lineNumber == v8::Function::kLineOffsetNotFound || columnNumber == v8::Function::kLineOffsetNotFound) - return v8::Null(m_isolate); - v8::Local location = v8::Object::New(m_isolate); - if (!location->SetPrototype(context, v8::Null(m_isolate)).FromMaybe(false)) - return v8::Null(m_isolate); - if (!location->Set(context, toV8StringInternalized(m_isolate, "scriptId"), toV8String(m_isolate, String16::fromInteger(scriptId))).FromMaybe(false)) - return v8::Null(m_isolate); - if (!location->Set(context, toV8StringInternalized(m_isolate, "lineNumber"), v8::Integer::New(m_isolate, lineNumber)).FromMaybe(false)) - return v8::Null(m_isolate); - if (!location->Set(context, toV8StringInternalized(m_isolate, "columnNumber"), v8::Integer::New(m_isolate, columnNumber)).FromMaybe(false)) - return v8::Null(m_isolate); - if (!markAsInternal(context, location, V8InternalValueType::kLocation)) - return v8::Null(m_isolate); - return location; -} - -bool V8Debugger::isPaused() -{ - return !m_pausedContext.IsEmpty(); -} - -std::unique_ptr V8Debugger::createStackTrace(v8::Local stackTrace) -{ - int contextGroupId = m_isolate->InContext() ? getGroupId(m_isolate->GetCurrentContext()) : 0; - return V8StackTraceImpl::create(this, contextGroupId, stackTrace, V8StackTraceImpl::maxCallStackSizeToCapture); -} - -int V8Debugger::markContext(const V8ContextInfo& info) -{ - DCHECK(info.context->GetIsolate() == m_isolate); - int contextId = ++m_lastContextId; - String16 debugData = String16::fromInteger(info.contextGroupId) + "," + String16::fromInteger(contextId) + "," + info.auxData; - v8::Context::Scope contextScope(info.context); - info.context->SetEmbedderData(static_cast(v8::Context::kDebugIdIndex), toV8String(m_isolate, debugData)); - return contextId; -} - -void V8Debugger::setAsyncCallStackDepth(V8DebuggerAgentImpl* agent, int depth) -{ - if (depth <= 0) - m_maxAsyncCallStackDepthMap.erase(agent); - else - m_maxAsyncCallStackDepthMap[agent] = depth; - - int maxAsyncCallStackDepth = 0; - for (const auto& pair : m_maxAsyncCallStackDepthMap) { - if (pair.second > maxAsyncCallStackDepth) - maxAsyncCallStackDepth = pair.second; - } - - if (m_maxAsyncCallStackDepth == maxAsyncCallStackDepth) - return; - m_maxAsyncCallStackDepth = maxAsyncCallStackDepth; - if (!maxAsyncCallStackDepth) - allAsyncTasksCanceled(); -} - -void V8Debugger::asyncTaskScheduled(const String16& taskName, void* task, bool recurring) -{ - if (!m_maxAsyncCallStackDepth) - return; - v8::HandleScope scope(m_isolate); - int contextGroupId = m_isolate->InContext() ? getGroupId(m_isolate->GetCurrentContext()) : 0; - std::unique_ptr chain = V8StackTraceImpl::capture(this, contextGroupId, V8StackTraceImpl::maxCallStackSizeToCapture, taskName); - if (chain) { - m_asyncTaskStacks[task] = std::move(chain); - if (recurring) - m_recurringTasks.insert(task); - } -} - -void V8Debugger::asyncTaskCanceled(void* task) -{ - if (!m_maxAsyncCallStackDepth) - return; - m_asyncTaskStacks.erase(task); - m_recurringTasks.erase(task); -} - -void V8Debugger::asyncTaskStarted(void* task) -{ - if (!m_maxAsyncCallStackDepth) - return; - m_currentTasks.push_back(task); - AsyncTaskToStackTrace::iterator stackIt = m_asyncTaskStacks.find(task); - // Needs to support following order of events: - // - asyncTaskScheduled - // <-- attached here --> - // - asyncTaskStarted - // - asyncTaskCanceled <-- canceled before finished - // <-- async stack requested here --> - // - asyncTaskFinished - std::unique_ptr stack; - if (stackIt != m_asyncTaskStacks.end() && stackIt->second) - stack = stackIt->second->cloneImpl(); - m_currentStacks.push_back(std::move(stack)); -} - -void V8Debugger::asyncTaskFinished(void* task) -{ - if (!m_maxAsyncCallStackDepth) - return; - // We could start instrumenting half way and the stack is empty. - if (!m_currentStacks.size()) - return; - - DCHECK(m_currentTasks.back() == task); - m_currentTasks.pop_back(); - - m_currentStacks.pop_back(); - if (m_recurringTasks.find(task) == m_recurringTasks.end()) - m_asyncTaskStacks.erase(task); -} - -void V8Debugger::allAsyncTasksCanceled() -{ - m_asyncTaskStacks.clear(); - m_recurringTasks.clear(); - m_currentStacks.clear(); - m_currentTasks.clear(); -} - -void V8Debugger::muteScriptParsedEvents() -{ - ++m_ignoreScriptParsedEventsCounter; -} - -void V8Debugger::unmuteScriptParsedEvents() -{ - --m_ignoreScriptParsedEventsCounter; - DCHECK_GE(m_ignoreScriptParsedEventsCounter, 0); -} - -std::unique_ptr V8Debugger::captureStackTrace(bool fullStack) -{ - if (!m_isolate->InContext()) - return nullptr; - - v8::HandleScope handles(m_isolate); - int contextGroupId = getGroupId(m_isolate->GetCurrentContext()); - if (!contextGroupId) - return nullptr; - - size_t stackSize = fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; - if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) - stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; - - return V8StackTraceImpl::capture(this, contextGroupId, stackSize); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.h deleted file mode 100644 index 02e762eb01c420..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Debugger.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8Debugger_h -#define V8Debugger_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/JavaScriptCallFrame.h" -#include "platform/v8_inspector/V8DebuggerScript.h" -#include "platform/v8_inspector/protocol/Runtime.h" -#include "platform/v8_inspector/public/V8ContextInfo.h" - -#include -#include -#include - -namespace v8_inspector { - -struct ScriptBreakpoint; -class V8DebuggerAgentImpl; -class V8InspectorImpl; -class V8StackTraceImpl; - -namespace protocol = blink::protocol; - -class V8Debugger { - PROTOCOL_DISALLOW_COPY(V8Debugger); -public: - V8Debugger(v8::Isolate*, V8InspectorImpl*); - ~V8Debugger(); - - static int contextId(v8::Local); - static int getGroupId(v8::Local); - int markContext(const V8ContextInfo&); - - bool enabled() const; - - String16 setBreakpoint(const String16& sourceID, const ScriptBreakpoint&, int* actualLineNumber, int* actualColumnNumber); - void removeBreakpoint(const String16& breakpointId); - void setBreakpointsActivated(bool); - bool breakpointsActivated() const { return m_breakpointsActivated; } - - enum PauseOnExceptionsState { - DontPauseOnExceptions, - PauseOnAllExceptions, - PauseOnUncaughtExceptions - }; - PauseOnExceptionsState getPauseOnExceptionsState(); - void setPauseOnExceptionsState(PauseOnExceptionsState); - void setPauseOnNextStatement(bool); - bool canBreakProgram(); - void breakProgram(); - void continueProgram(); - void stepIntoStatement(); - void stepOverStatement(); - void stepOutOfFunction(); - void clearStepping(); - - bool setScriptSource(const String16& sourceID, v8::Local newSource, bool dryRun, ErrorString*, protocol::Maybe*, JavaScriptCallFrames* newCallFrames, protocol::Maybe* stackChanged); - JavaScriptCallFrames currentCallFrames(int limit = 0); - - // Each script inherits debug data from v8::Context where it has been compiled. - // Only scripts whose debug data matches |contextGroupId| will be reported. - // Passing 0 will result in reporting all scripts. - void getCompiledScripts(int contextGroupId, std::vector>&); - void enable(); - void disable(); - - bool isPaused(); - v8::Local pausedContext() { return m_pausedContext; } - - int maxAsyncCallChainDepth() { return m_maxAsyncCallStackDepth; } - V8StackTraceImpl* currentAsyncCallChain(); - void setAsyncCallStackDepth(V8DebuggerAgentImpl*, int); - std::unique_ptr createStackTrace(v8::Local); - std::unique_ptr captureStackTrace(bool fullStack); - - v8::MaybeLocal internalProperties(v8::Local, v8::Local); - - void asyncTaskScheduled(const String16& taskName, void* task, bool recurring); - void asyncTaskCanceled(void* task); - void asyncTaskStarted(void* task); - void asyncTaskFinished(void* task); - void allAsyncTasksCanceled(); - - void muteScriptParsedEvents(); - void unmuteScriptParsedEvents(); - -private: - void compileDebuggerScript(); - v8::MaybeLocal callDebuggerMethod(const char* functionName, int argc, v8::Local argv[]); - v8::Local debuggerContext() const; - void clearBreakpoints(); - - static void breakProgramCallback(const v8::FunctionCallbackInfo&); - void handleProgramBreak(v8::Local pausedContext, v8::Local executionState, v8::Local exception, v8::Local hitBreakpoints, bool isPromiseRejection = false); - static void v8DebugEventCallback(const v8::Debug::EventDetails&); - v8::Local callInternalGetterFunction(v8::Local, const char* functionName); - void handleV8DebugEvent(const v8::Debug::EventDetails&); - void handleV8AsyncTaskEvent(v8::Local, v8::Local executionState, v8::Local eventData); - - v8::Local collectionEntries(v8::Local, v8::Local); - v8::Local generatorObjectLocation(v8::Local, v8::Local); - v8::Local functionLocation(v8::Local, v8::Local); - v8::MaybeLocal functionScopes(v8::Local, v8::Local); - - v8::Isolate* m_isolate; - V8InspectorImpl* m_inspector; - int m_lastContextId; - int m_enableCount; - bool m_breakpointsActivated; - v8::Global m_debuggerScript; - v8::Global m_debuggerContext; - v8::Local m_executionState; - v8::Local m_pausedContext; - bool m_runningNestedMessageLoop; - int m_ignoreScriptParsedEventsCounter; - - using AsyncTaskToStackTrace = protocol::HashMap>; - AsyncTaskToStackTrace m_asyncTaskStacks; - protocol::HashSet m_recurringTasks; - int m_maxAsyncCallStackDepth; - std::vector m_currentTasks; - std::vector> m_currentStacks; - protocol::HashMap m_maxAsyncCallStackDepthMap; -}; - -} // namespace v8_inspector - -#endif // V8Debugger_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.cpp deleted file mode 100644 index 0afbd02bd569cf..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.cpp +++ /dev/null @@ -1,1167 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/JavaScriptCallFrame.h" -#include "platform/v8_inspector/RemoteObjectId.h" -#include "platform/v8_inspector/ScriptBreakpoint.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8DebuggerScript.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8Regex.h" -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -#include - -using blink::protocol::Array; -using blink::protocol::Maybe; -using blink::protocol::Debugger::BreakpointId; -using blink::protocol::Debugger::CallFrame; -using blink::protocol::Runtime::ExceptionDetails; -using blink::protocol::Runtime::ScriptId; -using blink::protocol::Runtime::StackTrace; -using blink::protocol::Runtime::RemoteObject; - -namespace v8_inspector { - -namespace DebuggerAgentState { -static const char javaScriptBreakpoints[] = "javaScriptBreakopints"; -static const char pauseOnExceptionsState[] = "pauseOnExceptionsState"; -static const char asyncCallStackDepth[] = "asyncCallStackDepth"; -static const char blackboxPattern[] = "blackboxPattern"; -static const char debuggerEnabled[] = "debuggerEnabled"; - -// Breakpoint properties. -static const char url[] = "url"; -static const char isRegex[] = "isRegex"; -static const char lineNumber[] = "lineNumber"; -static const char columnNumber[] = "columnNumber"; -static const char condition[] = "condition"; -static const char skipAllPauses[] = "skipAllPauses"; - -} // namespace DebuggerAgentState; - -static const int maxSkipStepFrameCount = 128; -static const char backtraceObjectGroup[] = "backtrace"; - -static String16 breakpointIdSuffix(V8DebuggerAgentImpl::BreakpointSource source) -{ - switch (source) { - case V8DebuggerAgentImpl::UserBreakpointSource: - break; - case V8DebuggerAgentImpl::DebugCommandBreakpointSource: - return ":debug"; - case V8DebuggerAgentImpl::MonitorCommandBreakpointSource: - return ":monitor"; - } - return String16(); -} - -static String16 generateBreakpointId(const String16& scriptId, int lineNumber, int columnNumber, V8DebuggerAgentImpl::BreakpointSource source) -{ - return scriptId + ":" + String16::fromInteger(lineNumber) + ":" + String16::fromInteger(columnNumber) + breakpointIdSuffix(source); -} - -static bool positionComparator(const std::pair& a, const std::pair& b) -{ - if (a.first != b.first) - return a.first < b.first; - return a.second < b.second; -} - -static bool hasInternalError(ErrorString* errorString, bool hasError) -{ - if (hasError) - *errorString = "Internal error"; - return hasError; -} - -static std::unique_ptr buildProtocolLocation(const String16& scriptId, int lineNumber, int columnNumber) -{ - return protocol::Debugger::Location::create() - .setScriptId(scriptId) - .setLineNumber(lineNumber) - .setColumnNumber(columnNumber).build(); -} - -V8DebuggerAgentImpl::V8DebuggerAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) - : m_inspector(session->inspector()) - , m_debugger(m_inspector->debugger()) - , m_session(session) - , m_enabled(false) - , m_state(state) - , m_frontend(frontendChannel) - , m_isolate(m_inspector->isolate()) - , m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other) - , m_scheduledDebuggerStep(NoStep) - , m_skipNextDebuggerStepOut(false) - , m_javaScriptPauseScheduled(false) - , m_steppingFromFramework(false) - , m_pausingOnNativeEvent(false) - , m_skippedStepFrameCount(0) - , m_recursionLevelForStepOut(0) - , m_recursionLevelForStepFrame(0) - , m_skipAllPauses(false) -{ - clearBreakDetails(); -} - -V8DebuggerAgentImpl::~V8DebuggerAgentImpl() -{ -} - -bool V8DebuggerAgentImpl::checkEnabled(ErrorString* errorString) -{ - if (enabled()) - return true; - *errorString = "Debugger agent is not enabled"; - return false; -} - -void V8DebuggerAgentImpl::enable() -{ - // m_inspector->addListener may result in reporting all parsed scripts to - // the agent so it should already be in enabled state by then. - m_enabled = true; - m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); - m_debugger->enable(); - - std::vector> compiledScripts; - m_debugger->getCompiledScripts(m_session->contextGroupId(), compiledScripts); - for (size_t i = 0; i < compiledScripts.size(); i++) - didParseSource(std::move(compiledScripts[i]), true); - - // FIXME(WK44513): breakpoints activated flag should be synchronized between all front-ends - m_debugger->setBreakpointsActivated(true); -} - -bool V8DebuggerAgentImpl::enabled() -{ - return m_enabled; -} - -void V8DebuggerAgentImpl::enable(ErrorString* errorString) -{ - if (enabled()) - return; - - if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) { - *errorString = "Script execution is prohibited"; - return; - } - - enable(); -} - -void V8DebuggerAgentImpl::disable(ErrorString*) -{ - if (!enabled()) - return; - - m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, protocol::DictionaryValue::create()); - m_state->setInteger(DebuggerAgentState::pauseOnExceptionsState, V8Debugger::DontPauseOnExceptions); - m_state->setInteger(DebuggerAgentState::asyncCallStackDepth, 0); - - if (!m_pausedContext.IsEmpty()) - m_debugger->continueProgram(); - m_debugger->disable(); - m_pausedContext.Reset(); - JavaScriptCallFrames emptyCallFrames; - m_pausedCallFrames.swap(emptyCallFrames); - m_scripts.clear(); - m_blackboxedPositions.clear(); - m_breakpointIdToDebuggerBreakpointIds.clear(); - m_debugger->setAsyncCallStackDepth(this, 0); - m_continueToLocationBreakpointId = String16(); - clearBreakDetails(); - m_scheduledDebuggerStep = NoStep; - m_skipNextDebuggerStepOut = false; - m_javaScriptPauseScheduled = false; - m_steppingFromFramework = false; - m_pausingOnNativeEvent = false; - m_skippedStepFrameCount = 0; - m_recursionLevelForStepFrame = 0; - m_skipAllPauses = false; - m_blackboxPattern = nullptr; - m_state->remove(DebuggerAgentState::blackboxPattern); - m_enabled = false; - m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); -} - -void V8DebuggerAgentImpl::restore() -{ - DCHECK(!m_enabled); - if (!m_state->booleanProperty(DebuggerAgentState::debuggerEnabled, false)) - return; - if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) - return; - - enable(); - ErrorString error; - - int pauseState = V8Debugger::DontPauseOnExceptions; - m_state->getInteger(DebuggerAgentState::pauseOnExceptionsState, &pauseState); - setPauseOnExceptionsImpl(&error, pauseState); - DCHECK(error.isEmpty()); - - m_skipAllPauses = m_state->booleanProperty(DebuggerAgentState::skipAllPauses, false); - - int asyncCallStackDepth = 0; - m_state->getInteger(DebuggerAgentState::asyncCallStackDepth, &asyncCallStackDepth); - m_debugger->setAsyncCallStackDepth(this, asyncCallStackDepth); - - String16 blackboxPattern; - if (m_state->getString(DebuggerAgentState::blackboxPattern, &blackboxPattern)) { - if (!setBlackboxPattern(&error, blackboxPattern)) - NOTREACHED(); - } -} - -void V8DebuggerAgentImpl::setBreakpointsActive(ErrorString* errorString, bool active) -{ - if (!checkEnabled(errorString)) - return; - m_debugger->setBreakpointsActivated(active); -} - -void V8DebuggerAgentImpl::setSkipAllPauses(ErrorString*, bool skip) -{ - m_skipAllPauses = skip; - m_state->setBoolean(DebuggerAgentState::skipAllPauses, m_skipAllPauses); -} - -static std::unique_ptr buildObjectForBreakpointCookie(const String16& url, int lineNumber, int columnNumber, const String16& condition, bool isRegex) -{ - std::unique_ptr breakpointObject = protocol::DictionaryValue::create(); - breakpointObject->setString(DebuggerAgentState::url, url); - breakpointObject->setInteger(DebuggerAgentState::lineNumber, lineNumber); - breakpointObject->setInteger(DebuggerAgentState::columnNumber, columnNumber); - breakpointObject->setString(DebuggerAgentState::condition, condition); - breakpointObject->setBoolean(DebuggerAgentState::isRegex, isRegex); - return breakpointObject; -} - -static bool matches(V8InspectorImpl* inspector, const String16& url, const String16& pattern, bool isRegex) -{ - if (isRegex) { - V8Regex regex(inspector, pattern, true); - return regex.match(url) != -1; - } - return url == pattern; -} - -void V8DebuggerAgentImpl::setBreakpointByUrl(ErrorString* errorString, - int lineNumber, - const Maybe& optionalURL, - const Maybe& optionalURLRegex, - const Maybe& optionalColumnNumber, - const Maybe& optionalCondition, - String16* outBreakpointId, - std::unique_ptr>* locations) -{ - *locations = Array::create(); - if (optionalURL.isJust() == optionalURLRegex.isJust()) { - *errorString = "Either url or urlRegex must be specified."; - return; - } - - String16 url = optionalURL.isJust() ? optionalURL.fromJust() : optionalURLRegex.fromJust(); - int columnNumber = 0; - if (optionalColumnNumber.isJust()) { - columnNumber = optionalColumnNumber.fromJust(); - if (columnNumber < 0) { - *errorString = "Incorrect column number"; - return; - } - } - String16 condition = optionalCondition.fromMaybe(""); - bool isRegex = optionalURLRegex.isJust(); - - String16 breakpointId = (isRegex ? "/" + url + "/" : url) + ":" + String16::fromInteger(lineNumber) + ":" + String16::fromInteger(columnNumber); - protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); - if (!breakpointsCookie) { - std::unique_ptr newValue = protocol::DictionaryValue::create(); - breakpointsCookie = newValue.get(); - m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, std::move(newValue)); - } - if (breakpointsCookie->get(breakpointId)) { - *errorString = "Breakpoint at specified location already exists."; - return; - } - - breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, isRegex)); - - ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); - for (const auto& script : m_scripts) { - if (!matches(m_inspector, script.second->sourceURL(), url, isRegex)) - continue; - std::unique_ptr location = resolveBreakpoint(breakpointId, script.first, breakpoint, UserBreakpointSource); - if (location) - (*locations)->addItem(std::move(location)); - } - - *outBreakpointId = breakpointId; -} - -static bool parseLocation(ErrorString* errorString, std::unique_ptr location, String16* scriptId, int* lineNumber, int* columnNumber) -{ - *scriptId = location->getScriptId(); - *lineNumber = location->getLineNumber(); - *columnNumber = location->getColumnNumber(0); - return true; -} - -void V8DebuggerAgentImpl::setBreakpoint(ErrorString* errorString, - std::unique_ptr location, - const Maybe& optionalCondition, - String16* outBreakpointId, - std::unique_ptr* actualLocation) -{ - String16 scriptId; - int lineNumber; - int columnNumber; - - if (!parseLocation(errorString, std::move(location), &scriptId, &lineNumber, &columnNumber)) - return; - - String16 condition = optionalCondition.fromMaybe(""); - - String16 breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumber, UserBreakpointSource); - if (m_breakpointIdToDebuggerBreakpointIds.find(breakpointId) != m_breakpointIdToDebuggerBreakpointIds.end()) { - *errorString = "Breakpoint at specified location already exists."; - return; - } - ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); - *actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint, UserBreakpointSource); - if (*actualLocation) - *outBreakpointId = breakpointId; - else - *errorString = "Could not resolve breakpoint"; -} - -void V8DebuggerAgentImpl::removeBreakpoint(ErrorString* errorString, const String16& breakpointId) -{ - if (!checkEnabled(errorString)) - return; - protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); - if (breakpointsCookie) - breakpointsCookie->remove(breakpointId); - removeBreakpoint(breakpointId); -} - -void V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) -{ - DCHECK(enabled()); - BreakpointIdToDebuggerBreakpointIdsMap::iterator debuggerBreakpointIdsIterator = m_breakpointIdToDebuggerBreakpointIds.find(breakpointId); - if (debuggerBreakpointIdsIterator == m_breakpointIdToDebuggerBreakpointIds.end()) - return; - const std::vector& ids = debuggerBreakpointIdsIterator->second; - for (size_t i = 0; i < ids.size(); ++i) { - const String16& debuggerBreakpointId = ids[i]; - - m_debugger->removeBreakpoint(debuggerBreakpointId); - m_serverBreakpoints.erase(debuggerBreakpointId); - } - m_breakpointIdToDebuggerBreakpointIds.erase(breakpointId); -} - -void V8DebuggerAgentImpl::continueToLocation(ErrorString* errorString, std::unique_ptr location) -{ - if (!checkEnabled(errorString)) - return; - if (!m_continueToLocationBreakpointId.isEmpty()) { - m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); - m_continueToLocationBreakpointId = ""; - } - - String16 scriptId; - int lineNumber; - int columnNumber; - - if (!parseLocation(errorString, std::move(location), &scriptId, &lineNumber, &columnNumber)) - return; - - ScriptBreakpoint breakpoint(lineNumber, columnNumber, ""); - m_continueToLocationBreakpointId = m_debugger->setBreakpoint(scriptId, breakpoint, &lineNumber, &columnNumber); - resume(errorString); -} - -bool V8DebuggerAgentImpl::isCurrentCallStackEmptyOrBlackboxed() -{ - DCHECK(enabled()); - JavaScriptCallFrames callFrames = m_debugger->currentCallFrames(); - for (size_t index = 0; index < callFrames.size(); ++index) { - if (!isCallFrameWithUnknownScriptOrBlackboxed(callFrames[index].get())) - return false; - } - return true; -} - -bool V8DebuggerAgentImpl::isTopPausedCallFrameBlackboxed() -{ - DCHECK(enabled()); - JavaScriptCallFrame* frame = m_pausedCallFrames.size() ? m_pausedCallFrames[0].get() : nullptr; - return isCallFrameWithUnknownScriptOrBlackboxed(frame); -} - -bool V8DebuggerAgentImpl::isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCallFrame* frame) -{ - if (!frame) - return true; - ScriptsMap::iterator it = m_scripts.find(String16::fromInteger(frame->sourceID())); - if (it == m_scripts.end()) { - // Unknown scripts are blackboxed. - return true; - } - if (m_blackboxPattern) { - const String16& scriptSourceURL = it->second->sourceURL(); - if (!scriptSourceURL.isEmpty() && m_blackboxPattern->match(scriptSourceURL) != -1) - return true; - } - auto itBlackboxedPositions = m_blackboxedPositions.find(String16::fromInteger(frame->sourceID())); - if (itBlackboxedPositions == m_blackboxedPositions.end()) - return false; - - const std::vector>& ranges = itBlackboxedPositions->second; - auto itRange = std::lower_bound(ranges.begin(), ranges.end(), - std::make_pair(frame->line(), frame->column()), positionComparator); - // Ranges array contains positions in script where blackbox state is changed. - // [(0,0) ... ranges[0]) isn't blackboxed, [ranges[0] ... ranges[1]) is blackboxed... - return std::distance(ranges.begin(), itRange) % 2; -} - -V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::shouldSkipExceptionPause(JavaScriptCallFrame* topCallFrame) -{ - if (m_steppingFromFramework) - return RequestNoSkip; - if (isCallFrameWithUnknownScriptOrBlackboxed(topCallFrame)) - return RequestContinue; - return RequestNoSkip; -} - -V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::shouldSkipStepPause(JavaScriptCallFrame* topCallFrame) -{ - if (m_steppingFromFramework) - return RequestNoSkip; - - if (m_skipNextDebuggerStepOut) { - m_skipNextDebuggerStepOut = false; - if (m_scheduledDebuggerStep == StepOut) - return RequestStepOut; - } - - if (!isCallFrameWithUnknownScriptOrBlackboxed(topCallFrame)) - return RequestNoSkip; - - if (m_skippedStepFrameCount >= maxSkipStepFrameCount) - return RequestStepOut; - - if (!m_skippedStepFrameCount) - m_recursionLevelForStepFrame = 1; - - ++m_skippedStepFrameCount; - return RequestStepFrame; -} - -std::unique_ptr V8DebuggerAgentImpl::resolveBreakpoint(const String16& breakpointId, const String16& scriptId, const ScriptBreakpoint& breakpoint, BreakpointSource source) -{ - DCHECK(enabled()); - // FIXME: remove these checks once crbug.com/520702 is resolved. - CHECK(!breakpointId.isEmpty()); - CHECK(!scriptId.isEmpty()); - ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); - if (scriptIterator == m_scripts.end()) - return nullptr; - if (breakpoint.lineNumber < scriptIterator->second->startLine() || scriptIterator->second->endLine() < breakpoint.lineNumber) - return nullptr; - - int actualLineNumber; - int actualColumnNumber; - String16 debuggerBreakpointId = m_debugger->setBreakpoint(scriptId, breakpoint, &actualLineNumber, &actualColumnNumber); - if (debuggerBreakpointId.isEmpty()) - return nullptr; - - m_serverBreakpoints[debuggerBreakpointId] = std::make_pair(breakpointId, source); - CHECK(!breakpointId.isEmpty()); - - m_breakpointIdToDebuggerBreakpointIds[breakpointId].push_back(debuggerBreakpointId); - return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber); -} - -void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& scriptId, const String16& query, - const Maybe& optionalCaseSensitive, - const Maybe& optionalIsRegex, - std::unique_ptr>* results) -{ - v8::HandleScope handles(m_isolate); - ScriptsMap::iterator it = m_scripts.find(scriptId); - if (it == m_scripts.end()) { - *error = String16("No script for id: " + scriptId); - return; - } - - std::vector> matches = searchInTextByLinesImpl(m_session, toProtocolString(it->second->source(m_isolate)), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.fromMaybe(false)); - *results = protocol::Array::create(); - for (size_t i = 0; i < matches.size(); ++i) - (*results)->addItem(std::move(matches[i])); -} - -void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, - const String16& scriptId, - const String16& newContent, - const Maybe& dryRun, - Maybe>* newCallFrames, - Maybe* stackChanged, - Maybe* asyncStackTrace, - Maybe* optOutCompileError) -{ - if (!checkEnabled(errorString)) - return; - - v8::HandleScope handles(m_isolate); - v8::Local newSource = toV8String(m_isolate, newContent); - if (!m_debugger->setScriptSource(scriptId, newSource, dryRun.fromMaybe(false), errorString, optOutCompileError, &m_pausedCallFrames, stackChanged)) - return; - - ScriptsMap::iterator it = m_scripts.find(scriptId); - if (it != m_scripts.end()) - it->second->setSource(m_isolate, newSource); - - std::unique_ptr> callFrames = currentCallFrames(errorString); - if (!callFrames) - return; - *newCallFrames = std::move(callFrames); - *asyncStackTrace = currentAsyncStackTrace(); -} - -void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, - const String16& callFrameId, - std::unique_ptr>* newCallFrames, - Maybe* asyncStackTrace) -{ - if (!assertPaused(errorString)) - return; - InjectedScript::CallFrameScope scope(errorString, m_inspector, m_session->contextGroupId(), callFrameId); - if (!scope.initialize()) - return; - if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { - *errorString = "Could not find call frame with given id"; - return; - } - - v8::Local resultValue; - v8::Local result; - if (!m_pausedCallFrames[scope.frameOrdinal()]->restart().ToLocal(&resultValue) || scope.tryCatch().HasCaught() || !resultValue->ToBoolean(scope.context()).ToLocal(&result) || !result->Value()) { - *errorString = "Internal error"; - return; - } - JavaScriptCallFrames frames = m_debugger->currentCallFrames(); - m_pausedCallFrames.swap(frames); - - *newCallFrames = currentCallFrames(errorString); - if (!*newCallFrames) - return; - *asyncStackTrace = currentAsyncStackTrace(); -} - -void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& scriptId, String16* scriptSource) -{ - if (!checkEnabled(error)) - return; - ScriptsMap::iterator it = m_scripts.find(scriptId); - if (it == m_scripts.end()) { - *error = "No script for id: " + scriptId; - return; - } - v8::HandleScope handles(m_isolate); - *scriptSource = toProtocolString(it->second->source(m_isolate)); -} - -void V8DebuggerAgentImpl::schedulePauseOnNextStatement(const String16& breakReason, std::unique_ptr data) -{ - if (!enabled() || m_scheduledDebuggerStep == StepInto || m_javaScriptPauseScheduled || m_debugger->isPaused() || !m_debugger->breakpointsActivated()) - return; - m_breakReason = breakReason; - m_breakAuxData = std::move(data); - m_pausingOnNativeEvent = true; - m_skipNextDebuggerStepOut = false; - m_debugger->setPauseOnNextStatement(true); -} - -void V8DebuggerAgentImpl::schedulePauseOnNextStatementIfSteppingInto() -{ - DCHECK(enabled()); - if (m_scheduledDebuggerStep != StepInto || m_javaScriptPauseScheduled || m_debugger->isPaused()) - return; - clearBreakDetails(); - m_pausingOnNativeEvent = false; - m_skippedStepFrameCount = 0; - m_recursionLevelForStepFrame = 0; - m_debugger->setPauseOnNextStatement(true); -} - -void V8DebuggerAgentImpl::cancelPauseOnNextStatement() -{ - if (m_javaScriptPauseScheduled || m_debugger->isPaused()) - return; - clearBreakDetails(); - m_pausingOnNativeEvent = false; - m_debugger->setPauseOnNextStatement(false); -} - -void V8DebuggerAgentImpl::pause(ErrorString* errorString) -{ - if (!checkEnabled(errorString)) - return; - if (m_javaScriptPauseScheduled || m_debugger->isPaused()) - return; - clearBreakDetails(); - m_javaScriptPauseScheduled = true; - m_scheduledDebuggerStep = NoStep; - m_skippedStepFrameCount = 0; - m_steppingFromFramework = false; - m_debugger->setPauseOnNextStatement(true); -} - -void V8DebuggerAgentImpl::resume(ErrorString* errorString) -{ - if (!assertPaused(errorString)) - return; - m_scheduledDebuggerStep = NoStep; - m_steppingFromFramework = false; - m_session->releaseObjectGroup(backtraceObjectGroup); - m_debugger->continueProgram(); -} - -void V8DebuggerAgentImpl::stepOver(ErrorString* errorString) -{ - if (!assertPaused(errorString)) - return; - // StepOver at function return point should fallback to StepInto. - JavaScriptCallFrame* frame = !m_pausedCallFrames.empty() ? m_pausedCallFrames[0].get() : nullptr; - if (frame && frame->isAtReturn()) { - stepInto(errorString); - return; - } - m_scheduledDebuggerStep = StepOver; - m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); - m_session->releaseObjectGroup(backtraceObjectGroup); - m_debugger->stepOverStatement(); -} - -void V8DebuggerAgentImpl::stepInto(ErrorString* errorString) -{ - if (!assertPaused(errorString)) - return; - m_scheduledDebuggerStep = StepInto; - m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); - m_session->releaseObjectGroup(backtraceObjectGroup); - m_debugger->stepIntoStatement(); -} - -void V8DebuggerAgentImpl::stepOut(ErrorString* errorString) -{ - if (!assertPaused(errorString)) - return; - m_scheduledDebuggerStep = StepOut; - m_skipNextDebuggerStepOut = false; - m_recursionLevelForStepOut = 1; - m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); - m_session->releaseObjectGroup(backtraceObjectGroup); - m_debugger->stepOutOfFunction(); -} - -void V8DebuggerAgentImpl::setPauseOnExceptions(ErrorString* errorString, const String16& stringPauseState) -{ - if (!checkEnabled(errorString)) - return; - V8Debugger::PauseOnExceptionsState pauseState; - if (stringPauseState == "none") { - pauseState = V8Debugger::DontPauseOnExceptions; - } else if (stringPauseState == "all") { - pauseState = V8Debugger::PauseOnAllExceptions; - } else if (stringPauseState == "uncaught") { - pauseState = V8Debugger::PauseOnUncaughtExceptions; - } else { - *errorString = "Unknown pause on exceptions mode: " + stringPauseState; - return; - } - setPauseOnExceptionsImpl(errorString, pauseState); -} - -void V8DebuggerAgentImpl::setPauseOnExceptionsImpl(ErrorString* errorString, int pauseState) -{ - m_debugger->setPauseOnExceptionsState(static_cast(pauseState)); - if (m_debugger->getPauseOnExceptionsState() != pauseState) - *errorString = "Internal error. Could not change pause on exceptions state"; - else - m_state->setInteger(DebuggerAgentState::pauseOnExceptionsState, pauseState); -} - -void V8DebuggerAgentImpl::evaluateOnCallFrame(ErrorString* errorString, - const String16& callFrameId, - const String16& expression, - const Maybe& objectGroup, - const Maybe& includeCommandLineAPI, - const Maybe& silent, - const Maybe& returnByValue, - const Maybe& generatePreview, - std::unique_ptr* result, - Maybe* exceptionDetails) -{ - if (!assertPaused(errorString)) - return; - InjectedScript::CallFrameScope scope(errorString, m_inspector, m_session->contextGroupId(), callFrameId); - if (!scope.initialize()) - return; - if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { - *errorString = "Could not find call frame with given id"; - return; - } - - if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) - return; - if (silent.fromMaybe(false)) - scope.ignoreExceptionsAndMuteConsole(); - - v8::MaybeLocal maybeResultValue = m_pausedCallFrames[scope.frameOrdinal()]->evaluate(toV8String(m_isolate, expression)); - - // Re-initialize after running client's code, as it could have destroyed context or session. - if (!scope.initialize()) - return; - scope.injectedScript()->wrapEvaluateResult(errorString, - maybeResultValue, - scope.tryCatch(), - objectGroup.fromMaybe(""), - returnByValue.fromMaybe(false), - generatePreview.fromMaybe(false), - result, - exceptionDetails); -} - -void V8DebuggerAgentImpl::setVariableValue(ErrorString* errorString, - int scopeNumber, - const String16& variableName, - std::unique_ptr newValueArgument, - const String16& callFrameId) -{ - if (!checkEnabled(errorString)) - return; - if (!assertPaused(errorString)) - return; - InjectedScript::CallFrameScope scope(errorString, m_inspector, m_session->contextGroupId(), callFrameId); - if (!scope.initialize()) - return; - - v8::Local newValue; - if (!scope.injectedScript()->resolveCallArgument(errorString, newValueArgument.get()).ToLocal(&newValue)) - return; - - if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { - *errorString = "Could not find call frame with given id"; - return; - } - v8::MaybeLocal result = m_pausedCallFrames[scope.frameOrdinal()]->setVariableValue(scopeNumber, toV8String(m_isolate, variableName), newValue); - if (scope.tryCatch().HasCaught() || result.IsEmpty()) { - *errorString = "Internal error"; - return; - } -} - -void V8DebuggerAgentImpl::setAsyncCallStackDepth(ErrorString* errorString, int depth) -{ - if (!checkEnabled(errorString)) - return; - m_state->setInteger(DebuggerAgentState::asyncCallStackDepth, depth); - m_debugger->setAsyncCallStackDepth(this, depth); -} - -void V8DebuggerAgentImpl::setBlackboxPatterns(ErrorString* errorString, std::unique_ptr> patterns) -{ - if (!patterns->length()) { - m_blackboxPattern = nullptr; - m_state->remove(DebuggerAgentState::blackboxPattern); - return; - } - - String16Builder patternBuilder; - patternBuilder.append('('); - for (size_t i = 0; i < patterns->length() - 1; ++i) { - patternBuilder.append(patterns->get(i)); - patternBuilder.append("|"); - } - patternBuilder.append(patterns->get(patterns->length() - 1)); - patternBuilder.append(')'); - String16 pattern = patternBuilder.toString(); - if (!setBlackboxPattern(errorString, pattern)) - return; - m_state->setString(DebuggerAgentState::blackboxPattern, pattern); -} - -bool V8DebuggerAgentImpl::setBlackboxPattern(ErrorString* errorString, const String16& pattern) -{ - std::unique_ptr regex(new V8Regex(m_inspector, pattern, true /** caseSensitive */, false /** multiline */)); - if (!regex->isValid()) { - *errorString = "Pattern parser error: " + regex->errorMessage(); - return false; - } - m_blackboxPattern = std::move(regex); - return true; -} - -void V8DebuggerAgentImpl::setBlackboxedRanges(ErrorString* error, const String16& scriptId, - std::unique_ptr> inPositions) -{ - if (m_scripts.find(scriptId) == m_scripts.end()) { - *error = "No script with passed id."; - return; - } - - if (!inPositions->length()) { - m_blackboxedPositions.erase(scriptId); - return; - } - - std::vector> positions; - positions.reserve(inPositions->length()); - for (size_t i = 0; i < inPositions->length(); ++i) { - protocol::Debugger::ScriptPosition* position = inPositions->get(i); - if (position->getLineNumber() < 0) { - *error = "Position missing 'line' or 'line' < 0."; - return; - } - if (position->getColumnNumber() < 0) { - *error = "Position missing 'column' or 'column' < 0."; - return; - } - positions.push_back(std::make_pair(position->getLineNumber(), position->getColumnNumber())); - } - - for (size_t i = 1; i < positions.size(); ++i) { - if (positions[i - 1].first < positions[i].first) - continue; - if (positions[i - 1].first == positions[i].first && positions[i - 1].second < positions[i].second) - continue; - *error = "Input positions array is not sorted or contains duplicate values."; - return; - } - - m_blackboxedPositions[scriptId] = positions; -} - -void V8DebuggerAgentImpl::willExecuteScript(int scriptId) -{ - changeJavaScriptRecursionLevel(+1); - // Fast return. - if (m_scheduledDebuggerStep != StepInto) - return; - schedulePauseOnNextStatementIfSteppingInto(); -} - -void V8DebuggerAgentImpl::didExecuteScript() -{ - changeJavaScriptRecursionLevel(-1); -} - -void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step) -{ - if (m_javaScriptPauseScheduled && !m_skipAllPauses && !m_debugger->isPaused()) { - // Do not ever loose user's pause request until we have actually paused. - m_debugger->setPauseOnNextStatement(true); - } - if (m_scheduledDebuggerStep == StepOut) { - m_recursionLevelForStepOut += step; - if (!m_recursionLevelForStepOut) { - // When StepOut crosses a task boundary (i.e. js -> blink_c++) from where it was requested, - // switch stepping to step into a next JS task, as if we exited to a blackboxed framework. - m_scheduledDebuggerStep = StepInto; - m_skipNextDebuggerStepOut = false; - } - } - if (m_recursionLevelForStepFrame) { - m_recursionLevelForStepFrame += step; - if (!m_recursionLevelForStepFrame) { - // We have walked through a blackboxed framework and got back to where we started. - // If there was no stepping scheduled, we should cancel the stepping explicitly, - // since there may be a scheduled StepFrame left. - // Otherwise, if we were stepping in/over, the StepFrame will stop at the right location, - // whereas if we were stepping out, we should continue doing so after debugger pauses - // from the old StepFrame. - m_skippedStepFrameCount = 0; - if (m_scheduledDebuggerStep == NoStep) - m_debugger->clearStepping(); - else if (m_scheduledDebuggerStep == StepOut) - m_skipNextDebuggerStepOut = true; - } - } -} - -std::unique_ptr> V8DebuggerAgentImpl::currentCallFrames(ErrorString* errorString) -{ - if (m_pausedContext.IsEmpty() || !m_pausedCallFrames.size()) - return Array::create(); - ErrorString ignored; - v8::HandleScope handles(m_isolate); - v8::Local debuggerContext = v8::Debug::GetDebugContext(m_isolate); - v8::Context::Scope contextScope(debuggerContext); - - v8::Local objects = v8::Array::New(m_isolate); - - for (size_t frameOrdinal = 0; frameOrdinal < m_pausedCallFrames.size(); ++frameOrdinal) { - const std::unique_ptr& currentCallFrame = m_pausedCallFrames[frameOrdinal]; - - v8::Local details = currentCallFrame->details(); - if (hasInternalError(errorString, details.IsEmpty())) - return Array::create(); - - int contextId = currentCallFrame->contextId(); - InjectedScript* injectedScript = contextId ? m_session->findInjectedScript(&ignored, contextId) : nullptr; - - String16 callFrameId = RemoteCallFrameId::serialize(contextId, frameOrdinal); - if (hasInternalError(errorString, !details->Set(debuggerContext, toV8StringInternalized(m_isolate, "callFrameId"), toV8String(m_isolate, callFrameId)).FromMaybe(false))) - return Array::create(); - - if (injectedScript) { - v8::Local scopeChain; - if (hasInternalError(errorString, !details->Get(debuggerContext, toV8StringInternalized(m_isolate, "scopeChain")).ToLocal(&scopeChain) || !scopeChain->IsArray())) - return Array::create(); - v8::Local scopeChainArray = scopeChain.As(); - if (!injectedScript->wrapPropertyInArray(errorString, scopeChainArray, toV8StringInternalized(m_isolate, "object"), backtraceObjectGroup)) - return Array::create(); - if (!injectedScript->wrapObjectProperty(errorString, details, toV8StringInternalized(m_isolate, "this"), backtraceObjectGroup)) - return Array::create(); - if (details->Has(debuggerContext, toV8StringInternalized(m_isolate, "returnValue")).FromMaybe(false)) { - if (!injectedScript->wrapObjectProperty(errorString, details, toV8StringInternalized(m_isolate, "returnValue"), backtraceObjectGroup)) - return Array::create(); - } - } else { - if (hasInternalError(errorString, !details->Set(debuggerContext, toV8StringInternalized(m_isolate, "scopeChain"), v8::Array::New(m_isolate, 0)).FromMaybe(false))) - return Array::create(); - v8::Local remoteObject = v8::Object::New(m_isolate); - if (hasInternalError(errorString, !remoteObject->Set(debuggerContext, toV8StringInternalized(m_isolate, "type"), toV8StringInternalized(m_isolate, "undefined")).FromMaybe(false))) - return Array::create(); - if (hasInternalError(errorString, !details->Set(debuggerContext, toV8StringInternalized(m_isolate, "this"), remoteObject).FromMaybe(false))) - return Array::create(); - if (hasInternalError(errorString, !details->Delete(debuggerContext, toV8StringInternalized(m_isolate, "returnValue")).FromMaybe(false))) - return Array::create(); - } - - if (hasInternalError(errorString, !objects->Set(debuggerContext, frameOrdinal, details).FromMaybe(false))) - return Array::create(); - } - - protocol::ErrorSupport errorSupport; - std::unique_ptr> callFrames = Array::parse(toProtocolValue(debuggerContext, objects).get(), &errorSupport); - if (hasInternalError(errorString, !callFrames)) - return Array::create(); - return callFrames; -} - -std::unique_ptr V8DebuggerAgentImpl::currentAsyncStackTrace() -{ - if (m_pausedContext.IsEmpty()) - return nullptr; - V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); - return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) : nullptr; -} - -void V8DebuggerAgentImpl::didParseSource(std::unique_ptr script, bool success) -{ - v8::HandleScope handles(m_isolate); - String16 scriptSource = toProtocolString(script->source(m_isolate)); - if (!success) - script->setSourceURL(findSourceURL(scriptSource, false)); - if (!success) - script->setSourceMappingURL(findSourceMapURL(scriptSource, false)); - - std::unique_ptr executionContextAuxData; - if (!script->executionContextAuxData().isEmpty()) - executionContextAuxData = protocol::DictionaryValue::cast(parseJSON(script->executionContextAuxData())); - bool isLiveEdit = script->isLiveEdit(); - bool hasSourceURL = script->hasSourceURL(); - String16 scriptId = script->scriptId(); - String16 scriptURL = script->sourceURL(); - - const Maybe& sourceMapURLParam = script->sourceMappingURL(); - const Maybe& executionContextAuxDataParam(std::move(executionContextAuxData)); - const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; - const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; - if (success) - m_frontend.scriptParsed(scriptId, scriptURL, script->startLine(), script->startColumn(), script->endLine(), script->endColumn(), script->executionContextId(), script->hash(), executionContextAuxDataParam, isLiveEditParam, sourceMapURLParam, hasSourceURLParam); - else - m_frontend.scriptFailedToParse(scriptId, scriptURL, script->startLine(), script->startColumn(), script->endLine(), script->endColumn(), script->executionContextId(), script->hash(), executionContextAuxDataParam, sourceMapURLParam, hasSourceURLParam); - - m_scripts[scriptId] = std::move(script); - - if (scriptURL.isEmpty() || !success) - return; - - protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); - if (!breakpointsCookie) - return; - - for (size_t i = 0; i < breakpointsCookie->size(); ++i) { - auto cookie = breakpointsCookie->at(i); - protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue::cast(cookie.second); - bool isRegex; - breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); - String16 url; - breakpointObject->getString(DebuggerAgentState::url, &url); - if (!matches(m_inspector, scriptURL, url, isRegex)) - continue; - ScriptBreakpoint breakpoint; - breakpointObject->getInteger(DebuggerAgentState::lineNumber, &breakpoint.lineNumber); - breakpointObject->getInteger(DebuggerAgentState::columnNumber, &breakpoint.columnNumber); - breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.condition); - std::unique_ptr location = resolveBreakpoint(cookie.first, scriptId, breakpoint, UserBreakpointSource); - if (location) - m_frontend.breakpointResolved(cookie.first, std::move(location)); - } -} - -V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local context, v8::Local exception, const std::vector& hitBreakpoints, bool isPromiseRejection) -{ - JavaScriptCallFrames callFrames = m_debugger->currentCallFrames(1); - JavaScriptCallFrame* topCallFrame = !callFrames.empty() ? callFrames.begin()->get() : nullptr; - - V8DebuggerAgentImpl::SkipPauseRequest result; - if (m_skipAllPauses) - result = RequestContinue; - else if (!hitBreakpoints.empty()) - result = RequestNoSkip; // Don't skip explicit breakpoints even if set in frameworks. - else if (!exception.IsEmpty()) - result = shouldSkipExceptionPause(topCallFrame); - else if (m_scheduledDebuggerStep != NoStep || m_javaScriptPauseScheduled || m_pausingOnNativeEvent) - result = shouldSkipStepPause(topCallFrame); - else - result = RequestNoSkip; - - m_skipNextDebuggerStepOut = false; - if (result != RequestNoSkip) - return result; - // Skip pauses inside V8 internal scripts and on syntax errors. - if (!topCallFrame) - return RequestContinue; - - DCHECK(m_pausedContext.IsEmpty()); - JavaScriptCallFrames frames = m_debugger->currentCallFrames(); - m_pausedCallFrames.swap(frames); - m_pausedContext.Reset(m_isolate, context); - v8::HandleScope handles(m_isolate); - - if (!exception.IsEmpty()) { - ErrorString ignored; - InjectedScript* injectedScript = m_session->findInjectedScript(&ignored, V8Debugger::contextId(context)); - if (injectedScript) { - m_breakReason = isPromiseRejection ? protocol::Debugger::Paused::ReasonEnum::PromiseRejection : protocol::Debugger::Paused::ReasonEnum::Exception; - ErrorString errorString; - auto obj = injectedScript->wrapObject(&errorString, exception, backtraceObjectGroup); - m_breakAuxData = obj ? obj->serialize() : nullptr; - // m_breakAuxData might be null after this. - } - } - - std::unique_ptr> hitBreakpointIds = Array::create(); - - for (const auto& point : hitBreakpoints) { - DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIterator = m_serverBreakpoints.find(point); - if (breakpointIterator != m_serverBreakpoints.end()) { - const String16& localId = breakpointIterator->second.first; - hitBreakpointIds->addItem(localId); - - BreakpointSource source = breakpointIterator->second.second; - if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other && source == DebugCommandBreakpointSource) - m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCommand; - } - } - - ErrorString errorString; - m_frontend.paused(currentCallFrames(&errorString), m_breakReason, std::move(m_breakAuxData), std::move(hitBreakpointIds), currentAsyncStackTrace()); - m_scheduledDebuggerStep = NoStep; - m_javaScriptPauseScheduled = false; - m_steppingFromFramework = false; - m_pausingOnNativeEvent = false; - m_skippedStepFrameCount = 0; - m_recursionLevelForStepFrame = 0; - - if (!m_continueToLocationBreakpointId.isEmpty()) { - m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); - m_continueToLocationBreakpointId = ""; - } - return result; -} - -void V8DebuggerAgentImpl::didContinue() -{ - m_pausedContext.Reset(); - JavaScriptCallFrames emptyCallFrames; - m_pausedCallFrames.swap(emptyCallFrames); - clearBreakDetails(); - m_frontend.resumed(); -} - -void V8DebuggerAgentImpl::breakProgram(const String16& breakReason, std::unique_ptr data) -{ - if (!enabled() || m_skipAllPauses || !m_pausedContext.IsEmpty() || isCurrentCallStackEmptyOrBlackboxed() || !m_debugger->breakpointsActivated()) - return; - m_breakReason = breakReason; - m_breakAuxData = std::move(data); - m_scheduledDebuggerStep = NoStep; - m_steppingFromFramework = false; - m_pausingOnNativeEvent = false; - m_debugger->breakProgram(); -} - -void V8DebuggerAgentImpl::breakProgramOnException(const String16& breakReason, std::unique_ptr data) -{ - if (!enabled() || m_debugger->getPauseOnExceptionsState() == V8Debugger::DontPauseOnExceptions) - return; - breakProgram(breakReason, std::move(data)); -} - -bool V8DebuggerAgentImpl::assertPaused(ErrorString* errorString) -{ - if (m_pausedContext.IsEmpty()) { - *errorString = "Can only perform operation while paused."; - return false; - } - return true; -} - -void V8DebuggerAgentImpl::clearBreakDetails() -{ - m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; - m_breakAuxData = nullptr; -} - -void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource source, const String16& condition) -{ - String16 breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumber, source); - ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); - resolveBreakpoint(breakpointId, scriptId, breakpoint, source); -} - -void V8DebuggerAgentImpl::removeBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource source) -{ - removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, source)); -} - -void V8DebuggerAgentImpl::reset() -{ - if (!enabled()) - return; - m_scheduledDebuggerStep = NoStep; - m_scripts.clear(); - m_blackboxedPositions.clear(); - m_breakpointIdToDebuggerBreakpointIds.clear(); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.h deleted file mode 100644 index 04d1ad7c8927d0..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerAgentImpl.h +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8DebuggerAgentImpl_h -#define V8DebuggerAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/JavaScriptCallFrame.h" -#include "platform/v8_inspector/protocol/Debugger.h" - -#include - -namespace v8_inspector { - -struct ScriptBreakpoint; -class JavaScriptCallFrame; -class PromiseTracker; -class V8Debugger; -class V8DebuggerScript; -class V8InspectorImpl; -class V8InspectorSessionImpl; -class V8Regex; -class V8StackTraceImpl; - -namespace protocol = blink::protocol; -using blink::protocol::Maybe; - -class V8DebuggerAgentImpl : public protocol::Debugger::Backend { - PROTOCOL_DISALLOW_COPY(V8DebuggerAgentImpl); -public: - enum SkipPauseRequest { - RequestNoSkip, - RequestContinue, - RequestStepInto, - RequestStepOut, - RequestStepFrame - }; - - enum BreakpointSource { - UserBreakpointSource, - DebugCommandBreakpointSource, - MonitorCommandBreakpointSource - }; - - V8DebuggerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8DebuggerAgentImpl() override; - void restore(); - - // Part of the protocol. - void enable(ErrorString*) override; - void disable(ErrorString*) override; - void setBreakpointsActive(ErrorString*, bool active) override; - void setSkipAllPauses(ErrorString*, bool skip) override; - void setBreakpointByUrl(ErrorString*, - int lineNumber, - const Maybe& optionalURL, - const Maybe& optionalURLRegex, - const Maybe& optionalColumnNumber, - const Maybe& optionalCondition, - String16*, - std::unique_ptr>* locations) override; - void setBreakpoint(ErrorString*, - std::unique_ptr, - const Maybe& optionalCondition, - String16*, - std::unique_ptr* actualLocation) override; - void removeBreakpoint(ErrorString*, const String16& breakpointId) override; - void continueToLocation(ErrorString*, - std::unique_ptr) override; - void searchInContent(ErrorString*, - const String16& scriptId, - const String16& query, - const Maybe& optionalCaseSensitive, - const Maybe& optionalIsRegex, - std::unique_ptr>*) override; - void setScriptSource(ErrorString*, - const String16& inScriptId, - const String16& inScriptSource, - const Maybe& dryRun, - Maybe>* optOutCallFrames, - Maybe* optOutStackChanged, - Maybe* optOutAsyncStackTrace, - Maybe* optOutCompileError) override; - void restartFrame(ErrorString*, - const String16& callFrameId, - std::unique_ptr>* newCallFrames, - Maybe* asyncStackTrace) override; - void getScriptSource(ErrorString*, const String16& scriptId, String16* scriptSource) override; - void pause(ErrorString*) override; - void resume(ErrorString*) override; - void stepOver(ErrorString*) override; - void stepInto(ErrorString*) override; - void stepOut(ErrorString*) override; - void setPauseOnExceptions(ErrorString*, const String16& pauseState) override; - void evaluateOnCallFrame(ErrorString*, - const String16& callFrameId, - const String16& expression, - const Maybe& objectGroup, - const Maybe& includeCommandLineAPI, - const Maybe& silent, - const Maybe& returnByValue, - const Maybe& generatePreview, - std::unique_ptr* result, - Maybe*) override; - void setVariableValue(ErrorString*, - int scopeNumber, - const String16& variableName, - std::unique_ptr newValue, - const String16& callFrame) override; - void setAsyncCallStackDepth(ErrorString*, int depth) override; - void setBlackboxPatterns(ErrorString*, - std::unique_ptr> patterns) override; - void setBlackboxedRanges(ErrorString*, - const String16& scriptId, - std::unique_ptr> positions) override; - - bool enabled(); - - void setBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource, const String16& condition = String16()); - void removeBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource); - void schedulePauseOnNextStatement(const String16& breakReason, std::unique_ptr data); - void cancelPauseOnNextStatement(); - void breakProgram(const String16& breakReason, std::unique_ptr data); - void breakProgramOnException(const String16& breakReason, std::unique_ptr data); - - void reset(); - - // Interface for V8InspectorImpl - SkipPauseRequest didPause(v8::Local, v8::Local exception, const std::vector& hitBreakpoints, bool isPromiseRejection); - void didContinue(); - void didParseSource(std::unique_ptr, bool success); - void willExecuteScript(int scriptId); - void didExecuteScript(); - - v8::Isolate* isolate() { return m_isolate; } - -private: - bool checkEnabled(ErrorString*); - void enable(); - - SkipPauseRequest shouldSkipExceptionPause(JavaScriptCallFrame* topCallFrame); - SkipPauseRequest shouldSkipStepPause(JavaScriptCallFrame* topCallFrame); - - void schedulePauseOnNextStatementIfSteppingInto(); - - std::unique_ptr> currentCallFrames(ErrorString*); - std::unique_ptr currentAsyncStackTrace(); - - void changeJavaScriptRecursionLevel(int step); - - void setPauseOnExceptionsImpl(ErrorString*, int); - - std::unique_ptr resolveBreakpoint(const String16& breakpointId, const String16& scriptId, const ScriptBreakpoint&, BreakpointSource); - void removeBreakpoint(const String16& breakpointId); - bool assertPaused(ErrorString*); - void clearBreakDetails(); - - bool isCurrentCallStackEmptyOrBlackboxed(); - bool isTopPausedCallFrameBlackboxed(); - bool isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCallFrame*); - - void internalSetAsyncCallStackDepth(int); - void increaseCachedSkipStackGeneration(); - - bool setBlackboxPattern(ErrorString*, const String16& pattern); - - using ScriptsMap = protocol::HashMap>; - using BreakpointIdToDebuggerBreakpointIdsMap = protocol::HashMap>; - using DebugServerBreakpointToBreakpointIdAndSourceMap = protocol::HashMap>; - using MuteBreakpoins = protocol::HashMap>; - - enum DebuggerStep { - NoStep = 0, - StepInto, - StepOver, - StepOut - }; - - V8InspectorImpl* m_inspector; - V8Debugger* m_debugger; - V8InspectorSessionImpl* m_session; - bool m_enabled; - protocol::DictionaryValue* m_state; - protocol::Debugger::Frontend m_frontend; - v8::Isolate* m_isolate; - v8::Global m_pausedContext; - JavaScriptCallFrames m_pausedCallFrames; - ScriptsMap m_scripts; - BreakpointIdToDebuggerBreakpointIdsMap m_breakpointIdToDebuggerBreakpointIds; - DebugServerBreakpointToBreakpointIdAndSourceMap m_serverBreakpoints; - String16 m_continueToLocationBreakpointId; - String16 m_breakReason; - std::unique_ptr m_breakAuxData; - DebuggerStep m_scheduledDebuggerStep; - bool m_skipNextDebuggerStepOut; - bool m_javaScriptPauseScheduled; - bool m_steppingFromFramework; - bool m_pausingOnNativeEvent; - - int m_skippedStepFrameCount; - int m_recursionLevelForStepOut; - int m_recursionLevelForStepFrame; - bool m_skipAllPauses; - - std::unique_ptr m_blackboxPattern; - protocol::HashMap>> m_blackboxedPositions; -}; - -} // namespace v8_inspector - -#endif // V8DebuggerAgentImpl_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerScript.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerScript.cpp deleted file mode 100644 index 76e0c0066bfb89..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8DebuggerScript.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8DebuggerScript.h" - -#include "platform/v8_inspector/V8StringUtil.h" - -namespace v8_inspector { - -static const char hexDigits[17] = "0123456789ABCDEF"; - -static void appendUnsignedAsHex(unsigned number, String16Builder* destination) -{ - for (size_t i = 0; i < 8; ++i) { - UChar c = hexDigits[number & 0xF]; - destination->append(c); - number >>= 4; - } -} - -// Hash algorithm for substrings is described in "Über die Komplexität der Multiplikation in -// eingeschränkten Branchingprogrammmodellen" by Woelfe. -// http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECTION00832000000000000000 -static String16 calculateHash(const String16& str) -{ - static uint64_t prime[] = { 0x3FB75161, 0xAB1F4E4F, 0x82675BC5, 0xCD924D35, 0x81ABE279 }; - static uint64_t random[] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; - static uint32_t randomOdd[] = { 0xB4663807, 0xCC322BF5, 0xD4F91BBD, 0xA7BEA11D, 0x8F462907 }; - - uint64_t hashes[] = { 0, 0, 0, 0, 0 }; - uint64_t zi[] = { 1, 1, 1, 1, 1 }; - - const size_t hashesSize = PROTOCOL_ARRAY_LENGTH(hashes); - - size_t current = 0; - const uint32_t* data = nullptr; - size_t sizeInBytes = sizeof(UChar) * str.length(); - data = reinterpret_cast(str.characters16()); - for (size_t i = 0; i < sizeInBytes / 4; i += 4) { - uint32_t v = data[i]; - uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF; - hashes[current] = (hashes[current] + zi[current] * xi) % prime[current]; - zi[current] = (zi[current] * random[current]) % prime[current]; - current = current == hashesSize - 1 ? 0 : current + 1; - } - if (sizeInBytes % 4) { - uint32_t v = 0; - for (size_t i = sizeInBytes - sizeInBytes % 4; i < sizeInBytes; ++i) { - v <<= 8; - v |= reinterpret_cast(data)[i]; - } - uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF; - hashes[current] = (hashes[current] + zi[current] * xi) % prime[current]; - zi[current] = (zi[current] * random[current]) % prime[current]; - current = current == hashesSize - 1 ? 0 : current + 1; - } - - for (size_t i = 0; i < hashesSize; ++i) - hashes[i] = (hashes[i] + zi[i] * (prime[i] - 1)) % prime[i]; - - String16Builder hash; - for (size_t i = 0; i < hashesSize; ++i) - appendUnsignedAsHex(hashes[i], &hash); - return hash.toString(); -} - -V8DebuggerScript::V8DebuggerScript(v8::Isolate* isolate, v8::Local object, bool isLiveEdit) -{ - v8::Local idValue = object->Get(toV8StringInternalized(isolate, "id")); - DCHECK(!idValue.IsEmpty() && idValue->IsInt32()); - m_id = String16::fromInteger(idValue->Int32Value()); - - m_url = toProtocolStringWithTypeCheck(object->Get(toV8StringInternalized(isolate, "name"))); - m_sourceURL = toProtocolStringWithTypeCheck(object->Get(toV8StringInternalized(isolate, "sourceURL"))); - m_sourceMappingURL = toProtocolStringWithTypeCheck(object->Get(toV8StringInternalized(isolate, "sourceMappingURL"))); - m_startLine = object->Get(toV8StringInternalized(isolate, "startLine"))->ToInteger(isolate)->Value(); - m_startColumn = object->Get(toV8StringInternalized(isolate, "startColumn"))->ToInteger(isolate)->Value(); - m_endLine = object->Get(toV8StringInternalized(isolate, "endLine"))->ToInteger(isolate)->Value(); - m_endColumn = object->Get(toV8StringInternalized(isolate, "endColumn"))->ToInteger(isolate)->Value(); - m_executionContextAuxData = toProtocolStringWithTypeCheck(object->Get(toV8StringInternalized(isolate, "executionContextAuxData"))); - m_executionContextId = object->Get(toV8StringInternalized(isolate, "executionContextId"))->ToInteger(isolate)->Value(); - m_isLiveEdit = isLiveEdit; - - v8::Local sourceValue = object->Get(toV8StringInternalized(isolate, "source")); - if (!sourceValue.IsEmpty() && sourceValue->IsString()) - setSource(isolate, sourceValue.As()); -} - -V8DebuggerScript::~V8DebuggerScript() -{ -} - -const String16& V8DebuggerScript::sourceURL() const -{ - return m_sourceURL.isEmpty() ? m_url : m_sourceURL; -} - -v8::Local V8DebuggerScript::source(v8::Isolate* isolate) const -{ - return m_source.Get(isolate); -} - -void V8DebuggerScript::setSourceURL(const String16& sourceURL) -{ - m_sourceURL = sourceURL; -} - -void V8DebuggerScript::setSourceMappingURL(const String16& sourceMappingURL) -{ - m_sourceMappingURL = sourceMappingURL; -} - -void V8DebuggerScript::setSource(v8::Isolate* isolate, v8::Local source) -{ - m_source.Reset(isolate, source); - m_hash = calculateHash(toProtocolString(source)); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.cpp deleted file mode 100644 index 2f3389c5365d78..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8FunctionCall.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "platform/v8_inspector/V8FunctionCall.h" - -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -#include - -namespace v8_inspector { - -V8FunctionCall::V8FunctionCall(V8InspectorImpl* inspector, v8::Local context, v8::Local value, const String16& name) - : m_inspector(inspector) - , m_context(context) - , m_name(toV8String(context->GetIsolate(), name)) - , m_value(value) -{ -} - -void V8FunctionCall::appendArgument(v8::Local value) -{ - m_arguments.push_back(value); -} - -void V8FunctionCall::appendArgument(const String16& argument) -{ - m_arguments.push_back(toV8String(m_context->GetIsolate(), argument)); -} - -void V8FunctionCall::appendArgument(int argument) -{ - m_arguments.push_back(v8::Number::New(m_context->GetIsolate(), argument)); -} - -void V8FunctionCall::appendArgument(bool argument) -{ - m_arguments.push_back(argument ? v8::True(m_context->GetIsolate()) : v8::False(m_context->GetIsolate())); -} - -v8::Local V8FunctionCall::call(bool& hadException, bool reportExceptions) -{ - v8::TryCatch tryCatch(m_context->GetIsolate()); - tryCatch.SetVerbose(reportExceptions); - - v8::Local result = callWithoutExceptionHandling(); - hadException = tryCatch.HasCaught(); - return result; -} - -v8::Local V8FunctionCall::callWithoutExceptionHandling() -{ - v8::Local thisObject = v8::Local::Cast(m_value); - v8::Local value; - if (!thisObject->Get(m_context, m_name).ToLocal(&value)) - return v8::Local(); - - DCHECK(value->IsFunction()); - - v8::Local function = v8::Local::Cast(value); - std::unique_ptr[]> info(new v8::Local[m_arguments.size()]); - for (size_t i = 0; i < m_arguments.size(); ++i) { - info[i] = m_arguments[i]; - DCHECK(!info[i].IsEmpty()); - } - - int contextGroupId = V8Debugger::getGroupId(m_context); - if (contextGroupId) { - m_inspector->client()->muteMetrics(contextGroupId); - m_inspector->muteExceptions(contextGroupId); - } - v8::MicrotasksScope microtasksScope(m_context->GetIsolate(), v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::MaybeLocal maybeResult = function->Call(m_context, thisObject, m_arguments.size(), info.get()); - if (contextGroupId) { - m_inspector->client()->unmuteMetrics(contextGroupId); - m_inspector->unmuteExceptions(contextGroupId); - } - - v8::Local result; - if (!maybeResult.ToLocal(&result)) - return v8::Local(); - return result; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.cpp deleted file mode 100644 index fb2981fadb3308..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.cpp +++ /dev/null @@ -1,401 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" -#include -#include - -namespace v8_inspector { - -namespace { - -namespace HeapProfilerAgentState { -static const char heapProfilerEnabled[] = "heapProfilerEnabled"; -static const char heapObjectsTrackingEnabled[] = "heapObjectsTrackingEnabled"; -static const char allocationTrackingEnabled[] = "allocationTrackingEnabled"; -#if V8_MAJOR_VERSION >= 5 -static const char samplingHeapProfilerEnabled[] = "samplingHeapProfilerEnabled"; -static const char samplingHeapProfilerInterval[] = "samplingHeapProfilerInterval"; -#endif -} - -class HeapSnapshotProgress final : public v8::ActivityControl { -public: - HeapSnapshotProgress(protocol::HeapProfiler::Frontend* frontend) - : m_frontend(frontend) { } - ControlOption ReportProgressValue(int done, int total) override - { - m_frontend->reportHeapSnapshotProgress(done, total, protocol::Maybe()); - if (done >= total) { - m_frontend->reportHeapSnapshotProgress(total, total, true); - } - m_frontend->flush(); - return kContinue; - } -private: - protocol::HeapProfiler::Frontend* m_frontend; -}; - -class GlobalObjectNameResolver final : public v8::HeapProfiler::ObjectNameResolver { -public: - explicit GlobalObjectNameResolver(V8InspectorSessionImpl* session) - : m_offset(0), m_strings(10000), m_session(session) {} - - const char* GetName(v8::Local object) override - { - InspectedContext* context = m_session->inspector()->getContext(m_session->contextGroupId(), V8Debugger::contextId(object->CreationContext())); - if (!context) - return ""; - String16 name = context->origin(); - size_t length = name.length(); - if (m_offset + length + 1 >= m_strings.size()) - return ""; - for (size_t i = 0; i < length; ++i) { - UChar ch = name[i]; - m_strings[m_offset + i] = ch > 0xff ? '?' : static_cast(ch); - } - m_strings[m_offset + length] = '\0'; - char* result = &*m_strings.begin() + m_offset; - m_offset += length + 1; - return result; - } - -private: - size_t m_offset; - std::vector m_strings; - V8InspectorSessionImpl* m_session; -}; - -class HeapSnapshotOutputStream final : public v8::OutputStream { -public: - HeapSnapshotOutputStream(protocol::HeapProfiler::Frontend* frontend) - : m_frontend(frontend) { } - void EndOfStream() override { } - int GetChunkSize() override { return 102400; } - WriteResult WriteAsciiChunk(char* data, int size) override - { - m_frontend->addHeapSnapshotChunk(String16(data, size)); - m_frontend->flush(); - return kContinue; - } -private: - protocol::HeapProfiler::Frontend* m_frontend; -}; - -v8::Local objectByHeapObjectId(v8::Isolate* isolate, int id) -{ - v8::HeapProfiler* profiler = isolate->GetHeapProfiler(); - v8::Local value = profiler->FindObjectById(id); - if (value.IsEmpty() || !value->IsObject()) - return v8::Local(); - return value.As(); -} - -class InspectableHeapObject final : public V8InspectorSession::Inspectable { -public: - explicit InspectableHeapObject(int heapObjectId) : m_heapObjectId(heapObjectId) { } - v8::Local get(v8::Local context) override - { - return objectByHeapObjectId(context->GetIsolate(), m_heapObjectId); - } -private: - int m_heapObjectId; -}; - -class HeapStatsStream final : public v8::OutputStream { -public: - HeapStatsStream(protocol::HeapProfiler::Frontend* frontend) - : m_frontend(frontend) - { - } - - void EndOfStream() override { } - - WriteResult WriteAsciiChunk(char* data, int size) override - { - DCHECK(false); - return kAbort; - } - - WriteResult WriteHeapStatsChunk(v8::HeapStatsUpdate* updateData, int count) override - { - DCHECK_GT(count, 0); - std::unique_ptr> statsDiff = protocol::Array::create(); - for (int i = 0; i < count; ++i) { - statsDiff->addItem(updateData[i].index); - statsDiff->addItem(updateData[i].count); - statsDiff->addItem(updateData[i].size); - } - m_frontend->heapStatsUpdate(std::move(statsDiff)); - return kContinue; - } - -private: - protocol::HeapProfiler::Frontend* m_frontend; -}; - -} // namespace - -V8HeapProfilerAgentImpl::V8HeapProfilerAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) - : m_session(session) - , m_isolate(session->inspector()->isolate()) - , m_frontend(frontendChannel) - , m_state(state) - , m_hasTimer(false) -{ -} - -V8HeapProfilerAgentImpl::~V8HeapProfilerAgentImpl() -{ -} - -void V8HeapProfilerAgentImpl::restore() -{ - if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, false)) - m_frontend.resetProfiles(); - if (m_state->booleanProperty(HeapProfilerAgentState::heapObjectsTrackingEnabled, false)) - startTrackingHeapObjectsInternal(m_state->booleanProperty(HeapProfilerAgentState::allocationTrackingEnabled, false)); -#if V8_MAJOR_VERSION >= 5 - if (m_state->booleanProperty(HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { - ErrorString error; - double samplingInterval = m_state->doubleProperty(HeapProfilerAgentState::samplingHeapProfilerInterval, -1); - DCHECK_GE(samplingInterval, 0); - startSampling(&error, Maybe(samplingInterval)); - } -#endif -} - -void V8HeapProfilerAgentImpl::collectGarbage(ErrorString*) -{ - m_isolate->LowMemoryNotification(); -} - -void V8HeapProfilerAgentImpl::startTrackingHeapObjects(ErrorString*, const protocol::Maybe& trackAllocations) -{ - m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, true); - bool allocationTrackingEnabled = trackAllocations.fromMaybe(false); - m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, allocationTrackingEnabled); - startTrackingHeapObjectsInternal(allocationTrackingEnabled); -} - -void V8HeapProfilerAgentImpl::stopTrackingHeapObjects(ErrorString* error, const protocol::Maybe& reportProgress) -{ - requestHeapStatsUpdate(); - takeHeapSnapshot(error, reportProgress); - stopTrackingHeapObjectsInternal(); -} - -void V8HeapProfilerAgentImpl::enable(ErrorString*) -{ - m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true); -} - -void V8HeapProfilerAgentImpl::disable(ErrorString* error) -{ - stopTrackingHeapObjectsInternal(); -#if V8_MAJOR_VERSION >= 5 - if (m_state->booleanProperty(HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { - v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); - if (profiler) - profiler->StopSamplingHeapProfiler(); - } -#endif - m_isolate->GetHeapProfiler()->ClearObjectIds(); - m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, false); -} - -void V8HeapProfilerAgentImpl::takeHeapSnapshot(ErrorString* errorString, const protocol::Maybe& reportProgress) -{ - v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); - if (!profiler) { - *errorString = "Cannot access v8 heap profiler"; - return; - } - std::unique_ptr progress; - if (reportProgress.fromMaybe(false)) - progress = wrapUnique(new HeapSnapshotProgress(&m_frontend)); - - GlobalObjectNameResolver resolver(m_session); - const v8::HeapSnapshot* snapshot = profiler->TakeHeapSnapshot(progress.get(), &resolver); - if (!snapshot) { - *errorString = "Failed to take heap snapshot"; - return; - } - HeapSnapshotOutputStream stream(&m_frontend); - snapshot->Serialize(&stream); - const_cast(snapshot)->Delete(); -} - -void V8HeapProfilerAgentImpl::getObjectByHeapObjectId(ErrorString* error, const String16& heapSnapshotObjectId, const protocol::Maybe& objectGroup, std::unique_ptr* result) -{ - bool ok; - int id = heapSnapshotObjectId.toInteger(&ok); - if (!ok) { - *error = "Invalid heap snapshot object id"; - return; - } - - v8::HandleScope handles(m_isolate); - v8::Local heapObject = objectByHeapObjectId(m_isolate, id); - if (heapObject.IsEmpty()) { - *error = "Object is not available"; - return; - } - - if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { - *error = "Object is not available"; - return; - } - - *result = m_session->wrapObject(heapObject->CreationContext(), heapObject, objectGroup.fromMaybe(""), false); - if (!result) - *error = "Object is not available"; -} - -void V8HeapProfilerAgentImpl::addInspectedHeapObject(ErrorString* errorString, const String16& inspectedHeapObjectId) -{ - bool ok; - int id = inspectedHeapObjectId.toInteger(&ok); - if (!ok) { - *errorString = "Invalid heap snapshot object id"; - return; - } - - v8::HandleScope handles(m_isolate); - v8::Local heapObject = objectByHeapObjectId(m_isolate, id); - if (heapObject.IsEmpty()) { - *errorString = "Object is not available"; - return; - } - - if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { - *errorString = "Object is not available"; - return; - } - - m_session->addInspectedObject(wrapUnique(new InspectableHeapObject(id))); -} - -void V8HeapProfilerAgentImpl::getHeapObjectId(ErrorString* errorString, const String16& objectId, String16* heapSnapshotObjectId) -{ - v8::HandleScope handles(m_isolate); - v8::Local value; - v8::Local context; - String16 objectGroup; - if (!m_session->unwrapObject(errorString, objectId, &value, &context, &objectGroup) || value->IsUndefined()) - return; - - v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value); - *heapSnapshotObjectId = String16::fromInteger(id); -} - -void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() -{ - HeapStatsStream stream(&m_frontend); - v8::SnapshotObjectId lastSeenObjectId = m_isolate->GetHeapProfiler()->GetHeapStats(&stream); - m_frontend.lastSeenObjectId(lastSeenObjectId, m_session->inspector()->client()->currentTimeMS()); -} - -// static -void V8HeapProfilerAgentImpl::onTimer(void* data) -{ - reinterpret_cast(data)->requestHeapStatsUpdate(); -} - -void V8HeapProfilerAgentImpl::startTrackingHeapObjectsInternal(bool trackAllocations) -{ - m_isolate->GetHeapProfiler()->StartTrackingHeapObjects(trackAllocations); - if (!m_hasTimer) { - m_hasTimer = true; - m_session->inspector()->client()->startRepeatingTimer(0.05, &V8HeapProfilerAgentImpl::onTimer, reinterpret_cast(this)); - } -} - -void V8HeapProfilerAgentImpl::stopTrackingHeapObjectsInternal() -{ - if (m_hasTimer) { - m_session->inspector()->client()->cancelTimer(reinterpret_cast(this)); - m_hasTimer = false; - } - m_isolate->GetHeapProfiler()->StopTrackingHeapObjects(); - m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, false); - m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, false); -} - -void V8HeapProfilerAgentImpl::startSampling(ErrorString* errorString, const Maybe& samplingInterval) -{ -#if V8_MAJOR_VERSION >= 5 - v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); - if (!profiler) { - *errorString = "Cannot access v8 heap profiler"; - return; - } - const unsigned defaultSamplingInterval = 1 << 15; - double samplingIntervalValue = samplingInterval.fromMaybe(defaultSamplingInterval); - m_state->setDouble(HeapProfilerAgentState::samplingHeapProfilerInterval, samplingIntervalValue); - m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, true); -#if V8_MAJOR_VERSION * 1000 + V8_MINOR_VERSION >= 5002 - profiler->StartSamplingHeapProfiler(static_cast(samplingIntervalValue), 128, v8::HeapProfiler::kSamplingForceGC); -#else - profiler->StartSamplingHeapProfiler(static_cast(samplingIntervalValue), 128); -#endif -#endif -} - -#if V8_MAJOR_VERSION >= 5 -namespace { -std::unique_ptr buildSampingHeapProfileNode(const v8::AllocationProfile::Node* node) -{ - auto children = protocol::Array::create(); - for (const auto* child : node->children) - children->addItem(buildSampingHeapProfileNode(child)); - size_t selfSize = 0; - for (const auto& allocation : node->allocations) - selfSize += allocation.size * allocation.count; - std::unique_ptr callFrame = protocol::Runtime::CallFrame::create() - .setFunctionName(toProtocolString(node->name)) - .setScriptId(String16::fromInteger(node->script_id)) - .setUrl(toProtocolString(node->script_name)) - .setLineNumber(node->line_number - 1) - .setColumnNumber(node->column_number - 1) - .build(); - std::unique_ptr result = protocol::HeapProfiler::SamplingHeapProfileNode::create() - .setCallFrame(std::move(callFrame)) - .setSelfSize(selfSize) - .setChildren(std::move(children)).build(); - return result; -} -} // namespace -#endif - -void V8HeapProfilerAgentImpl::stopSampling(ErrorString* errorString, std::unique_ptr* profile) -{ -#if V8_MAJOR_VERSION >= 5 - v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); - if (!profiler) { - *errorString = "Cannot access v8 heap profiler"; - return; - } - v8::HandleScope scope(m_isolate); // Allocation profile contains Local handles. - std::unique_ptr v8Profile(profiler->GetAllocationProfile()); - profiler->StopSamplingHeapProfiler(); - m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, false); - if (!v8Profile) { - *errorString = "Cannot access v8 sampled heap profile."; - return; - } - v8::AllocationProfile::Node* root = v8Profile->GetRootNode(); - *profile = protocol::HeapProfiler::SamplingHeapProfile::create() - .setHead(buildSampingHeapProfileNode(root)).build(); -#endif -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.h deleted file mode 100644 index 198772a4836a4c..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8HeapProfilerAgentImpl.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8HeapProfilerAgentImpl_h -#define V8HeapProfilerAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/HeapProfiler.h" - -#include - -namespace v8_inspector { - -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; -using blink::protocol::Maybe; - -class V8HeapProfilerAgentImpl : public protocol::HeapProfiler::Backend { - PROTOCOL_DISALLOW_COPY(V8HeapProfilerAgentImpl); -public: - V8HeapProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8HeapProfilerAgentImpl() override; - void restore(); - - void collectGarbage(ErrorString*) override; - - void enable(ErrorString*) override; - void startTrackingHeapObjects(ErrorString*, const Maybe& trackAllocations) override; - void stopTrackingHeapObjects(ErrorString*, const Maybe& reportProgress) override; - - void disable(ErrorString*) override; - - void takeHeapSnapshot(ErrorString*, const Maybe& reportProgress) override; - - void getObjectByHeapObjectId(ErrorString*, const String16& heapSnapshotObjectId, const Maybe& objectGroup, std::unique_ptr* result) override; - void addInspectedHeapObject(ErrorString*, const String16& inspectedHeapObjectId) override; - void getHeapObjectId(ErrorString*, const String16& objectId, String16* heapSnapshotObjectId) override; - - void startSampling(ErrorString*, const Maybe& samplingInterval) override; - void stopSampling(ErrorString*, std::unique_ptr*) override; - -private: - void startTrackingHeapObjectsInternal(bool trackAllocations); - void stopTrackingHeapObjectsInternal(); - void requestHeapStatsUpdate(); - static void onTimer(void*); - - V8InspectorSessionImpl* m_session; - v8::Isolate* m_isolate; - protocol::HeapProfiler::Frontend m_frontend; - protocol::DictionaryValue* m_state; - bool m_hasTimer; -}; - -} // namespace v8_inspector - -#endif // !defined(V8HeapProfilerAgentImpl_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.cpp deleted file mode 100644 index 782e5bbab01473..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8InjectedScriptHost.h" - -#include "platform/v8_inspector/InjectedScriptNative.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InternalValueType.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -namespace { - -void setFunctionProperty(v8::Local context, v8::Local obj, const char* name, v8::FunctionCallback callback, v8::Local external) -{ - v8::Local funcName = toV8StringInternalized(context->GetIsolate(), name); - v8::Local func; - if (!V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, callback, external, 0).ToLocal(&func)) - return; - func->SetName(funcName); - if (!obj->Set(context, funcName, func).FromMaybe(false)) - return; -} - -V8InspectorImpl* unwrapInspector(const v8::FunctionCallbackInfo& info) -{ - DCHECK(!info.Data().IsEmpty()); - DCHECK(info.Data()->IsExternal()); - V8InspectorImpl* inspector = static_cast(info.Data().As()->Value()); - DCHECK(inspector); - return inspector; -} - -} // namespace - -v8::Local V8InjectedScriptHost::create(v8::Local context, V8InspectorImpl* inspector) -{ - v8::Isolate* isolate = inspector->isolate(); - v8::Local injectedScriptHost = v8::Object::New(isolate); - bool success = injectedScriptHost->SetPrototype(context, v8::Null(isolate)).FromMaybe(false); - DCHECK(success); - v8::Local debuggerExternal = v8::External::New(isolate, inspector); - setFunctionProperty(context, injectedScriptHost, "internalConstructorName", V8InjectedScriptHost::internalConstructorNameCallback, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "formatAccessorsAsProperties", V8InjectedScriptHost::formatAccessorsAsProperties, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "subtype", V8InjectedScriptHost::subtypeCallback, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "getInternalProperties", V8InjectedScriptHost::getInternalPropertiesCallback, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "objectHasOwnProperty", V8InjectedScriptHost::objectHasOwnPropertyCallback, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "bind", V8InjectedScriptHost::bindCallback, debuggerExternal); - setFunctionProperty(context, injectedScriptHost, "proxyTargetValue", V8InjectedScriptHost::proxyTargetValueCallback, debuggerExternal); - return injectedScriptHost; -} - -void V8InjectedScriptHost::internalConstructorNameCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() < 1 || !info[0]->IsObject()) - return; - - v8::Local object = info[0].As(); - info.GetReturnValue().Set(object->GetConstructorName()); -} - -void V8InjectedScriptHost::formatAccessorsAsProperties(const v8::FunctionCallbackInfo& info) -{ - DCHECK_EQ(info.Length(), 2); - info.GetReturnValue().Set(false); - if (!info[1]->IsFunction()) - return; - // Check that function is user-defined. - if (info[1].As()->ScriptId() != v8::UnboundScript::kNoScriptId) - return; - info.GetReturnValue().Set(unwrapInspector(info)->client()->formatAccessorsAsProperties(info[0])); -} - -void V8InjectedScriptHost::subtypeCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() < 1) - return; - - v8::Isolate* isolate = info.GetIsolate(); - v8::Local value = info[0]; - if (value->IsObject()) { - v8::Local internalType = v8InternalValueTypeFrom(isolate->GetCurrentContext(), v8::Local::Cast(value)); - if (internalType->IsString()) { - info.GetReturnValue().Set(internalType); - return; - } - } - if (value->IsArray() || value->IsArgumentsObject()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "array")); - return; - } - if (value->IsTypedArray()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "typedarray")); - return; - } - if (value->IsDate()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "date")); - return; - } - if (value->IsRegExp()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "regexp")); - return; - } - if (value->IsMap() || value->IsWeakMap()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "map")); - return; - } - if (value->IsSet() || value->IsWeakSet()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "set")); - return; - } - if (value->IsMapIterator() || value->IsSetIterator()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "iterator")); - return; - } - if (value->IsGeneratorObject()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "generator")); - return; - } - if (value->IsNativeError()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "error")); - return; - } - if (value->IsProxy()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "proxy")); - return; - } - if (value->IsPromise()) { - info.GetReturnValue().Set(toV8StringInternalized(isolate, "promise")); - return; - } - String16 subtype = unwrapInspector(info)->client()->valueSubtype(value); - if (!subtype.isEmpty()) { - info.GetReturnValue().Set(toV8String(isolate, subtype)); - return; - } -} - -void V8InjectedScriptHost::getInternalPropertiesCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() < 1) - return; - v8::Local properties; - if (unwrapInspector(info)->debugger()->internalProperties(info.GetIsolate()->GetCurrentContext(), info[0]).ToLocal(&properties)) - info.GetReturnValue().Set(properties); -} - -void V8InjectedScriptHost::objectHasOwnPropertyCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() < 2 || !info[0]->IsObject() || !info[1]->IsString()) - return; - bool result = info[0].As()->HasOwnProperty(info.GetIsolate()->GetCurrentContext(), v8::Local::Cast(info[1])).FromMaybe(false); - info.GetReturnValue().Set(v8::Boolean::New(info.GetIsolate(), result)); -} - -void V8InjectedScriptHost::bindCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() < 2 || !info[1]->IsString()) - return; - InjectedScriptNative* injectedScriptNative = InjectedScriptNative::fromInjectedScriptHost(info.Holder()); - if (!injectedScriptNative) - return; - - v8::Local v8groupName = info[1]->ToString(info.GetIsolate()); - String16 groupName = toProtocolStringWithTypeCheck(v8groupName); - int id = injectedScriptNative->bind(info[0], groupName); - info.GetReturnValue().Set(id); -} - -void V8InjectedScriptHost::proxyTargetValueCallback(const v8::FunctionCallbackInfo& info) -{ - if (info.Length() != 1 || !info[0]->IsProxy()) { - NOTREACHED(); - return; - } - v8::Local target = info[0].As(); - while (target->IsProxy()) - target = v8::Local::Cast(target)->GetTarget(); - info.GetReturnValue().Set(target); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.h deleted file mode 100644 index 3123319f6c56f0..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InjectedScriptHost.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8InjectedScriptHost_h -#define V8InjectedScriptHost_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -namespace v8_inspector { - -class V8InspectorImpl; - -namespace protocol = blink::protocol; - -// SECURITY NOTE: Although the InjectedScriptHost is intended for use solely by the inspector, -// a reference to the InjectedScriptHost may be leaked to the page being inspected. Thus, the -// InjectedScriptHost must never implemment methods that have more power over the page than the -// page already has itself (e.g. origin restriction bypasses). - -class V8InjectedScriptHost { -public: - // We expect that debugger outlives any JS context and thus V8InjectedScriptHost (owned by JS) - // is destroyed before inspector. - static v8::Local create(v8::Local, V8InspectorImpl*); -private: - static void internalConstructorNameCallback(const v8::FunctionCallbackInfo&); - static void formatAccessorsAsProperties(const v8::FunctionCallbackInfo&); - static void subtypeCallback(const v8::FunctionCallbackInfo&); - static void getInternalPropertiesCallback(const v8::FunctionCallbackInfo&); - static void objectHasOwnPropertyCallback(const v8::FunctionCallbackInfo&); - static void bindCallback(const v8::FunctionCallbackInfo&); - static void proxyTargetValueCallback(const v8::FunctionCallbackInfo&); -}; - -} // namespace v8_inspector - -#endif // V8InjectedScriptHost_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.cpp deleted file mode 100644 index 1a56906f782416..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 2010-2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "platform/v8_inspector/V8InspectorImpl.h" - -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8ConsoleAgentImpl.h" -#include "platform/v8_inspector/V8ConsoleMessage.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" -#include - -namespace v8_inspector { - -std::unique_ptr V8Inspector::create(v8::Isolate* isolate, V8InspectorClient* client) -{ - return wrapUnique(new V8InspectorImpl(isolate, client)); -} - -V8InspectorImpl::V8InspectorImpl(v8::Isolate* isolate, V8InspectorClient* client) - : m_isolate(isolate) - , m_client(client) - , m_debugger(new V8Debugger(isolate, this)) - , m_capturingStackTracesCount(0) - , m_lastExceptionId(0) -{ -} - -V8InspectorImpl::~V8InspectorImpl() -{ -} - -V8DebuggerAgentImpl* V8InspectorImpl::enabledDebuggerAgentForGroup(int contextGroupId) -{ - V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); - V8DebuggerAgentImpl* agent = session ? session->debuggerAgent() : nullptr; - return agent && agent->enabled() ? agent : nullptr; -} - -V8RuntimeAgentImpl* V8InspectorImpl::enabledRuntimeAgentForGroup(int contextGroupId) -{ - V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); - V8RuntimeAgentImpl* agent = session ? session->runtimeAgent() : nullptr; - return agent && agent->enabled() ? agent : nullptr; -} - -v8::MaybeLocal V8InspectorImpl::runCompiledScript(v8::Local context, v8::Local script) -{ - v8::MicrotasksScope microtasksScope(m_isolate, v8::MicrotasksScope::kRunMicrotasks); - int groupId = V8Debugger::getGroupId(context); - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) - agent->willExecuteScript(script->GetUnboundScript()->GetId()); - v8::MaybeLocal result = script->Run(context); - // Get agent from the map again, since it could have detached during script execution. - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) - agent->didExecuteScript(); - return result; -} - -v8::MaybeLocal V8InspectorImpl::callFunction(v8::Local function, v8::Local context, v8::Local receiver, int argc, v8::Local info[]) -{ - v8::MicrotasksScope microtasksScope(m_isolate, v8::MicrotasksScope::kRunMicrotasks); - int groupId = V8Debugger::getGroupId(context); - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) - agent->willExecuteScript(function->ScriptId()); - v8::MaybeLocal result = function->Call(context, receiver, argc, info); - // Get agent from the map again, since it could have detached during script execution. - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) - agent->didExecuteScript(); - return result; -} - -v8::MaybeLocal V8InspectorImpl::compileAndRunInternalScript(v8::Local context, v8::Local source) -{ - v8::Local script = compileScript(context, source, String16(), true); - if (script.IsEmpty()) - return v8::MaybeLocal(); - v8::MicrotasksScope microtasksScope(m_isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - return script->Run(context); -} - -v8::Local V8InspectorImpl::compileScript(v8::Local context, v8::Local code, const String16& fileName, bool markAsInternal) -{ - v8::ScriptOrigin origin( - toV8String(m_isolate, fileName), - v8::Integer::New(m_isolate, 0), - v8::Integer::New(m_isolate, 0), - v8::False(m_isolate), // sharable - v8::Local(), - v8::Boolean::New(m_isolate, markAsInternal), // internal - toV8String(m_isolate, String16()), // sourceMap - v8::True(m_isolate)); // opaqueresource - v8::ScriptCompiler::Source source(code, origin); - v8::Local script; - if (!v8::ScriptCompiler::Compile(context, &source, v8::ScriptCompiler::kNoCompileOptions).ToLocal(&script)) - return v8::Local(); - return script; -} - -void V8InspectorImpl::enableStackCapturingIfNeeded() -{ - if (!m_capturingStackTracesCount) - V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, true); - ++m_capturingStackTracesCount; -} - -void V8InspectorImpl::disableStackCapturingIfNeeded() -{ - if (!(--m_capturingStackTracesCount)) - V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, false); -} - -void V8InspectorImpl::muteExceptions(int contextGroupId) -{ - m_muteExceptionsMap[contextGroupId]++; -} - -void V8InspectorImpl::unmuteExceptions(int contextGroupId) -{ - m_muteExceptionsMap[contextGroupId]--; -} - -V8ConsoleMessageStorage* V8InspectorImpl::ensureConsoleMessageStorage(int contextGroupId) -{ - ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(contextGroupId); - if (storageIt == m_consoleStorageMap.end()) - storageIt = m_consoleStorageMap.insert(std::make_pair(contextGroupId, wrapUnique(new V8ConsoleMessageStorage(this, contextGroupId)))).first; - return storageIt->second.get(); -} - -std::unique_ptr V8InspectorImpl::createStackTrace(v8::Local stackTrace) -{ - return m_debugger->createStackTrace(stackTrace); -} - -std::unique_ptr V8InspectorImpl::connect(int contextGroupId, protocol::FrontendChannel* channel, const String16* state) -{ - DCHECK(m_sessions.find(contextGroupId) == m_sessions.cend()); - std::unique_ptr session = V8InspectorSessionImpl::create(this, contextGroupId, channel, state); - m_sessions[contextGroupId] = session.get(); - return std::move(session); -} - -void V8InspectorImpl::disconnect(V8InspectorSessionImpl* session) -{ - DCHECK(m_sessions.find(session->contextGroupId()) != m_sessions.end()); - m_sessions.erase(session->contextGroupId()); -} - -InspectedContext* V8InspectorImpl::getContext(int groupId, int contextId) const -{ - if (!groupId || !contextId) - return nullptr; - - ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); - if (contextGroupIt == m_contexts.end()) - return nullptr; - - ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); - if (contextIt == contextGroupIt->second->end()) - return nullptr; - - return contextIt->second.get(); -} - -void V8InspectorImpl::contextCreated(const V8ContextInfo& info) -{ - int contextId = m_debugger->markContext(info); - - ContextsByGroupMap::iterator contextIt = m_contexts.find(info.contextGroupId); - if (contextIt == m_contexts.end()) - contextIt = m_contexts.insert(std::make_pair(info.contextGroupId, wrapUnique(new ContextByIdMap()))).first; - - const auto& contextById = contextIt->second; - - DCHECK(contextById->find(contextId) == contextById->cend()); - InspectedContext* context = new InspectedContext(this, info, contextId); - (*contextById)[contextId] = wrapUnique(context); - SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); - if (sessionIt != m_sessions.end()) - sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); -} - -void V8InspectorImpl::contextDestroyed(v8::Local context) -{ - int contextId = V8Debugger::contextId(context); - int contextGroupId = V8Debugger::getGroupId(context); - - ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(contextGroupId); - if (storageIt != m_consoleStorageMap.end()) - storageIt->second->contextDestroyed(contextId); - - InspectedContext* inspectedContext = getContext(contextGroupId, contextId); - if (!inspectedContext) - return; - - SessionMap::iterator iter = m_sessions.find(contextGroupId); - if (iter != m_sessions.end()) - iter->second->runtimeAgent()->reportExecutionContextDestroyed(inspectedContext); - discardInspectedContext(contextGroupId, contextId); -} - -void V8InspectorImpl::resetContextGroup(int contextGroupId) -{ - m_consoleStorageMap.erase(contextGroupId); - m_muteExceptionsMap.erase(contextGroupId); - SessionMap::iterator session = m_sessions.find(contextGroupId); - if (session != m_sessions.end()) - session->second->reset(); - m_contexts.erase(contextGroupId); -} - -void V8InspectorImpl::willExecuteScript(v8::Local context, int scriptId) -{ - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) - agent->willExecuteScript(scriptId); -} - -void V8InspectorImpl::didExecuteScript(v8::Local context) -{ - if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) - agent->didExecuteScript(); -} - -void V8InspectorImpl::idleStarted() -{ - m_isolate->GetCpuProfiler()->SetIdle(true); -} - -void V8InspectorImpl::idleFinished() -{ - m_isolate->GetCpuProfiler()->SetIdle(false); -} - -unsigned V8InspectorImpl::exceptionThrown(v8::Local context, const String16& message, v8::Local exception, const String16& detailedMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr stackTrace, int scriptId) -{ - int contextGroupId = V8Debugger::getGroupId(context); - if (!contextGroupId || m_muteExceptionsMap[contextGroupId]) - return 0; - std::unique_ptr stackTraceImpl = wrapUnique(static_cast(stackTrace.release())); - unsigned exceptionId = nextExceptionId(); - std::unique_ptr consoleMessage = V8ConsoleMessage::createForException(m_client->currentTimeMS(), detailedMessage, url, lineNumber, columnNumber, std::move(stackTraceImpl), scriptId, m_isolate, message, V8Debugger::contextId(context), exception, exceptionId); - ensureConsoleMessageStorage(contextGroupId)->addMessage(std::move(consoleMessage)); - return exceptionId; -} - -void V8InspectorImpl::exceptionRevoked(v8::Local context, unsigned exceptionId, const String16& message) -{ - int contextGroupId = V8Debugger::getGroupId(context); - if (!contextGroupId) - return; - - std::unique_ptr consoleMessage = V8ConsoleMessage::createForRevokedException(m_client->currentTimeMS(), message, exceptionId); - ensureConsoleMessageStorage(contextGroupId)->addMessage(std::move(consoleMessage)); -} - -std::unique_ptr V8InspectorImpl::captureStackTrace(bool fullStack) -{ - return m_debugger->captureStackTrace(fullStack); -} - -void V8InspectorImpl::asyncTaskScheduled(const String16& taskName, void* task, bool recurring) -{ - m_debugger->asyncTaskScheduled(taskName, task, recurring); -} - -void V8InspectorImpl::asyncTaskCanceled(void* task) -{ - m_debugger->asyncTaskCanceled(task); -} - -void V8InspectorImpl::asyncTaskStarted(void* task) -{ - m_debugger->asyncTaskStarted(task); -} - -void V8InspectorImpl::asyncTaskFinished(void* task) -{ - m_debugger->asyncTaskFinished(task); -} - -void V8InspectorImpl::allAsyncTasksCanceled() -{ - m_debugger->allAsyncTasksCanceled(); -} - -v8::Local V8InspectorImpl::regexContext() -{ - if (m_regexContext.IsEmpty()) - m_regexContext.Reset(m_isolate, v8::Context::New(m_isolate)); - return m_regexContext.Get(m_isolate); -} - -void V8InspectorImpl::discardInspectedContext(int contextGroupId, int contextId) -{ - if (!getContext(contextGroupId, contextId)) - return; - m_contexts[contextGroupId]->erase(contextId); - if (m_contexts[contextGroupId]->empty()) - m_contexts.erase(contextGroupId); -} - -const V8InspectorImpl::ContextByIdMap* V8InspectorImpl::contextGroup(int contextGroupId) -{ - ContextsByGroupMap::iterator iter = m_contexts.find(contextGroupId); - return iter == m_contexts.end() ? nullptr : iter->second.get(); -} - -V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup(int contextGroupId) -{ - if (!contextGroupId) - return nullptr; - SessionMap::iterator iter = m_sessions.find(contextGroupId); - return iter == m_sessions.end() ? nullptr : iter->second; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.h deleted file mode 100644 index 395c48ddd79d09..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorImpl.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010, Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef V8InspectorImpl_h -#define V8InspectorImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/public/V8Inspector.h" - -#include -#include -#include - -namespace v8_inspector { - -class InspectedContext; -class V8ConsoleMessageStorage; -class V8Debugger; -class V8DebuggerAgentImpl; -class V8InspectorSessionImpl; -class V8RuntimeAgentImpl; -class V8StackTraceImpl; - -namespace protocol = blink::protocol; - -class V8InspectorImpl : public V8Inspector { - PROTOCOL_DISALLOW_COPY(V8InspectorImpl); -public: - V8InspectorImpl(v8::Isolate*, V8InspectorClient*); - ~V8InspectorImpl() override; - - v8::Isolate* isolate() const { return m_isolate; } - V8InspectorClient* client() { return m_client; } - V8Debugger* debugger() { return m_debugger.get(); } - - v8::MaybeLocal runCompiledScript(v8::Local, v8::Local); - v8::MaybeLocal callFunction(v8::Local, v8::Local, v8::Local receiver, int argc, v8::Local info[]); - v8::MaybeLocal compileAndRunInternalScript(v8::Local, v8::Local); - v8::Local compileScript(v8::Local, v8::Local, const String16& fileName, bool markAsInternal); - v8::Local regexContext(); - - // V8Inspector implementation. - std::unique_ptr connect(int contextGroupId, protocol::FrontendChannel*, const String16* state) override; - void contextCreated(const V8ContextInfo&) override; - void contextDestroyed(v8::Local) override; - void resetContextGroup(int contextGroupId) override; - void willExecuteScript(v8::Local, int scriptId) override; - void didExecuteScript(v8::Local) override; - void idleStarted() override; - void idleFinished() override; - unsigned exceptionThrown(v8::Local, const String16& message, v8::Local exception, const String16& detailedMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr, int scriptId) override; - void exceptionRevoked(v8::Local, unsigned exceptionId, const String16& message) override; - std::unique_ptr createStackTrace(v8::Local) override; - std::unique_ptr captureStackTrace(bool fullStack) override; - void asyncTaskScheduled(const String16& taskName, void* task, bool recurring) override; - void asyncTaskCanceled(void* task) override; - void asyncTaskStarted(void* task) override; - void asyncTaskFinished(void* task) override; - void allAsyncTasksCanceled() override; - - unsigned nextExceptionId() { return ++m_lastExceptionId; } - void enableStackCapturingIfNeeded(); - void disableStackCapturingIfNeeded(); - void muteExceptions(int contextGroupId); - void unmuteExceptions(int contextGroupId); - V8ConsoleMessageStorage* ensureConsoleMessageStorage(int contextGroupId); - using ContextByIdMap = protocol::HashMap>; - void discardInspectedContext(int contextGroupId, int contextId); - const ContextByIdMap* contextGroup(int contextGroupId); - void disconnect(V8InspectorSessionImpl*); - V8InspectorSessionImpl* sessionForContextGroup(int contextGroupId); - InspectedContext* getContext(int groupId, int contextId) const; - V8DebuggerAgentImpl* enabledDebuggerAgentForGroup(int contextGroupId); - V8RuntimeAgentImpl* enabledRuntimeAgentForGroup(int contextGroupId); - -private: - v8::Isolate* m_isolate; - V8InspectorClient* m_client; - std::unique_ptr m_debugger; - v8::Global m_regexContext; - int m_capturingStackTracesCount; - unsigned m_lastExceptionId; - - using MuteExceptionsMap = protocol::HashMap; - MuteExceptionsMap m_muteExceptionsMap; - - using ContextsByGroupMap = protocol::HashMap>; - ContextsByGroupMap m_contexts; - - using SessionMap = protocol::HashMap; - SessionMap m_sessions; - - using ConsoleStorageMap = protocol::HashMap>; - ConsoleStorageMap m_consoleStorageMap; -}; - -} // namespace v8_inspector - - -#endif // V8InspectorImpl_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.cpp deleted file mode 100644 index 51b288de882d75..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.cpp +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8InspectorSessionImpl.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/RemoteObjectId.h" -#include "platform/v8_inspector/V8ConsoleAgentImpl.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" -#include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8ProfilerAgentImpl.h" -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" -#include "platform/v8_inspector/V8SchemaAgentImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8ContextInfo.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -// static -bool V8InspectorSession::canDispatchMethod(const String16& method) -{ - return method.startsWith(protocol::Runtime::Metainfo::commandPrefix) - || method.startsWith(protocol::Debugger::Metainfo::commandPrefix) - || method.startsWith(protocol::Profiler::Metainfo::commandPrefix) - || method.startsWith(protocol::HeapProfiler::Metainfo::commandPrefix) - || method.startsWith(protocol::Console::Metainfo::commandPrefix) - || method.startsWith(protocol::Schema::Metainfo::commandPrefix); -} - -std::unique_ptr V8InspectorSessionImpl::create(V8InspectorImpl* inspector, int contextGroupId, protocol::FrontendChannel* channel, const String16* state) -{ - return wrapUnique(new V8InspectorSessionImpl(inspector, contextGroupId, channel, state)); -} - -V8InspectorSessionImpl::V8InspectorSessionImpl(V8InspectorImpl* inspector, int contextGroupId, protocol::FrontendChannel* channel, const String16* savedState) - : m_contextGroupId(contextGroupId) - , m_inspector(inspector) - , m_customObjectFormatterEnabled(false) - , m_dispatcher(channel) - , m_state(nullptr) - , m_runtimeAgent(nullptr) - , m_debuggerAgent(nullptr) - , m_heapProfilerAgent(nullptr) - , m_profilerAgent(nullptr) - , m_consoleAgent(nullptr) - , m_schemaAgent(nullptr) -{ - if (savedState) { - std::unique_ptr state = protocol::parseJSON(*savedState); - if (state) - m_state = protocol::DictionaryValue::cast(std::move(state)); - if (!m_state) - m_state = protocol::DictionaryValue::create(); - } else { - m_state = protocol::DictionaryValue::create(); - } - - m_runtimeAgent = wrapUnique(new V8RuntimeAgentImpl(this, channel, agentState(protocol::Runtime::Metainfo::domainName))); - protocol::Runtime::Dispatcher::wire(&m_dispatcher, m_runtimeAgent.get()); - - m_debuggerAgent = wrapUnique(new V8DebuggerAgentImpl(this, channel, agentState(protocol::Debugger::Metainfo::domainName))); - protocol::Debugger::Dispatcher::wire(&m_dispatcher, m_debuggerAgent.get()); - - m_profilerAgent = wrapUnique(new V8ProfilerAgentImpl(this, channel, agentState(protocol::Profiler::Metainfo::domainName))); - protocol::Profiler::Dispatcher::wire(&m_dispatcher, m_profilerAgent.get()); - - m_heapProfilerAgent = wrapUnique(new V8HeapProfilerAgentImpl(this, channel, agentState(protocol::HeapProfiler::Metainfo::domainName))); - protocol::HeapProfiler::Dispatcher::wire(&m_dispatcher, m_heapProfilerAgent.get()); - - m_consoleAgent = wrapUnique(new V8ConsoleAgentImpl(this, channel, agentState(protocol::Console::Metainfo::domainName))); - protocol::Console::Dispatcher::wire(&m_dispatcher, m_consoleAgent.get()); - - m_schemaAgent = wrapUnique(new V8SchemaAgentImpl(this, channel, agentState(protocol::Schema::Metainfo::domainName))); - protocol::Schema::Dispatcher::wire(&m_dispatcher, m_schemaAgent.get()); - - if (savedState) { - m_runtimeAgent->restore(); - m_debuggerAgent->restore(); - m_heapProfilerAgent->restore(); - m_profilerAgent->restore(); - m_consoleAgent->restore(); - } -} - -V8InspectorSessionImpl::~V8InspectorSessionImpl() -{ - ErrorString errorString; - m_consoleAgent->disable(&errorString); - m_profilerAgent->disable(&errorString); - m_heapProfilerAgent->disable(&errorString); - m_debuggerAgent->disable(&errorString); - m_runtimeAgent->disable(&errorString); - - discardInjectedScripts(); - m_inspector->disconnect(this); -} - -protocol::DictionaryValue* V8InspectorSessionImpl::agentState(const String16& name) -{ - protocol::DictionaryValue* state = m_state->getObject(name); - if (!state) { - std::unique_ptr newState = protocol::DictionaryValue::create(); - state = newState.get(); - m_state->setObject(name, std::move(newState)); - } - return state; -} - -void V8InspectorSessionImpl::reset() -{ - m_debuggerAgent->reset(); - m_runtimeAgent->reset(); - discardInjectedScripts(); -} - -void V8InspectorSessionImpl::discardInjectedScripts() -{ - m_inspectedObjects.clear(); - const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - return; - - std::vector keys; - keys.reserve(contexts->size()); - for (auto& idContext : *contexts) - keys.push_back(idContext.first); - for (auto& key : keys) { - contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - continue; - auto contextIt = contexts->find(key); - if (contextIt != contexts->end()) - contextIt->second->discardInjectedScript(); // This may destroy some contexts. - } -} - -InjectedScript* V8InspectorSessionImpl::findInjectedScript(ErrorString* errorString, int contextId) -{ - if (!contextId) { - *errorString = "Cannot find context with specified id"; - return nullptr; - } - - const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) { - *errorString = "Cannot find context with specified id"; - return nullptr; - } - - auto contextsIt = contexts->find(contextId); - if (contextsIt == contexts->end()) { - *errorString = "Cannot find context with specified id"; - return nullptr; - } - - const std::unique_ptr& context = contextsIt->second; - if (!context->getInjectedScript()) { - context->createInjectedScript(); - if (!context->getInjectedScript()) { - *errorString = "Cannot access specified execution context"; - return nullptr; - } - if (m_customObjectFormatterEnabled) - context->getInjectedScript()->setCustomObjectFormatterEnabled(true); - } - return context->getInjectedScript(); -} - -InjectedScript* V8InspectorSessionImpl::findInjectedScript(ErrorString* errorString, RemoteObjectIdBase* objectId) -{ - return objectId ? findInjectedScript(errorString, objectId->contextId()) : nullptr; -} - -void V8InspectorSessionImpl::releaseObjectGroup(const String16& objectGroup) -{ - const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - return; - - std::vector keys; - for (auto& idContext : *contexts) - keys.push_back(idContext.first); - for (auto& key : keys) { - contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - continue; - auto contextsIt = contexts->find(key); - if (contextsIt == contexts->end()) - continue; - InjectedScript* injectedScript = contextsIt->second->getInjectedScript(); - if (injectedScript) - injectedScript->releaseObjectGroup(objectGroup); // This may destroy some contexts. - } -} - -bool V8InspectorSessionImpl::unwrapObject(ErrorString* errorString, const String16& objectId, v8::Local* object, v8::Local* context, String16* objectGroup) -{ - std::unique_ptr remoteId = RemoteObjectId::parse(errorString, objectId); - if (!remoteId) - return false; - InjectedScript* injectedScript = findInjectedScript(errorString, remoteId.get()); - if (!injectedScript) - return false; - if (!injectedScript->findObject(errorString, *remoteId, object)) - return false; - *context = injectedScript->context()->context(); - *objectGroup = injectedScript->objectGroupName(*remoteId); - return true; -} - -std::unique_ptr V8InspectorSessionImpl::wrapObject(v8::Local context, v8::Local value, const String16& groupName) -{ - return wrapObject(context, value, groupName, false); -} - -std::unique_ptr V8InspectorSessionImpl::wrapObject(v8::Local context, v8::Local value, const String16& groupName, bool generatePreview) -{ - ErrorString errorString; - InjectedScript* injectedScript = findInjectedScript(&errorString, V8Debugger::contextId(context)); - if (!injectedScript) - return nullptr; - return injectedScript->wrapObject(&errorString, value, groupName, false, generatePreview); -} - -std::unique_ptr V8InspectorSessionImpl::wrapTable(v8::Local context, v8::Local table, v8::Local columns) -{ - ErrorString errorString; - InjectedScript* injectedScript = findInjectedScript(&errorString, V8Debugger::contextId(context)); - if (!injectedScript) - return nullptr; - return injectedScript->wrapTable(table, columns); -} - -void V8InspectorSessionImpl::setCustomObjectFormatterEnabled(bool enabled) -{ - m_customObjectFormatterEnabled = enabled; - const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - return; - for (auto& idContext : *contexts) { - InjectedScript* injectedScript = idContext.second->getInjectedScript(); - if (injectedScript) - injectedScript->setCustomObjectFormatterEnabled(enabled); - } -} - -void V8InspectorSessionImpl::reportAllContexts(V8RuntimeAgentImpl* agent) -{ - const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_contextGroupId); - if (!contexts) - return; - for (auto& idContext : *contexts) - agent->reportExecutionContextCreated(idContext.second.get()); -} - -void V8InspectorSessionImpl::dispatchProtocolMessage(const String16& message) -{ - m_dispatcher.dispatch(message); -} - -String16 V8InspectorSessionImpl::stateJSON() -{ - return m_state->toJSONString(); -} - -std::unique_ptr> V8InspectorSessionImpl::supportedDomains() -{ - std::vector> domains = supportedDomainsImpl(); - std::unique_ptr> result = protocol::Array::create(); - for (size_t i = 0; i < domains.size(); ++i) - result->addItem(std::move(domains[i])); - return result; -} - -std::vector> V8InspectorSessionImpl::supportedDomainsImpl() -{ - std::vector> result; - result.push_back(protocol::Schema::Domain::create().setName(protocol::Runtime::Metainfo::domainName).setVersion(protocol::Runtime::Metainfo::version).build()); - result.push_back(protocol::Schema::Domain::create().setName(protocol::Debugger::Metainfo::domainName).setVersion(protocol::Debugger::Metainfo::version).build()); - result.push_back(protocol::Schema::Domain::create().setName(protocol::Profiler::Metainfo::domainName).setVersion(protocol::Profiler::Metainfo::version).build()); - result.push_back(protocol::Schema::Domain::create().setName(protocol::HeapProfiler::Metainfo::domainName).setVersion(protocol::HeapProfiler::Metainfo::version).build()); - result.push_back(protocol::Schema::Domain::create().setName(protocol::Schema::Metainfo::domainName).setVersion(protocol::Schema::Metainfo::version).build()); - return result; -} - -void V8InspectorSessionImpl::addInspectedObject(std::unique_ptr inspectable) -{ - m_inspectedObjects.insert(m_inspectedObjects.begin(), std::move(inspectable)); - if (m_inspectedObjects.size() > kInspectedObjectBufferSize) - m_inspectedObjects.resize(kInspectedObjectBufferSize); -} - -V8InspectorSession::Inspectable* V8InspectorSessionImpl::inspectedObject(unsigned num) -{ - if (num >= m_inspectedObjects.size()) - return nullptr; - return m_inspectedObjects[num].get(); -} - -void V8InspectorSessionImpl::schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails) -{ - m_debuggerAgent->schedulePauseOnNextStatement(breakReason, protocol::DictionaryValue::cast(parseJSON(breakDetails))); -} - -void V8InspectorSessionImpl::cancelPauseOnNextStatement() -{ - m_debuggerAgent->cancelPauseOnNextStatement(); -} - -void V8InspectorSessionImpl::breakProgram(const String16& breakReason, const String16& breakDetails) -{ - m_debuggerAgent->breakProgram(breakReason, protocol::DictionaryValue::cast(parseJSON(breakDetails))); -} - -void V8InspectorSessionImpl::setSkipAllPauses(bool skip) -{ - ErrorString errorString; - m_debuggerAgent->setSkipAllPauses(&errorString, skip); -} - -void V8InspectorSessionImpl::resume() -{ - ErrorString errorString; - m_debuggerAgent->resume(&errorString); -} - -void V8InspectorSessionImpl::stepOver() -{ - ErrorString errorString; - m_debuggerAgent->stepOver(&errorString); -} - -std::unique_ptr> V8InspectorSessionImpl::searchInTextByLines(const String16& text, const String16& query, bool caseSensitive, bool isRegex) -{ - std::vector> matches = searchInTextByLinesImpl(this, text, query, caseSensitive, isRegex); - std::unique_ptr> result = protocol::Array::create(); - for (size_t i = 0; i < matches.size(); ++i) - result->addItem(std::move(matches[i])); - return result; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.h deleted file mode 100644 index 18164b7daf0215..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InspectorSessionImpl.h +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8InspectorSessionImpl_h -#define V8InspectorSessionImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Runtime.h" -#include "platform/v8_inspector/protocol/Schema.h" -#include "platform/v8_inspector/public/V8InspectorSession.h" - -#include - -#include - -namespace v8_inspector { - -class InjectedScript; -class RemoteObjectIdBase; -class V8ConsoleAgentImpl; -class V8DebuggerAgentImpl; -class V8InspectorImpl; -class V8HeapProfilerAgentImpl; -class V8ProfilerAgentImpl; -class V8RuntimeAgentImpl; -class V8SchemaAgentImpl; - -namespace protocol = blink::protocol; - -class V8InspectorSessionImpl : public V8InspectorSession { - PROTOCOL_DISALLOW_COPY(V8InspectorSessionImpl); -public: - static std::unique_ptr create(V8InspectorImpl*, int contextGroupId, protocol::FrontendChannel*, const String16* state); - ~V8InspectorSessionImpl(); - - V8InspectorImpl* inspector() const { return m_inspector; } - V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); } - V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); } - V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); } - V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); } - V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); } - int contextGroupId() const { return m_contextGroupId; } - - InjectedScript* findInjectedScript(ErrorString*, int contextId); - InjectedScript* findInjectedScript(ErrorString*, RemoteObjectIdBase*); - void reset(); - void discardInjectedScripts(); - void reportAllContexts(V8RuntimeAgentImpl*); - void setCustomObjectFormatterEnabled(bool); - std::unique_ptr wrapObject(v8::Local, v8::Local, const String16& groupName, bool generatePreview); - std::unique_ptr wrapTable(v8::Local, v8::Local table, v8::Local columns); - std::vector> supportedDomainsImpl(); - - // V8InspectorSession implementation. - void dispatchProtocolMessage(const String16& message) override; - String16 stateJSON() override; - std::unique_ptr> supportedDomains() override; - void addInspectedObject(std::unique_ptr) override; - void schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails) override; - void cancelPauseOnNextStatement() override; - void breakProgram(const String16& breakReason, const String16& breakDetails) override; - void setSkipAllPauses(bool) override; - void resume() override; - void stepOver() override; - std::unique_ptr> searchInTextByLines(const String16& text, const String16& query, bool caseSensitive, bool isRegex) override; - void releaseObjectGroup(const String16& objectGroup) override; - bool unwrapObject(ErrorString*, const String16& objectId, v8::Local*, v8::Local*, String16* objectGroup) override; - std::unique_ptr wrapObject(v8::Local, v8::Local, const String16& groupName) override; - - V8InspectorSession::Inspectable* inspectedObject(unsigned num); - static const unsigned kInspectedObjectBufferSize = 5; - -private: - V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, protocol::FrontendChannel*, const String16* state); - protocol::DictionaryValue* agentState(const String16& name); - - int m_contextGroupId; - V8InspectorImpl* m_inspector; - bool m_customObjectFormatterEnabled; - - protocol::UberDispatcher m_dispatcher; - std::unique_ptr m_state; - - std::unique_ptr m_runtimeAgent; - std::unique_ptr m_debuggerAgent; - std::unique_ptr m_heapProfilerAgent; - std::unique_ptr m_profilerAgent; - std::unique_ptr m_consoleAgent; - std::unique_ptr m_schemaAgent; - std::vector> m_inspectedObjects; -}; - -} // namespace v8_inspector - -#endif diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.cpp deleted file mode 100644 index 652de5982abb7e..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8InternalValueType.h" - -#include "platform/v8_inspector/V8StringUtil.h" - -namespace v8_inspector { - -namespace { - -v8::Local internalSubtypePrivate(v8::Isolate* isolate) -{ - return v8::Private::ForApi(isolate, toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); -} - -v8::Local subtypeForInternalType(v8::Isolate* isolate, V8InternalValueType type) -{ - switch (type) { - case V8InternalValueType::kEntry: - return toV8StringInternalized(isolate, "internal#entry"); - case V8InternalValueType::kLocation: - return toV8StringInternalized(isolate, "internal#location"); - case V8InternalValueType::kScope: - return toV8StringInternalized(isolate, "internal#scope"); - case V8InternalValueType::kScopeList: - return toV8StringInternalized(isolate, "internal#scopeList"); - } - NOTREACHED(); - return v8::Local(); -} - -} // namespace - -bool markAsInternal(v8::Local context, v8::Local object, V8InternalValueType type) -{ - v8::Isolate* isolate = context->GetIsolate(); - v8::Local privateValue = internalSubtypePrivate(isolate); - v8::Local subtype = subtypeForInternalType(isolate, type); - return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); -} - -bool markArrayEntriesAsInternal(v8::Local context, v8::Local array, V8InternalValueType type) -{ - v8::Isolate* isolate = context->GetIsolate(); - v8::Local privateValue = internalSubtypePrivate(isolate); - v8::Local subtype = subtypeForInternalType(isolate, type); - for (size_t i = 0; i < array->Length(); ++i) { - v8::Local entry; - if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) - return false; - if (!entry.As()->SetPrivate(context, privateValue, subtype).FromMaybe(false)) - return false; - } - return true; -} - -v8::Local v8InternalValueTypeFrom(v8::Local context, v8::Local object) -{ - v8::Isolate* isolate = context->GetIsolate(); - v8::Local privateValue = internalSubtypePrivate(isolate); - if (!object->HasPrivate(context, privateValue).FromMaybe(false)) - return v8::Null(isolate); - v8::Local subtypeValue; - if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || !subtypeValue->IsString()) - return v8::Null(isolate); - return subtypeValue; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.h deleted file mode 100644 index 8655fea51d2100..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8InternalValueType.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8InternalValueType_h -#define V8InternalValueType_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -namespace v8_inspector { - -enum class V8InternalValueType { kEntry, kLocation, kScope, kScopeList }; - -bool markAsInternal(v8::Local, v8::Local, V8InternalValueType); -bool markArrayEntriesAsInternal(v8::Local, v8::Local, V8InternalValueType); -v8::Local v8InternalValueTypeFrom(v8::Local, v8::Local); - - -} // namespace v8_inspector - -#endif // V8InternalValueType_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.cpp deleted file mode 100644 index 3385c7ed07b408..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.cpp +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8ProfilerAgentImpl.h" - -#include "platform/v8_inspector/Atomics.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include - -#include - -#define ENSURE_V8_VERSION(major, minor) \ - (V8_MAJOR_VERSION * 1000 + V8_MINOR_VERSION >= (major) * 1000 + (minor)) - -namespace v8_inspector { - -namespace ProfilerAgentState { -static const char samplingInterval[] = "samplingInterval"; -static const char userInitiatedProfiling[] = "userInitiatedProfiling"; -static const char profilerEnabled[] = "profilerEnabled"; -} - -namespace { - -std::unique_ptr> buildInspectorObjectForPositionTicks(const v8::CpuProfileNode* node) -{ - unsigned lineCount = node->GetHitLineCount(); - if (!lineCount) - return nullptr; - auto array = protocol::Array::create(); - std::vector entries(lineCount); - if (node->GetLineTicks(&entries[0], lineCount)) { - for (unsigned i = 0; i < lineCount; i++) { - std::unique_ptr line = protocol::Profiler::PositionTickInfo::create() - .setLine(entries[i].line) - .setTicks(entries[i].hit_count).build(); - array->addItem(std::move(line)); - } - } - return array; -} - -std::unique_ptr buildInspectorObjectFor(v8::Isolate* isolate, const v8::CpuProfileNode* node) -{ - v8::HandleScope handleScope(isolate); - auto callFrame = protocol::Runtime::CallFrame::create() - .setFunctionName(toProtocolString(node->GetFunctionName())) - .setScriptId(String16::fromInteger(node->GetScriptId())) - .setUrl(toProtocolString(node->GetScriptResourceName())) - .setLineNumber(node->GetLineNumber() - 1) - .setColumnNumber(node->GetColumnNumber() - 1) - .build(); - auto result = protocol::Profiler::CPUProfileNode::create() - .setCallFrame(std::move(callFrame)) - .setHitCount(node->GetHitCount()) - .setId(node->GetNodeId()).build(); - - const int childrenCount = node->GetChildrenCount(); - if (childrenCount) { - auto children = protocol::Array::create(); - for (int i = 0; i < childrenCount; i++) - children->addItem(node->GetChild(i)->GetNodeId()); - result->setChildren(std::move(children)); - } - - const char* deoptReason = node->GetBailoutReason(); - if (deoptReason && deoptReason[0] && strcmp(deoptReason, "no reason")) - result->setDeoptReason(deoptReason); - - auto positionTicks = buildInspectorObjectForPositionTicks(node); - if (positionTicks) - result->setPositionTicks(std::move(positionTicks)); - - return result; -} - -std::unique_ptr> buildInspectorObjectForSamples(v8::CpuProfile* v8profile) -{ - auto array = protocol::Array::create(); - int count = v8profile->GetSamplesCount(); - for (int i = 0; i < count; i++) - array->addItem(v8profile->GetSample(i)->GetNodeId()); - return array; -} - -std::unique_ptr> buildInspectorObjectForTimestamps(v8::CpuProfile* v8profile) -{ - auto array = protocol::Array::create(); - int count = v8profile->GetSamplesCount(); - uint64_t lastTime = v8profile->GetStartTime(); - for (int i = 0; i < count; i++) { - uint64_t ts = v8profile->GetSampleTimestamp(i); - array->addItem(static_cast(ts - lastTime)); - lastTime = ts; - } - return array; -} - -void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, protocol::Array* list) -{ - list->addItem(buildInspectorObjectFor(isolate, node)); - const int childrenCount = node->GetChildrenCount(); - for (int i = 0; i < childrenCount; i++) - flattenNodesTree(isolate, node->GetChild(i), list); -} - -std::unique_ptr createCPUProfile(v8::Isolate* isolate, v8::CpuProfile* v8profile) -{ - auto nodes = protocol::Array::create(); - flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get()); - - auto profile = protocol::Profiler::CPUProfile::create() - .setNodes(std::move(nodes)) - .setStartTime(static_cast(v8profile->GetStartTime())) - .setEndTime(static_cast(v8profile->GetEndTime())).build(); - profile->setSamples(buildInspectorObjectForSamples(v8profile)); - profile->setTimestampDeltas(buildInspectorObjectForTimestamps(v8profile)); - return profile; -} - -std::unique_ptr currentDebugLocation(V8InspectorImpl* inspector) -{ - std::unique_ptr callStack = inspector->captureStackTrace(1); - auto location = protocol::Debugger::Location::create() - .setScriptId(callStack->topScriptId()) - .setLineNumber(callStack->topLineNumber()).build(); - location->setColumnNumber(callStack->topColumnNumber()); - return location; -} - -volatile int s_lastProfileId = 0; - -} // namespace - -class V8ProfilerAgentImpl::ProfileDescriptor { -public: - ProfileDescriptor(const String16& id, const String16& title) - : m_id(id) - , m_title(title) { } - String16 m_id; - String16 m_title; -}; - -V8ProfilerAgentImpl::V8ProfilerAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) - : m_session(session) - , m_isolate(m_session->inspector()->isolate()) - , m_profiler(nullptr) - , m_state(state) - , m_frontend(frontendChannel) - , m_enabled(false) - , m_recordingCPUProfile(false) -{ -} - -V8ProfilerAgentImpl::~V8ProfilerAgentImpl() -{ -#if ENSURE_V8_VERSION(5, 4) - if (m_profiler) - m_profiler->Dispose(); -#endif -} - -void V8ProfilerAgentImpl::consoleProfile(const String16& title) -{ - if (!m_enabled) - return; - String16 id = nextProfileId(); - m_startedProfiles.push_back(ProfileDescriptor(id, title)); - startProfiling(id); - m_frontend.consoleProfileStarted(id, currentDebugLocation(m_session->inspector()), title); -} - -void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) -{ - if (!m_enabled) - return; - String16 id; - String16 resolvedTitle; - // Take last started profile if no title was passed. - if (title.isEmpty()) { - if (m_startedProfiles.empty()) - return; - id = m_startedProfiles.back().m_id; - resolvedTitle = m_startedProfiles.back().m_title; - m_startedProfiles.pop_back(); - } else { - for (size_t i = 0; i < m_startedProfiles.size(); i++) { - if (m_startedProfiles[i].m_title == title) { - resolvedTitle = title; - id = m_startedProfiles[i].m_id; - m_startedProfiles.erase(m_startedProfiles.begin() + i); - break; - } - } - if (id.isEmpty()) - return; - } - std::unique_ptr profile = stopProfiling(id, true); - if (!profile) - return; - std::unique_ptr location = currentDebugLocation(m_session->inspector()); - m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile), resolvedTitle); -} - -void V8ProfilerAgentImpl::enable(ErrorString*) -{ - if (m_enabled) - return; - m_enabled = true; -#if ENSURE_V8_VERSION(5, 4) - DCHECK(!m_profiler); - m_profiler = v8::CpuProfiler::New(m_isolate); -#endif - m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); -} - -void V8ProfilerAgentImpl::disable(ErrorString* errorString) -{ - if (!m_enabled) - return; - for (size_t i = m_startedProfiles.size(); i > 0; --i) - stopProfiling(m_startedProfiles[i - 1].m_id, false); - m_startedProfiles.clear(); - stop(nullptr, nullptr); -#if ENSURE_V8_VERSION(5, 4) - m_profiler->Dispose(); - m_profiler = nullptr; -#endif - m_enabled = false; - m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); -} - -void V8ProfilerAgentImpl::setSamplingInterval(ErrorString* error, int interval) -{ - if (m_recordingCPUProfile) { - *error = "Cannot change sampling interval when profiling."; - return; - } - m_state->setInteger(ProfilerAgentState::samplingInterval, interval); - profiler()->SetSamplingInterval(interval); -} - -void V8ProfilerAgentImpl::restore() -{ - DCHECK(!m_enabled); - if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) - return; - m_enabled = true; -#if ENSURE_V8_VERSION(5, 4) - DCHECK(!m_profiler); - m_profiler = v8::CpuProfiler::New(m_isolate); -#endif - int interval = 0; - m_state->getInteger(ProfilerAgentState::samplingInterval, &interval); - if (interval) - profiler()->SetSamplingInterval(interval); - if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, false)) { - ErrorString error; - start(&error); - } -} - -void V8ProfilerAgentImpl::start(ErrorString* error) -{ - if (m_recordingCPUProfile) - return; - if (!m_enabled) { - *error = "Profiler is not enabled"; - return; - } - m_recordingCPUProfile = true; - m_frontendInitiatedProfileId = nextProfileId(); - startProfiling(m_frontendInitiatedProfileId); - m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); -} - -void V8ProfilerAgentImpl::stop(ErrorString* errorString, std::unique_ptr* profile) -{ - if (!m_recordingCPUProfile) { - if (errorString) - *errorString = "No recording profiles found"; - return; - } - m_recordingCPUProfile = false; - std::unique_ptr cpuProfile = stopProfiling(m_frontendInitiatedProfileId, !!profile); - if (profile) { - *profile = std::move(cpuProfile); - if (!profile->get() && errorString) - *errorString = "Profile is not found"; - } - m_frontendInitiatedProfileId = String16(); - m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); -} - -String16 V8ProfilerAgentImpl::nextProfileId() -{ - return String16::fromInteger(atomicIncrement(&s_lastProfileId)); -} - -void V8ProfilerAgentImpl::startProfiling(const String16& title) -{ - v8::HandleScope handleScope(m_isolate); - profiler()->StartProfiling(toV8String(m_isolate, title), true); -} - -std::unique_ptr V8ProfilerAgentImpl::stopProfiling(const String16& title, bool serialize) -{ - v8::HandleScope handleScope(m_isolate); - v8::CpuProfile* profile = profiler()->StopProfiling(toV8String(m_isolate, title)); - if (!profile) - return nullptr; - std::unique_ptr result; - if (serialize) - result = createCPUProfile(m_isolate, profile); - profile->Delete(); - return result; -} - -bool V8ProfilerAgentImpl::isRecording() const -{ - return m_recordingCPUProfile || !m_startedProfiles.empty(); -} - -v8::CpuProfiler* V8ProfilerAgentImpl::profiler() -{ -#if ENSURE_V8_VERSION(5, 4) - return m_profiler; -#else - return m_isolate->GetCpuProfiler(); -#endif -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.h deleted file mode 100644 index b6513fde058194..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ProfilerAgentImpl.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8ProfilerAgentImpl_h -#define V8ProfilerAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Profiler.h" - -#include - -namespace v8 { -class CpuProfiler; -class Isolate; -} - -namespace v8_inspector { - -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; - -class V8ProfilerAgentImpl : public protocol::Profiler::Backend { - PROTOCOL_DISALLOW_COPY(V8ProfilerAgentImpl); -public: - V8ProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8ProfilerAgentImpl() override; - - bool enabled() const { return m_enabled; } - void restore(); - - void enable(ErrorString*) override; - void disable(ErrorString*) override; - void setSamplingInterval(ErrorString*, int) override; - void start(ErrorString*) override; - void stop(ErrorString*, std::unique_ptr*) override; - - void consoleProfile(const String16& title); - void consoleProfileEnd(const String16& title); - -private: - String16 nextProfileId(); - v8::CpuProfiler* profiler(); - - void startProfiling(const String16& title); - std::unique_ptr stopProfiling(const String16& title, bool serialize); - - bool isRecording() const; - - V8InspectorSessionImpl* m_session; - v8::Isolate* m_isolate; - v8::CpuProfiler* m_profiler; - protocol::DictionaryValue* m_state; - protocol::Profiler::Frontend m_frontend; - bool m_enabled; - bool m_recordingCPUProfile; - class ProfileDescriptor; - std::vector m_startedProfiles; - String16 m_frontendInitiatedProfileId; -}; - -} // namespace v8_inspector - -#endif // !defined(V8ProfilerAgentImpl_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.cpp deleted file mode 100644 index e8c8db2e4ddee4..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8Regex.h" - -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -#include - -namespace v8_inspector { - -V8Regex::V8Regex(V8InspectorImpl* inspector, const String16& pattern, bool caseSensitive, bool multiline) - : m_inspector(inspector) -{ - v8::Isolate* isolate = m_inspector->isolate(); - v8::HandleScope handleScope(isolate); - v8::Local context = m_inspector->regexContext(); - v8::Context::Scope contextScope(context); - v8::TryCatch tryCatch(isolate); - - unsigned flags = v8::RegExp::kNone; - if (!caseSensitive) - flags |= v8::RegExp::kIgnoreCase; - if (multiline) - flags |= v8::RegExp::kMultiline; - - v8::Local regex; - if (v8::RegExp::New(context, toV8String(isolate, pattern), static_cast(flags)).ToLocal(®ex)) - m_regex.Reset(isolate, regex); - else if (tryCatch.HasCaught()) - m_errorMessage = toProtocolString(tryCatch.Message()->Get()); - else - m_errorMessage = "Internal error"; -} - -int V8Regex::match(const String16& string, int startFrom, int* matchLength) const -{ - if (matchLength) - *matchLength = 0; - - if (m_regex.IsEmpty() || string.isEmpty()) - return -1; - - // v8 strings are limited to int. - if (string.length() > INT_MAX) - return -1; - - v8::Isolate* isolate = m_inspector->isolate(); - v8::HandleScope handleScope(isolate); - v8::Local context = m_inspector->regexContext(); - v8::MicrotasksScope microtasks(isolate, v8::MicrotasksScope::kDoNotRunMicrotasks); - v8::TryCatch tryCatch(isolate); - - v8::Local regex = m_regex.Get(isolate); - v8::Local exec; - if (!regex->Get(context, toV8StringInternalized(isolate, "exec")).ToLocal(&exec)) - return -1; - v8::Local argv[] = { toV8String(isolate, string.substring(startFrom)) }; - v8::Local returnValue; - if (!exec.As()->Call(context, regex, PROTOCOL_ARRAY_LENGTH(argv), argv).ToLocal(&returnValue)) - return -1; - - // RegExp#exec returns null if there's no match, otherwise it returns an - // Array of strings with the first being the whole match string and others - // being subgroups. The Array also has some random properties tacked on like - // "index" which is the offset of the match. - // - // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec - - DCHECK(!returnValue.IsEmpty()); - if (!returnValue->IsArray()) - return -1; - - v8::Local result = returnValue.As(); - v8::Local matchOffset; - if (!result->Get(context, toV8StringInternalized(isolate, "index")).ToLocal(&matchOffset)) - return -1; - if (matchLength) { - v8::Local match; - if (!result->Get(context, 0).ToLocal(&match)) - return -1; - *matchLength = match.As()->Length(); - } - - return matchOffset.As()->Value() + startFrom; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.h deleted file mode 100644 index b1b09c7e55ab60..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8Regex.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8Regex_h -#define V8Regex_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include - -namespace v8_inspector { - -class V8InspectorImpl; - -enum MultilineMode { - MultilineDisabled, - MultilineEnabled -}; - -class V8Regex { - PROTOCOL_DISALLOW_COPY(V8Regex); -public: - V8Regex(V8InspectorImpl*, const String16&, bool caseSensitive, bool multiline = false); - int match(const String16&, int startFrom = 0, int* matchLength = 0) const; - bool isValid() const { return !m_regex.IsEmpty(); } - const String16& errorMessage() const { return m_errorMessage; } - -private: - V8InspectorImpl* m_inspector; - v8::Global m_regex; - String16 m_errorMessage; -}; - -} // namespace v8_inspector - -#endif // V8Regex_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.cpp deleted file mode 100644 index c5a0449c1497d2..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.cpp +++ /dev/null @@ -1,687 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "platform/v8_inspector/V8RuntimeAgentImpl.h" - -#include "platform/v8_inspector/InjectedScript.h" -#include "platform/v8_inspector/InspectedContext.h" -#include "platform/v8_inspector/RemoteObjectId.h" -#include "platform/v8_inspector/V8Compat.h" -#include "platform/v8_inspector/V8ConsoleMessage.h" -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8DebuggerAgentImpl.h" -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8StackTraceImpl.h" -#include "platform/v8_inspector/V8StringUtil.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" - -namespace v8_inspector { - -namespace V8RuntimeAgentImplState { -static const char customObjectFormatterEnabled[] = "customObjectFormatterEnabled"; -static const char runtimeEnabled[] = "runtimeEnabled"; -}; - -using protocol::Runtime::RemoteObject; - -static bool hasInternalError(ErrorString* errorString, bool hasError) -{ - if (hasError) - *errorString = "Internal error"; - return hasError; -} - -namespace { - -template -class ProtocolPromiseHandler { -public: - static void add(V8InspectorImpl* inspector, v8::Local context, v8::MaybeLocal value, const String16& notPromiseError, int contextGroupId, int executionContextId, const String16& objectGroup, bool returnByValue, bool generatePreview, std::unique_ptr callback) - { - if (value.IsEmpty()) { - callback->sendFailure("Internal error"); - return; - } - if (!value.ToLocalChecked()->IsPromise()) { - callback->sendFailure(notPromiseError); - return; - } - v8::Local promise = v8::Local::Cast(value.ToLocalChecked()); - Callback* rawCallback = callback.get(); - ProtocolPromiseHandler* handler = new ProtocolPromiseHandler(inspector, contextGroupId, executionContextId, objectGroup, returnByValue, generatePreview, std::move(callback)); - v8::Local wrapper = handler->m_wrapper.Get(inspector->isolate()); - - v8::Local thenCallbackFunction = V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, thenCallback, wrapper, 0).ToLocalChecked(); - if (promise->Then(context, thenCallbackFunction).IsEmpty()) { - rawCallback->sendFailure("Internal error"); - return; - } - v8::Local catchCallbackFunction = V8_FUNCTION_NEW_REMOVE_PROTOTYPE(context, catchCallback, wrapper, 0).ToLocalChecked(); - if (promise->Catch(context, catchCallbackFunction).IsEmpty()) { - rawCallback->sendFailure("Internal error"); - return; - } - } -private: - static void thenCallback(const v8::FunctionCallbackInfo& info) - { - ProtocolPromiseHandler* handler = static_cast*>(info.Data().As()->Value()); - DCHECK(handler); - v8::Local value = info.Length() > 0 ? info[0] : v8::Local::Cast(v8::Undefined(info.GetIsolate())); - handler->m_callback->sendSuccess(handler->wrapObject(value), Maybe()); - } - - static void catchCallback(const v8::FunctionCallbackInfo& info) - { - ProtocolPromiseHandler* handler = static_cast*>(info.Data().As()->Value()); - DCHECK(handler); - v8::Local value = info.Length() > 0 ? info[0] : v8::Local::Cast(v8::Undefined(info.GetIsolate())); - - std::unique_ptr stack = handler->m_inspector->debugger()->captureStackTrace(true); - std::unique_ptr exceptionDetails = protocol::Runtime::ExceptionDetails::create() - .setExceptionId(handler->m_inspector->nextExceptionId()) - .setText("Uncaught (in promise)") - .setLineNumber(stack && !stack->isEmpty() ? stack->topLineNumber() : 0) - .setColumnNumber(stack && !stack->isEmpty() ? stack->topColumnNumber() : 0) - .setException(handler->wrapObject(value)) - .build(); - if (stack) - exceptionDetails->setStackTrace(stack->buildInspectorObjectImpl()); - if (stack && !stack->isEmpty()) - exceptionDetails->setScriptId(stack->topScriptId()); - handler->m_callback->sendSuccess(handler->wrapObject(value), std::move(exceptionDetails)); - } - - ProtocolPromiseHandler(V8InspectorImpl* inspector, int contextGroupId, int executionContextId, const String16& objectGroup, bool returnByValue, bool generatePreview, std::unique_ptr callback) - : m_inspector(inspector) - , m_contextGroupId(contextGroupId) - , m_executionContextId(executionContextId) - , m_objectGroup(objectGroup) - , m_returnByValue(returnByValue) - , m_generatePreview(generatePreview) - , m_callback(std::move(callback)) - , m_wrapper(inspector->isolate(), v8::External::New(inspector->isolate(), this)) - { - m_wrapper.SetWeak(this, cleanup, v8::WeakCallbackType::kParameter); - } - - static void cleanup(const v8::WeakCallbackInfo>& data) - { - if (!data.GetParameter()->m_wrapper.IsEmpty()) { - data.GetParameter()->m_wrapper.Reset(); - data.SetSecondPassCallback(cleanup); - } else { - data.GetParameter()->m_callback->sendFailure("Promise was collected"); - delete data.GetParameter(); - } - } - - std::unique_ptr wrapObject(v8::Local value) - { - ErrorString errorString; - InjectedScript::ContextScope scope(&errorString, m_inspector, m_contextGroupId, m_executionContextId); - if (!scope.initialize()) { - m_callback->sendFailure(errorString); - return nullptr; - } - std::unique_ptr wrappedValue = scope.injectedScript()->wrapObject(&errorString, value, m_objectGroup, m_returnByValue, m_generatePreview); - if (!wrappedValue) { - m_callback->sendFailure(errorString); - return nullptr; - } - return wrappedValue; - } - - V8InspectorImpl* m_inspector; - int m_contextGroupId; - int m_executionContextId; - String16 m_objectGroup; - bool m_returnByValue; - bool m_generatePreview; - std::unique_ptr m_callback; - v8::Global m_wrapper; -}; - -template -bool wrapEvaluateResultAsync(InjectedScript* injectedScript, v8::MaybeLocal maybeResultValue, const v8::TryCatch& tryCatch, const String16& objectGroup, bool returnByValue, bool generatePreview, Callback* callback) -{ - std::unique_ptr result; - Maybe exceptionDetails; - - ErrorString errorString; - injectedScript->wrapEvaluateResult(&errorString, - maybeResultValue, - tryCatch, - objectGroup, - returnByValue, - generatePreview, - &result, - &exceptionDetails); - if (errorString.isEmpty()) { - callback->sendSuccess(std::move(result), exceptionDetails); - return true; - } - callback->sendFailure(errorString); - return false; -} - -int ensureContext(ErrorString* errorString, V8InspectorImpl* inspector, int contextGroupId, const Maybe& executionContextId) -{ - int contextId; - if (executionContextId.isJust()) { - contextId = executionContextId.fromJust(); - } else { - v8::HandleScope handles(inspector->isolate()); - v8::Local defaultContext = inspector->client()->ensureDefaultContextInGroup(contextGroupId); - if (defaultContext.IsEmpty()) { - *errorString = "Cannot find default execution context"; - return 0; - } - contextId = V8Debugger::contextId(defaultContext); - } - return contextId; -} - -} // namespace - -V8RuntimeAgentImpl::V8RuntimeAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* FrontendChannel, protocol::DictionaryValue* state) - : m_session(session) - , m_state(state) - , m_frontend(FrontendChannel) - , m_inspector(session->inspector()) - , m_enabled(false) -{ -} - -V8RuntimeAgentImpl::~V8RuntimeAgentImpl() -{ -} - -void V8RuntimeAgentImpl::evaluate( - const String16& expression, - const Maybe& objectGroup, - const Maybe& includeCommandLineAPI, - const Maybe& silent, - const Maybe& executionContextId, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& userGesture, - const Maybe& awaitPromise, - std::unique_ptr callback) -{ - ErrorString errorString; - int contextId = ensureContext(&errorString, m_inspector, m_session->contextGroupId(), executionContextId); - if (!errorString.isEmpty()) { - callback->sendFailure(errorString); - return; - } - - InjectedScript::ContextScope scope(&errorString, m_inspector, m_session->contextGroupId(), contextId); - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - if (silent.fromMaybe(false)) - scope.ignoreExceptionsAndMuteConsole(); - if (userGesture.fromMaybe(false)) - scope.pretendUserGesture(); - - if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) { - callback->sendFailure(errorString); - return; - } - - bool evalIsDisabled = !scope.context()->IsCodeGenerationFromStringsAllowed(); - // Temporarily enable allow evals for inspector. - if (evalIsDisabled) - scope.context()->AllowCodeGenerationFromStrings(true); - - v8::MaybeLocal maybeResultValue; - v8::Local script = m_inspector->compileScript(scope.context(), toV8String(m_inspector->isolate(), expression), String16(), false); - if (!script.IsEmpty()) - maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); - - if (evalIsDisabled) - scope.context()->AllowCodeGenerationFromStrings(false); - - // Re-initialize after running client's code, as it could have destroyed context or session. - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { - wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, scope.tryCatch(), objectGroup.fromMaybe(""), returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), callback.get()); - return; - } - ProtocolPromiseHandler::add( - m_inspector, - scope.context(), - maybeResultValue, - "Result of the evaluation is not a promise", - m_session->contextGroupId(), - scope.injectedScript()->context()->contextId(), - objectGroup.fromMaybe(""), - returnByValue.fromMaybe(false), - generatePreview.fromMaybe(false), - std::move(callback)); -} - -void V8RuntimeAgentImpl::awaitPromise( - const String16& promiseObjectId, - const Maybe& returnByValue, - const Maybe& generatePreview, - std::unique_ptr callback) -{ - ErrorString errorString; - InjectedScript::ObjectScope scope(&errorString, m_inspector, m_session->contextGroupId(), promiseObjectId); - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - ProtocolPromiseHandler::add( - m_inspector, - scope.context(), - scope.object(), - "Could not find promise with given id", - m_session->contextGroupId(), - scope.injectedScript()->context()->contextId(), - scope.objectGroupName(), - returnByValue.fromMaybe(false), - generatePreview.fromMaybe(false), - std::move(callback)); -} - -void V8RuntimeAgentImpl::callFunctionOn( - const String16& objectId, - const String16& expression, - const Maybe>& optionalArguments, - const Maybe& silent, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& userGesture, - const Maybe& awaitPromise, - std::unique_ptr callback) -{ - ErrorString errorString; - InjectedScript::ObjectScope scope(&errorString, m_inspector, m_session->contextGroupId(), objectId); - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - std::unique_ptr[]> argv = nullptr; - int argc = 0; - if (optionalArguments.isJust()) { - protocol::Array* arguments = optionalArguments.fromJust(); - argc = arguments->length(); - argv.reset(new v8::Local[argc]); - for (int i = 0; i < argc; ++i) { - v8::Local argumentValue; - if (!scope.injectedScript()->resolveCallArgument(&errorString, arguments->get(i)).ToLocal(&argumentValue)) { - callback->sendFailure(errorString); - return; - } - argv[i] = argumentValue; - } - } - - if (silent.fromMaybe(false)) - scope.ignoreExceptionsAndMuteConsole(); - if (userGesture.fromMaybe(false)) - scope.pretendUserGesture(); - - v8::MaybeLocal maybeFunctionValue = m_inspector->compileAndRunInternalScript(scope.context(), toV8String(m_inspector->isolate(), "(" + expression + ")")); - // Re-initialize after running client's code, as it could have destroyed context or session. - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - if (scope.tryCatch().HasCaught()) { - wrapEvaluateResultAsync(scope.injectedScript(), maybeFunctionValue, scope.tryCatch(), scope.objectGroupName(), false, false, callback.get()); - return; - } - - v8::Local functionValue; - if (!maybeFunctionValue.ToLocal(&functionValue) || !functionValue->IsFunction()) { - callback->sendFailure("Given expression does not evaluate to a function"); - return; - } - - v8::MaybeLocal maybeResultValue = m_inspector->callFunction(functionValue.As(), scope.context(), scope.object(), argc, argv.get()); - // Re-initialize after running client's code, as it could have destroyed context or session. - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { - wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, scope.tryCatch(), scope.objectGroupName(), returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), callback.get()); - return; - } - - ProtocolPromiseHandler::add( - m_inspector, - scope.context(), - maybeResultValue, - "Result of the function call is not a promise", - m_session->contextGroupId(), - scope.injectedScript()->context()->contextId(), - scope.objectGroupName(), - returnByValue.fromMaybe(false), - generatePreview.fromMaybe(false), - std::move(callback)); -} - -void V8RuntimeAgentImpl::getProperties( - ErrorString* errorString, - const String16& objectId, - const Maybe& ownProperties, - const Maybe& accessorPropertiesOnly, - const Maybe& generatePreview, - std::unique_ptr>* result, - Maybe>* internalProperties, - Maybe* exceptionDetails) -{ - using protocol::Runtime::InternalPropertyDescriptor; - - InjectedScript::ObjectScope scope(errorString, m_inspector, m_session->contextGroupId(), objectId); - if (!scope.initialize()) - return; - - scope.ignoreExceptionsAndMuteConsole(); - if (!scope.object()->IsObject()) { - *errorString = "Value with given id is not an object"; - return; - } - - v8::Local object = scope.object().As(); - scope.injectedScript()->getProperties(errorString, object, scope.objectGroupName(), ownProperties.fromMaybe(false), accessorPropertiesOnly.fromMaybe(false), generatePreview.fromMaybe(false), result, exceptionDetails); - if (!errorString->isEmpty() || exceptionDetails->isJust() || accessorPropertiesOnly.fromMaybe(false)) - return; - v8::Local propertiesArray; - if (hasInternalError(errorString, !m_inspector->debugger()->internalProperties(scope.context(), scope.object()).ToLocal(&propertiesArray))) - return; - std::unique_ptr> propertiesProtocolArray = protocol::Array::create(); - for (uint32_t i = 0; i < propertiesArray->Length(); i += 2) { - v8::Local name; - if (hasInternalError(errorString, !propertiesArray->Get(scope.context(), i).ToLocal(&name)) || !name->IsString()) - return; - v8::Local value; - if (hasInternalError(errorString, !propertiesArray->Get(scope.context(), i + 1).ToLocal(&value))) - return; - std::unique_ptr wrappedValue = scope.injectedScript()->wrapObject(errorString, value, scope.objectGroupName()); - if (!wrappedValue) - return; - propertiesProtocolArray->addItem(InternalPropertyDescriptor::create() - .setName(toProtocolString(name.As())) - .setValue(std::move(wrappedValue)).build()); - } - if (!propertiesProtocolArray->length()) - return; - *internalProperties = std::move(propertiesProtocolArray); -} - -void V8RuntimeAgentImpl::releaseObject(ErrorString* errorString, const String16& objectId) -{ - InjectedScript::ObjectScope scope(errorString, m_inspector, m_session->contextGroupId(), objectId); - if (!scope.initialize()) - return; - scope.injectedScript()->releaseObject(objectId); -} - -void V8RuntimeAgentImpl::releaseObjectGroup(ErrorString*, const String16& objectGroup) -{ - m_session->releaseObjectGroup(objectGroup); -} - -void V8RuntimeAgentImpl::runIfWaitingForDebugger(ErrorString* errorString) -{ - m_inspector->client()->runIfWaitingForDebugger(m_session->contextGroupId()); -} - -void V8RuntimeAgentImpl::setCustomObjectFormatterEnabled(ErrorString*, bool enabled) -{ - m_state->setBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled, enabled); - m_session->setCustomObjectFormatterEnabled(enabled); -} - -void V8RuntimeAgentImpl::discardConsoleEntries(ErrorString*) -{ - V8ConsoleMessageStorage* storage = m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); - storage->clear(); -} - -void V8RuntimeAgentImpl::compileScript(ErrorString* errorString, - const String16& expression, - const String16& sourceURL, - bool persistScript, - const Maybe& executionContextId, - Maybe* scriptId, - Maybe* exceptionDetails) -{ - if (!m_enabled) { - *errorString = "Runtime agent is not enabled"; - return; - } - int contextId = ensureContext(errorString, m_inspector, m_session->contextGroupId(), executionContextId); - if (!errorString->isEmpty()) - return; - InjectedScript::ContextScope scope(errorString, m_inspector, m_session->contextGroupId(), contextId); - if (!scope.initialize()) - return; - - if (!persistScript) - m_inspector->debugger()->muteScriptParsedEvents(); - v8::Local script = m_inspector->compileScript(scope.context(), toV8String(m_inspector->isolate(), expression), sourceURL, false); - if (!persistScript) - m_inspector->debugger()->unmuteScriptParsedEvents(); - if (script.IsEmpty()) { - if (scope.tryCatch().HasCaught()) - *exceptionDetails = scope.injectedScript()->createExceptionDetails(errorString, scope.tryCatch(), String16(), false); - else - *errorString = "Script compilation failed"; - return; - } - - if (!persistScript) - return; - - String16 scriptValueId = String16::fromInteger(script->GetUnboundScript()->GetId()); - std::unique_ptr> global(new v8::Global(m_inspector->isolate(), script)); - m_compiledScripts[scriptValueId] = std::move(global); - *scriptId = scriptValueId; -} - -void V8RuntimeAgentImpl::runScript( - const String16& scriptId, - const Maybe& executionContextId, - const Maybe& objectGroup, - const Maybe& silent, - const Maybe& includeCommandLineAPI, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& awaitPromise, - std::unique_ptr callback) -{ - if (!m_enabled) { - callback->sendFailure("Runtime agent is not enabled"); - return; - } - - auto it = m_compiledScripts.find(scriptId); - if (it == m_compiledScripts.end()) { - callback->sendFailure("No script with given id"); - return; - } - - ErrorString errorString; - int contextId = ensureContext(&errorString, m_inspector, m_session->contextGroupId(), executionContextId); - if (!errorString.isEmpty()) { - callback->sendFailure(errorString); - return; - } - - InjectedScript::ContextScope scope(&errorString, m_inspector, m_session->contextGroupId(), contextId); - if (!scope.initialize()) { - callback->sendFailure(errorString); - return; - } - - if (silent.fromMaybe(false)) - scope.ignoreExceptionsAndMuteConsole(); - - std::unique_ptr> scriptWrapper = std::move(it->second); - m_compiledScripts.erase(it); - v8::Local script = scriptWrapper->Get(m_inspector->isolate()); - if (script.IsEmpty()) { - callback->sendFailure("Script execution failed"); - return; - } - - if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) - return; - - v8::MaybeLocal maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); - - // Re-initialize after running client's code, as it could have destroyed context or session. - if (!scope.initialize()) - return; - - if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { - wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, scope.tryCatch(), objectGroup.fromMaybe(""), returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), callback.get()); - return; - } - ProtocolPromiseHandler::add( - m_inspector, - scope.context(), - maybeResultValue.ToLocalChecked(), - "Result of the script execution is not a promise", - m_session->contextGroupId(), - scope.injectedScript()->context()->contextId(), - objectGroup.fromMaybe(""), - returnByValue.fromMaybe(false), - generatePreview.fromMaybe(false), - std::move(callback)); -} - -void V8RuntimeAgentImpl::restore() -{ - if (!m_state->booleanProperty(V8RuntimeAgentImplState::runtimeEnabled, false)) - return; - m_frontend.executionContextsCleared(); - ErrorString error; - enable(&error); - if (m_state->booleanProperty(V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) - m_session->setCustomObjectFormatterEnabled(true); -} - -void V8RuntimeAgentImpl::enable(ErrorString* errorString) -{ - if (m_enabled) - return; - m_inspector->client()->beginEnsureAllContextsInGroup(m_session->contextGroupId()); - m_enabled = true; - m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true); - m_inspector->enableStackCapturingIfNeeded(); - m_session->reportAllContexts(this); - V8ConsoleMessageStorage* storage = m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); - for (const auto& message : storage->messages()) - reportMessage(message.get(), false); -} - -void V8RuntimeAgentImpl::disable(ErrorString* errorString) -{ - if (!m_enabled) - return; - m_enabled = false; - m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, false); - m_inspector->disableStackCapturingIfNeeded(); - m_session->discardInjectedScripts(); - reset(); - m_inspector->client()->endEnsureAllContextsInGroup(m_session->contextGroupId()); -} - -void V8RuntimeAgentImpl::reset() -{ - m_compiledScripts.clear(); - if (m_enabled) { - if (const V8InspectorImpl::ContextByIdMap* contexts = m_inspector->contextGroup(m_session->contextGroupId())) { - for (auto& idContext : *contexts) - idContext.second->setReported(false); - } - m_frontend.executionContextsCleared(); - } -} - -void V8RuntimeAgentImpl::reportExecutionContextCreated(InspectedContext* context) -{ - if (!m_enabled) - return; - context->setReported(true); - std::unique_ptr description = protocol::Runtime::ExecutionContextDescription::create() - .setId(context->contextId()) - .setName(context->humanReadableName()) - .setOrigin(context->origin()).build(); - if (!context->auxData().isEmpty()) - description->setAuxData(protocol::DictionaryValue::cast(parseJSON(context->auxData()))); - m_frontend.executionContextCreated(std::move(description)); -} - -void V8RuntimeAgentImpl::reportExecutionContextDestroyed(InspectedContext* context) -{ - if (m_enabled && context->isReported()) { - context->setReported(false); - m_frontend.executionContextDestroyed(context->contextId()); - } -} - -void V8RuntimeAgentImpl::inspect(std::unique_ptr objectToInspect, std::unique_ptr hints) -{ - if (m_enabled) - m_frontend.inspectRequested(std::move(objectToInspect), std::move(hints)); -} - -void V8RuntimeAgentImpl::messageAdded(V8ConsoleMessage* message) -{ - if (m_enabled) - reportMessage(message, true); -} - -void V8RuntimeAgentImpl::reportMessage(V8ConsoleMessage* message, bool generatePreview) -{ - message->reportToFrontend(&m_frontend, m_session, generatePreview); - m_frontend.flush(); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.h deleted file mode 100644 index d08a0b63311a83..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8RuntimeAgentImpl.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef V8RuntimeAgentImpl_h -#define V8RuntimeAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Runtime.h" - -#include - -namespace v8_inspector { - -class InjectedScript; -class InspectedContext; -class RemoteObjectIdBase; -class V8ConsoleMessage; -class V8InspectorImpl; -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; -using blink::protocol::Maybe; - -class V8RuntimeAgentImpl : public protocol::Runtime::Backend { - PROTOCOL_DISALLOW_COPY(V8RuntimeAgentImpl); -public: - V8RuntimeAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8RuntimeAgentImpl() override; - void restore(); - - // Part of the protocol. - void enable(ErrorString*) override; - void disable(ErrorString*) override; - void evaluate( - const String16& expression, - const Maybe& objectGroup, - const Maybe& includeCommandLineAPI, - const Maybe& silent, - const Maybe& executionContextId, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& userGesture, - const Maybe& awaitPromise, - std::unique_ptr) override; - void awaitPromise( - const String16& promiseObjectId, - const Maybe& returnByValue, - const Maybe& generatePreview, - std::unique_ptr) override; - void callFunctionOn( - const String16& objectId, - const String16& expression, - const Maybe>& optionalArguments, - const Maybe& silent, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& userGesture, - const Maybe& awaitPromise, - std::unique_ptr) override; - void releaseObject(ErrorString*, const String16& objectId) override; - void getProperties(ErrorString*, - const String16& objectId, - const Maybe& ownProperties, - const Maybe& accessorPropertiesOnly, - const Maybe& generatePreview, - std::unique_ptr>* result, - Maybe>* internalProperties, - Maybe*) override; - void releaseObjectGroup(ErrorString*, const String16& objectGroup) override; - void runIfWaitingForDebugger(ErrorString*) override; - void setCustomObjectFormatterEnabled(ErrorString*, bool) override; - void discardConsoleEntries(ErrorString*) override; - void compileScript(ErrorString*, - const String16& expression, - const String16& sourceURL, - bool persistScript, - const Maybe& executionContextId, - Maybe*, - Maybe*) override; - void runScript( - const String16&, - const Maybe& executionContextId, - const Maybe& objectGroup, - const Maybe& silent, - const Maybe& includeCommandLineAPI, - const Maybe& returnByValue, - const Maybe& generatePreview, - const Maybe& awaitPromise, - std::unique_ptr) override; - - void reset(); - void reportExecutionContextCreated(InspectedContext*); - void reportExecutionContextDestroyed(InspectedContext*); - void inspect(std::unique_ptr objectToInspect, std::unique_ptr hints); - void messageAdded(V8ConsoleMessage*); - bool enabled() const { return m_enabled; } - -private: - void reportMessage(V8ConsoleMessage*, bool generatePreview); - - V8InspectorSessionImpl* m_session; - protocol::DictionaryValue* m_state; - protocol::Runtime::Frontend m_frontend; - V8InspectorImpl* m_inspector; - bool m_enabled; - protocol::HashMap>> m_compiledScripts; -}; - -} // namespace v8_inspector - -#endif // V8RuntimeAgentImpl_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.cpp deleted file mode 100644 index c43120f66c1f34..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8SchemaAgentImpl.h" - -#include "platform/v8_inspector/V8InspectorSessionImpl.h" - -namespace v8_inspector { - -V8SchemaAgentImpl::V8SchemaAgentImpl(V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) - : m_session(session) - , m_frontend(frontendChannel) -{ -} - -V8SchemaAgentImpl::~V8SchemaAgentImpl() -{ -} - -void V8SchemaAgentImpl::getDomains(ErrorString*, std::unique_ptr>* result) -{ - std::vector> domains = m_session->supportedDomainsImpl(); - *result = protocol::Array::create(); - for (size_t i = 0; i < domains.size(); ++i) - (*result)->addItem(std::move(domains[i])); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.h deleted file mode 100644 index 9838af6ce910fa..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8SchemaAgentImpl.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8SchemaAgentImpl_h -#define V8SchemaAgentImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Schema.h" - -namespace v8_inspector { - -class V8InspectorSessionImpl; - -namespace protocol = blink::protocol; - -class V8SchemaAgentImpl : public protocol::Schema::Backend { - PROTOCOL_DISALLOW_COPY(V8SchemaAgentImpl); -public: - V8SchemaAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); - ~V8SchemaAgentImpl() override; - - void getDomains(ErrorString*, std::unique_ptr>*) override; - -private: - V8InspectorSessionImpl* m_session; - protocol::Schema::Frontend m_frontend; -}; - -} // namespace v8_inspector - - -#endif // !defined(V8SchemaAgentImpl_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.cpp deleted file mode 100644 index e0bab17d89084f..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.cpp +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8StackTraceImpl.h" - -#include "platform/v8_inspector/V8Debugger.h" -#include "platform/v8_inspector/V8StringUtil.h" - -#include -#include -#include - -namespace v8_inspector { - -namespace { - -static const v8::StackTrace::StackTraceOptions stackTraceOptions = static_cast( - v8::StackTrace::kLineNumber | - v8::StackTrace::kColumnOffset | - v8::StackTrace::kScriptId | - v8::StackTrace::kScriptNameOrSourceURL | - v8::StackTrace::kFunctionName); - -V8StackTraceImpl::Frame toFrame(v8::Local frame) -{ - String16 scriptId = String16::fromInteger(frame->GetScriptId()); - String16 sourceName; - v8::Local sourceNameValue(frame->GetScriptNameOrSourceURL()); - if (!sourceNameValue.IsEmpty()) - sourceName = toProtocolString(sourceNameValue); - - String16 functionName; - v8::Local functionNameValue(frame->GetFunctionName()); - if (!functionNameValue.IsEmpty()) - functionName = toProtocolString(functionNameValue); - - int sourceLineNumber = frame->GetLineNumber(); - int sourceColumn = frame->GetColumn(); - return V8StackTraceImpl::Frame(functionName, scriptId, sourceName, sourceLineNumber, sourceColumn); -} - -void toFramesVector(v8::Local stackTrace, std::vector& frames, size_t maxStackSize, v8::Isolate* isolate) -{ - DCHECK(isolate->InContext()); - int frameCount = stackTrace->GetFrameCount(); - if (frameCount > static_cast(maxStackSize)) - frameCount = maxStackSize; - for (int i = 0; i < frameCount; i++) { - v8::Local stackFrame = stackTrace->GetFrame(i); - frames.push_back(toFrame(stackFrame)); - } -} - -} // namespace - -V8StackTraceImpl::Frame::Frame() - : m_functionName("undefined") - , m_scriptId("") - , m_scriptName("undefined") - , m_lineNumber(0) - , m_columnNumber(0) -{ -} - -V8StackTraceImpl::Frame::Frame(const String16& functionName, const String16& scriptId, const String16& scriptName, int lineNumber, int column) - : m_functionName(functionName) - , m_scriptId(scriptId) - , m_scriptName(scriptName) - , m_lineNumber(lineNumber) - , m_columnNumber(column) -{ - DCHECK(m_lineNumber != v8::Message::kNoLineNumberInfo); - DCHECK(m_columnNumber != v8::Message::kNoColumnInfo); -} - -V8StackTraceImpl::Frame::~Frame() -{ -} - -// buildInspectorObject() and SourceLocation's toTracedValue() should set the same fields. -// If either of them is modified, the other should be also modified. -std::unique_ptr V8StackTraceImpl::Frame::buildInspectorObject() const -{ - return protocol::Runtime::CallFrame::create() - .setFunctionName(m_functionName) - .setScriptId(m_scriptId) - .setUrl(m_scriptName) - .setLineNumber(m_lineNumber - 1) - .setColumnNumber(m_columnNumber - 1) - .build(); -} - -V8StackTraceImpl::Frame V8StackTraceImpl::Frame::clone() const -{ - return Frame(m_functionName.isolatedCopy(), m_scriptId.isolatedCopy(), m_scriptName.isolatedCopy(), m_lineNumber, m_columnNumber); -} - -// static -void V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(v8::Isolate* isolate, bool capture) -{ - isolate->SetCaptureStackTraceForUncaughtExceptions(capture, V8StackTraceImpl::maxCallStackSizeToCapture, stackTraceOptions); -} - -// static -std::unique_ptr V8StackTraceImpl::create(V8Debugger* debugger, int contextGroupId, v8::Local stackTrace, size_t maxStackSize, const String16& description) -{ - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::HandleScope scope(isolate); - std::vector frames; - if (!stackTrace.IsEmpty()) - toFramesVector(stackTrace, frames, maxStackSize, isolate); - - int maxAsyncCallChainDepth = 1; - V8StackTraceImpl* asyncCallChain = nullptr; - if (debugger && maxStackSize > 1) { - asyncCallChain = debugger->currentAsyncCallChain(); - maxAsyncCallChainDepth = debugger->maxAsyncCallChainDepth(); - } - // Do not accidentally append async call chain from another group. This should not - // happen if we have proper instrumentation, but let's double-check to be safe. - if (contextGroupId && asyncCallChain && asyncCallChain->m_contextGroupId && asyncCallChain->m_contextGroupId != contextGroupId) { - asyncCallChain = nullptr; - maxAsyncCallChainDepth = 1; - } - - // Only the top stack in the chain may be empty, so ensure that second stack is non-empty (it's the top of appended chain). - if (asyncCallChain && asyncCallChain->isEmpty()) - asyncCallChain = asyncCallChain->m_parent.get(); - - if (stackTrace.IsEmpty() && !asyncCallChain) - return nullptr; - - std::unique_ptr result(new V8StackTraceImpl(contextGroupId, description, frames, asyncCallChain ? asyncCallChain->cloneImpl() : nullptr)); - - // Crop to not exceed maxAsyncCallChainDepth. - V8StackTraceImpl* deepest = result.get(); - while (deepest && maxAsyncCallChainDepth) { - deepest = deepest->m_parent.get(); - maxAsyncCallChainDepth--; - } - if (deepest) - deepest->m_parent.reset(); - - return result; -} - -std::unique_ptr V8StackTraceImpl::capture(V8Debugger* debugger, int contextGroupId, size_t maxStackSize, const String16& description) -{ - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::HandleScope handleScope(isolate); - v8::Local stackTrace; - if (isolate->InContext()) { -#if V8_MAJOR_VERSION >= 5 - isolate->GetCpuProfiler()->CollectSample(); -#endif - stackTrace = v8::StackTrace::CurrentStackTrace(isolate, maxStackSize, stackTraceOptions); - } - return V8StackTraceImpl::create(debugger, contextGroupId, stackTrace, maxStackSize, description); -} - -std::unique_ptr V8StackTraceImpl::cloneImpl() -{ - std::vector framesCopy(m_frames); - return wrapUnique(new V8StackTraceImpl(m_contextGroupId, m_description, framesCopy, m_parent ? m_parent->cloneImpl() : nullptr)); -} - -std::unique_ptr V8StackTraceImpl::clone() -{ - std::vector frames; - for (size_t i = 0; i < m_frames.size(); i++) - frames.push_back(m_frames.at(i).clone()); - return wrapUnique(new V8StackTraceImpl(m_contextGroupId, m_description.isolatedCopy(), frames, nullptr)); -} - -V8StackTraceImpl::V8StackTraceImpl(int contextGroupId, const String16& description, std::vector& frames, std::unique_ptr parent) - : m_contextGroupId(contextGroupId) - , m_description(description) - , m_parent(std::move(parent)) -{ - m_frames.swap(frames); -} - -V8StackTraceImpl::~V8StackTraceImpl() -{ -} - -String16 V8StackTraceImpl::topSourceURL() const -{ - DCHECK(m_frames.size()); - return m_frames[0].m_scriptName; -} - -int V8StackTraceImpl::topLineNumber() const -{ - DCHECK(m_frames.size()); - return m_frames[0].m_lineNumber; -} - -int V8StackTraceImpl::topColumnNumber() const -{ - DCHECK(m_frames.size()); - return m_frames[0].m_columnNumber; -} - -String16 V8StackTraceImpl::topFunctionName() const -{ - DCHECK(m_frames.size()); - return m_frames[0].m_functionName; -} - -String16 V8StackTraceImpl::topScriptId() const -{ - DCHECK(m_frames.size()); - return m_frames[0].m_scriptId; -} - -std::unique_ptr V8StackTraceImpl::buildInspectorObjectImpl() const -{ - std::unique_ptr> frames = protocol::Array::create(); - for (size_t i = 0; i < m_frames.size(); i++) - frames->addItem(m_frames.at(i).buildInspectorObject()); - - std::unique_ptr stackTrace = protocol::Runtime::StackTrace::create() - .setCallFrames(std::move(frames)).build(); - if (!m_description.isEmpty()) - stackTrace->setDescription(m_description); - if (m_parent) - stackTrace->setParent(m_parent->buildInspectorObjectImpl()); - return stackTrace; -} - -std::unique_ptr V8StackTraceImpl::buildInspectorObjectForTail(V8Debugger* debugger) const -{ - v8::HandleScope handleScope(v8::Isolate::GetCurrent()); - // Next call collapses possible empty stack and ensures maxAsyncCallChainDepth. - std::unique_ptr fullChain = V8StackTraceImpl::create(debugger, m_contextGroupId, v8::Local(), V8StackTraceImpl::maxCallStackSizeToCapture); - if (!fullChain || !fullChain->m_parent) - return nullptr; - return fullChain->m_parent->buildInspectorObjectImpl(); -} - -std::unique_ptr V8StackTraceImpl::buildInspectorObject() const -{ - return buildInspectorObjectImpl(); -} - -String16 V8StackTraceImpl::toString() const -{ - String16Builder stackTrace; - for (size_t i = 0; i < m_frames.size(); ++i) { - const Frame& frame = m_frames[i]; - stackTrace.append("\n at " + (frame.functionName().length() ? frame.functionName() : "(anonymous function)")); - stackTrace.append(" ("); - stackTrace.append(frame.sourceURL()); - stackTrace.append(':'); - stackTrace.append(String16::fromInteger(frame.lineNumber())); - stackTrace.append(':'); - stackTrace.append(String16::fromInteger(frame.columnNumber())); - stackTrace.append(')'); - } - return stackTrace.toString(); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.h deleted file mode 100644 index 25ad3ab09d6120..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StackTraceImpl.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8StackTraceImpl_h -#define V8StackTraceImpl_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Runtime.h" -#include "platform/v8_inspector/public/V8StackTrace.h" - -#include - -namespace v8_inspector { - -class TracedValue; -class V8Debugger; - -namespace protocol = blink::protocol; - -// Note: async stack trace may have empty top stack with non-empty tail to indicate -// that current native-only state had some async story. -// On the other hand, any non-top async stack is guaranteed to be non-empty. -class V8StackTraceImpl final : public V8StackTrace { - PROTOCOL_DISALLOW_COPY(V8StackTraceImpl); -public: - static const size_t maxCallStackSizeToCapture = 200; - - class Frame { - public: - Frame(); - Frame(const String16& functionName, const String16& scriptId, const String16& scriptName, int lineNumber, int column = 0); - ~Frame(); - - const String16& functionName() const { return m_functionName; } - const String16& scriptId() const { return m_scriptId; } - const String16& sourceURL() const { return m_scriptName; } - int lineNumber() const { return m_lineNumber; } - int columnNumber() const { return m_columnNumber; } - Frame clone() const; - - private: - friend class V8StackTraceImpl; - std::unique_ptr buildInspectorObject() const; - void toTracedValue(TracedValue*) const; - - String16 m_functionName; - String16 m_scriptId; - String16 m_scriptName; - int m_lineNumber; - int m_columnNumber; - }; - - static void setCaptureStackTraceForUncaughtExceptions(v8::Isolate*, bool capture); - static std::unique_ptr create(V8Debugger*, int contextGroupId, v8::Local, size_t maxStackSize, const String16& description = String16()); - static std::unique_ptr capture(V8Debugger*, int contextGroupId, size_t maxStackSize, const String16& description = String16()); - - // This method drops the async chain. Use cloneImpl() instead. - std::unique_ptr clone() override; - std::unique_ptr cloneImpl(); - std::unique_ptr buildInspectorObjectForTail(V8Debugger*) const; - std::unique_ptr buildInspectorObjectImpl() const; - ~V8StackTraceImpl() override; - - // V8StackTrace implementation. - bool isEmpty() const override { return !m_frames.size(); }; - String16 topSourceURL() const override; - int topLineNumber() const override; - int topColumnNumber() const override; - String16 topScriptId() const override; - String16 topFunctionName() const override; - std::unique_ptr buildInspectorObject() const override; - String16 toString() const override; - -private: - V8StackTraceImpl(int contextGroupId, const String16& description, std::vector& frames, std::unique_ptr parent); - - int m_contextGroupId; - String16 m_description; - std::vector m_frames; - std::unique_ptr m_parent; -}; - -} // namespace v8_inspector - -#endif // V8StackTraceImpl_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.cpp deleted file mode 100644 index d078da6a0e3b75..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.cpp +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8StringUtil.h" - -#include "platform/v8_inspector/V8InspectorImpl.h" -#include "platform/v8_inspector/V8InspectorSessionImpl.h" -#include "platform/v8_inspector/V8Regex.h" - -namespace v8_inspector { - -namespace { - -String16 findMagicComment(const String16& content, const String16& name, bool multiline) -{ - DCHECK(name.find("=") == String16::kNotFound); - unsigned length = content.length(); - unsigned nameLength = name.length(); - - size_t pos = length; - size_t equalSignPos = 0; - size_t closingCommentPos = 0; - while (true) { - pos = content.reverseFind(name, pos); - if (pos == String16::kNotFound) - return String16(); - - // Check for a /\/[\/*][@#][ \t]/ regexp (length of 4) before found name. - if (pos < 4) - return String16(); - pos -= 4; - if (content[pos] != '/') - continue; - if ((content[pos + 1] != '/' || multiline) - && (content[pos + 1] != '*' || !multiline)) - continue; - if (content[pos + 2] != '#' && content[pos + 2] != '@') - continue; - if (content[pos + 3] != ' ' && content[pos + 3] != '\t') - continue; - equalSignPos = pos + 4 + nameLength; - if (equalSignPos < length && content[equalSignPos] != '=') - continue; - if (multiline) { - closingCommentPos = content.find("*/", equalSignPos + 1); - if (closingCommentPos == String16::kNotFound) - return String16(); - } - - break; - } - - DCHECK(equalSignPos); - DCHECK(!multiline || closingCommentPos); - size_t urlPos = equalSignPos + 1; - String16 match = multiline - ? content.substring(urlPos, closingCommentPos - urlPos) - : content.substring(urlPos); - - size_t newLine = match.find("\n"); - if (newLine != String16::kNotFound) - match = match.substring(0, newLine); - match = match.stripWhiteSpace(); - - for (unsigned i = 0; i < match.length(); ++i) { - UChar c = match[i]; - if (c == '"' || c == '\'' || c == ' ' || c == '\t') - return ""; - } - - return match; -} - -String16 createSearchRegexSource(const String16& text) -{ - String16Builder result; - - for (unsigned i = 0; i < text.length(); i++) { - UChar c = text[i]; - if (c == '[' || c == ']' || c == '(' || c == ')' || c == '{' || c == '}' - || c == '+' || c == '-' || c == '*' || c == '.' || c == ',' || c == '?' - || c == '\\' || c == '^' || c == '$' || c == '|') { - result.append('\\'); - } - result.append(text[i]); - } - - return result.toString(); -} - -std::unique_ptr> lineEndings(const String16& text) -{ - std::unique_ptr> result(new std::vector()); - - const String16 lineEndString = "\n"; - unsigned start = 0; - while (start < text.length()) { - size_t lineEnd = text.find(lineEndString, start); - if (lineEnd == String16::kNotFound) - break; - - result->push_back(static_cast(lineEnd)); - start = lineEnd + 1; - } - result->push_back(text.length()); - - return result; -} - -std::vector> scriptRegexpMatchesByLines(const V8Regex& regex, const String16& text) -{ - std::vector> result; - if (text.isEmpty()) - return result; - - std::unique_ptr> endings(lineEndings(text)); - unsigned size = endings->size(); - unsigned start = 0; - for (unsigned lineNumber = 0; lineNumber < size; ++lineNumber) { - unsigned lineEnd = endings->at(lineNumber); - String16 line = text.substring(start, lineEnd - start); - if (line.length() && line[line.length() - 1] == '\r') - line = line.substring(0, line.length() - 1); - - int matchLength; - if (regex.match(line, 0, &matchLength) != -1) - result.push_back(std::pair(lineNumber, line)); - - start = lineEnd + 1; - } - return result; -} - -std::unique_ptr buildObjectForSearchMatch(int lineNumber, const String16& lineContent) -{ - return protocol::Debugger::SearchMatch::create() - .setLineNumber(lineNumber) - .setLineContent(lineContent) - .build(); -} - -std::unique_ptr createSearchRegex(V8InspectorImpl* inspector, const String16& query, bool caseSensitive, bool isRegex) -{ - String16 regexSource = isRegex ? query : createSearchRegexSource(query); - return wrapUnique(new V8Regex(inspector, regexSource, caseSensitive)); -} - -} // namespace - -v8::Local toV8String(v8::Isolate* isolate, const String16& string) -{ - if (string.isEmpty()) - return v8::String::Empty(isolate); - return v8::String::NewFromTwoByte(isolate, reinterpret_cast(string.characters16()), v8::NewStringType::kNormal, string.length()).ToLocalChecked(); -} - -v8::Local toV8StringInternalized(v8::Isolate* isolate, const String16& string) -{ - if (string.isEmpty()) - return v8::String::Empty(isolate); - return v8::String::NewFromTwoByte(isolate, reinterpret_cast(string.characters16()), v8::NewStringType::kInternalized, string.length()).ToLocalChecked(); -} - -v8::Local toV8StringInternalized(v8::Isolate* isolate, const char* str) -{ - return v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kInternalized).ToLocalChecked(); -} - -String16 toProtocolString(v8::Local value) -{ - if (value.IsEmpty() || value->IsNull() || value->IsUndefined()) - return String16(); - std::unique_ptr buffer(new UChar[value->Length()]); - value->Write(reinterpret_cast(buffer.get()), 0, value->Length()); - return String16(buffer.get(), value->Length()); -} - -String16 toProtocolStringWithTypeCheck(v8::Local value) -{ - if (value.IsEmpty() || !value->IsString()) - return String16(); - return toProtocolString(value.As()); -} - -std::vector> searchInTextByLinesImpl(V8InspectorSession* session, const String16& text, const String16& query, const bool caseSensitive, const bool isRegex) -{ - std::unique_ptr regex = createSearchRegex(static_cast(session)->inspector(), query, caseSensitive, isRegex); - std::vector> matches = scriptRegexpMatchesByLines(*regex.get(), text); - - std::vector> result; - for (const auto& match : matches) - result.push_back(buildObjectForSearchMatch(match.first, match.second)); - return result; -} - -String16 findSourceURL(const String16& content, bool multiline) -{ - return findMagicComment(content, "sourceURL", multiline); -} - -String16 findSourceMapURL(const String16& content, bool multiline) -{ - return findMagicComment(content, "sourceMappingURL", multiline); -} - -std::unique_ptr toProtocolValue(v8::Local context, v8::Local value, int maxDepth) -{ - if (value.IsEmpty()) { - NOTREACHED(); - return nullptr; - } - - if (!maxDepth) - return nullptr; - maxDepth--; - - if (value->IsNull() || value->IsUndefined()) - return protocol::Value::null(); - if (value->IsBoolean()) - return protocol::FundamentalValue::create(value.As()->Value()); - if (value->IsNumber()) { - double doubleValue = value.As()->Value(); - int intValue = static_cast(doubleValue); - if (intValue == doubleValue) - return protocol::FundamentalValue::create(intValue); - return protocol::FundamentalValue::create(doubleValue); - } - if (value->IsString()) - return protocol::StringValue::create(toProtocolString(value.As())); - if (value->IsArray()) { - v8::Local array = value.As(); - std::unique_ptr inspectorArray = protocol::ListValue::create(); - uint32_t length = array->Length(); - for (uint32_t i = 0; i < length; i++) { - v8::Local value; - if (!array->Get(context, i).ToLocal(&value)) - return nullptr; - std::unique_ptr element = toProtocolValue(context, value, maxDepth); - if (!element) - return nullptr; - inspectorArray->pushValue(std::move(element)); - } - return std::move(inspectorArray); - } - if (value->IsObject()) { - std::unique_ptr jsonObject = protocol::DictionaryValue::create(); - v8::Local object = v8::Local::Cast(value); - v8::Local propertyNames; - if (!object->GetPropertyNames(context).ToLocal(&propertyNames)) - return nullptr; - uint32_t length = propertyNames->Length(); - for (uint32_t i = 0; i < length; i++) { - v8::Local name; - if (!propertyNames->Get(context, i).ToLocal(&name)) - return nullptr; - // FIXME(yurys): v8::Object should support GetOwnPropertyNames - if (name->IsString()) { - v8::Maybe hasRealNamedProperty = object->HasRealNamedProperty(context, v8::Local::Cast(name)); - if (!hasRealNamedProperty.IsJust() || !hasRealNamedProperty.FromJust()) - continue; - } - v8::Local propertyName; - if (!name->ToString(context).ToLocal(&propertyName)) - continue; - v8::Local property; - if (!object->Get(context, name).ToLocal(&property)) - return nullptr; - std::unique_ptr propertyValue = toProtocolValue(context, property, maxDepth); - if (!propertyValue) - return nullptr; - jsonObject->setValue(toProtocolString(propertyName), std::move(propertyValue)); - } - return std::move(jsonObject); - } - NOTREACHED(); - return nullptr; -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.h deleted file mode 100644 index 2245c8fed6a941..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8StringUtil.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8StringUtil_h -#define V8StringUtil_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/protocol/Debugger.h" -#include - -namespace v8_inspector { - -class V8InspectorSession; - -namespace protocol = blink::protocol; - -std::unique_ptr toProtocolValue(v8::Local, v8::Local, int maxDepth = protocol::Value::maxDepth); - -v8::Local toV8String(v8::Isolate*, const String16&); -v8::Local toV8StringInternalized(v8::Isolate*, const String16&); -v8::Local toV8StringInternalized(v8::Isolate*, const char*); - -String16 toProtocolString(v8::Local); -String16 toProtocolStringWithTypeCheck(v8::Local); - -String16 findSourceURL(const String16& content, bool multiline); -String16 findSourceMapURL(const String16& content, bool multiline); -std::vector> searchInTextByLinesImpl(V8InspectorSession*, const String16& text, const String16& query, bool caseSensitive, bool isRegex); - -} // namespace v8_inspector - - -#endif // !defined(V8StringUtil_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.cpp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.cpp deleted file mode 100644 index 3347abeba5929a..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "platform/v8_inspector/V8ValueCopier.h" - -namespace v8_inspector { - -namespace { - -static int kMaxDepth = 20; -static int kMaxCalls = 1000; - -class V8ValueCopier { -public: - v8::MaybeLocal copy(v8::Local value, int depth) - { - if (++m_calls > kMaxCalls || depth > kMaxDepth) - return v8::MaybeLocal(); - - if (value.IsEmpty()) - return v8::MaybeLocal(); - if (value->IsNull() || value->IsUndefined() || value->IsBoolean() || value->IsString() || value->IsNumber()) - return value; - if (!value->IsObject()) - return v8::MaybeLocal(); - v8::Local object = value.As(); - if (object->CreationContext() != m_from) - return value; - - if (object->IsArray()) { - v8::Local array = object.As(); - v8::Local result = v8::Array::New(m_isolate, array->Length()); - if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) - return v8::MaybeLocal(); - for (size_t i = 0; i < array->Length(); ++i) { - v8::Local item; - if (!array->Get(m_from, i).ToLocal(&item)) - return v8::MaybeLocal(); - v8::Local copied; - if (!copy(item, depth + 1).ToLocal(&copied)) - return v8::MaybeLocal(); - if (!result->Set(m_to, i, copied).FromMaybe(false)) - return v8::MaybeLocal(); - } - return result; - } - - - v8::Local result = v8::Object::New(m_isolate); - if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) - return v8::MaybeLocal(); - v8::Local properties; - if (!object->GetOwnPropertyNames(m_from).ToLocal(&properties)) - return v8::MaybeLocal(); - for (size_t i = 0; i < properties->Length(); ++i) { - v8::Local name; - if (!properties->Get(m_from, i).ToLocal(&name) || !name->IsString()) - return v8::MaybeLocal(); - v8::Local property; - if (!object->Get(m_from, name).ToLocal(&property)) - return v8::MaybeLocal(); - v8::Local copied; - if (!copy(property, depth + 1).ToLocal(&copied)) - return v8::MaybeLocal(); - if (!result->Set(m_to, name, copied).FromMaybe(false)) - return v8::MaybeLocal(); - } - return result; - } - - v8::Isolate* m_isolate; - v8::Local m_from; - v8::Local m_to; - int m_calls; -}; - -} // namespace - -v8::MaybeLocal copyValueFromDebuggerContext(v8::Isolate* isolate, v8::Local debuggerContext, v8::Local toContext, v8::Local value) -{ - V8ValueCopier copier; - copier.m_isolate = isolate; - copier.m_from = debuggerContext; - copier.m_to = toContext; - copier.m_calls = 0; - return copier.copy(value, 0); -} - -} // namespace v8_inspector diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.h deleted file mode 100644 index 9cd650cc80168b..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/V8ValueCopier.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8ValueCopier_h -#define V8ValueCopier_h - -#include - -namespace v8_inspector { - -v8::MaybeLocal copyValueFromDebuggerContext(v8::Isolate*, v8::Local debuggerContext, v8::Local toContext, v8::Local); - -} // namespace v8_inspector - -#endif // !defined(V8ValueCopier_h) diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config.json b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config.json deleted file mode 100644 index 512a1db7ef8d2c..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "protocol": { - "path": "js_protocol.json", - "package": "platform/v8_inspector/protocol", - "output": "v8_inspector/protocol" - }, - - "exported": { - "package": "platform/v8_inspector/public/protocol", - "output": "v8_inspector/public/protocol" - }, - - "string": { - "class_name": "String16" - }, - - "lib": { - "output": "inspector_protocol", - "string16_header": "platform/v8_inspector/String16WTF.h", - "platform_header": "platform/v8_inspector/PlatformWTF.h" - }, - - "lib_package": "platform/inspector_protocol", - - "class_export": { - "macro": "PLATFORM_EXPORT", - "header": "platform/PlatformExport.h" - } -} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config_stl.json b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config_stl.json deleted file mode 100644 index 1c5ee878cc2bdf..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/inspector_protocol_config_stl.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "protocol": { - "path": "js_protocol.json", - "package": "platform/v8_inspector/protocol", - "output": "v8_inspector/protocol" - }, - - "exported": { - "package": "platform/v8_inspector/public/protocol", - "output": "v8_inspector/public/protocol" - }, - - "string": { - "class_name": "String16" - }, - - "lib": { - "output": "inspector_protocol", - "string16_header": "platform/v8_inspector/String16STL.h", - "platform_header": "platform/v8_inspector/PlatformSTL.h" - }, - - "lib_package": "platform/inspector_protocol", - - "class_export": { - "macro": "PLATFORM_EXPORT", - "header": "platform/PlatformExport.h" - } -} diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/js_protocol-1.1.json b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/js_protocol-1.1.json deleted file mode 100644 index 8961f3bbd2321e..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/js_protocol-1.1.json +++ /dev/null @@ -1,1866 +0,0 @@ -{ - "domains": [ - { - "domain": "Runtime", - "description": "Runtime domain exposes JavaScript runtime by means of remote evaluation and mirror objects. Evaluation results are returned as mirror object that expose object type, string representation and unique identifier that can be used for further object reference. Original objects are maintained in memory unless they are either explicitly released or are released along with the other objects in their object group.", - "types": [ - { - "id": "RemoteObjectId", - "type": "string", - "description": "Unique object identifier." - }, - { - "id": "RemoteObject", - "type": "object", - "description": "Mirror object referencing original JavaScript object.", - "properties": [ - { - "name": "type", - "type": "string", - "enum": [ - "object", - "function", - "undefined", - "string", - "number", - "boolean" - ], - "description": "Object type." - }, - { - "name": "subtype", - "type": "string", - "optional": true, - "enum": [ - "array", - "null", - "node", - "regexp", - "date" - ], - "description": "Object subtype hint. Specified for object type values only." - }, - { - "name": "className", - "type": "string", - "optional": true, - "description": "Object class (constructor) name. Specified for object type values only." - }, - { - "name": "value", - "type": "any", - "optional": true, - "description": "Remote object value (in case of primitive values or JSON values if it was requested)." - }, - { - "name": "description", - "type": "string", - "optional": true, - "description": "String representation of the object." - }, - { - "name": "objectId", - "$ref": "RemoteObjectId", - "optional": true, - "description": "Unique object identifier (for non-primitive values)." - }, - { - "name": "preview", - "$ref": "ObjectPreview", - "optional": true, - "description": "Preview containing abbreviated property values.", - "hidden": true - } - ] - }, - { - "id": "ObjectPreview", - "type": "object", - "hidden": true, - "description": "Object containing abbreviated remote object value.", - "properties": [ - { - "name": "lossless", - "type": "boolean", - "description": "Determines whether preview is lossless (contains all information of the original object)." - }, - { - "name": "overflow", - "type": "boolean", - "description": "True iff some of the properties of the original did not fit." - }, - { - "name": "properties", - "type": "array", - "items": { - "$ref": "PropertyPreview" - }, - "description": "List of the properties." - } - ] - }, - { - "id": "PropertyPreview", - "type": "object", - "hidden": true, - "properties": [ - { - "name": "name", - "type": "string", - "description": "Property name." - }, - { - "name": "type", - "type": "string", - "enum": [ - "object", - "function", - "undefined", - "string", - "number", - "boolean" - ], - "description": "Object type." - }, - { - "name": "value", - "type": "string", - "optional": true, - "description": "User-friendly property value string." - }, - { - "name": "valuePreview", - "$ref": "ObjectPreview", - "optional": true, - "description": "Nested value preview." - }, - { - "name": "subtype", - "type": "string", - "optional": true, - "enum": [ - "array", - "null", - "node", - "regexp", - "date" - ], - "description": "Object subtype hint. Specified for object type values only." - } - ] - }, - { - "id": "PropertyDescriptor", - "type": "object", - "description": "Object property descriptor.", - "properties": [ - { - "name": "name", - "type": "string", - "description": "Property name." - }, - { - "name": "value", - "$ref": "RemoteObject", - "optional": true, - "description": "The value associated with the property." - }, - { - "name": "writable", - "type": "boolean", - "optional": true, - "description": "True if the value associated with the property may be changed (data descriptors only)." - }, - { - "name": "get", - "$ref": "RemoteObject", - "optional": true, - "description": "A function which serves as a getter for the property, or undefined if there is no getter (accessor descriptors only)." - }, - { - "name": "set", - "$ref": "RemoteObject", - "optional": true, - "description": "A function which serves as a setter for the property, or undefined if there is no setter (accessor descriptors only)." - }, - { - "name": "configurable", - "type": "boolean", - "description": "True if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object." - }, - { - "name": "enumerable", - "type": "boolean", - "description": "True if this property shows up during enumeration of the properties on the corresponding object." - }, - { - "name": "wasThrown", - "type": "boolean", - "optional": true, - "description": "True if the result was thrown during the evaluation." - }, - { - "name": "isOwn", - "optional": true, - "type": "boolean", - "description": "True if the property is owned for the object.", - "hidden": true - } - ] - }, - { - "id": "InternalPropertyDescriptor", - "type": "object", - "description": "Object internal property descriptor. This property isn't normally visible in JavaScript code.", - "properties": [ - { - "name": "name", - "type": "string", - "description": "Conventional property name." - }, - { - "name": "value", - "$ref": "RemoteObject", - "optional": true, - "description": "The value associated with the property." - } - ], - "hidden": true - }, - { - "id": "CallArgument", - "type": "object", - "description": "Represents function call argument. Either remote object id objectId or primitive value or neither of (for undefined) them should be specified.", - "properties": [ - { - "name": "value", - "type": "any", - "optional": true, - "description": "Primitive value." - }, - { - "name": "objectId", - "$ref": "RemoteObjectId", - "optional": true, - "description": "Remote object handle." - } - ] - }, - { - "id": "ExecutionContextId", - "type": "integer", - "description": "Id of an execution context." - }, - { - "id": "ExecutionContextDescription", - "type": "object", - "description": "Description of an isolated world.", - "properties": [ - { - "name": "id", - "$ref": "ExecutionContextId", - "description": "Unique id of the execution context. It can be used to specify in which execution context script evaluation should be performed." - }, - { - "name": "isPageContext", - "type": "boolean", - "description": "True if this is a context where inpspected web page scripts run. False if it is a content script isolated context.", - "hidden": true - }, - { - "name": "name", - "type": "string", - "description": "Human readable name describing given context.", - "hidden": true - }, - { - "name": "frameId", - "type": "string", - "description": "Id of the owning frame." - } - ] - } - ], - "commands": [ - { - "name": "evaluate", - "parameters": [ - { - "name": "expression", - "type": "string", - "description": "Expression to evaluate." - }, - { - "name": "objectGroup", - "type": "string", - "optional": true, - "description": "Symbolic group name that can be used to release multiple objects." - }, - { - "name": "includeCommandLineAPI", - "type": "boolean", - "optional": true, - "description": "Determines whether Command Line API should be available during the evaluation.", - "hidden": true - }, - { - "name": "doNotPauseOnExceptionsAndMuteConsole", - "type": "boolean", - "optional": true, - "description": "Specifies whether evaluation should stop on exceptions and mute console. Overrides setPauseOnException state.", - "hidden": true - }, - { - "name": "contextId", - "$ref": "Runtime.ExecutionContextId", - "optional": true, - "description": "Specifies in which isolated context to perform evaluation. Each content script lives in an isolated context and this parameter may be used to specify one of those contexts. If the parameter is omitted or 0 the evaluation will be performed in the context of the inspected page." - }, - { - "name": "returnByValue", - "type": "boolean", - "optional": true, - "description": "Whether the result is expected to be a JSON object that should be sent by value." - }, - { - "name": "generatePreview", - "type": "boolean", - "optional": true, - "hidden": true, - "description": "Whether preview should be generated for the result." - } - ], - "returns": [ - { - "name": "result", - "$ref": "RemoteObject", - "description": "Evaluation result." - }, - { - "name": "wasThrown", - "type": "boolean", - "optional": true, - "description": "True if the result was thrown during the evaluation." - } - ], - "description": "Evaluates expression on global object." - }, - { - "name": "callFunctionOn", - "parameters": [ - { - "name": "objectId", - "$ref": "RemoteObjectId", - "description": "Identifier of the object to call function on." - }, - { - "name": "functionDeclaration", - "type": "string", - "description": "Declaration of the function to call." - }, - { - "name": "arguments", - "type": "array", - "items": { - "$ref": "CallArgument", - "description": "Call argument." - }, - "optional": true, - "description": "Call arguments. All call arguments must belong to the same JavaScript world as the target object." - }, - { - "name": "doNotPauseOnExceptionsAndMuteConsole", - "type": "boolean", - "optional": true, - "description": "Specifies whether function call should stop on exceptions and mute console. Overrides setPauseOnException state.", - "hidden": true - }, - { - "name": "returnByValue", - "type": "boolean", - "optional": true, - "description": "Whether the result is expected to be a JSON object which should be sent by value." - }, - { - "name": "generatePreview", - "type": "boolean", - "optional": true, - "hidden": true, - "description": "Whether preview should be generated for the result." - } - ], - "returns": [ - { - "name": "result", - "$ref": "RemoteObject", - "description": "Call result." - }, - { - "name": "wasThrown", - "type": "boolean", - "optional": true, - "description": "True if the result was thrown during the evaluation." - } - ], - "description": "Calls function with given declaration on the given object. Object group of the result is inherited from the target object." - }, - { - "name": "getProperties", - "parameters": [ - { - "name": "objectId", - "$ref": "RemoteObjectId", - "description": "Identifier of the object to return properties for." - }, - { - "name": "ownProperties", - "optional": true, - "type": "boolean", - "description": "If true, returns properties belonging only to the element itself, not to its prototype chain." - }, - { - "name": "accessorPropertiesOnly", - "optional": true, - "type": "boolean", - "description": "If true, returns accessor properties (with getter/setter) only; internal properties are not returned either.", - "hidden": true - } - ], - "returns": [ - { - "name": "result", - "type": "array", - "items": { - "$ref": "PropertyDescriptor" - }, - "description": "Object properties." - }, - { - "name": "internalProperties", - "optional": true, - "type": "array", - "items": { - "$ref": "InternalPropertyDescriptor" - }, - "description": "Internal object properties (only of the element itself).", - "hidden": true - } - ], - "description": "Returns properties of a given object. Object group of the result is inherited from the target object." - }, - { - "name": "releaseObject", - "parameters": [ - { - "name": "objectId", - "$ref": "RemoteObjectId", - "description": "Identifier of the object to release." - } - ], - "description": "Releases remote object with given id." - }, - { - "name": "releaseObjectGroup", - "parameters": [ - { - "name": "objectGroup", - "type": "string", - "description": "Symbolic object group name." - } - ], - "description": "Releases all remote objects that belong to a given group." - }, - { - "name": "run", - "hidden": true, - "description": "Tells inspected instance(worker or page) that it can run in case it was started paused." - }, - { - "name": "enable", - "description": "Enables reporting of execution contexts creation by means of executionContextCreated event. When the reporting gets enabled the event will be sent immediately for each existing execution context." - }, - { - "name": "disable", - "hidden": true, - "description": "Disables reporting of execution contexts creation." - } - ], - "events": [ - { - "name": "executionContextCreated", - "parameters": [ - { - "name": "context", - "$ref": "ExecutionContextDescription", - "description": "A newly created execution contex." - } - ], - "description": "Issued when new execution context is created." - } - ] - }, - { - "domain": "Debugger", - "description": "Debugger domain exposes JavaScript debugging capabilities. It allows setting and removing breakpoints, stepping through execution, exploring stack traces, etc.", - "types": [ - { - "id": "SearchMatch", - "type": "object", - "description": "Search match for resource.", - "properties": [ - { - "name": "lineNumber", - "type": "number", - "description": "Line number in resource content." - }, - { - "name": "lineContent", - "type": "string", - "description": "Line with match content." - } - ], - "hidden": true - }, - { - "id": "BreakpointId", - "type": "string", - "description": "Breakpoint identifier." - }, - { - "id": "ScriptId", - "type": "string", - "description": "Unique script identifier." - }, - { - "id": "CallFrameId", - "type": "string", - "description": "Call frame identifier." - }, - { - "id": "Location", - "type": "object", - "properties": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Script identifier as reported in the Debugger.scriptParsed." - }, - { - "name": "lineNumber", - "type": "integer", - "description": "Line number in the script (0-based)." - }, - { - "name": "columnNumber", - "type": "integer", - "optional": true, - "description": "Column number in the script (0-based)." - } - ], - "description": "Location in the source code." - }, - { - "id": "FunctionDetails", - "hidden": true, - "type": "object", - "properties": [ - { - "name": "location", - "$ref": "Location", - "description": "Location of the function." - }, - { - "name": "name", - "type": "string", - "optional": true, - "description": "Name of the function. Not present for anonymous functions." - }, - { - "name": "displayName", - "type": "string", - "optional": true, - "description": "Display name of the function(specified in 'displayName' property on the function object)." - }, - { - "name": "inferredName", - "type": "string", - "optional": true, - "description": "Name of the function inferred from its initial assignment." - }, - { - "name": "scopeChain", - "type": "array", - "optional": true, - "items": { - "$ref": "Scope" - }, - "description": "Scope chain for this closure." - } - ], - "description": "Information about the function." - }, - { - "id": "CallFrame", - "type": "object", - "properties": [ - { - "name": "callFrameId", - "$ref": "CallFrameId", - "description": "Call frame identifier. This identifier is only valid while the virtual machine is paused." - }, - { - "name": "functionName", - "type": "string", - "description": "Name of the JavaScript function called on this call frame." - }, - { - "name": "location", - "$ref": "Location", - "description": "Location in the source code." - }, - { - "name": "scopeChain", - "type": "array", - "items": { - "$ref": "Scope" - }, - "description": "Scope chain for this call frame." - }, - { - "name": "this", - "$ref": "Runtime.RemoteObject", - "description": "this object for this call frame." - } - ], - "description": "JavaScript call frame. Array of call frames form the call stack." - }, - { - "id": "Scope", - "type": "object", - "properties": [ - { - "name": "type", - "type": "string", - "enum": [ - "global", - "local", - "with", - "closure", - "catch" - ], - "description": "Scope type." - }, - { - "name": "object", - "$ref": "Runtime.RemoteObject", - "description": "Object representing the scope. For global and with scopes it represents the actual object; for the rest of the scopes, it is artificial transient object enumerating scope variables as its properties." - } - ], - "description": "Scope description." - }, - { - "id": "SetScriptSourceError", - "type": "object", - "properties": [ - { - "name": "compileError", - "optional": true, - "type": "object", - "properties": [ - { - "name": "message", - "type": "string", - "description": "Compiler error message" - }, - { - "name": "lineNumber", - "type": "integer", - "description": "Compile error line number (1-based)" - }, - { - "name": "columnNumber", - "type": "integer", - "description": "Compile error column number (1-based)" - } - ] - } - ], - "description": "Error data for setScriptSource command. compileError is a case type for uncompilable script source error.", - "hidden": true - } - ], - "commands": [ - { - "name": "enable", - "description": "Enables debugger for the given page. Clients should not assume that the debugging has been enabled until the result for this command is received." - }, - { - "name": "disable", - "description": "Disables debugger for given page." - }, - { - "name": "setBreakpointsActive", - "parameters": [ - { - "name": "active", - "type": "boolean", - "description": "New value for breakpoints active state." - } - ], - "description": "Activates / deactivates all breakpoints on the page." - }, - { - "name": "setSkipAllPauses", - "hidden": true, - "parameters": [ - { - "name": "skipped", - "type": "boolean", - "description": "New value for skip pauses state." - }, - { - "name": "untilReload", - "type": "boolean", - "optional": true, - "description": "Whether page reload should set skipped to false." - } - ], - "description": "Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc)." - }, - { - "name": "setBreakpointByUrl", - "parameters": [ - { - "name": "lineNumber", - "type": "integer", - "description": "Line number to set breakpoint at." - }, - { - "name": "url", - "type": "string", - "optional": true, - "description": "URL of the resources to set breakpoint on." - }, - { - "name": "urlRegex", - "type": "string", - "optional": true, - "description": "Regex pattern for the URLs of the resources to set breakpoints on. Either url or urlRegex must be specified." - }, - { - "name": "columnNumber", - "type": "integer", - "optional": true, - "description": "Offset in the line to set breakpoint at." - }, - { - "name": "condition", - "type": "string", - "optional": true, - "description": "Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true." - }, - { - "name": "isAntibreakpoint", - "type": "boolean", - "optional": true, - "hidden": true, - "description": "Creates pseudo-breakpoint that prevents debugger from pausing on exception at this location." - } - ], - "returns": [ - { - "name": "breakpointId", - "$ref": "BreakpointId", - "description": "Id of the created breakpoint for further reference." - }, - { - "name": "locations", - "type": "array", - "items": { - "$ref": "Location" - }, - "description": "List of the locations this breakpoint resolved into upon addition." - } - ], - "description": "Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this command is issued, all existing parsed scripts will have breakpoints resolved and returned in locations property. Further matching script parsing will result in subsequent breakpointResolved events issued. This logical breakpoint will survive page reloads." - }, - { - "name": "setBreakpoint", - "parameters": [ - { - "name": "location", - "$ref": "Location", - "description": "Location to set breakpoint in." - }, - { - "name": "condition", - "type": "string", - "optional": true, - "description": "Expression to use as a breakpoint condition. When specified, debugger will only stop on the breakpoint if this expression evaluates to true." - } - ], - "returns": [ - { - "name": "breakpointId", - "$ref": "BreakpointId", - "description": "Id of the created breakpoint for further reference." - }, - { - "name": "actualLocation", - "$ref": "Location", - "description": "Location this breakpoint resolved into." - } - ], - "description": "Sets JavaScript breakpoint at a given location." - }, - { - "name": "removeBreakpoint", - "parameters": [ - { - "name": "breakpointId", - "$ref": "BreakpointId" - } - ], - "description": "Removes JavaScript breakpoint." - }, - { - "name": "continueToLocation", - "parameters": [ - { - "name": "location", - "$ref": "Location", - "description": "Location to continue to." - }, - { - "name": "interstatementLocation", - "type": "boolean", - "optional": true, - "hidden": true, - "description": "Allows breakpoints at the intemediate positions inside statements." - } - ], - "description": "Continues execution until specific location is reached." - }, - { - "name": "stepOver", - "description": "Steps over the statement." - }, - { - "name": "stepInto", - "description": "Steps into the function call." - }, - { - "name": "stepOut", - "description": "Steps out of the function call." - }, - { - "name": "pause", - "description": "Stops on the next JavaScript statement." - }, - { - "name": "resume", - "description": "Resumes JavaScript execution." - }, - { - "name": "searchInContent", - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Id of the script to search in." - }, - { - "name": "query", - "type": "string", - "description": "String to search for." - }, - { - "name": "caseSensitive", - "type": "boolean", - "optional": true, - "description": "If true, search is case sensitive." - }, - { - "name": "isRegex", - "type": "boolean", - "optional": true, - "description": "If true, treats string parameter as regex." - } - ], - "returns": [ - { - "name": "result", - "type": "array", - "items": { - "$ref": "SearchMatch" - }, - "description": "List of search matches." - } - ], - "description": "Searches for given string in script content." - }, - { - "name": "canSetScriptSource", - "returns": [ - { - "name": "result", - "type": "boolean", - "description": "True if setScriptSource is supported." - } - ], - "description": "Always returns true." - }, - { - "name": "setScriptSource", - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Id of the script to edit." - }, - { - "name": "scriptSource", - "type": "string", - "description": "New content of the script." - }, - { - "name": "preview", - "type": "boolean", - "optional": true, - "description": " If true the change will not actually be applied. Preview mode may be used to get result description without actually modifying the code.", - "hidden": true - } - ], - "returns": [ - { - "name": "callFrames", - "type": "array", - "optional": true, - "items": { - "$ref": "CallFrame" - }, - "description": "New stack trace in case editing has happened while VM was stopped." - }, - { - "name": "result", - "type": "object", - "optional": true, - "description": "VM-specific description of the changes applied.", - "hidden": true - } - ], - "error": { - "$ref": "SetScriptSourceError" - }, - "description": "Edits JavaScript source live." - }, - { - "name": "restartFrame", - "parameters": [ - { - "name": "callFrameId", - "$ref": "CallFrameId", - "description": "Call frame identifier to evaluate on." - } - ], - "returns": [ - { - "name": "callFrames", - "type": "array", - "items": { - "$ref": "CallFrame" - }, - "description": "New stack trace." - }, - { - "name": "result", - "type": "object", - "description": "VM-specific description.", - "hidden": true - } - ], - "hidden": true, - "description": "Restarts particular call frame from the beginning." - }, - { - "name": "getScriptSource", - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Id of the script to get source for." - } - ], - "returns": [ - { - "name": "scriptSource", - "type": "string", - "description": "Script source." - } - ], - "description": "Returns source for the script with given id." - }, - { - "name": "getFunctionDetails", - "hidden": true, - "parameters": [ - { - "name": "functionId", - "$ref": "Runtime.RemoteObjectId", - "description": "Id of the function to get location for." - } - ], - "returns": [ - { - "name": "details", - "$ref": "FunctionDetails", - "description": "Information about the function." - } - ], - "description": "Returns detailed informtation on given function." - }, - { - "name": "setPauseOnExceptions", - "parameters": [ - { - "name": "state", - "type": "string", - "enum": [ - "none", - "uncaught", - "all" - ], - "description": "Pause on exceptions mode." - } - ], - "description": "Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or no exceptions. Initial pause on exceptions state is none." - }, - { - "name": "evaluateOnCallFrame", - "parameters": [ - { - "name": "callFrameId", - "$ref": "CallFrameId", - "description": "Call frame identifier to evaluate on." - }, - { - "name": "expression", - "type": "string", - "description": "Expression to evaluate." - }, - { - "name": "objectGroup", - "type": "string", - "optional": true, - "description": "String object group name to put result into (allows rapid releasing resulting object handles using releaseObjectGroup)." - }, - { - "name": "includeCommandLineAPI", - "type": "boolean", - "optional": true, - "description": "Specifies whether command line API should be available to the evaluated expression, defaults to false.", - "hidden": true - }, - { - "name": "doNotPauseOnExceptionsAndMuteConsole", - "type": "boolean", - "optional": true, - "description": "Specifies whether evaluation should stop on exceptions and mute console. Overrides setPauseOnException state.", - "hidden": true - }, - { - "name": "returnByValue", - "type": "boolean", - "optional": true, - "description": "Whether the result is expected to be a JSON object that should be sent by value." - }, - { - "name": "generatePreview", - "type": "boolean", - "optional": true, - "hidden": true, - "description": "Whether preview should be generated for the result." - } - ], - "returns": [ - { - "name": "result", - "$ref": "Runtime.RemoteObject", - "description": "Object wrapper for the evaluation result." - }, - { - "name": "wasThrown", - "type": "boolean", - "optional": true, - "description": "True if the result was thrown during the evaluation." - } - ], - "description": "Evaluates expression on a given call frame." - }, - { - "name": "compileScript", - "hidden": true, - "parameters": [ - { - "name": "expression", - "type": "string", - "description": "Expression to compile." - }, - { - "name": "sourceURL", - "type": "string", - "description": "Source url to be set for the script." - } - ], - "returns": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "optional": true, - "description": "Id of the script." - }, - { - "name": "syntaxErrorMessage", - "type": "string", - "optional": true, - "description": "Syntax error message if compilation failed." - } - ], - "description": "Compiles expression." - }, - { - "name": "runScript", - "hidden": true, - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Id of the script to run." - }, - { - "name": "contextId", - "$ref": "Runtime.ExecutionContextId", - "optional": true, - "description": "Specifies in which isolated context to perform script run. Each content script lives in an isolated context and this parameter may be used to specify one of those contexts. If the parameter is omitted or 0 the evaluation will be performed in the context of the inspected page." - }, - { - "name": "objectGroup", - "type": "string", - "optional": true, - "description": "Symbolic group name that can be used to release multiple objects." - }, - { - "name": "doNotPauseOnExceptionsAndMuteConsole", - "type": "boolean", - "optional": true, - "description": "Specifies whether script run should stop on exceptions and mute console. Overrides setPauseOnException state." - } - ], - "returns": [ - { - "name": "result", - "$ref": "Runtime.RemoteObject", - "description": "Run result." - }, - { - "name": "wasThrown", - "type": "boolean", - "optional": true, - "description": "True if the result was thrown during the script run." - } - ], - "description": "Runs script with given id in a given context." - }, - { - "name": "setOverlayMessage", - "parameters": [ - { - "name": "message", - "type": "string", - "optional": true, - "description": "Overlay message to display when paused in debugger." - } - ], - "hidden": true, - "description": "Sets overlay message." - }, - { - "name": "setVariableValue", - "parameters": [ - { - "name": "scopeNumber", - "type": "integer", - "description": "0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch' scope types are allowed. Other scopes could be manipulated manually." - }, - { - "name": "variableName", - "type": "string", - "description": "Variable name." - }, - { - "name": "newValue", - "$ref": "Runtime.CallArgument", - "description": "New variable value." - }, - { - "name": "callFrameId", - "$ref": "CallFrameId", - "optional": true, - "description": "Id of callframe that holds variable." - }, - { - "name": "functionObjectId", - "$ref": "Runtime.RemoteObjectId", - "optional": true, - "description": "Object id of closure (function) that holds variable." - } - ], - "hidden": true, - "description": "Changes value of variable in a callframe or a closure. Either callframe or function must be specified. Object-based scopes are not supported and must be mutated manually." - }, - { - "name": "getStepInPositions", - "parameters": [ - { - "name": "callFrameId", - "$ref": "CallFrameId", - "description": "Id of a call frame where the current statement should be analized" - } - ], - "returns": [ - { - "name": "stepInPositions", - "type": "array", - "items": { - "$ref": "Location" - }, - "optional": true, - "description": "experimental" - } - ], - "hidden": true, - "description": "Lists all positions where step-in is possible for a current statement in a specified call frame" - }, - { - "name": "getBacktrace", - "returns": [ - { - "name": "callFrames", - "type": "array", - "items": { - "$ref": "CallFrame" - }, - "description": "Call stack the virtual machine stopped on." - } - ], - "hidden": true, - "description": "Returns call stack including variables changed since VM was paused. VM must be paused." - }, - { - "name": "skipStackFrames", - "parameters": [ - { - "name": "script", - "optional": true, - "type": "string", - "description": "Regular expression defining the scripts to ignore while stepping." - } - ], - "hidden": true, - "description": "Makes backend skip steps in the sources with names matching given pattern. VM will try leave blacklisted scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful." - } - ], - "events": [ - { - "name": "globalObjectCleared", - "description": "Called when global has been cleared and debugger client should reset its state. Happens upon navigation or reload." - }, - { - "name": "scriptParsed", - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Identifier of the script parsed." - }, - { - "name": "url", - "type": "string", - "description": "URL or name of the script parsed (if any)." - }, - { - "name": "startLine", - "type": "integer", - "description": "Line offset of the script within the resource with given URL (for script tags)." - }, - { - "name": "startColumn", - "type": "integer", - "description": "Column offset of the script within the resource with given URL." - }, - { - "name": "endLine", - "type": "integer", - "description": "Last line of the script." - }, - { - "name": "endColumn", - "type": "integer", - "description": "Length of the last line of the script." - }, - { - "name": "isContentScript", - "type": "boolean", - "optional": true, - "description": "Determines whether this script is a user extension script." - }, - { - "name": "sourceMapURL", - "type": "string", - "optional": true, - "description": "URL of source map associated with script (if any)." - }, - { - "name": "hasSourceURL", - "type": "boolean", - "optional": true, - "description": "True, if this script has sourceURL.", - "hidden": true - } - ], - "description": "Fired when virtual machine parses script. This event is also fired for all known and uncollected scripts upon enabling debugger." - }, - { - "name": "scriptFailedToParse", - "parameters": [ - { - "name": "scriptId", - "$ref": "ScriptId", - "description": "Identifier of the script parsed." - }, - { - "name": "url", - "type": "string", - "description": "URL or name of the script parsed (if any)." - }, - { - "name": "startLine", - "type": "integer", - "description": "Line offset of the script within the resource with given URL (for script tags)." - }, - { - "name": "startColumn", - "type": "integer", - "description": "Column offset of the script within the resource with given URL." - }, - { - "name": "endLine", - "type": "integer", - "description": "Last line of the script." - }, - { - "name": "endColumn", - "type": "integer", - "description": "Length of the last line of the script." - }, - { - "name": "isContentScript", - "type": "boolean", - "optional": true, - "description": "Determines whether this script is a user extension script." - }, - { - "name": "sourceMapURL", - "type": "string", - "optional": true, - "description": "URL of source map associated with script (if any)." - }, - { - "name": "hasSourceURL", - "type": "boolean", - "optional": true, - "description": "True, if this script has sourceURL.", - "hidden": true - } - ], - "description": "Fired when virtual machine fails to parse the script." - }, - { - "name": "breakpointResolved", - "parameters": [ - { - "name": "breakpointId", - "$ref": "BreakpointId", - "description": "Breakpoint unique identifier." - }, - { - "name": "location", - "$ref": "Location", - "description": "Actual breakpoint location." - } - ], - "description": "Fired when breakpoint is resolved to an actual script and location." - }, - { - "name": "paused", - "parameters": [ - { - "name": "callFrames", - "type": "array", - "items": { - "$ref": "CallFrame" - }, - "description": "Call stack the virtual machine stopped on." - }, - { - "name": "reason", - "type": "string", - "enum": [ - "XHR", - "DOM", - "EventListener", - "exception", - "assert", - "CSPViolation", - "debugCommand", - "other" - ], - "description": "Pause reason." - }, - { - "name": "data", - "type": "object", - "optional": true, - "description": "Object containing break-specific auxiliary properties." - }, - { - "name": "hitBreakpoints", - "type": "array", - "optional": true, - "items": { - "type": "string" - }, - "description": "Hit breakpoints IDs", - "hidden": true - } - ], - "description": "Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria." - }, - { - "name": "resumed", - "description": "Fired when the virtual machine resumed execution." - } - ] - }, - { - "domain": "Profiler", - "hidden": true, - "types": [ - { - "id": "ProfileHeader", - "type": "object", - "description": "Profile header.", - "properties": [ - { - "name": "title", - "type": "string", - "description": "Profile title." - }, - { - "name": "uid", - "type": "integer", - "description": "Unique identifier of the profile." - } - ] - }, - { - "id": "CPUProfileNode", - "type": "object", - "description": "CPU Profile node. Holds callsite information, execution statistics and child nodes.", - "properties": [ - { - "name": "functionName", - "type": "string", - "description": "Function name." - }, - { - "name": "scriptId", - "$ref": "Debugger.ScriptId", - "description": "Script identifier." - }, - { - "name": "url", - "type": "string", - "description": "URL." - }, - { - "name": "lineNumber", - "type": "integer", - "description": "Line number." - }, - { - "name": "hitCount", - "type": "integer", - "description": "Number of samples where this node was on top of the call stack." - }, - { - "name": "callUID", - "type": "number", - "description": "Call UID." - }, - { - "name": "children", - "type": "array", - "items": { - "$ref": "CPUProfileNode" - }, - "description": "Child nodes." - }, - { - "name": "deoptReason", - "type": "string", - "description": "The reason of being not optimized. The function may be deoptimized or marked as don't optimize." - }, - { - "name": "id", - "optional": true, - "type": "integer", - "description": "Unique id of the node." - } - ] - }, - { - "id": "CPUProfile", - "type": "object", - "description": "Profile.", - "properties": [ - { - "name": "head", - "$ref": "CPUProfileNode" - }, - { - "name": "startTime", - "type": "number", - "description": "Profiling start time in seconds." - }, - { - "name": "endTime", - "type": "number", - "description": "Profiling end time in seconds." - }, - { - "name": "samples", - "optional": true, - "type": "array", - "items": { - "type": "integer" - }, - "description": "Ids of samples top nodes." - } - ] - }, - { - "id": "HeapSnapshotObjectId", - "type": "string", - "description": "Heap snashot object id." - } - ], - "commands": [ - { - "name": "enable" - }, - { - "name": "disable" - }, - { - "name": "start" - }, - { - "name": "stop", - "returns": [ - { - "name": "header", - "$ref": "ProfileHeader", - "description": "The header of the recorded profile." - } - ] - }, - { - "name": "getProfileHeaders", - "returns": [ - { - "name": "headers", - "type": "array", - "items": { - "$ref": "ProfileHeader" - } - } - ] - }, - { - "name": "getCPUProfile", - "parameters": [ - { - "name": "uid", - "type": "integer" - } - ], - "returns": [ - { - "name": "profile", - "$ref": "CPUProfile" - } - ] - }, - { - "name": "removeProfile", - "parameters": [ - { - "name": "type", - "type": "string" - }, - { - "name": "uid", - "type": "integer" - } - ] - }, - { - "name": "clearProfiles" - } - ], - "events": [ - { - "name": "addProfileHeader", - "parameters": [ - { - "name": "header", - "$ref": "ProfileHeader" - } - ] - }, - { - "name": "setRecordingProfile", - "parameters": [ - { - "name": "isProfiling", - "type": "boolean" - } - ] - }, - { - "name": "resetProfiles" - } - ] - }, - { - "domain": "HeapProfiler", - "hidden": true, - "types": [ - { - "id": "ProfileHeader", - "type": "object", - "description": "Profile header.", - "properties": [ - { - "name": "title", - "type": "string", - "description": "Profile title." - }, - { - "name": "uid", - "type": "integer", - "description": "Unique identifier of the profile." - }, - { - "name": "maxJSObjectId", - "type": "integer", - "optional": true, - "description": "Last seen JS object Id." - } - ] - }, - { - "id": "HeapSnapshotObjectId", - "type": "string", - "description": "Heap snashot object id." - } - ], - "commands": [ - { - "name": "getProfileHeaders", - "returns": [ - { - "name": "headers", - "type": "array", - "items": { - "$ref": "ProfileHeader" - } - } - ] - }, - { - "name": "startTrackingHeapObjects" - }, - { - "name": "stopTrackingHeapObjects" - }, - { - "name": "getHeapSnapshot", - "parameters": [ - { - "name": "uid", - "type": "integer" - } - ] - }, - { - "name": "removeProfile", - "parameters": [ - { - "name": "uid", - "type": "integer" - } - ] - }, - { - "name": "clearProfiles" - }, - { - "name": "takeHeapSnapshot", - "parameters": [ - { - "name": "reportProgress", - "type": "boolean", - "optional": true, - "description": "If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken." - } - ] - }, - { - "name": "collectGarbage" - }, - { - "name": "getObjectByHeapObjectId", - "parameters": [ - { - "name": "objectId", - "$ref": "HeapSnapshotObjectId" - }, - { - "name": "objectGroup", - "type": "string", - "optional": true, - "description": "Symbolic group name that can be used to release multiple objects." - } - ], - "returns": [ - { - "name": "result", - "$ref": "Runtime.RemoteObject", - "description": "Evaluation result." - } - ] - }, - { - "name": "getHeapObjectId", - "parameters": [ - { - "name": "objectId", - "$ref": "Runtime.RemoteObjectId", - "description": "Identifier of the object to get heap object id for." - } - ], - "returns": [ - { - "name": "heapSnapshotObjectId", - "$ref": "HeapSnapshotObjectId", - "description": "Id of the heap snapshot object corresponding to the passed remote object id." - } - ] - } - ], - "events": [ - { - "name": "addProfileHeader", - "parameters": [ - { - "name": "header", - "$ref": "ProfileHeader" - } - ] - }, - { - "name": "addHeapSnapshotChunk", - "parameters": [ - { - "name": "uid", - "type": "integer" - }, - { - "name": "chunk", - "type": "string" - } - ] - }, - { - "name": "finishHeapSnapshot", - "parameters": [ - { - "name": "uid", - "type": "integer" - } - ] - }, - { - "name": "resetProfiles" - }, - { - "name": "reportHeapSnapshotProgress", - "parameters": [ - { - "name": "done", - "type": "integer" - }, - { - "name": "total", - "type": "integer" - } - ] - }, - { - "name": "lastSeenObjectId", - "description": "If heap objects tracking has been started then backend regulary sends a current value for last seen object id and corresponding timestamp. If the were changes in the heap since last event then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event.", - "parameters": [ - { - "name": "lastSeenObjectId", - "type": "integer" - }, - { - "name": "timestamp", - "type": "number" - } - ] - }, - { - "name": "heapStatsUpdate", - "description": "If heap objects tracking has been started then backend may send update for one or more fragments", - "parameters": [ - { - "name": "statsUpdate", - "type": "array", - "items": { - "type": "integer" - }, - "description": "An array of triplets. Each triplet describes a fragment. The first integer is the fragment index, the second integer is a total count of objects for the fragment, the third integer is a total size of the objects for the fragment." - } - ] - } - ] - } - ], - "version": { - "major": "1", - "minor": "1" - } -} \ No newline at end of file diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/InspectorVersion.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/InspectorVersion.h deleted file mode 100644 index 1cdee42a6e02dc..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/InspectorVersion.h +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file is automatically generated. Do not modify. -#define V8_INSPECTOR_REVISION "60cd6e859b9f557d2312f5bf532f6aec5f284980" diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8ContextInfo.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8ContextInfo.h deleted file mode 100644 index 24570a4751a93b..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8ContextInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8ContextInfo_h -#define V8ContextInfo_h - -#include "platform/inspector_protocol/InspectorProtocol.h" - -#include - -namespace v8_inspector { - -class V8ContextInfo { -public: - V8ContextInfo(v8::Local context, int contextGroupId, const String16& humanReadableName) - : context(context) - , contextGroupId(contextGroupId) - , humanReadableName(humanReadableName) - , hasMemoryOnConsole(false) - { - } - - v8::Local context; - // Each v8::Context is a part of a group. The group id is used to find appropriate - // V8DebuggerAgent to notify about events in the context. - // |contextGroupId| must be non-0. - int contextGroupId; - String16 humanReadableName; - String16 origin; - String16 auxData; - bool hasMemoryOnConsole; -}; - -} // namespace v8_inspector - -#endif // V8ContextInfo_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8Inspector.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8Inspector.h deleted file mode 100644 index bb078474f9bd92..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8Inspector.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8Inspector_h -#define V8Inspector_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/public/V8ContextInfo.h" - -#include - -namespace v8_inspector { - -class V8InspectorClient; -class V8InspectorSession; -class V8StackTrace; - -class PLATFORM_EXPORT V8Inspector { -public: - static std::unique_ptr create(v8::Isolate*, V8InspectorClient*); - virtual ~V8Inspector() { } - - // Contexts instrumentation. - virtual void contextCreated(const V8ContextInfo&) = 0; - virtual void contextDestroyed(v8::Local) = 0; - virtual void resetContextGroup(int contextGroupId) = 0; - - // Various instrumentation. - virtual void willExecuteScript(v8::Local, int scriptId) = 0; - virtual void didExecuteScript(v8::Local) = 0; - virtual void idleStarted() = 0; - virtual void idleFinished() = 0; - - // Async stack traces instrumentation. - virtual void asyncTaskScheduled(const String16& taskName, void* task, bool recurring) = 0; - virtual void asyncTaskCanceled(void* task) = 0; - virtual void asyncTaskStarted(void* task) = 0; - virtual void asyncTaskFinished(void* task) = 0; - virtual void allAsyncTasksCanceled() = 0; - - // Exceptions instrumentation. - virtual unsigned exceptionThrown(v8::Local, const String16& message, v8::Local exception, const String16& detailedMessage, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr, int scriptId) = 0; - virtual void exceptionRevoked(v8::Local, unsigned exceptionId, const String16& message) = 0; - - // API methods. - virtual std::unique_ptr connect(int contextGroupId, blink::protocol::FrontendChannel*, const String16* state) = 0; - virtual std::unique_ptr createStackTrace(v8::Local) = 0; - virtual std::unique_ptr captureStackTrace(bool fullStack) = 0; -}; - -} // namespace v8_inspector - - -#endif // V8Inspector_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorClient.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorClient.h deleted file mode 100644 index eb3e2ae7a22609..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorClient.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8InspectorClient_h -#define V8InspectorClient_h - -#include "platform/inspector_protocol/InspectorProtocol.h" - -#include - -namespace v8_inspector { - -class V8StackTrace; - -enum class V8ConsoleAPIType { kClear, kDebug, kLog, kInfo, kWarning, kError }; - -class PLATFORM_EXPORT V8InspectorClient { -public: - virtual ~V8InspectorClient() { } - - virtual void runMessageLoopOnPause(int contextGroupId) { } - virtual void quitMessageLoopOnPause() { } - virtual void runIfWaitingForDebugger(int contextGroupId) { } - - virtual void muteMetrics(int contextGroupId) { } - virtual void unmuteMetrics(int contextGroupId) { } - - virtual void beginUserGesture() { } - virtual void endUserGesture() { } - - virtual String16 valueSubtype(v8::Local) { return String16(); } - virtual bool formatAccessorsAsProperties(v8::Local) { return false; } - virtual bool isInspectableHeapObject(v8::Local) { return true; } - - virtual v8::Local ensureDefaultContextInGroup(int contextGroupId) { return v8::Local(); } - virtual void beginEnsureAllContextsInGroup(int contextGroupId) { } - virtual void endEnsureAllContextsInGroup(int contextGroupId) { } - - virtual void installAdditionalCommandLineAPI(v8::Local, v8::Local) { } - virtual void consoleAPIMessage(int contextGroupId, V8ConsoleAPIType, const String16& message, const String16& url, unsigned lineNumber, unsigned columnNumber, V8StackTrace*) { } - virtual v8::MaybeLocal memoryInfo(v8::Isolate*, v8::Local) { return v8::MaybeLocal(); } - - virtual void consoleTime(const String16& title) { } - virtual void consoleTimeEnd(const String16& title) { } - virtual void consoleTimeStamp(const String16& title) { } - virtual double currentTimeMS() { return 0; } - typedef void (*TimerCallback)(void*); - virtual void startRepeatingTimer(double, TimerCallback, void* data) { } - virtual void cancelTimer(void* data) { } - - // TODO(dgozman): this was added to support service worker shadow page. We should not connect at all. - virtual bool canExecuteScripts(int contextGroupId) { return true; } -}; - -} // namespace v8_inspector - - -#endif // V8InspectorClient_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorSession.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorSession.h deleted file mode 100644 index 2954ae353b0a4f..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8InspectorSession.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8InspectorSession_h -#define V8InspectorSession_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/public/protocol/Debugger.h" -#include "platform/v8_inspector/public/protocol/Runtime.h" -#include "platform/v8_inspector/public/protocol/Schema.h" - -#include - -namespace v8_inspector { - -class PLATFORM_EXPORT V8InspectorSession { -public: - virtual ~V8InspectorSession() { } - - // Cross-context inspectable values (DOM nodes in different worlds, etc.). - class Inspectable { - public: - virtual v8::Local get(v8::Local) = 0; - virtual ~Inspectable() { } - }; - virtual void addInspectedObject(std::unique_ptr) = 0; - - // Dispatching protocol messages. - static bool canDispatchMethod(const String16& method); - virtual void dispatchProtocolMessage(const String16& message) = 0; - virtual String16 stateJSON() = 0; - virtual std::unique_ptr> supportedDomains() = 0; - - // Debugger actions. - virtual void schedulePauseOnNextStatement(const String16& breakReason, const String16& breakDetails) = 0; - virtual void cancelPauseOnNextStatement() = 0; - virtual void breakProgram(const String16& breakReason, const String16& breakDetails) = 0; - virtual void setSkipAllPauses(bool) = 0; - virtual void resume() = 0; - virtual void stepOver() = 0; - virtual std::unique_ptr> searchInTextByLines(const String16& text, const String16& query, bool caseSensitive, bool isRegex) = 0; - - // Remote objects. - virtual std::unique_ptr wrapObject(v8::Local, v8::Local, const String16& groupName) = 0; - virtual bool unwrapObject(ErrorString*, const String16& objectId, v8::Local*, v8::Local*, String16* objectGroup) = 0; - virtual void releaseObjectGroup(const String16&) = 0; -}; - -} // namespace v8_inspector - -#endif // V8InspectorSession_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8StackTrace.h b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8StackTrace.h deleted file mode 100644 index ac68c1b0e9ea0a..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/public/V8StackTrace.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8StackTrace_h -#define V8StackTrace_h - -#include "platform/inspector_protocol/InspectorProtocol.h" -#include "platform/v8_inspector/public/protocol/Runtime.h" - -#include - -namespace v8_inspector { - -class V8StackTrace { -public: - virtual bool isEmpty() const = 0; - virtual String16 topSourceURL() const = 0; - virtual int topLineNumber() const = 0; - virtual int topColumnNumber() const = 0; - virtual String16 topScriptId() const = 0; - virtual String16 topFunctionName() const = 0; - - virtual ~V8StackTrace() { } - virtual std::unique_ptr buildInspectorObject() const = 0; - virtual String16 toString() const = 0; - - // Safe to pass between threads, drops async chain. - virtual std::unique_ptr clone() = 0; -}; - -} // namespace v8_inspector - -#endif // V8StackTrace_h diff --git a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/v8_inspector.gyp b/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/v8_inspector.gyp deleted file mode 100644 index c957ee2c184635..00000000000000 --- a/deps/v8_inspector/third_party/v8_inspector/platform/v8_inspector/v8_inspector.gyp +++ /dev/null @@ -1,320 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -{ - 'variables': { - 'blink_platform_output_dir': '<(SHARED_INTERMEDIATE_DIR)/blink/platform', - }, - 'conditions': [ - ['v8_inspector!="true"', - { - 'targets': [ - { - # GN version: //third_party/WebKit/Source/platform:inspector_protocol_sources - 'target_name': 'protocol_sources', - 'type': 'none', - 'dependencies': ['protocol_version'], - 'actions': [ - { - 'action_name': 'generateV8InspectorProtocolBackendSources', - 'inputs': [ - # Source code templates. - '../inspector_protocol/Allocator_h.template', - '../inspector_protocol/Array_h.template', - '../inspector_protocol/BackendCallback_h.template', - '../inspector_protocol/CodeGenerator.py', - '../inspector_protocol/Collections_h.template', - '../inspector_protocol/DispatcherBase_cpp.template', - '../inspector_protocol/DispatcherBase_h.template', - '../inspector_protocol/ErrorSupport_cpp.template', - '../inspector_protocol/ErrorSupport_h.template', - '../inspector_protocol/Exported_h.template', - '../inspector_protocol/FrontendChannel_h.template', - '../inspector_protocol/Imported_h.template', - '../inspector_protocol/InspectorProtocol_cpp.template', - '../inspector_protocol/Maybe_h.template', - '../inspector_protocol/Object_cpp.template', - '../inspector_protocol/Object_h.template', - '../inspector_protocol/Parser_cpp.template', - '../inspector_protocol/Parser_h.template', - '../inspector_protocol/Platform_h.template', - '../inspector_protocol/String16_cpp.template', - '../inspector_protocol/String16_h.template', - '../inspector_protocol/TypeBuilder_cpp.template', - '../inspector_protocol/TypeBuilder_h.template', - '../inspector_protocol/ValueConversions_h.template', - '../inspector_protocol/Values_cpp.template', - '../inspector_protocol/Values_h.template', - # Protocol definitions - 'js_protocol.json', - # Config - 'inspector_protocol_config.json', - ], - 'outputs': [ - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.cpp', - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Schema.h', - ], - 'action': [ - 'python', - '../inspector_protocol/CodeGenerator.py', - '--output_base', '<(blink_platform_output_dir)', - '--config', 'inspector_protocol_config.json', - ], - 'message': 'Generating protocol backend sources from json definitions.', - }, - ] - }, - ], - }, - ], - ], - - 'targets': [ - { - # GN version: //third_party/WebKit/Source/platform:inspector_injected_script - 'target_name': 'inspector_injected_script', - 'type': 'none', - 'actions': [ - { - 'action_name': 'ConvertFileToHeaderWithCharacterArray', - 'inputs': [ - 'build/xxd.py', - 'InjectedScriptSource.js', - ], - 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/blink/platform/v8_inspector/InjectedScriptSource.h', ], - 'action': [ - 'python', 'build/xxd.py', 'InjectedScriptSource_js', 'InjectedScriptSource.js', '<@(_outputs)' - ], - }, - ], - # Since this target generates header files, it needs to be a hard dependency. - 'hard_dependency': 1, - }, - { - # GN version: //third_party/WebKit/Source/platform:inspector_debugger_script - 'target_name': 'inspector_debugger_script', - 'type': 'none', - 'actions': [ - { - 'action_name': 'ConvertFileToHeaderWithCharacterArray', - 'inputs': [ - 'build/xxd.py', - 'DebuggerScript.js', - ], - 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/blink/platform/v8_inspector/DebuggerScript.h', ], - 'action': [ - 'python', 'build/xxd.py', 'DebuggerScript_js', 'DebuggerScript.js', '<@(_outputs)' - ], - }, - ], - # Since this target generates header files, it needs to be a hard dependency. - 'hard_dependency': 1, - }, - { - # GN version: //third_party/WebKit/Source/core/inspector:protocol_version - 'target_name': 'protocol_version', - 'type': 'none', - 'actions': [ - { - 'action_name': 'generateV8InspectorProtocolVersion', - 'inputs': [ - '../inspector_protocol/generate-inspector-protocol-version', - 'js_protocol.json', - ], - 'outputs': [ - '<(blink_platform_output_dir)/v8_inspector/protocol.json', - ], - 'action': [ - 'python', - '../inspector_protocol/generate-inspector-protocol-version', - '--o', - '<@(_outputs)', - 'js_protocol.json', - ], - 'message': 'Validate v8_inspector protocol for backwards compatibility and generate version file', - }, - ] - }, - { - 'target_name': 'protocol_sources_stl', - 'type': 'none', - 'dependencies': ['protocol_version'], - 'actions': [ - { - 'action_name': 'generateV8InspectorProtocolBackendSourcesSTL', - 'inputs': [ - # Source code templates. - '../inspector_protocol/Allocator_h.template', - '../inspector_protocol/Array_h.template', - '../inspector_protocol/BackendCallback_h.template', - '../inspector_protocol/CodeGenerator.py', - '../inspector_protocol/Collections_h.template', - '../inspector_protocol/DispatcherBase_cpp.template', - '../inspector_protocol/DispatcherBase_h.template', - '../inspector_protocol/ErrorSupport_cpp.template', - '../inspector_protocol/ErrorSupport_h.template', - '../inspector_protocol/Exported_h.template', - '../inspector_protocol/FrontendChannel_h.template', - '../inspector_protocol/Imported_h.template', - '../inspector_protocol/InspectorProtocol_cpp.template', - '../inspector_protocol/Maybe_h.template', - '../inspector_protocol/Object_cpp.template', - '../inspector_protocol/Object_h.template', - '../inspector_protocol/Parser_cpp.template', - '../inspector_protocol/Parser_h.template', - '../inspector_protocol/Platform_h.template', - '../inspector_protocol/String16_cpp.template', - '../inspector_protocol/String16_h.template', - '../inspector_protocol/TypeBuilder_cpp.template', - '../inspector_protocol/TypeBuilder_h.template', - '../inspector_protocol/ValueConversions_h.template', - '../inspector_protocol/Values_cpp.template', - '../inspector_protocol/Values_h.template', - # Protocol definitions - 'js_protocol.json', - # Config - 'inspector_protocol_config_stl.json', - ], - 'outputs': [ - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.cpp', - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Schema.h', - ], - 'action': [ - 'python', - '../inspector_protocol/CodeGenerator.py', - '--output_base', '<(blink_platform_output_dir)', - '--config', 'inspector_protocol_config_stl.json', - ], - 'message': 'Generating protocol backend sources from json definitions.', - }, - ] - }, - { - 'target_name': 'v8_inspector_stl', - 'type': '<(component)', - 'dependencies': [ - ':inspector_injected_script', - ':inspector_debugger_script', - ':protocol_sources_stl', - ], - 'include_dirs': [ - '../..', - '../../../../../v8/include', - '../../../../../v8', - '<(SHARED_INTERMEDIATE_DIR)/blink', - ], - 'sources': [ - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.cpp', - '<(blink_platform_output_dir)/inspector_protocol/InspectorProtocol.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Console.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/HeapProfiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Profiler.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.cpp', - '<(blink_platform_output_dir)/v8_inspector/protocol/Schema.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Debugger.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Runtime.h', - '<(blink_platform_output_dir)/v8_inspector/public/protocol/Schema.h', - - 'Atomics.h', - 'InjectedScript.cpp', - 'InjectedScript.h', - 'InjectedScriptNative.cpp', - 'InjectedScriptNative.h', - 'InspectedContext.cpp', - 'InspectedContext.h', - 'JavaScriptCallFrame.cpp', - 'JavaScriptCallFrame.h', - 'PlatformSTL.h', - 'RemoteObjectId.cpp', - 'RemoteObjectId.h', - 'ScriptBreakpoint.h', - 'String16STL.cpp', - 'String16STL.h', - 'V8Console.cpp', - 'V8Console.h', - 'V8ConsoleAgentImpl.cpp', - 'V8ConsoleAgentImpl.h', - 'V8ConsoleMessage.cpp', - 'V8ConsoleMessage.h', - 'V8Debugger.cpp', - 'V8Debugger.h', - 'V8DebuggerAgentImpl.cpp', - 'V8DebuggerAgentImpl.h', - 'V8InspectorImpl.cpp', - 'V8InspectorImpl.h', - 'V8DebuggerScript.cpp', - 'V8DebuggerScript.h', - 'V8FunctionCall.cpp', - 'V8FunctionCall.h', - 'V8HeapProfilerAgentImpl.cpp', - 'V8HeapProfilerAgentImpl.h', - 'V8InjectedScriptHost.cpp', - 'V8InjectedScriptHost.h', - 'V8InspectorSessionImpl.cpp', - 'V8InspectorSessionImpl.h', - 'V8InternalValueType.cpp', - 'V8InternalValueType.h', - 'V8ProfilerAgentImpl.cpp', - 'V8ProfilerAgentImpl.h', - 'V8Regex.cpp', - 'V8Regex.h', - 'V8RuntimeAgentImpl.cpp', - 'V8RuntimeAgentImpl.h', - 'V8SchemaAgentImpl.cpp', - 'V8SchemaAgentImpl.h', - 'V8StackTraceImpl.cpp', - 'V8StackTraceImpl.h', - 'V8StringUtil.cpp', - 'V8StringUtil.h', - 'V8ValueCopier.cpp', - 'V8ValueCopier.h', - 'public/V8ContextInfo.h', - 'public/V8Inspector.h', - 'public/V8InspectorClient.h', - 'public/V8InspectorSession.h', - 'public/V8StackTrace.h', - - '<(blink_platform_output_dir)/v8_inspector/DebuggerScript.h', - '<(blink_platform_output_dir)/v8_inspector/InjectedScriptSource.h', - ], - }, - ], # targets -} diff --git a/node.gyp b/node.gyp index 59bdc0d3a7dfc1..bfdbf927c9eea1 100644 --- a/node.gyp +++ b/node.gyp @@ -314,8 +314,6 @@ [ 'v8_inspector=="true"', { 'defines': [ 'HAVE_INSPECTOR=1', - 'V8_INSPECTOR_USE_STL=1', - 'V8_INSPECTOR_USE_OLD_STL=1', ], 'sources': [ 'src/inspector_agent.cc', @@ -324,13 +322,13 @@ 'src/inspector_agent.h', ], 'dependencies': [ - 'deps/v8_inspector/third_party/v8_inspector/platform/' - 'v8_inspector/v8_inspector.gyp:v8_inspector_stl', + 'deps/v8_inspector/src/inspector/inspector.gyp:standalone_inspector', 'v8_inspector_compress_protocol_json#host', ], 'include_dirs': [ - 'deps/v8_inspector/third_party/v8_inspector', - '<(SHARED_INTERMEDIATE_DIR)/blink', # for inspector + 'deps/v8_inspector/include', + '<(SHARED_INTERMEDIATE_DIR)/include', # for inspector + '<(SHARED_INTERMEDIATE_DIR)', ], }, { 'defines': [ 'HAVE_INSPECTOR=0' ] @@ -666,8 +664,7 @@ 'action_name': 'v8_inspector_compress_protocol_json', 'process_outputs_as_sources': 1, 'inputs': [ - 'deps/v8_inspector/third_party/' - 'v8_inspector/platform/v8_inspector/js_protocol.json', + 'deps/v8_inspector/src/inspector/js_protocol.json', ], 'outputs': [ '<(SHARED_INTERMEDIATE_DIR)/v8_inspector_protocol_json.h', diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index cb20bd702f37d1..7f82b7b0516fa6 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -7,21 +7,17 @@ #include "node_crypto.h" #include "node_mutex.h" #include "node_version.h" +#include "v8-inspector.h" #include "v8-platform.h" #include "util.h" #include "zlib.h" -#include "platform/v8_inspector/public/InspectorVersion.h" -#include "platform/v8_inspector/public/V8Inspector.h" -#include "platform/v8_inspector/public/V8InspectorClient.h" -#include "platform/v8_inspector/public/V8InspectorSession.h" -#include "platform/v8_inspector/public/V8StackTrace.h" -#include "platform/inspector_protocol/InspectorProtocol.h" - #include "libplatform/libplatform.h" #include #include +#include + #include #include #include @@ -31,6 +27,9 @@ namespace node { namespace inspector { namespace { +using v8_inspector::StringBuffer; +using v8_inspector::StringView; + const char TAG_CONNECT[] = "#connect"; const char TAG_DISCONNECT[] = "#disconnect"; @@ -48,10 +47,9 @@ void PrintDebuggerReadyMessage(int port, const std::string& id) { fprintf(stderr, "Debugger listening on port %d.\n" "Warning: This is an experimental feature and could change at any time.\n" "To start debugging, open the following URL in Chrome:\n" - " chrome-devtools://devtools/remote/serve_file/" - "@" V8_INSPECTOR_REVISION "/inspector.html?" + " chrome-devtools://devtools/bundled/inspector.html?" "experiments=true&v8only=true&ws=%s\n", - port, GetWsUrl(port, id).c_str()); + port, GetWsUrl(port, id).c_str()); fflush(stderr); } @@ -170,8 +168,40 @@ std::string GenerateID() { buffer[7]); return uuid; } -} // namespace +std::string StringViewToUtf8(const StringView& view) { + if (view.is8Bit()) { + return std::string(reinterpret_cast(view.characters8()), + view.length()); + } + const uint16_t* source = view.characters16(); + const UChar* unicodeSource = reinterpret_cast(source); + static_assert(sizeof(*source) == sizeof(*unicodeSource), + "sizeof(*source) == sizeof(*unicodeSource)"); + + size_t result_length = view.length() * sizeof(*source); + std::string result(result_length, '\0'); + UnicodeString utf16(unicodeSource, view.length()); + // ICU components for std::string compatibility are not enabled in build... + bool done = false; + while (!done) { + CheckedArrayByteSink sink(&result[0], result_length); + utf16.toUTF8(sink); + result_length = sink.NumberOfBytesAppended(); + result.resize(result_length); + done = !sink.Overflowed(); + } + return result; +} + +std::unique_ptr Utf8ToStringView(const char* source, + size_t length) { + UnicodeString utf16 = UnicodeString::fromUTF8(StringPiece(source, length)); + StringView view(reinterpret_cast(utf16.getBuffer()), + utf16.length()); + return StringBuffer::create(view); +} +} // namespace class V8NodeInspector; @@ -193,7 +223,8 @@ class AgentImpl { v8::Local message); private: - using MessageQueue = std::vector>; + using MessageQueue = + std::vector>>; enum class State { kNew, kAccepting, kConnected, kDone, kError }; static void ThreadCbIO(void* agent); @@ -211,11 +242,11 @@ class AgentImpl { const uv_buf_t* b); void SetConnected(bool connected); void DispatchMessages(); - void Write(int session_id, const String16& message); + void Write(int session_id, const StringView& message); bool AppendMessage(MessageQueue* vector, int session_id, - const String16& message); + std::unique_ptr buffer); void SwapBehindLock(MessageQueue* vector1, MessageQueue* vector2); - void PostIncomingMessage(const String16& message); + void PostIncomingMessage(const char* message, size_t len); void WaitForFrontendMessage(); void NotifyMessageReceived(); State ToState(State state); @@ -279,22 +310,22 @@ class DispatchOnInspectorBackendTask : public v8::Task { AgentImpl* agent_; }; -class ChannelImpl final : public blink::protocol::FrontendChannel { +class ChannelImpl final : public v8_inspector::V8Inspector::Channel { public: explicit ChannelImpl(AgentImpl* agent): agent_(agent) {} virtual ~ChannelImpl() {} private: - void sendProtocolResponse(int callId, const String16& message) override { + void sendProtocolResponse(int callId, const StringView& message) override { sendMessageToFrontend(message); } - void sendProtocolNotification(const String16& message) override { + void sendProtocolNotification(const StringView& message) override { sendMessageToFrontend(message); } void flushProtocolNotifications() override { } - void sendMessageToFrontend(const String16& message) { + void sendMessageToFrontend(const StringView& message) { agent_->Write(agent_->frontend_session_id_, message); } @@ -316,8 +347,10 @@ class V8NodeInspector : public v8_inspector::V8InspectorClient { terminated_(false), running_nested_loop_(false), inspector_(V8Inspector::create(env->isolate(), this)) { - inspector_->contextCreated( - v8_inspector::V8ContextInfo(env->context(), 1, "NodeJS Main Context")); + const uint8_t CONTEXT_NAME[] = "Node.js Main Context"; + StringView context_name(CONTEXT_NAME, sizeof(CONTEXT_NAME) - 1); + v8_inspector::V8ContextInfo info(env->context(), 1, context_name); + inspector_->contextCreated(info); } void runMessageLoopOnPause(int context_group_id) override { @@ -343,14 +376,14 @@ class V8NodeInspector : public v8_inspector::V8InspectorClient { } void connectFrontend() { - session_ = inspector_->connect(1, new ChannelImpl(agent_), nullptr); + session_ = inspector_->connect(1, new ChannelImpl(agent_), StringView()); } void disconnectFrontend() { session_.reset(); } - void dispatchMessageFromFrontend(const String16& message) { + void dispatchMessageFromFrontend(const StringView& message) { CHECK(session_); session_->dispatchProtocolMessage(message); } @@ -530,15 +563,16 @@ void AgentImpl::InstallInspectorOnProcess() { env->SetMethod(inspector, "wrapConsoleCall", InspectorWrapConsoleCall); } -String16 ToProtocolString(v8::Local value) { +std::unique_ptr ToProtocolString(v8::Local value) { if (value.IsEmpty() || value->IsNull() || value->IsUndefined() || !value->IsString()) { - return String16(); + return StringBuffer::create(StringView()); } v8::Local string_value = v8::Local::Cast(value); - std::basic_string buffer(string_value->Length(), '\0'); - string_value->Write(&buffer[0], 0, string_value->Length()); - return String16(buffer); + size_t len = string_value->Length(); + std::basic_string buffer(len, '\0'); + string_value->Write(&buffer[0], 0, len); + return StringBuffer::create(StringView(buffer.data(), len)); } void AgentImpl::FatalException(v8::Local error, @@ -549,23 +583,26 @@ void AgentImpl::FatalException(v8::Local error, v8::Local context = env->context(); int script_id = message->GetScriptOrigin().ScriptID()->Value(); - std::unique_ptr stack_trace = - inspector_->inspector()->createStackTrace(message->GetStackTrace()); - if (stack_trace && !stack_trace->isEmpty() && - String16::fromInteger(script_id) == stack_trace->topScriptId()) { + v8::Local stack_trace = message->GetStackTrace(); + + if (!stack_trace.IsEmpty() && + stack_trace->GetFrameCount() > 0 && + script_id == stack_trace->GetFrame(0)->GetScriptId()) { script_id = 0; } + const uint8_t DETAILS[] = "Uncaught"; + inspector_->inspector()->exceptionThrown( context, - "Uncaught", + StringView(DETAILS, sizeof(DETAILS) - 1), error, - ToProtocolString(message->Get()), - ToProtocolString(message->GetScriptResourceName()), + ToProtocolString(message->Get())->string(), + ToProtocolString(message->GetScriptResourceName())->string(), message->GetLineNumber(context).FromMaybe(0), message->GetStartColumn(context).FromMaybe(0), - std::move(stack_trace), + inspector_->inspector()->createStackTrace(stack_trace), script_id); WaitForDisconnect(); } @@ -614,23 +651,24 @@ void AgentImpl::OnRemoteDataIO(InspectorSocket* socket, ssize_t read, const uv_buf_t* buf) { if (read > 0) { - String16 str = String16::fromUTF8(buf->base, read); // TODO(pfeldman): Instead of blocking execution while debugger // engages, node should wait for the run callback from the remote client // and initiate its startup. This is a change to node.cc that should be // upstreamed separately. - if (wait_&& str.find("\"Runtime.runIfWaitingForDebugger\"") - != std::string::npos) { - wait_ = false; - uv_sem_post(&start_sem_); + if (wait_) { + std::string message(buf->base, read); + if (message.find("\"Runtime.runIfWaitingForDebugger\"") != + std::string::npos) { + wait_ = false; + uv_sem_post(&start_sem_); + } } - PostIncomingMessage(str); + PostIncomingMessage(buf->base, read); } else { // EOF if (client_socket_ == socket) { - String16 message(TAG_DISCONNECT, sizeof(TAG_DISCONNECT) - 1); client_socket_ = nullptr; - PostIncomingMessage(message); + PostIncomingMessage(TAG_DISCONNECT, sizeof(TAG_DISCONNECT) - 1); } DisconnectAndDisposeIO(socket); } @@ -656,8 +694,7 @@ void AgentImpl::SendTargentsListResponse(InspectorSocket* socket) { std::string address = GetWsUrl(port_, id_); std::ostringstream frontend_url; - frontend_url << "https://chrome-devtools-frontend.appspot.com/serve_file/@"; - frontend_url << V8_INSPECTOR_REVISION; + frontend_url << "chrome-devtools://devtools/bundled"; frontend_url << "/inspector.html?experiments=true&v8only=true&ws="; frontend_url << address; @@ -699,8 +736,9 @@ void AgentImpl::WriteCbIO(uv_async_t* async) { agent->SwapBehindLock(&agent->outgoing_message_queue_, &outgoing_messages); for (const MessageQueue::value_type& outgoing : outgoing_messages) { if (outgoing.first == agent->frontend_session_id_) { - std::string message = outgoing.second.utf8(); - inspector_write(socket, message.c_str(), message.length()); + StringView message = outgoing.second->string(); + std::string utf8Message = StringViewToUtf8(message); + inspector_write(socket, utf8Message.c_str(), utf8Message.length()); } } } @@ -752,10 +790,10 @@ void AgentImpl::WorkerRunIO() { } bool AgentImpl::AppendMessage(MessageQueue* queue, int session_id, - const String16& message) { + std::unique_ptr buffer) { Mutex::ScopedLock scoped_lock(state_lock_); bool trigger_pumping = queue->empty(); - queue->push_back(std::make_pair(session_id, message)); + queue->push_back(std::make_pair(session_id, std::move(buffer))); return trigger_pumping; } @@ -764,8 +802,9 @@ void AgentImpl::SwapBehindLock(MessageQueue* vector1, MessageQueue* vector2) { vector1->swap(*vector2); } -void AgentImpl::PostIncomingMessage(const String16& message) { - if (AppendMessage(&incoming_message_queue_, frontend_session_id_, message)) { +void AgentImpl::PostIncomingMessage(const char* message, size_t len) { + if (AppendMessage(&incoming_message_queue_, frontend_session_id_, + Utf8ToStringView(message, len))) { v8::Isolate* isolate = parent_env_->isolate(); platform_->CallOnForegroundThread(isolate, new DispatchOnInspectorBackendTask(this)); @@ -794,7 +833,7 @@ void AgentImpl::OnInspectorConnectionIO(InspectorSocket* socket) { client_socket_ = socket; inspector_read_start(socket, OnBufferAlloc, DataCallback); frontend_session_id_++; - PostIncomingMessage(String16(TAG_CONNECT, sizeof(TAG_CONNECT) - 1)); + PostIncomingMessage(TAG_CONNECT, sizeof(TAG_CONNECT) - 1); } void AgentImpl::DispatchMessages() { @@ -810,14 +849,20 @@ void AgentImpl::DispatchMessages() { tasks.clear(); SwapBehindLock(&incoming_message_queue_, &tasks); for (const MessageQueue::value_type& pair : tasks) { - const String16& message = pair.second; - if (message == TAG_CONNECT) { + StringView message = pair.second->string(); + std::string tag; + if (message.length() == sizeof(TAG_CONNECT) - 1 || + message.length() == sizeof(TAG_DISCONNECT) - 1) { + tag = StringViewToUtf8(message); + } + + if (tag == TAG_CONNECT) { CHECK_EQ(State::kAccepting, state_); backend_session_id_++; state_ = State::kConnected; fprintf(stderr, "Debugger attached.\n"); inspector_->connectFrontend(); - } else if (message == TAG_DISCONNECT) { + } else if (tag == TAG_DISCONNECT) { CHECK_EQ(State::kConnected, state_); if (shutting_down_) { state_ = State::kDone; @@ -836,8 +881,9 @@ void AgentImpl::DispatchMessages() { dispatching_messages_ = false; } -void AgentImpl::Write(int session_id, const String16& message) { - AppendMessage(&outgoing_message_queue_, session_id, message); +void AgentImpl::Write(int session_id, const StringView& inspector_message) { + AppendMessage(&outgoing_message_queue_, session_id, + StringBuffer::create(inspector_message)); int err = uv_async_send(&io_thread_req_); CHECK_EQ(0, err); } diff --git a/test/inspector/test-inspector.js b/test/inspector/test-inspector.js index eba4a0fc05dac2..d3d0bbd55923c1 100644 --- a/test/inspector/test-inspector.js +++ b/test/inspector/test-inspector.js @@ -173,6 +173,26 @@ function testNoUrlsWhenConnected(session) { }); } +function testI18NCharacters(session) { + console.log('[test]', 'Verify sending and receiving UTF8 characters'); + const chars = 'טֶ字и'; + session.sendInspectorCommands([ + { + 'method': 'Debugger.evaluateOnCallFrame', 'params': { + 'callFrameId': '{"ordinal":0,"injectedScriptId":1}', + 'expression': 'console.log("' + chars + '")', + 'objectGroup': 'console', + 'includeCommandLineAPI': true, + 'silent': false, + 'returnByValue': false, + 'generatePreview': true + } + } + ]).expectMessages([ + setupExpectConsoleOutput('log', [chars]), + ]); +} + function testWaitsForFrontendDisconnect(session, harness) { console.log('[test]', 'Verify node waits for the frontend to disconnect'); session.sendInspectorCommands({ 'method': 'Debugger.resume'}) @@ -193,6 +213,7 @@ function runTests(harness) { testBreakpointOnStart, testSetBreakpointAndResume, testInspectScope, + testI18NCharacters, testWaitsForFrontendDisconnect ]).expectShutDown(55); } From fc9e6a37fac7db813277a398cfd12897cb95a492 Mon Sep 17 00:00:00 2001 From: BethGriggs Date: Mon, 24 Oct 2016 23:25:22 +0100 Subject: [PATCH 033/119] test: remove err timer from test-http-set-timeout Removed the errorTimer from test-http-set-timeout.js, as this timer is not necessary to test the setTimeout functionality. Also edited the console.log message on line 8 to log the correct timeout duration. Changed var to const, and added common.mustCall() to on timeout and on error callbacks. Fixes: https://github.com/nodejs/node/issues/9256 PR-URL: https://github.com/nodejs/node/pull/9264 Reviewed-By: Rich Trott Reviewed-By: James M Snell --- test/parallel/test-http-set-timeout.js | 32 +++++++++++--------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/test/parallel/test-http-set-timeout.js b/test/parallel/test-http-set-timeout.js index 08777d30d22570..e8df29e0ccdc67 100644 --- a/test/parallel/test-http-set-timeout.js +++ b/test/parallel/test-http-set-timeout.js @@ -1,32 +1,26 @@ 'use strict'; -var common = require('../common'); -var assert = require('assert'); -var http = require('http'); -var net = require('net'); +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); +const net = require('net'); var server = http.createServer(function(req, res) { - console.log('got request. setting 1 second timeout'); - var s = req.connection.setTimeout(500); - assert.ok(s instanceof net.Socket); - req.connection.on('timeout', function() { + console.log('got request. setting 500ms timeout'); + var socket = req.connection.setTimeout(500); + assert.ok(socket instanceof net.Socket); + req.connection.on('timeout', common.mustCall(function() { req.connection.destroy(); console.error('TIMEOUT'); server.close(); - }); + })); }); server.listen(0, function() { console.log(`Server running at http://127.0.0.1:${this.address().port}/`); - var errorTimer = setTimeout(function() { - throw new Error('Timeout was not successful'); - }, common.platformTimeout(2000)); - - var x = http.get({port: this.address().port, path: '/'}); - x.on('error', function() { - clearTimeout(errorTimer); + var request = http.get({port: this.address().port, path: '/'}); + request.on('error', common.mustCall(function() { console.log('HTTP REQUEST COMPLETE (this is good)'); - }); - x.end(); - + })); + request.end(); }); From f39eb059460cf16774fd6433da6210ef75c6db80 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 24 Oct 2016 22:54:30 +0200 Subject: [PATCH 034/119] test: use strict assertions in module loader test Replace calls to assert.equal() and assert.notEqual() with assert.strictEqual() and assert.strictNotEqual() respectively. PR-URL: https://github.com/nodejs/node/pull/9263 Reviewed-By: Colin Ihrig Reviewed-By: Evan Lucas Reviewed-By: James M Snell Reviewed-By: Rich Trott --- test/sequential/test-module-loading.js | 101 +++++++++++++------------ 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/test/sequential/test-module-loading.js b/test/sequential/test-module-loading.js index d272b1921ba99e..f500700f9dbbb6 100644 --- a/test/sequential/test-module-loading.js +++ b/test/sequential/test-module-loading.js @@ -7,20 +7,20 @@ var fs = require('fs'); console.error('load test-module-loading.js'); // assert that this is the main module. -assert.equal(require.main.id, '.', 'main module should have id of \'.\''); -assert.equal(require.main, module, 'require.main should === module'); -assert.equal(process.mainModule, module, - 'process.mainModule should === module'); +assert.strictEqual(require.main.id, '.', 'main module should have id of \'.\''); +assert.strictEqual(require.main, module, 'require.main should === module'); +assert.strictEqual(process.mainModule, module, + 'process.mainModule should === module'); // assert that it's *not* the main module in the required module. require('../fixtures/not-main-module.js'); // require a file with a request that includes the extension var a_js = require('../fixtures/a.js'); -assert.equal(42, a_js.number); +assert.strictEqual(42, a_js.number); // require a file without any extensions var foo_no_ext = require('../fixtures/foo'); -assert.equal('ok', foo_no_ext.foo); +assert.strictEqual('ok', foo_no_ext.foo); var a = require('../fixtures/a'); var c = require('../fixtures/b/c'); @@ -31,56 +31,56 @@ var d3 = require(path.join(__dirname, '../fixtures/b/d')); // Relative var d4 = require('../fixtures/b/d'); -assert.equal(false, false, 'testing the test program.'); +assert.strictEqual(false, false, 'testing the test program.'); assert.ok(a.A instanceof Function); -assert.equal('A', a.A()); +assert.strictEqual('A', a.A()); assert.ok(a.C instanceof Function); -assert.equal('C', a.C()); +assert.strictEqual('C', a.C()); assert.ok(a.D instanceof Function); -assert.equal('D', a.D()); +assert.strictEqual('D', a.D()); assert.ok(d.D instanceof Function); -assert.equal('D', d.D()); +assert.strictEqual('D', d.D()); assert.ok(d2.D instanceof Function); -assert.equal('D', d2.D()); +assert.strictEqual('D', d2.D()); assert.ok(d3.D instanceof Function); -assert.equal('D', d3.D()); +assert.strictEqual('D', d3.D()); assert.ok(d4.D instanceof Function); -assert.equal('D', d4.D()); +assert.strictEqual('D', d4.D()); assert.ok((new a.SomeClass()) instanceof c.SomeClass); console.error('test index.js modules ids and relative loading'); const one = require('../fixtures/nested-index/one'); const two = require('../fixtures/nested-index/two'); -assert.notEqual(one.hello, two.hello); +assert.notStrictEqual(one.hello, two.hello); console.error('test index.js in a folder with a trailing slash'); const three = require('../fixtures/nested-index/three'); const threeFolder = require('../fixtures/nested-index/three/'); const threeIndex = require('../fixtures/nested-index/three/index.js'); -assert.equal(threeFolder, threeIndex); -assert.notEqual(threeFolder, three); +assert.strictEqual(threeFolder, threeIndex); +assert.notStrictEqual(threeFolder, three); console.error('test package.json require() loading'); -assert.equal(require('../fixtures/packages/index').ok, 'ok', - 'Failed loading package'); -assert.equal(require('../fixtures/packages/main').ok, 'ok', - 'Failed loading package'); -assert.equal(require('../fixtures/packages/main-index').ok, 'ok', - 'Failed loading package with index.js in main subdir'); +assert.strictEqual(require('../fixtures/packages/index').ok, 'ok', + 'Failed loading package'); +assert.strictEqual(require('../fixtures/packages/main').ok, 'ok', + 'Failed loading package'); +assert.strictEqual(require('../fixtures/packages/main-index').ok, 'ok', + 'Failed loading package with index.js in main subdir'); console.error('test cycles containing a .. path'); const root = require('../fixtures/cycles/root'); const foo = require('../fixtures/cycles/folder/foo'); -assert.equal(root.foo, foo); -assert.equal(root.sayHello(), root.hello); +assert.strictEqual(root.foo, foo); +assert.strictEqual(root.sayHello(), root.hello); console.error('test node_modules folders'); // asserts are in the fixtures files themselves, @@ -99,23 +99,24 @@ try { require('../fixtures/throws_error'); } catch (e) { errorThrown = true; - assert.equal('blah', e.message); + assert.strictEqual('blah', e.message); } -assert.equal(require('path').dirname(__filename), __dirname); +assert.strictEqual(require('path').dirname(__filename), __dirname); console.error('load custom file types with extensions'); require.extensions['.test'] = function(module, filename) { var content = fs.readFileSync(filename).toString(); - assert.equal('this is custom source\n', content); + assert.strictEqual('this is custom source\n', content); content = content.replace('this is custom source', 'exports.test = \'passed\''); module._compile(content, filename); }; -assert.equal(require('../fixtures/registerExt').test, 'passed'); +assert.strictEqual(require('../fixtures/registerExt').test, 'passed'); // unknown extension, load as .js -assert.equal(require('../fixtures/registerExt.hello.world').test, 'passed'); +assert.strictEqual(require('../fixtures/registerExt.hello.world').test, + 'passed'); console.error('load custom file types that return non-strings'); require.extensions['.test'] = function(module, filename) { @@ -124,16 +125,16 @@ require.extensions['.test'] = function(module, filename) { }; }; -assert.equal(require('../fixtures/registerExt2').custom, 'passed'); +assert.strictEqual(require('../fixtures/registerExt2').custom, 'passed'); -assert.equal(require('../fixtures/foo').foo, 'ok', - 'require module with no extension'); +assert.strictEqual(require('../fixtures/foo').foo, 'ok', + 'require module with no extension'); // Should not attempt to load a directory try { require('../fixtures/empty'); } catch (err) { - assert.equal(err.message, 'Cannot find module \'../fixtures/empty\''); + assert.strictEqual(err.message, 'Cannot find module \'../fixtures/empty\''); } // Check load order is as expected @@ -145,31 +146,31 @@ const msg = 'Load order incorrect.'; require.extensions['.reg'] = require.extensions['.js']; require.extensions['.reg2'] = require.extensions['.js']; -assert.equal(require(loadOrder + 'file1').file1, 'file1', msg); -assert.equal(require(loadOrder + 'file2').file2, 'file2.js', msg); +assert.strictEqual(require(loadOrder + 'file1').file1, 'file1', msg); +assert.strictEqual(require(loadOrder + 'file2').file2, 'file2.js', msg); try { require(loadOrder + 'file3'); } catch (e) { // Not a real .node module, but we know we require'd the right thing. assert.ok(e.message.replace(/\\/g, '/').match(/file3\.node/)); } -assert.equal(require(loadOrder + 'file4').file4, 'file4.reg', msg); -assert.equal(require(loadOrder + 'file5').file5, 'file5.reg2', msg); -assert.equal(require(loadOrder + 'file6').file6, 'file6/index.js', msg); +assert.strictEqual(require(loadOrder + 'file4').file4, 'file4.reg', msg); +assert.strictEqual(require(loadOrder + 'file5').file5, 'file5.reg2', msg); +assert.strictEqual(require(loadOrder + 'file6').file6, 'file6/index.js', msg); try { require(loadOrder + 'file7'); } catch (e) { assert.ok(e.message.replace(/\\/g, '/').match(/file7\/index\.node/)); } -assert.equal(require(loadOrder + 'file8').file8, 'file8/index.reg', msg); -assert.equal(require(loadOrder + 'file9').file9, 'file9/index.reg2', msg); +assert.strictEqual(require(loadOrder + 'file8').file8, 'file8/index.reg', msg); +assert.strictEqual(require(loadOrder + 'file9').file9, 'file9/index.reg2', msg); // make sure that module.require() is the same as // doing require() inside of that module. var parent = require('../fixtures/module-require/parent/'); var child = require('../fixtures/module-require/child/'); -assert.equal(child.loaded, parent.loaded); +assert.strictEqual(child.loaded, parent.loaded); // #1357 Loading JSON files with require() @@ -259,29 +260,29 @@ assert.throws(function() { process.on('exit', function() { assert.ok(a.A instanceof Function); - assert.equal('A done', a.A()); + assert.strictEqual('A done', a.A()); assert.ok(a.C instanceof Function); - assert.equal('C done', a.C()); + assert.strictEqual('C done', a.C()); assert.ok(a.D instanceof Function); - assert.equal('D done', a.D()); + assert.strictEqual('D done', a.D()); assert.ok(d.D instanceof Function); - assert.equal('D done', d.D()); + assert.strictEqual('D done', d.D()); assert.ok(d2.D instanceof Function); - assert.equal('D done', d2.D()); + assert.strictEqual('D done', d2.D()); - assert.equal(true, errorThrown); + assert.strictEqual(true, errorThrown); console.log('exit'); }); // #1440 Loading files with a byte order marker. -assert.equal(42, require('../fixtures/utf8-bom.js')); -assert.equal(42, require('../fixtures/utf8-bom.json')); +assert.strictEqual(42, require('../fixtures/utf8-bom.js')); +assert.strictEqual(42, require('../fixtures/utf8-bom.json')); // Error on the first line of a module should // have the correct line number From bdad1e28fd324f42ec646a8a156c0c0a61509d38 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 23 Oct 2016 22:00:37 -0700 Subject: [PATCH 035/119] tools: make --repeat work with -j in test.py The repeat option in test.py did not work as expected if `-j` was set to more than one. Repeated tests running at the same time could share temp directories and cause test failures. This was observed with: tools/test.py -J --repeat=10 parallel/test-fs-watch-recursive By using copy.deepCopy(), the repeated tests are separate objects and not references to the same objects. Setting `thread_id` on one of them will now not change the `thread_id` on all of them. And `thread_id` is how the temp directory (and common.PORT as well) are determined. Refs: https://github.com/nodejs/node/pull/9228 PR-URL: https://github.com/nodejs/node/pull/9249 Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Gibson Fahnestock Reviewed-By: Michael Dawson Reviewed-By: James M Snell Reviewed-By: Santiago Gimeno --- tools/test.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/test.py b/tools/test.py index b543010990c364..d57988f24d608e 100755 --- a/tools/test.py +++ b/tools/test.py @@ -42,6 +42,7 @@ import utils import multiprocessing import errno +import copy from os.path import join, dirname, abspath, basename, isdir, exists from datetime import datetime @@ -773,7 +774,9 @@ def AddTestsToList(self, result, current_path, path, context, arch, mode): tests = self.GetConfiguration(context).ListTests(current_path, path, arch, mode) for t in tests: t.variant_flags = v - result += tests * context.repeat + result += tests + for i in range(1, context.repeat): + result += copy.deepcopy(tests) def GetTestStatus(self, context, sections, defs): self.GetConfiguration(context).GetTestStatus(sections, defs) From 2ad81ed0e635649fdc8a0c3095276d17c6e62cee Mon Sep 17 00:00:00 2001 From: Deverick Date: Thu, 20 Oct 2016 23:32:34 -0500 Subject: [PATCH 036/119] test: refactor /parallel/test-cluster-uncaught-exception.js to ES6 Replaces function expressions with ES6 arrow functions as well as improve the comparison operator to check if operands are of same types. PR-URL: https://github.com/nodejs/node/pull/9239 Reviewed-By: James M Snell Reviewed-By: Rich Trott --- .../test-cluster-uncaught-exception.js | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/test/parallel/test-cluster-uncaught-exception.js b/test/parallel/test-cluster-uncaught-exception.js index 1091b6fec759a1..69d0a3095e7368 100644 --- a/test/parallel/test-cluster-uncaught-exception.js +++ b/test/parallel/test-cluster-uncaught-exception.js @@ -4,26 +4,23 @@ // https://github.com/joyent/node/issues/2556 const common = require('../common'); -var assert = require('assert'); -var cluster = require('cluster'); -var fork = require('child_process').fork; +const assert = require('assert'); +const cluster = require('cluster'); +const fork = require('child_process').fork; -var MAGIC_EXIT_CODE = 42; +const MAGIC_EXIT_CODE = 42; -var isTestRunner = process.argv[2] != 'child'; +const isTestRunner = process.argv[2] !== 'child'; if (isTestRunner) { - var master = fork(__filename, ['child']); - master.on('exit', common.mustCall(function(code) { + const master = fork(__filename, ['child']); + master.on('exit', common.mustCall((code) => { assert.strictEqual(code, MAGIC_EXIT_CODE); })); } else if (cluster.isMaster) { - process.on('uncaughtException', function() { - process.nextTick(function() { - process.exit(MAGIC_EXIT_CODE); - }); - }); - + process.on('uncaughtException', common.mustCall(() => { + process.nextTick(() => process.exit(MAGIC_EXIT_CODE)); + })); cluster.fork(); throw new Error('kill master'); } else { // worker From d2e7882723fa892096d9a473e17dfcbdcb1d84c4 Mon Sep 17 00:00:00 2001 From: Josh Gavant Date: Wed, 19 Oct 2016 13:48:31 -0700 Subject: [PATCH 037/119] doc: add 2016-10-19 CTC meeting minutes PR-URL: https://github.com/nodejs/node/pull/9193 Reviewed-By: Rich Trott Reviewed-By: Michael Dawson Reviewed-By: James M Snell --- doc/ctc-meetings/2016-10-19.md | 202 +++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 doc/ctc-meetings/2016-10-19.md diff --git a/doc/ctc-meetings/2016-10-19.md b/doc/ctc-meetings/2016-10-19.md new file mode 100644 index 00000000000000..8fbaa1dfa906d6 --- /dev/null +++ b/doc/ctc-meetings/2016-10-19.md @@ -0,0 +1,202 @@ +# Node Foundation CTC Meeting 2016-10-19 + +## Links + +* **Audio Recording**: TBP +* **GitHub Issue**: [#9143](https://github.com/nodejs/node/issues/9143) +* **Minutes Google Doc**: +* _Previous Minutes Google Doc: _ + +## Present + +* Bradley Meck @bmeck (observer/GoDaddy/TC39) +* Colin Ihrig @cjihrig (CTC) +* Evan Lucas @evanlucas (CTC) +* James M Snell @jasnell (CTC) +* Josh Gavant @joshgav (observer/Microsoft) +* Michael Dawson @mhdawson (CTC) +* Julien Gilli @misterdjules (CTC) +* Mikeal Rogers @mikeal (observer/Node.js Foundation) +* Brian White @mscdex (CTC) +* Ali Ijaz Sheikh @ofrobots (CTC) +* Jenn Turner @renrutnnej (observer/Node.js Foundation) +* Steven R. Loomis @srl295 (observer) +* Sakthipriyan Vairamani @thefourtheye (observer) +* Trevor Norris @trevnorris (CTC) +* Rich Trott @Trott (CTC) + +## Standup + +* Bradley Meck @bmeck (observer/GoDaddy/TC39) + * Vacation, work on import changes for ES spec +* Colin Ihrig @cjihrig (CTC) + * Reviewed issues and PRs. Revisited an old PR. +* Evan Lucas @evanlucas (CTC) + * cut v6.8.1 release + * opened small doc PR + * issue/pr review +* James M Snell @jasnell (CTC) + * Preparing v7.0.0 release + * HTTP/2 implementation + * PRs +* Josh Gavant @joshgav (observer/Microsoft) + * PR’s to improve user experience with new debugger + * investigating how to integrate guides with API docs + * off this week +* Michael Dawson @mhdawson (CTC) + * couple days vacation + * Added code coverage nightly job and PR for doc + * misc issue review/comment/lands + * Some Abi stable node discussion/work + * A number of benchmarking issues to look at +* Julien Gilli @misterdjules (CTC) + * nothing too significant +* Mikeal Rogers @mikeal (observer/Node.js Foundation) + * Putting together bugeting stuff +* Brian White @mscdex (CTC) + * Continued work on improving string encoding/decoding + performance. + * Commented on issues, reviewed PRs. +* Ali Ijaz Sheikh @ofrobots (CTC) + * Some V8 backport triage. Not much else notable. +* Jenn Turner @renrutnnej (observer/Node.js Foundation) + * Just observing, no update +* Steven R. Loomis @srl295 (observer) + * ICU 58 going GA end of week so will submit PR to update - [#7844](https://github.com/nodejs/node/issues/7844) + * Backported break iterator fix to v4.x [#9008](https://github.com/nodejs/node/pull/9008) +* Sakthipriyan Vairamani @thefourtheye (observer) + * mostly PR reviews +* Trevor Norris @trevnorris (CTC) + * Worked with Matt Loring, proposed promise hooks api is + sufficient combined with debugger API. +* Rich Trott @Trott (CTC) + * Outreachy + * flaky tests + * linting tools and rules + +--- + +## Agenda + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + +### nodejs/node + +* doc: add ctc-review label information [#9072](https://github.com/nodejs/node/pull/9072) @Trott +* http: improve invalid character in header error message [#9010](https://github.com/nodejs/node/pull/9010) @evanlucas +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) @jasnell + +### nodejs/TSC + +* Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) @rvagg + + +--- + +## Previous Meeting Review + +### nodejs/node + +* governance: expand use of CTC issue tracker [#8945](https://github.com/nodejs/node/pull/8945) + + * Finalize through GitHub discussions. + * Consider `ctc-review` label (#9072). + +* doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) + + * Complete, remove from agenda. + +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + + * Back to GitHub for further discussion. + +### nodejs/TSC + +* Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) + +--- + +## Minutes + +### doc: add ctc-review label information [#9072](https://github.com/nodejs/node/pull/9072) @Trott + +@trott: Has landed. If any objections speak now. Goal is more resolutions within tracker, less in meetings. + +--- + +### http: improve invalid character in header error message [#9010](https://github.com/nodejs/node/pull/9010) @evanlucas + +@evanlucas: Concerns about this leading to an information leak, because header name is displayed. + +Would like to land this for v7. Would have to be merged today. + +@trott: Question is if people are uncomfortable moving forward now before information from @Chalker is available. + +@mhdawson: Seems there are already some hits (problems). + +@evanlucas: Package `http-node` had problems, seems they copied `_http_outgoing.js`. + +@evanlucas: Perhaps we can just add a debug message, that would not be semver-major. + +@mhdawson: Seems better to do that than introduce a semver-major change this late. + +@evanlucas: That seems fine, as long as we can get the needed info. + +@trott: So land the debug message now, perhaps land standard output in v8.x. + +**Next steps**: + +* Create new PR with debug-based message, defer including in stderr/stdout till v8.x. + +--- + +### net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) @jasnell + +@jasnell: Question is whether to land in v7.x. If so please take it up today! + +--- + +### Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) @rvagg + +@trott: Mainly to bring this to people’s attention, continue conversation in tracker. + +--- + +### Info text in `--inspect` output [#8978](https://github.com/nodejs/node/pull/8978) + +@joshgav: Should we land this for v7.x? + +@trott: Is this a semver-major change? + +@jasnell: No, especially cause this is an experimental feature. + +@evanlucas: I’d prefer to wait till Chrome automatically lists Node.js targets via chrome://inspect, which is 55. + +@ofrobots: No urgency to land this change now and it will make it harder to get started. + +@mhdawson: Agreed, no urgency to land this before v7.x. + +@joshgav: So I’ll update PR to include generic URL but not remove the chrome-devtools URL for now. + +**Next steps**: + +* Josh to update PR to still include chrome-devtools URL. +* Consider removing chrome-devtools URL when 55 is released (early December). + +--- + +## Q/A on public channels + + +--- + +## Upcoming Meetings + +* CTC: 2016-10-26, 9am Pacific +* TSC: 2016-10-20, 1pm Pacific +* Build: 2016-10-24 (?) +* Diagnostics: first week of November +* Benchmarking: +* LTS: +* Post-Mortem: +* API: From 82119049efbe773be572a06f2cfb6b291407030e Mon Sep 17 00:00:00 2001 From: anu0012 Date: Tue, 18 Oct 2016 07:33:10 +0530 Subject: [PATCH 038/119] doc: fix typo in http.md PR-URL: https://github.com/nodejs/node/pull/9144 Reviewed-By: Anna Henningsen Reviewed-By: Luigi Pinca Reviewed-By: James M Snell Reviewed-By: Brian White --- doc/api/http.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/http.md b/doc/api/http.md index 8ea664f799ba9d..3b3b93525709af 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -289,7 +289,7 @@ Emitted each time a server responds to a request with a `CONNECT` method. If thi event isn't being listened for, clients receiving a `CONNECT` method will have their connections closed. -A client server pair that show you how to listen for the `'connect'` event. +A client and server pair that shows you how to listen for the `'connect'` event: ```js const http = require('http'); From 1c59cefc44709159343ac6ef76c9a09603934be9 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Thu, 20 Oct 2016 16:47:33 +0200 Subject: [PATCH 039/119] repl: make `key` of `repl.write()` optional always MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In `.editor` mode, `repl.write()` would have crashed when the `key` argument was not present, because the overwritten `_ttyWrite` of REPLs doesn’t check for the absence of a second argument like `readline.write()` does. Since the docs indicate that the argument is optional, add a check paralleling the one in `readline.write()`. PR-URL: https://github.com/nodejs/node/pull/9207 Reviewed-By: Prince John Wesley Reviewed-By: James M Snell --- lib/repl.js | 1 + test/parallel/test-repl-.editor.js | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/repl.js b/lib/repl.js index 470b42a0b7a94f..399bcba979660d 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -601,6 +601,7 @@ function REPLServer(prompt, // Wrap readline tty to enable editor mode const ttyWrite = self._ttyWrite.bind(self); self._ttyWrite = (d, key) => { + key = key || {}; if (!self.editorMode || !self.terminal) { ttyWrite(d, key); return; diff --git a/test/parallel/test-repl-.editor.js b/test/parallel/test-repl-.editor.js index 556662181f7831..4077840c596376 100644 --- a/test/parallel/test-repl-.editor.js +++ b/test/parallel/test-repl-.editor.js @@ -8,16 +8,17 @@ const repl = require('repl'); // \u001b[0J - Clear screen // \u001b[3G - Moves the cursor to 3rd column const terminalCode = '\u001b[1G\u001b[0J> \u001b[3G'; +const terminalCodeRegex = new RegExp(terminalCode.replace(/\[/g, '\\['), 'g'); -function run({input, output, event}) { +function run({input, output, event, checkTerminalCodes = true}) { const stream = new common.ArrayStream(); let found = ''; stream.write = (msg) => found += msg.replace('\r', ''); - const expected = `${terminalCode}.editor\n` + - '// Entering editor mode (^D to finish, ^C to cancel)\n' + - `${input}${output}\n${terminalCode}`; + let expected = `${terminalCode}.editor\n` + + '// Entering editor mode (^D to finish, ^C to cancel)\n' + + `${input}${output}\n${terminalCode}`; const replServer = repl.start({ prompt: '> ', @@ -31,6 +32,12 @@ function run({input, output, event}) { stream.emit('data', input); replServer.write('', event); replServer.close(); + + if (!checkTerminalCodes) { + found = found.replace(terminalCodeRegex, '').replace(/\n/g, ''); + expected = expected.replace(terminalCodeRegex, '').replace(/\n/g, ''); + } + assert.strictEqual(found, expected); } @@ -54,6 +61,12 @@ const tests = [ input: ' var i = 1;\ni + 3', output: '\n4', event: {ctrl: true, name: 'd'} + }, + { + input: '', + output: '', + checkTerminalCodes: false, + event: null, } ]; From 0b9d80a037fa865d7bcdef4a5247f1bbb0d90211 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Thu, 20 Oct 2016 16:57:40 +0200 Subject: [PATCH 040/119] =?UTF-8?q?repl:=20don=E2=80=99t=20write=20to=20in?= =?UTF-8?q?put=20stream=20in=20editor=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of writing to the REPL’s input stream for the alignment spaces in `.editor` mode, let `readline` handle the spaces properly (echoing them using `_ttyWrite` and adding them to the current line buffer). Fixes: https://github.com/nodejs/node/issues/9189 PR-URL: https://github.com/nodejs/node/pull/9207 Reviewed-By: Prince John Wesley Reviewed-By: James M Snell --- lib/repl.js | 2 +- test/parallel/test-repl-.editor.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/repl.js b/lib/repl.js index 399bcba979660d..cac79c5e2188f3 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -476,7 +476,7 @@ function REPLServer(prompt, const matches = self._sawKeyPress ? cmd.match(/^\s+/) : null; if (matches) { const prefix = matches[0]; - self.inputStream.write(prefix); + self.write(prefix); self.line = prefix; self.cursor = prefix.length; } diff --git a/test/parallel/test-repl-.editor.js b/test/parallel/test-repl-.editor.js index 4077840c596376..678d6d5c6d94f8 100644 --- a/test/parallel/test-repl-.editor.js +++ b/test/parallel/test-repl-.editor.js @@ -75,12 +75,15 @@ tests.forEach(run); // Auto code alignment for .editor mode function testCodeAligment({input, cursor = 0, line = ''}) { const stream = new common.ArrayStream(); + const outputStream = new common.ArrayStream(); + + stream.write = () => { throw new Error('Writing not allowed!'); }; const replServer = repl.start({ prompt: '> ', terminal: true, input: stream, - output: stream, + output: outputStream, useColors: false }); From 4f0596fb0300d77d7ba1c870728d936ea6929397 Mon Sep 17 00:00:00 2001 From: Alejandro Oviedo Garcia Date: Mon, 17 Oct 2016 14:16:04 -0300 Subject: [PATCH 041/119] util: use template strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit changes string manipulation in favor of template literals in the `util` module. PR-URL: https://github.com/nodejs/node/pull/9120 Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Luigi Pinca --- lib/util.js | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/lib/util.js b/lib/util.js index edec19bf791ce3..95c69248e07282 100644 --- a/lib/util.js +++ b/lib/util.js @@ -144,7 +144,7 @@ exports.debuglog = function(set) { debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + if (new RegExp(`\\b${set}\\b`, 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); @@ -239,8 +239,8 @@ function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; + return `\u001b[${inspect.colors[style][0]}m${str}` + + `\u001b[${inspect.colors[style][1]}m`; } else { return str; } @@ -402,8 +402,8 @@ function formatValue(ctx, value, recurseTimes) { // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (typeof value === 'function') { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); + return ctx.stylize(`[Function${value.name ? `: ${value.name}` : ''}]`, + 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); @@ -421,19 +421,19 @@ function formatValue(ctx, value, recurseTimes) { // now check the `raw` value to handle boxed primitives if (typeof raw === 'string') { formatted = formatPrimitiveNoColor(ctx, raw); - return ctx.stylize('[String: ' + formatted + ']', 'string'); + return ctx.stylize(`[String: ${formatted}]`, 'string'); } if (typeof raw === 'symbol') { formatted = formatPrimitiveNoColor(ctx, raw); - return ctx.stylize('[Symbol: ' + formatted + ']', 'symbol'); + return ctx.stylize(`[Symbol: ${formatted}]`, 'symbol'); } if (typeof raw === 'number') { formatted = formatPrimitiveNoColor(ctx, raw); - return ctx.stylize('[Number: ' + formatted + ']', 'number'); + return ctx.stylize(`[Number: ${formatted}]`, 'number'); } if (typeof raw === 'boolean') { formatted = formatPrimitiveNoColor(ctx, raw); - return ctx.stylize('[Boolean: ' + formatted + ']', 'boolean'); + return ctx.stylize(`[Boolean: ${formatted}]`, 'boolean'); } // Fast path for ArrayBuffer and SharedArrayBuffer. // Can't do the same for DataView because it has a non-primitive @@ -535,8 +535,7 @@ function formatValue(ctx, value, recurseTimes) { // Make functions say that they are functions if (typeof value === 'function') { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; + base = ` [Function${value.name ? `: ${value.name}` : ''}]`; } // Make RegExps say that they are RegExps @@ -557,24 +556,24 @@ function formatValue(ctx, value, recurseTimes) { // Make boxed primitive Strings look like such if (typeof raw === 'string') { formatted = formatPrimitiveNoColor(ctx, raw); - base = ' ' + '[String: ' + formatted + ']'; + base = ` [String: ${formatted}]`; } // Make boxed primitive Numbers look like such if (typeof raw === 'number') { formatted = formatPrimitiveNoColor(ctx, raw); - base = ' ' + '[Number: ' + formatted + ']'; + base = ` [Number: ${formatted}]`; } // Make boxed primitive Booleans look like such if (typeof raw === 'boolean') { formatted = formatPrimitiveNoColor(ctx, raw); - base = ' ' + '[Boolean: ' + formatted + ']'; + base = ` [Boolean: ${formatted}]`; } // Add constructor name if available if (base === '' && constructor) - braces[0] = constructor.name + ' ' + braces[0]; + braces[0] = `${constructor.name} ${braces[0]}`; if (empty === true) { return braces[0] + base + braces[1]; @@ -646,7 +645,7 @@ function formatPrimitiveNoColor(ctx, value) { function formatError(value) { - return value.stack || '[' + Error.prototype.toString.call(value) + ']'; + return value.stack || `[${Error.prototype.toString.call(value)}]`; } @@ -782,9 +781,9 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { } if (!hasOwnProperty(visibleKeys, key)) { if (typeof key === 'symbol') { - name = '[' + ctx.stylize(key.toString(), 'symbol') + ']'; + name = `[${ctx.stylize(key.toString(), 'symbol')}]`; } else { - name = '[' + key + ']'; + name = `[${key}]`; } } if (!str) { @@ -822,7 +821,7 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { } } - return name + ': ' + str; + return `${name}: ${str}`; } @@ -837,13 +836,10 @@ function reduceToSingleString(output, base, braces, breakLength) { // we need to force the first item to be on the next line or the // items will not line up correctly. (base === '' && braces[0].length === 1 ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; + ` ${output.join(',\n ')} ${braces[1]}`; } - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + return `${braces[0]}${base} ${output.join(', ')} ${braces[1]}`; } @@ -1007,7 +1003,7 @@ exports.puts = internalUtil.deprecate(function() { exports.debug = internalUtil.deprecate(function(x) { - process.stderr.write('DEBUG: ' + x + '\n'); + process.stderr.write(`DEBUG: ${x}\n`); }, 'util.debug is deprecated. Use console.error instead.'); @@ -1020,7 +1016,7 @@ exports.error = internalUtil.deprecate(function(x) { exports._errnoException = function(err, syscall, original) { var errname = uv.errname(err); - var message = syscall + ' ' + errname; + var message = `${syscall} ${errname}`; if (original) message += ' ' + original; var e = new Error(message); @@ -1038,13 +1034,13 @@ exports._exceptionWithHostPort = function(err, additional) { var details; if (port && port > 0) { - details = address + ':' + port; + details = `${address}:${port}`; } else { details = address; } if (additional) { - details += ' - Local (' + additional + ')'; + details += ` - Local (${additional})`; } var ex = exports._errnoException(err, syscall, details); ex.address = address; From 3f90481e20210f37b44bb45304666dd5b655fb0f Mon Sep 17 00:00:00 2001 From: marzelin Date: Tue, 11 Oct 2016 16:18:57 +0200 Subject: [PATCH 042/119] doc: clarify relation between a file and a module PR-URL: https://github.com/nodejs/node/pull/9026 Reviewed-By: Gibson Fahnestock Reviewed-By: Luigi Pinca Reviewed-By: James M Snell --- doc/api/modules.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/api/modules.md b/doc/api/modules.md index 8de7071fe03082..66ac1ce22c2bca 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -4,9 +4,9 @@ -Node.js has a simple module loading system. In Node.js, files and modules are -in one-to-one correspondence. As an example, `foo.js` loads the module -`circle.js` in the same directory. +Node.js has a simple module loading system. In Node.js, files and modules +are in one-to-one correspondence (each file is treated as a separate module). +As an example, `foo.js` loads the module `circle.js` in the same directory. The contents of `foo.js`: From 0ce0abf6cb4cb9066c52e4338dc5fa35267033f7 Mon Sep 17 00:00:00 2001 From: jseagull Date: Mon, 10 Oct 2016 18:47:07 +0800 Subject: [PATCH 043/119] events,test: fix TypeError in EventEmitter warning Allows Symbol to be converted to String so it can be included in the error. Fixes: https://github.com/nodejs/node/issues/9003 PR-URL: https://github.com/nodejs/node/pull/9021 Reviewed-By: Rich Trott Reviewed-By: Luigi Pinca Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Santiago Gimeno --- lib/events.js | 5 ++-- ...test-event-emitter-check-listener-leaks.js | 12 ++++++++-- ...-emitter-max-listeners-warning-for-null.js | 22 +++++++++++++++++ ...mitter-max-listeners-warning-for-symbol.js | 24 +++++++++++++++++++ ...est-event-emitter-max-listeners-warning.js | 1 + 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 test/parallel/test-event-emitter-max-listeners-warning-for-null.js create mode 100644 test/parallel/test-event-emitter-max-listeners-warning-for-symbol.js diff --git a/lib/events.js b/lib/events.js index d676580df3398f..da2dc599cacc32 100644 --- a/lib/events.js +++ b/lib/events.js @@ -257,8 +257,9 @@ function _addListener(target, type, listener, prepend) { if (m && m > 0 && existing.length > m) { existing.warned = true; const w = new Error('Possible EventEmitter memory leak detected. ' + - `${existing.length} ${type} listeners added. ` + - 'Use emitter.setMaxListeners() to increase limit'); + `${existing.length} ${String(type)} listeners ` + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit'); w.name = 'MaxListenersExceededWarning'; w.emitter = target; w.type = type; diff --git a/test/parallel/test-event-emitter-check-listener-leaks.js b/test/parallel/test-event-emitter-check-listener-leaks.js index 1e357cd027d0f5..18d2d065b8b1f4 100644 --- a/test/parallel/test-event-emitter-check-listener-leaks.js +++ b/test/parallel/test-event-emitter-check-listener-leaks.js @@ -1,7 +1,7 @@ 'use strict'; require('../common'); -var assert = require('assert'); -var events = require('events'); +const assert = require('assert'); +const events = require('events'); var e = new events.EventEmitter(); @@ -13,6 +13,14 @@ assert.ok(!e._events['default'].hasOwnProperty('warned')); e.on('default', function() {}); assert.ok(e._events['default'].warned); +// symbol +const symbol = Symbol('symbol'); +e.setMaxListeners(1); +e.on(symbol, function() {}); +assert.ok(!e._events[symbol].hasOwnProperty('warned')); +e.on(symbol, function() {}); +assert.ok(e._events[symbol].hasOwnProperty('warned')); + // specific e.setMaxListeners(5); for (let i = 0; i < 5; i++) { diff --git a/test/parallel/test-event-emitter-max-listeners-warning-for-null.js b/test/parallel/test-event-emitter-max-listeners-warning-for-null.js new file mode 100644 index 00000000000000..3a31150657b430 --- /dev/null +++ b/test/parallel/test-event-emitter-max-listeners-warning-for-null.js @@ -0,0 +1,22 @@ +// Flags: --no-warnings +// The flag suppresses stderr output but the warning event will still emit +'use strict'; + +const common = require('../common'); +const events = require('events'); +const assert = require('assert'); + +const e = new events.EventEmitter(); +e.setMaxListeners(1); + +process.on('warning', common.mustCall((warning) => { + assert.ok(warning instanceof Error); + assert.strictEqual(warning.name, 'MaxListenersExceededWarning'); + assert.strictEqual(warning.emitter, e); + assert.strictEqual(warning.count, 2); + assert.strictEqual(warning.type, null); + assert.ok(warning.message.includes('2 null listeners added.')); +})); + +e.on(null, function() {}); +e.on(null, function() {}); diff --git a/test/parallel/test-event-emitter-max-listeners-warning-for-symbol.js b/test/parallel/test-event-emitter-max-listeners-warning-for-symbol.js new file mode 100644 index 00000000000000..fc0a3dba0eff23 --- /dev/null +++ b/test/parallel/test-event-emitter-max-listeners-warning-for-symbol.js @@ -0,0 +1,24 @@ +// Flags: --no-warnings +// The flag suppresses stderr output but the warning event will still emit +'use strict'; + +const common = require('../common'); +const events = require('events'); +const assert = require('assert'); + +const symbol = Symbol('symbol'); + +const e = new events.EventEmitter(); +e.setMaxListeners(1); + +process.on('warning', common.mustCall((warning) => { + assert.ok(warning instanceof Error); + assert.strictEqual(warning.name, 'MaxListenersExceededWarning'); + assert.strictEqual(warning.emitter, e); + assert.strictEqual(warning.count, 2); + assert.strictEqual(warning.type, symbol); + assert.ok(warning.message.includes('2 Symbol(symbol) listeners added.')); +})); + +e.on(symbol, function() {}); +e.on(symbol, function() {}); diff --git a/test/parallel/test-event-emitter-max-listeners-warning.js b/test/parallel/test-event-emitter-max-listeners-warning.js index 717315cf6329f1..168ed02f19d1f3 100644 --- a/test/parallel/test-event-emitter-max-listeners-warning.js +++ b/test/parallel/test-event-emitter-max-listeners-warning.js @@ -15,6 +15,7 @@ process.on('warning', common.mustCall((warning) => { assert.strictEqual(warning.emitter, e); assert.strictEqual(warning.count, 2); assert.strictEqual(warning.type, 'event-type'); + assert.ok(warning.message.includes('2 event-type listeners added.')); })); e.on('event-type', function() {}); From a0074e2232651fe38031cb6e024b9d6c81c0ba2a Mon Sep 17 00:00:00 2001 From: Olan Byrne Date: Sat, 8 Oct 2016 15:46:52 +0100 Subject: [PATCH 044/119] doc: clarify buffer toString docs. Fixes: https://github.com/nodejs/node/issues/8971 PR-URL: https://github.com/nodejs/node/pull/8984 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- doc/api/buffer.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 3877cc55699077..96b280375ae36e 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -1809,12 +1809,13 @@ added: v0.1.90 --> * `encoding` {String} The character encoding to decode to. **Default:** `'utf8'` -* `start` {Integer} Where to start decoding. **Default:** `0` -* `end` {Integer} Where to stop decoding (not inclusive). **Default:** [`buf.length`] +* `start` {Integer} The byte offset to start decoding at. **Default:** `0` +* `end` {Integer} The byte offset to stop decoding at (not inclusive). + **Default:** [`buf.length`] * Return: {String} -Decodes `buf` to a string according to the specified character encoding in `encoding`. -`start` and `end` may be passed to decode only a subset of `buf`. +Decodes `buf` to a string according to the specified character encoding in +`encoding`. `start` and `end` may be passed to decode only a subset of `buf`. Examples: @@ -1827,19 +1828,22 @@ for (var i = 0 ; i < 26 ; i++) { } // Prints: abcdefghijklmnopqrstuvwxyz -console.log(buf.toString('ascii')); +console.log(buf1.toString('ascii')); // Prints: abcde -console.log(buf.toString('ascii', 0, 5)); +console.log(buf1.toString('ascii', 0, 5)); const buf2 = Buffer.from('tést'); -// Prints: tés -console.log(buf.toString('utf8', 0, 3)); +// Prints: 74c3a97374 +console.log(buf2.toString('hex')); + +// Prints: té +console.log(buf2.toString('utf8', 0, 3)); -// Prints: tés -console.log(buf.toString(undefined, 0, 3)); +// Prints: té +console.log(buf2.toString(undefined, 0, 3)); ``` ### buf.toJSON() From a3f6854724090a3de77c2659cab55ff0f3b9ed34 Mon Sep 17 00:00:00 2001 From: "Ryan Scheel (Havvy)" Date: Sat, 1 Oct 2016 00:56:16 +0000 Subject: [PATCH 045/119] doc: more realistic custom inspect example Changes the custom inspect example to a more complex object that actually uses the parameters of the custom inspect function. I specifically chose a wrapper of a value called a "Box" that inspects to "Box < inner_inspect_value >". I also want there to be documentation explaining what the code is actually doing. E.g., the padding replacement part is to make the inspected value line up properly when multi-line inputs are given. I also went with having a space between the Box's brackets and the inner value because it matches how objects work, and that should definitely be listed as a convention somewhere in here. Also, the convention to shorten only when depth is less than 0, not e.g. at 0. But I don't know how to write the documentation for that, so I'm leaving that to somebody who reads this message. Ref: https://github.com/nodejs/node/issues/8442 PR-URL: https://github.com/nodejs/node/pull/8875 Reviewed-By: Evan Lucas Reviewed-By: James M Snell Reviewed-By: Anna Henningsen --- doc/api/util.md | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/doc/api/util.md b/doc/api/util.md index 3ffefa3f87fe31..57ed7269f68b87 100644 --- a/doc/api/util.md +++ b/doc/api/util.md @@ -286,13 +286,31 @@ invoke and use the result of when inspecting the object: ```js const util = require('util'); -const obj = { name: 'nate' }; -obj[util.inspect.custom] = function(depth) { - return `{${this.name}}`; -}; +class Box { + constructor(value) { + this.value = value; + } -util.inspect(obj); - // "{nate}" + inspect(depth, options) { + if (depth < 0) { + return options.stylize('[Box]', 'special'); + } + + const newOptions = Object.assign({}, options, { + depth: options.depth === null ? null : options.depth - 1 + }); + + // Five space padding because that's the size of "Box< ". + const padding = ' '.repeat(5); + const inner = util.inspect(this.value, newOptions).replace(/\n/g, '\n' + padding); + return options.stylize('Box', 'special') + '< ' + inner + ' >'; + } +} + +const box = new Box(true); + +util.inspect(box); + // "Box< true >" ``` Custom `[util.inspect.custom](depth, opts)` functions typically return a string From 9940666c1b5f2844232c5a482c1cbb0a33c27937 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 24 Oct 2016 11:24:21 -0700 Subject: [PATCH 046/119] intl: Add more versions from ICU * Adds process.versions.cldr, .tz, and .unicode * Changes how process.versions.icu is loaded * Lazy loads the process.versions.* values for these * add an exception to util.js to cause 'node -p process.versions' to still work * update process.version docs PR-URL: https://github.com/nodejs/node/pull/9266 Fixes: https://github.com/nodejs/node/issues/9237 Reviewed-By: James M Snell --- doc/api/process.md | 6 ++- lib/internal/bootstrap_node.js | 32 ++++++++++++ lib/util.js | 4 ++ src/node.cc | 4 +- src/node_i18n.cc | 68 +++++++++++++++++++++++++- test/parallel/test-process-versions.js | 3 ++ 6 files changed, 111 insertions(+), 6 deletions(-) diff --git a/doc/api/process.md b/doc/api/process.md index 7a109dd6abfe2d..78bdcd3f0582ae 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -1643,8 +1643,10 @@ Will generate output similar to: ares: '1.10.0-DEV', modules: '43', icu: '55.1', - openssl: '1.0.1k' -} + openssl: '1.0.1k', + unicode: '8.0', + cldr: '29.0', + tz: '2016b' } ``` ## Exit Codes diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js index c8adb39e6b7b26..4e1e2aa9018b5a 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -26,6 +26,8 @@ // do this good and early, since it handles errors. setupProcessFatal(); + setupProcessICUVersions(); + setupGlobalVariables(); if (!process._noBrowserGlobals) { setupGlobalTimeouts(); @@ -310,6 +312,36 @@ }; } + function setupProcessICUVersions() { + const icu = process.binding('config').hasIntl ? + process.binding('icu') : undefined; + if (!icu) return; // no Intl/ICU: nothing to add here. + // With no argument, getVersion() returns a comma separated list + // of possible types. + const versionTypes = icu.getVersion().split(','); + versionTypes.forEach((name) => { + // Copied from module.js:addBuiltinLibsToObject + Object.defineProperty(process.versions, name, { + configurable: true, + enumerable: true, + get: () => { + // With an argument, getVersion(type) returns + // the actual version string. + const version = icu.getVersion(name); + // Replace the current getter with a new + // property. + delete process.versions[name]; + Object.defineProperty(process.versions, name, { + value: version, + writable: false, + enumerable: true + }); + return version; + } + }); + }); + } + function tryGetCwd(path) { var threw = true; var cwd; diff --git a/lib/util.js b/lib/util.js index 95c69248e07282..37008b2d176062 100644 --- a/lib/util.js +++ b/lib/util.js @@ -1049,3 +1049,7 @@ exports._exceptionWithHostPort = function(err, } return ex; }; + +// process.versions needs a custom function as some values are lazy-evaluated. +process.versions[exports.inspect.custom] = + (depth) => exports.format(JSON.parse(JSON.stringify(process.versions))); diff --git a/src/node.cc b/src/node.cc index d02ecf1a1cdd6c..58c739facfd03d 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3032,9 +3032,7 @@ void SetupProcessObject(Environment* env, FIXED_ONE_BYTE_STRING(env->isolate(), ARES_VERSION_STR)); #if defined(NODE_HAVE_I18N_SUPPORT) && defined(U_ICU_VERSION) - READONLY_PROPERTY(versions, - "icu", - OneByteString(env->isolate(), U_ICU_VERSION)); + // ICU-related versions are now handled on the js side, see bootstrap_node.js if (icu_data_dir != nullptr) { // Did the user attempt (via env var or parameter) to set an ICU path? diff --git a/src/node_i18n.cc b/src/node_i18n.cc index 7ac50423b2db2c..282575b3c3cc5d 100644 --- a/src/node_i18n.cc +++ b/src/node_i18n.cc @@ -31,14 +31,18 @@ #include "util-inl.h" #include "v8.h" +#include #include #include #include #include -#include #include #include #include +#include +#include +#include +#include #ifdef NODE_HAVE_SMALL_ICU /* if this is defined, we have a 'secondary' entry point. @@ -339,6 +343,67 @@ static void ICUErrorName(const FunctionCallbackInfo& args) { v8::NewStringType::kNormal).ToLocalChecked()); } +#define TYPE_ICU "icu" +#define TYPE_UNICODE "unicode" +#define TYPE_CLDR "cldr" +#define TYPE_TZ "tz" + +/** + * This is the workhorse function that deals with the actual version info. + * Get an ICU version. + * @param type the type of version to get. One of VERSION_TYPES + * @param buf optional buffer for result + * @param status ICU error status. If failure, assume result is undefined. + * @return version number, or NULL. May or may not be buf. + */ +static const char* GetVersion(const char* type, + char buf[U_MAX_VERSION_STRING_LENGTH], + UErrorCode* status) { + if (!strcmp(type, TYPE_ICU)) { + return U_ICU_VERSION; + } else if (!strcmp(type, TYPE_UNICODE)) { + return U_UNICODE_VERSION; + } else if (!strcmp(type, TYPE_TZ)) { + return TimeZone::getTZDataVersion(*status); + } else if (!strcmp(type, TYPE_CLDR)) { + UVersionInfo versionArray; + ulocdata_getCLDRVersion(versionArray, status); + if (U_SUCCESS(*status)) { + u_versionToString(versionArray, buf); + return buf; + } + } + // Fall through - unknown type or error case + return nullptr; +} + +static void GetVersion(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + if ( args.Length() == 0 ) { + // With no args - return a comma-separated list of allowed values + args.GetReturnValue().Set( + String::NewFromUtf8(env->isolate(), + TYPE_ICU "," + TYPE_UNICODE "," + TYPE_CLDR "," + TYPE_TZ)); + } else { + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + Utf8Value val(env->isolate(), args[0]); + UErrorCode status = U_ZERO_ERROR; + char buf[U_MAX_VERSION_STRING_LENGTH] = ""; // Possible output buffer. + const char* versionString = GetVersion(*val, buf, &status); + + if (U_SUCCESS(status) && versionString) { + // Success. + args.GetReturnValue().Set( + String::NewFromUtf8(env->isolate(), + versionString)); + } + } +} + bool InitializeICUDirectory(const char* icu_data_path) { if (icu_data_path != nullptr) { flag_icu_data_dir = true; @@ -558,6 +623,7 @@ void Init(Local target, env->SetMethod(target, "toUnicode", ToUnicode); env->SetMethod(target, "toASCII", ToASCII); env->SetMethod(target, "getStringWidth", GetStringWidth); + env->SetMethod(target, "getVersion", GetVersion); // One-shot converters env->SetMethod(target, "icuErrName", ICUErrorName); diff --git a/test/parallel/test-process-versions.js b/test/parallel/test-process-versions.js index 0b86cfd7343df1..181e3ecef2bdb0 100644 --- a/test/parallel/test-process-versions.js +++ b/test/parallel/test-process-versions.js @@ -11,6 +11,9 @@ if (common.hasCrypto) { if (common.hasIntl) { expected_keys.push('icu'); + expected_keys.push('cldr'); + expected_keys.push('tz'); + expected_keys.push('unicode'); } expected_keys.sort(); From c23ece705693ad6b70054e7edcd9341c1ebbe791 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Wed, 26 Oct 2016 13:40:15 -0700 Subject: [PATCH 047/119] tools: remove dangling eslint symlink The tools/eslint/node_modules/.bin/eslint symlink was unused by node, but was present, and pointed at a non-existent file. This causes problems for tooling. Reviewed-By: Sam Roberts Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig PR-URL: https://github.com/nodejs/node/pull/9299 --- tools/eslint/node_modules/.bin/eslint | 1 - 1 file changed, 1 deletion(-) delete mode 120000 tools/eslint/node_modules/.bin/eslint diff --git a/tools/eslint/node_modules/.bin/eslint b/tools/eslint/node_modules/.bin/eslint deleted file mode 120000 index 810e4bcb32af34..00000000000000 --- a/tools/eslint/node_modules/.bin/eslint +++ /dev/null @@ -1 +0,0 @@ -../eslint/bin/eslint.js \ No newline at end of file From d49d990c426785334b3c12f30b6c2c7625c3ec08 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Mon, 24 Oct 2016 08:53:42 -0700 Subject: [PATCH 048/119] test: prevent workers outliving parent test-child-process-pass-fd.js parent can exit with an error on failure to fork, in which case it will leak child processes. Limit child lifetime to that of parent. Fixes: https://github.com/nodejs/node/issues/9255 PR-URL: https://github.com/nodejs/node/pull/9257 Reviewed-By: Gibson Fahnestock Reviewed-By: Michael Dawson Reviewed-By: James M Snell Reviewed-By: Colin Ihrig --- test/sequential/test-child-process-pass-fd.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/sequential/test-child-process-pass-fd.js b/test/sequential/test-child-process-pass-fd.js index c1d115f9a9db29..404ae854a15953 100644 --- a/test/sequential/test-child-process-pass-fd.js +++ b/test/sequential/test-child-process-pass-fd.js @@ -39,15 +39,23 @@ if (process.argv[2] !== 'child') { process.send('handle', socket); } + // As a side-effect, listening for the message event will ref the IPC channel, + // so the child process will stay alive as long as it has a parent process/IPC + // channel. Once this is done, we can unref our client and server sockets, and + // the only thing keeping this worker alive will be IPC. This is important, + // because it means a worker with no parent will have no referenced handles, + // thus no work to do, and will exit immediately, preventing process leaks. + process.on('message', function() {}); + const server = net.createServer((c) => { process.once('message', function(msg) { assert.strictEqual(msg, 'got'); c.end('hello'); }); socketConnected(); - }); + }).unref(); server.listen(0, common.localhostIPv4, () => { const port = server.address().port; - socket = net.connect(port, common.localhostIPv4, socketConnected); + socket = net.connect(port, common.localhostIPv4, socketConnected).unref(); }); } From c7458909a75e6e7bbcedb39f83bd1428845cfea8 Mon Sep 17 00:00:00 2001 From: Emanuele DelBono Date: Thu, 27 Oct 2016 21:22:43 +0200 Subject: [PATCH 049/119] doc: reference signal(7) for the list of signals Fixes: https://github.com/nodejs/node/issues/9309 PR-URL: https://github.com/nodejs/node/pull/9323 Reviewed-By: Colin Ihrig Reviewed-By: Sam Roberts Reviewed-By: Brian White --- doc/api/process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/process.md b/doc/api/process.md index 78bdcd3f0582ae..e2b269a35873d0 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -374,7 +374,7 @@ The `*-deprecation` command line flags only affect warnings that use the name Signal events will be emitted when the Node.js process receives a signal. Please -refer to sigaction(2) for a listing of standard POSIX signal names such as +refer to signal(7) for a listing of standard POSIX signal names such as `SIGINT`, `SIGHUP`, etc. The name of each event will be the uppercase common name for the signal (e.g. From d6f688ae0d1988f8b86a6cf0d6040a7ce216b5e4 Mon Sep 17 00:00:00 2001 From: "Italo A. Casas" Date: Mon, 26 Sep 2016 22:45:56 -0400 Subject: [PATCH 050/119] test: writable stream finished state Add a test for _writableState.finished. PR-URL: https://github.com/nodejs/node/pull/8791 Reviewed-By: Colin Ihrig Reviewed-By: Matteo Collina Related: https://github.com/nodejs/node/issues/8686 --- .../test-stream-writable-finished-state.js | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/parallel/test-stream-writable-finished-state.js diff --git a/test/parallel/test-stream-writable-finished-state.js b/test/parallel/test-stream-writable-finished-state.js new file mode 100644 index 00000000000000..b42137ed0b5d6b --- /dev/null +++ b/test/parallel/test-stream-writable-finished-state.js @@ -0,0 +1,22 @@ +'use strict'; + +const common = require('../common'); + +const assert = require('assert'); +const stream = require('stream'); + +const writable = new stream.Writable(); + +writable._write = (chunk, encoding, cb) => { + // The state finished should start in false. + assert.strictEqual(writable._writableState.finished, false); + cb(); +}; + +writable.on('finish', common.mustCall(() => { + assert.strictEqual(writable._writableState.finished, true); +})); + +writable.end('testing finished state', common.mustCall(() => { + assert.strictEqual(writable._writableState.finished, true); +})); From 248a3200b23ed42a629d801a853bbb358a5091e3 Mon Sep 17 00:00:00 2001 From: "Italo A. Casas" Date: Wed, 21 Sep 2016 21:43:16 -0400 Subject: [PATCH 051/119] test: writable stream ending state Add a test for _writableState.ending, when ending becomes true, but the stream is not finished/ended yet. PR-URL: https://github.com/nodejs/node/pull/8707 Reviewed-By: Colin Ihrig Reviewed-By: Matteo Collina Related: https://github.com/nodejs/node/issues/8686 --- lib/_stream_writable.js | 1 + .../test-stream-writableState-ending.js | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/parallel/test-stream-writableState-ending.js diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 524f6dcdb24ef2..06499fc947fe30 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -43,6 +43,7 @@ function WritableState(options, stream) { // cast to ints. this.highWaterMark = ~~this.highWaterMark; + // drain event flag. this.needDrain = false; // at the start of calling end() this.ending = false; diff --git a/test/parallel/test-stream-writableState-ending.js b/test/parallel/test-stream-writableState-ending.js new file mode 100644 index 00000000000000..06d62a9ae2ed2b --- /dev/null +++ b/test/parallel/test-stream-writableState-ending.js @@ -0,0 +1,34 @@ +'use strict'; + +const common = require('../common'); + +const assert = require('assert'); +const stream = require('stream'); + +const writable = new stream.Writable(); + +function testStates(ending, finished, ended) { + assert.strictEqual(writable._writableState.ending, ending); + assert.strictEqual(writable._writableState.finished, finished); + assert.strictEqual(writable._writableState.ended, ended); +} + +writable._write = (chunk, encoding, cb) => { + // ending, finished, ended start in false. + testStates(false, false, false); + cb(); +}; + +writable.on('finish', () => { + // ending, finished, ended = true. + testStates(true, true, true); +}); + +writable.end('testing function end()', () => { + // ending, finished, ended = true. + testStates(true, true, true); +}); + +// ending, ended = true. +// finished = false. +testStates(true, false, true); From c9b67c6a91ce124f4ac2a495a0a0ee14609e1359 Mon Sep 17 00:00:00 2001 From: "Italo A. Casas" Date: Mon, 26 Sep 2016 23:25:02 -0400 Subject: [PATCH 052/119] test: writable stream needDrain state Add a test for _writableState.needDrain. PR-URL: https://github.com/nodejs/node/pull/8799 Reviewed-By: Colin Ihrig Reviewed-By: Matteo Collina Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Related: https://github.com/nodejs/node/issues/8686 --- .../test-stream-writable-needdrain-state.js | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 test/parallel/test-stream-writable-needdrain-state.js diff --git a/test/parallel/test-stream-writable-needdrain-state.js b/test/parallel/test-stream-writable-needdrain-state.js new file mode 100644 index 00000000000000..ea5617d997d5ed --- /dev/null +++ b/test/parallel/test-stream-writable-needdrain-state.js @@ -0,0 +1,23 @@ +'use strict'; + +const common = require('../common'); +const stream = require('stream'); +const assert = require('assert'); + +const transform = new stream.Transform({ + transform: _transform, + highWaterMark: 1 +}); + +function _transform(chunk, encoding, cb) { + assert.strictEqual(transform._writableState.needDrain, true); + cb(); +} + +assert.strictEqual(transform._writableState.needDrain, false); + +transform.write('asdasd', common.mustCall(() => { + assert.strictEqual(transform._writableState.needDrain, false); +})); + +assert.strictEqual(transform._writableState.needDrain, true); From edd89265baaf1cffb75389f7ad396c2c0014fef6 Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Wed, 19 Oct 2016 15:14:14 +0100 Subject: [PATCH 053/119] doc: update CONTRIBUTING.md to address editing PRs Add more info about the contribution process after PR submission. PR-URL: https://github.com/nodejs/node/pull/9259 Reviewed-By: James M Snell Reviewed-By: Rich Trott Reviewed-By: Santiago Gimeno Reviewed-By: Michael Dawson --- CONTRIBUTING.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 120fdeaf3b0c6e..17aa305f8c7fe4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -89,6 +89,13 @@ $ git config --global user.name "J. Random User" $ git config --global user.email "j.random.user@example.com" ``` +Add and commit: + +```text +$ git add my/changed/files +$ git commit +``` + Writing good commit logs is important. A commit log should describe what changed and why. Follow these guidelines when writing one: @@ -194,10 +201,60 @@ $ git push origin my-branch Go to https://github.com/yourusername/node and select your branch. Click the 'Pull Request' button and fill out the form. -Pull requests are usually reviewed within a few days. If there are comments -to address, apply your changes in a separate commit and push that to your -branch. Post a comment in the pull request afterwards; GitHub does -not send out notifications when you add commits. +Pull requests are usually reviewed within a few days. + +### Step 7: Discuss and update + +You will probably get feedback or requests for changes to your Pull Request. +This is a big part of the submission process, so don't be disheartened! + +To make changes to an existing Pull Request, make the changes to your branch. +When you push that branch to your fork, GitHub will automatically update the +Pull Request. + +You can push more commits to your branch: + +```text +$ git add my/changed/files +$ git commit +$ git push origin my-branch +``` + +Or you can rebase against master: + +```text +$ git fetch --all +$ git rebase origin/master +$ git push --force-with-lease origin my-branch +``` + +Or you can amend the last commit (for example if you want to change the commit +log). + +```text +$ git add any/changed/files +$ git commit --amend +$ git push --force-with-lease origin my-branch +``` + +**Important:** The `git push --force-with-lease` command is one of the few ways +to delete history in git. Before you use it, make sure you understand the risks. +If in doubt, you can always ask for guidance in the Pull Request or on +[IRC in the #node-dev channel](https://webchat.freenode.net?channels=node-dev&uio=d4). + +Feel free to post a comment in the Pull Request to ping reviewers if you are +awaiting an answer on something. + + +### Step 8: Landing + +Once your Pull Request has been reviewed and approved by at least one Node.js +Collaborators (often by saying LGTM, or Looks Good To Me), and as long as +there is consensus (no objections from a Collaborator), a +Collaborator can merge the Pull Request . GitHub often shows the Pull Request as + `Closed` at this point, but don't worry. If you look at the branch you raised + your Pull Request against (probably `master`), you should see a commit with + your name on it. Congratulations and thanks for your contribution! ## Developer's Certificate of Origin 1.1 From 0ab008e50d516c2a023974e350e9e729586ec3e5 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 28 Oct 2016 10:37:09 +0200 Subject: [PATCH 054/119] test: fix lint error regarding unused commons const MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, make lint is failing with the following error: 3:7 error 'common' is assigned a value but never used no-unused-vars ✖ 1 problem (1 error, 0 warnings) PR-URL: https://github.com/nodejs/node/pull/9334 Reviewed-By: Luigi Pinca Reviewed-By: Gibson Fahnestock --- test/parallel/test-stream-writableState-ending.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/parallel/test-stream-writableState-ending.js b/test/parallel/test-stream-writableState-ending.js index 06d62a9ae2ed2b..1e0b0bf77f1ee7 100644 --- a/test/parallel/test-stream-writableState-ending.js +++ b/test/parallel/test-stream-writableState-ending.js @@ -1,6 +1,6 @@ 'use strict'; -const common = require('../common'); +require('../common'); const assert = require('assert'); const stream = require('stream'); From 212da12f4568da966857e89a0cf92989d98dee82 Mon Sep 17 00:00:00 2001 From: Charmander <~@charmander.me> Date: Tue, 25 Oct 2016 22:27:14 -0700 Subject: [PATCH 055/119] buffer: use correct name for custom inspect symbol 59714cb7b3918c9e4fcd94013b778078d3710705 introduced the `util.inspect.custom` symbol, but it was exported as `customInspectSymbol` by `internal/util.js` and referenced as `inspectSymbol` by `buffer.js`. PR-URL: https://github.com/nodejs/node/pull/9289 Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- lib/buffer.js | 4 ++-- test/parallel/test-buffer-inspect.js | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 4d11aa835fc807..9754cfeeb50b94 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -527,7 +527,7 @@ Buffer.prototype.equals = function equals(b) { // Override how buffers are presented by util.inspect(). -Buffer.prototype[internalUtil.inspectSymbol] = function inspect() { +Buffer.prototype[internalUtil.customInspectSymbol] = function inspect() { var str = ''; var max = exports.INSPECT_MAX_BYTES; if (this.length > 0) { @@ -537,7 +537,7 @@ Buffer.prototype[internalUtil.inspectSymbol] = function inspect() { } return '<' + this.constructor.name + ' ' + str + '>'; }; -Buffer.prototype.inspect = Buffer.prototype[internalUtil.inspectSymbol]; +Buffer.prototype.inspect = Buffer.prototype[internalUtil.customInspectSymbol]; Buffer.prototype.compare = function compare(target, start, diff --git a/test/parallel/test-buffer-inspect.js b/test/parallel/test-buffer-inspect.js index 4239d787ea10ba..4fed249207611b 100644 --- a/test/parallel/test-buffer-inspect.js +++ b/test/parallel/test-buffer-inspect.js @@ -34,3 +34,6 @@ assert.doesNotThrow(function() { assert.strictEqual(util.inspect(b), expected); assert.strictEqual(util.inspect(s), expected); }); + +b.inspect = undefined; +assert.strictEqual(util.inspect(b), expected); From f7d8481ee2a3acde403f13ec3bb9b3e81f16992c Mon Sep 17 00:00:00 2001 From: Aaron Bieber Date: Fri, 21 Oct 2016 17:13:42 -0600 Subject: [PATCH 056/119] build: use wxneeded on openbsd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On OpenBSD 6.0 and greater W^X is enabled by default. All executables that violate W^X need to be marked with PT_OPENBSD_WXNEEDED. In addition to this, they must be executed from a filesystem mounted with 'wxallowed'. More info on W^X: https://en.wikipedia.org/wiki/W%5EX PR-URL: https://github.com/nodejs/node/pull/9232 Reviewed-By: James M Snell Reviewed-By: Johan Bergström Reviewed-By: Ben Noordhuis --- common.gypi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common.gypi b/common.gypi index d1411ed1c6f19c..d87205e5c320cf 100644 --- a/common.gypi +++ b/common.gypi @@ -278,6 +278,9 @@ ['_type=="static_library" and OS=="solaris"', { 'standalone_static_library': 1, }], + ['OS=="openbsd"', { + 'ldflags': [ '-Wl,-z,wxneeded' ], + }], ], 'conditions': [ [ 'target_arch=="ia32"', { From 0f871e108730fba42767a65a8a5c9c21594d46f6 Mon Sep 17 00:00:00 2001 From: Aaron Bieber Date: Sun, 23 Oct 2016 07:40:12 -0600 Subject: [PATCH 057/119] deps: back port OpenBSD fix in c-ares/c-ares MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original PR: https://github.com/c-ares/c-ares/pull/68 PR-URL: https://github.com/nodejs/node/pull/9232 Reviewed-By: James M Snell Reviewed-By: Johan Bergström Reviewed-By: Ben Noordhuis --- deps/cares/include/ares.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index cd94d4fc628cb2..c23ea3e2e0ad27 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -38,7 +38,7 @@ require it! */ #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) + defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) #include #endif #if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) From 6f35e4421a3df92b6809e07053bf23cb811ecbec Mon Sep 17 00:00:00 2001 From: Evan Lucas Date: Wed, 19 Oct 2016 16:28:16 -0500 Subject: [PATCH 058/119] http: add debug message for invalid header value This makes it easier to see what header has an invalid value. PR-URL: https://github.com/nodejs/node/pull/9195 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Brian White --- lib/_http_outgoing.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 09459480565413..b85e3c54074d82 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -317,6 +317,7 @@ function storeHeader(self, state, field, value) { 'Header name must be a valid HTTP Token ["' + field + '"]'); } if (common._checkInvalidHeaderChar(value) === true) { + debug('Header "%s" contains invalid characters', field); throw new TypeError('The header content contains invalid characters'); } state.messageHeader += field + ': ' + escapeHeaderValue(value) + CRLF; @@ -357,6 +358,7 @@ OutgoingMessage.prototype.setHeader = function setHeader(name, value) { if (this._header) throw new Error('Can\'t set headers after they are sent.'); if (common._checkInvalidHeaderChar(value) === true) { + debug('Header "%s" contains invalid characters', name); throw new TypeError('The header content contains invalid characters'); } if (this._headers === null) @@ -534,6 +536,7 @@ OutgoingMessage.prototype.addTrailers = function addTrailers(headers) { 'Trailer name must be a valid HTTP Token ["' + field + '"]'); } if (common._checkInvalidHeaderChar(value) === true) { + debug('Trailer "%s" contains invalid characters', field); throw new TypeError('The trailer content contains invalid characters'); } this._trailer += field + ': ' + escapeHeaderValue(value) + CRLF; From 6c9e4fddf01a6390684219499f0490d716ababda Mon Sep 17 00:00:00 2001 From: Gerges Beshay Date: Wed, 26 Oct 2016 17:24:45 +0000 Subject: [PATCH 059/119] test: refactor test-async-wrap-check-providers * use 'strictEqual' instead of 'equal' * use '!==' instead of '!=' PR-URL: https://github.com/nodejs/node/pull/9297 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/parallel/test-async-wrap-check-providers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-async-wrap-check-providers.js b/test/parallel/test-async-wrap-check-providers.js index 7591e5799e6ae3..4264cfc524788e 100644 --- a/test/parallel/test-async-wrap-check-providers.js +++ b/test/parallel/test-async-wrap-check-providers.js @@ -36,7 +36,7 @@ if (common.isAix) { } function init(id, provider) { - keyList = keyList.filter((e) => e != pkeys[provider]); + keyList = keyList.filter((e) => e !== pkeys[provider]); } function noop() { } @@ -119,6 +119,6 @@ process.on('exit', function() { if (keyList.length !== 0) { process._rawDebug('Not all keys have been used:'); process._rawDebug(keyList); - assert.equal(keyList.length, 0); + assert.strictEqual(keyList.length, 0); } }); From 5ab172ee8ff2726a57b0d27f63944b8d8f8cb0ae Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 25 Oct 2016 14:50:32 -0700 Subject: [PATCH 060/119] src: fix use of uninitialized variable Variable was uninitialized in 72547fe28d Initialize the variable and add a static_check PR-URL: https://github.com/nodejs/node/pull/9281 Reviewed-By: Ben Noordhuis --- src/node_i18n.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/node_i18n.cc b/src/node_i18n.cc index 282575b3c3cc5d..bab06cfcdfc41a 100644 --- a/src/node_i18n.cc +++ b/src/node_i18n.cc @@ -586,7 +586,9 @@ static void GetStringWidth(const FunctionCallbackInfo& args) { TwoByteValue value(env->isolate(), args[0]); // reinterpret_cast is required by windows to compile UChar* str = reinterpret_cast(*value); - UChar32 c; + static_assert(sizeof(*str) == sizeof(**value), + "sizeof(*str) == sizeof(**value)"); + UChar32 c = 0; UChar32 p; size_t n = 0; uint32_t width = 0; From 8b7ce8bd11f09a9f0772b787c63d842f976c243e Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 26 Oct 2016 15:44:10 -0700 Subject: [PATCH 061/119] test: fix flaky test-fs-watch-recursive on OS X The test was sometimes timing out due to a race condition. In OS X, events for `fs.watch()` might only start showing up after a delay. This is a limitation of the operating system. To work around that, there was a timer in the test that delayed the writing of the file by 100ms. However, sometimes that was not enough, and so the event never fired, and the test timed out. Change the timer to an interval so that it fires repeatedly until it is picked up. This change only affects OS X. Fixes: https://github.com/nodejs/node/issues/8511 PR-URL: https://github.com/nodejs/node/pull/9303 Reviewed-By: Colin Ihrig Reviewed-By: Santiago Gimeno --- test/parallel/test-fs-watch-recursive.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/parallel/test-fs-watch-recursive.js b/test/parallel/test-fs-watch-recursive.js index 05dfb32178c438..97c65fccf4a1fb 100644 --- a/test/parallel/test-fs-watch-recursive.js +++ b/test/parallel/test-fs-watch-recursive.js @@ -30,14 +30,17 @@ watcher.on('change', function(event, filename) { if (filename !== relativePathOne) return; + if (common.isOSX) { + clearInterval(interval); + } watcher.close(); watcherClosed = true; }); -if (process.platform === 'darwin') { - setTimeout(function() { +if (common.isOSX) { + var interval = setInterval(function() { fs.writeFileSync(filepathOne, 'world'); - }, 100); + }, 10); } else { fs.writeFileSync(filepathOne, 'world'); } From bd9cb409770baed2c33fb2cf8d9497c7fe6a8e93 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 26 Oct 2016 16:50:11 -0700 Subject: [PATCH 062/119] test: run all of test-timers-blocking-callback The test has two test cases, but only the first was being run due to a small bug. This change fixes the bug. PR-URL: https://github.com/nodejs/node/pull/9305 Reviewed-By: Julien Gilli Reviewed-By: Colin Ihrig --- test/parallel/test-timers-blocking-callback.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/parallel/test-timers-blocking-callback.js b/test/parallel/test-timers-blocking-callback.js index aff28d1df7ef25..e4e85cddc6302d 100644 --- a/test/parallel/test-timers-blocking-callback.js +++ b/test/parallel/test-timers-blocking-callback.js @@ -56,24 +56,24 @@ function blockingCallback(callback) { common.busyLoop(TIMEOUT); timeCallbackScheduled = Timer.now(); - setTimeout(blockingCallback, TIMEOUT); + setTimeout(blockingCallback.bind(null, callback), TIMEOUT); } } -function testAddingTimerToEmptyTimersList(callback) { +const testAddingTimerToEmptyTimersList = common.mustCall(function(callback) { initTest(); // Call setTimeout just once to make sure the timers list is // empty when blockingCallback is called. setTimeout(blockingCallback.bind(null, callback), TIMEOUT); -} +}); -function testAddingTimerToNonEmptyTimersList() { +const testAddingTimerToNonEmptyTimersList = common.mustCall(function() { initTest(); // Call setTimeout twice with the same timeout to make // sure the timers list is not empty when blockingCallback is called. setTimeout(blockingCallback, TIMEOUT); setTimeout(blockingCallback, TIMEOUT); -} +}); // Run the test for the empty timers list case, and then for the non-empty // timers list one From fab8eb660fa29cc3c9fc6fed73fe047b81f6ebec Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Thu, 7 Jul 2016 16:31:19 +1000 Subject: [PATCH 063/119] benchmark: add microbenchmarks for ES Map PR-URL: https://github.com/nodejs/node/pull/7581 Reviewed-By: James M Snell Reviewed-By: Franziska Hinkelmann --- benchmark/es/map-bench.js | 96 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 benchmark/es/map-bench.js diff --git a/benchmark/es/map-bench.js b/benchmark/es/map-bench.js new file mode 100644 index 00000000000000..574da25d53f2f2 --- /dev/null +++ b/benchmark/es/map-bench.js @@ -0,0 +1,96 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + method: ['object', 'nullProtoObject', 'fakeMap', 'map'], + millions: [1] +}); + +function runObject(n) { + const m = {}; + var i = 0; + bench.start(); + for (; i < n; i++) { + m['i' + i] = i; + m['s' + i] = String(i); + assert.equal(m['i' + i], m['s' + i]); + m['i' + i] = undefined; + m['s' + i] = undefined; + } + bench.end(n / 1e6); +} + +function runNullProtoObject(n) { + const m = Object.create(null); + var i = 0; + bench.start(); + for (; i < n; i++) { + m['i' + i] = i; + m['s' + i] = String(i); + assert.equal(m['i' + i], m['s' + i]); + m['i' + i] = undefined; + m['s' + i] = undefined; + } + bench.end(n / 1e6); +} + +function fakeMap() { + const m = {}; + return { + get(key) { return m['$' + key]; }, + set(key, val) { m['$' + key] = val; }, + get size() { return Object.keys(m).length; }, + has(key) { return Object.prototype.hasOwnProperty.call(m, '$' + key); } + }; +} + +function runFakeMap(n) { + const m = fakeMap(); + var i = 0; + bench.start(); + for (; i < n; i++) { + m.set('i' + i, i); + m.set('s' + i, String(i)); + assert.equal(m.get('i' + i), m.get('s' + i)); + m.set('i' + i, undefined); + m.set('s' + i, undefined); + } + bench.end(n / 1e6); +} + +function runMap(n) { + const m = new Map(); + var i = 0; + bench.start(); + for (; i < n; i++) { + m.set('i' + i, i); + m.set('s' + i, String(i)); + assert.equal(m.get('i' + i), m.get('s' + i)); + m.set('i' + i, undefined); + m.set('s' + i, undefined); + } + bench.end(n / 1e6); +} + +function main(conf) { + const n = +conf.millions * 1e6; + + switch (conf.method) { + case 'object': + runObject(n); + break; + case 'nullProtoObject': + runNullProtoObject(n); + break; + case 'fakeMap': + runFakeMap(n); + break; + case 'map': + runMap(n); + break; + default: + throw new Error('Unexpected method'); + } +} From 1037463604000ba4e583eb35760c859a46a61dc0 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 26 Oct 2016 22:12:47 -0400 Subject: [PATCH 064/119] test: add child_process customFds test This commit adds a test for spawn()'s deprecated customFds option. PR-URL: https://github.com/nodejs/node/pull/9307 Reviewed-By: Rich Trott Reviewed-By: Santiago Gimeno Reviewed-By: James M Snell --- .../parallel/test-child-process-custom-fds.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/parallel/test-child-process-custom-fds.js diff --git a/test/parallel/test-child-process-custom-fds.js b/test/parallel/test-child-process-custom-fds.js new file mode 100644 index 00000000000000..2958a6f8070722 --- /dev/null +++ b/test/parallel/test-child-process-custom-fds.js @@ -0,0 +1,33 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +// Verify that customFds is used if stdio is not provided. +{ + const msg = 'child_process: options.customFds option is deprecated. ' + + 'Use options.stdio instead.'; + common.expectWarning('DeprecationWarning', msg); + + const customFds = [-1, process.stdout.fd, process.stderr.fd]; + const child = common.spawnSyncPwd({ customFds }); + + assert.deepStrictEqual(child.options.customFds, customFds); + assert.deepStrictEqual(child.options.stdio, [ + { type: 'pipe', readable: true, writable: false }, + { type: 'fd', fd: process.stdout.fd }, + { type: 'fd', fd: process.stderr.fd } + ]); +} + +// Verify that customFds is ignored when stdio is present. +{ + const customFds = [0, 1, 2]; + const child = common.spawnSyncPwd({ customFds, stdio: 'pipe' }); + + assert.deepStrictEqual(child.options.customFds, customFds); + assert.deepStrictEqual(child.options.stdio, [ + { type: 'pipe', readable: true, writable: false }, + { type: 'pipe', readable: false, writable: true }, + { type: 'pipe', readable: false, writable: true } + ]); +} From 4e3731c7e7c02bd208e2baa981ea9bc1f6ae91fa Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 26 Oct 2016 22:41:24 -0400 Subject: [PATCH 065/119] child_process: remove unreachable code _convertCustomFds() is only called from normalizeSpawnArguments(), which always provides an options object. Therefore, there is no need to check for options in _convertCustomFds(). PR-URL: https://github.com/nodejs/node/pull/9307 Reviewed-By: Rich Trott Reviewed-By: Santiago Gimeno Reviewed-By: James M Snell --- lib/child_process.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/child_process.js b/lib/child_process.js index 4c2fb7e09817f4..afdc5ae551a95e 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -305,7 +305,7 @@ var _deprecatedCustomFds = internalUtil.deprecate(function(options) { 'Use options.stdio instead.'); function _convertCustomFds(options) { - if (options && options.customFds && !options.stdio) { + if (options.customFds && !options.stdio) { _deprecatedCustomFds(options); } } From 411b1339bc6e6daa5e5c9f3ecdaab80488cadad1 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 26 Oct 2016 20:56:08 -0700 Subject: [PATCH 066/119] test: fix freebsd10-64 CI failures Remove unneeded timers from some tests and move others from parallel testing to sequential testing. This is to resolve test failures on freebsd10-64 on CI. The failures are all due to timers firing later than expected. Timers firing later than they are set for can happen on resource-constrained hosts and is not a bug. In general, it may be wise to put tests that depend on timing into sequential testing rather than parallel testing, as the timing can be affected by other simultaneously-running test processes. Fixes: https://github.com/nodejs/node/issues/8041 Fixes: https://github.com/nodejs/node/issues/9227 PR-URL: https://github.com/nodejs/node/pull/9317 Reviewed-By: Colin Ihrig Reviewed-By: Anna Henningsen Reviewed-By: Gibson Fahnestock Reviewed-By: Julien Gilli Reviewed-By: Johan Bergstrom Reviewed-By: Santiago Gimeno --- .../test-dgram-send-callback-multi-buffer.js | 5 ----- test/parallel/test-dgram-send-multi-buffer-copy.js | 5 ----- ...ls-server-failed-handshake-emits-clienterror.js | 14 +++----------- .../test-http-client-timeout-with-data.js | 0 .../test-http-server-consumed-timeout.js | 0 .../test-timers-blocking-callback.js | 0 .../test-timers-same-timeout-wrong-list-deleted.js | 0 7 files changed, 3 insertions(+), 21 deletions(-) rename test/{parallel => sequential}/test-http-client-timeout-with-data.js (100%) rename test/{parallel => sequential}/test-http-server-consumed-timeout.js (100%) rename test/{parallel => sequential}/test-timers-blocking-callback.js (100%) rename test/{parallel => sequential}/test-timers-same-timeout-wrong-list-deleted.js (100%) diff --git a/test/parallel/test-dgram-send-callback-multi-buffer.js b/test/parallel/test-dgram-send-callback-multi-buffer.js index 3004bfe39b8203..a60d42cc45d49e 100644 --- a/test/parallel/test-dgram-send-callback-multi-buffer.js +++ b/test/parallel/test-dgram-send-callback-multi-buffer.js @@ -6,13 +6,8 @@ const dgram = require('dgram'); const client = dgram.createSocket('udp4'); -const timer = setTimeout(function() { - throw new Error('Timeout'); -}, common.platformTimeout(200)); - const messageSent = common.mustCall(function messageSent(err, bytes) { assert.equal(bytes, buf1.length + buf2.length); - clearTimeout(timer); }); const buf1 = Buffer.alloc(256, 'x'); diff --git a/test/parallel/test-dgram-send-multi-buffer-copy.js b/test/parallel/test-dgram-send-multi-buffer-copy.js index 19222dac5fbd11..0b7f003335b545 100644 --- a/test/parallel/test-dgram-send-multi-buffer-copy.js +++ b/test/parallel/test-dgram-send-multi-buffer-copy.js @@ -6,13 +6,8 @@ const dgram = require('dgram'); const client = dgram.createSocket('udp4'); -const timer = setTimeout(function() { - throw new Error('Timeout'); -}, common.platformTimeout(200)); - const onMessage = common.mustCall(function(err, bytes) { assert.equal(bytes, buf1.length + buf2.length); - clearTimeout(timer); }); const buf1 = Buffer.alloc(256, 'x'); diff --git a/test/parallel/test-tls-server-failed-handshake-emits-clienterror.js b/test/parallel/test-tls-server-failed-handshake-emits-clienterror.js index a404dc904ba7b7..bd92dc28904183 100644 --- a/test/parallel/test-tls-server-failed-handshake-emits-clienterror.js +++ b/test/parallel/test-tls-server-failed-handshake-emits-clienterror.js @@ -11,7 +11,6 @@ const assert = require('assert'); const bonkers = Buffer.alloc(1024, 42); -let tlsClientErrorEmited = false; const server = tls.createServer({}) .listen(0, function() { @@ -19,19 +18,12 @@ const server = tls.createServer({}) c.write(bonkers); }); - }).on('tlsClientError', function(e) { - tlsClientErrorEmited = true; + }).on('tlsClientError', common.mustCall(function(e) { assert.ok(e instanceof Error, 'Instance of Error should be passed to error handler'); assert.ok(e.message.match( /SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol/), 'Expecting SSL unknown protocol'); - }); -setTimeout(function() { - server.close(); - - assert.ok(tlsClientErrorEmited, - 'tlsClientError should be emited'); - -}, common.platformTimeout(200)); + server.close(); + })); diff --git a/test/parallel/test-http-client-timeout-with-data.js b/test/sequential/test-http-client-timeout-with-data.js similarity index 100% rename from test/parallel/test-http-client-timeout-with-data.js rename to test/sequential/test-http-client-timeout-with-data.js diff --git a/test/parallel/test-http-server-consumed-timeout.js b/test/sequential/test-http-server-consumed-timeout.js similarity index 100% rename from test/parallel/test-http-server-consumed-timeout.js rename to test/sequential/test-http-server-consumed-timeout.js diff --git a/test/parallel/test-timers-blocking-callback.js b/test/sequential/test-timers-blocking-callback.js similarity index 100% rename from test/parallel/test-timers-blocking-callback.js rename to test/sequential/test-timers-blocking-callback.js diff --git a/test/parallel/test-timers-same-timeout-wrong-list-deleted.js b/test/sequential/test-timers-same-timeout-wrong-list-deleted.js similarity index 100% rename from test/parallel/test-timers-same-timeout-wrong-list-deleted.js rename to test/sequential/test-timers-same-timeout-wrong-list-deleted.js From 01b626a45ab3b383c3bb5442ed9969feadf278c4 Mon Sep 17 00:00:00 2001 From: Isobel Redelmeier Date: Wed, 26 Oct 2016 19:59:32 -0700 Subject: [PATCH 067/119] test: clean up dgram-broadcast-multi-process test Use assert.strictEqual() instead of assert.equal(), === instead of ==, and const instead of var. PR-URL: https://github.com/nodejs/node/pull/9308 Reviewed-By: Rich Trott Reviewed-By: Bryan English Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- .../test-dgram-broadcast-multi-process.js | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/test/internet/test-dgram-broadcast-multi-process.js b/test/internet/test-dgram-broadcast-multi-process.js index 1c39baa29741e2..c05d0cf5b9512e 100644 --- a/test/internet/test-dgram-broadcast-multi-process.js +++ b/test/internet/test-dgram-broadcast-multi-process.js @@ -20,15 +20,17 @@ if (common.inFreeBSDJail) { return; } +let bindAddress = null; + // Take the first non-internal interface as the address for binding. // Ideally, this should check for whether or not an interface is set up for // BROADCAST and favor internal/private interfaces. -get_bindAddress: for (var name in networkInterfaces) { - var interfaces = networkInterfaces[name]; - for (var i = 0; i < interfaces.length; i++) { - var localInterface = interfaces[i]; +get_bindAddress: for (const name in networkInterfaces) { + const interfaces = networkInterfaces[name]; + for (let i = 0; i < interfaces.length; i++) { + const localInterface = interfaces[i]; if (!localInterface.internal && localInterface.family === 'IPv4') { - var bindAddress = localInterface.address; + bindAddress = localInterface.address; break get_bindAddress; } } @@ -56,9 +58,9 @@ if (process.argv[2] !== 'child') { }, TIMEOUT); //launch child processes - for (var x = 0; x < listeners; x++) { + for (let x = 0; x < listeners; x++) { (function() { - var worker = fork(process.argv[1], ['child']); + const worker = fork(process.argv[1], ['child']); workers[worker.pid] = worker; worker.messagesReceived = []; @@ -68,7 +70,7 @@ if (process.argv[2] !== 'child') { // don't consider this the true death if the worker // has finished successfully // or if the exit code is 0 - if (worker.isDone || code == 0) { + if (worker.isDone || code === 0) { return; } @@ -113,12 +115,12 @@ if (process.argv[2] !== 'child') { 'messages. Will now compare.'); Object.keys(workers).forEach(function(pid) { - var worker = workers[pid]; + const worker = workers[pid]; - var count = 0; + let count = 0; worker.messagesReceived.forEach(function(buf) { - for (var i = 0; i < messages.length; ++i) { + for (let i = 0; i < messages.length; ++i) { if (buf.toString() === messages[i].toString()) { count++; break; @@ -130,8 +132,11 @@ if (process.argv[2] !== 'child') { worker.pid, count); - assert.equal(count, messages.length, - 'A worker received an invalid multicast message'); + assert.strictEqual( + count, + messages.length, + 'A worker received an invalid multicast message' + ); }); clearTimeout(timer); @@ -143,7 +148,7 @@ if (process.argv[2] !== 'child') { })(x); } - var sendSocket = dgram.createSocket({ + const sendSocket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); @@ -160,7 +165,7 @@ if (process.argv[2] !== 'child') { }); sendSocket.sendNext = function() { - var buf = messages[i++]; + const buf = messages[i++]; if (!buf) { try { sendSocket.close(); } catch (e) {} @@ -186,15 +191,15 @@ if (process.argv[2] !== 'child') { function killChildren(children) { Object.keys(children).forEach(function(key) { - var child = children[key]; + const child = children[key]; child.kill(); }); } } if (process.argv[2] === 'child') { - var receivedMessages = []; - var listenSocket = dgram.createSocket({ + const receivedMessages = []; + const listenSocket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); @@ -212,7 +217,7 @@ if (process.argv[2] === 'child') { process.send({message: buf.toString()}); - if (receivedMessages.length == messages.length) { + if (receivedMessages.length === messages.length) { process.nextTick(function() { listenSocket.close(); }); From d8eaa14c2d657b9dbf0255306f902a58584cbe20 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Sun, 30 Oct 2016 23:40:54 +1100 Subject: [PATCH 068/119] build: prioritise --shared-X-Y over pkg-config PR-URL: https://github.com/nodejs/node/pull/9368 Reviewed-By: Johan Bergstrom Reviewed-By: Ben Noordhuis --- configure | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/configure b/configure index 20975831ff3794..fdbda66320e4ee 100755 --- a/configure +++ b/configure @@ -864,26 +864,26 @@ def configure_library(lib, output): if getattr(options, shared_lib): (pkg_libs, pkg_cflags, pkg_libpath) = pkg_config(lib) - if pkg_cflags: + if options.__dict__[shared_lib + '_includes']: + output['include_dirs'] += [options.__dict__[shared_lib + '_includes']] + elif pkg_cflags: output['include_dirs'] += ( filter(None, map(str.strip, pkg_cflags.split('-I')))) - elif options.__dict__[shared_lib + '_includes']: - output['include_dirs'] += [options.__dict__[shared_lib + '_includes']] # libpath needs to be provided ahead libraries - if pkg_libpath: - output['libraries'] += [pkg_libpath] - elif options.__dict__[shared_lib + '_libpath']: + if options.__dict__[shared_lib + '_libpath']: output['libraries'] += [ '-L%s' % options.__dict__[shared_lib + '_libpath']] + elif pkg_libpath: + output['libraries'] += [pkg_libpath] default_libs = getattr(options, shared_lib + '_libname') default_libs = map('-l{0}'.format, default_libs.split(',')) - if pkg_libs: - output['libraries'] += pkg_libs.split() - elif default_libs: + if default_libs: output['libraries'] += default_libs + elif pkg_libs: + output['libraries'] += pkg_libs.split() def configure_v8(o): From 7f1a40dbcf6d6891c2a4e2a77a0426792721906c Mon Sep 17 00:00:00 2001 From: Josh Gavant Date: Thu, 27 Oct 2016 13:26:17 -0700 Subject: [PATCH 069/119] doc: add 2016-09-28 CTC meeting minutes PR-URL: https://github.com/nodejs/node/pull/9325 Reviewed-By: James M Snell Reviewed-By: Rich Trott --- doc/ctc-meetings/2016-09-28.md | 303 +++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 doc/ctc-meetings/2016-09-28.md diff --git a/doc/ctc-meetings/2016-09-28.md b/doc/ctc-meetings/2016-09-28.md new file mode 100644 index 00000000000000..8583410af0b5f0 --- /dev/null +++ b/doc/ctc-meetings/2016-09-28.md @@ -0,0 +1,303 @@ +# Node Foundation CTC Meeting 2016-09-28 + +## Links + +* **Audio Recording**: TBP +* **GitHub Issue**: [#8802](https://github.com/nodejs/node/issues/8802) +* **Minutes Google Doc**: +* _Previous Minutes Google Doc_: + + +## Present + +* Anna Henningsen @addaleax (CTC) +* Сковорода Никита Андреевич @ChALkeR (CTC) +* Colin Ihrig @cjihrig (CTC) +* Evan Lucas @evanlucas (CTC) +* Jeremiah Senkpiel @Fishrock123 (CTC) +* Tracy Hinds @hackygolucky (observer/Node.js Foundation) +* Josh Gavant @joshgav (observer/Microsoft) +* Michael Dawson @mhdawson (CTC) +* Ali Ijaz Sheikh @ofrobots (CTC) +* Jenn Turner @renrutnnej (observer/Node.js Foundation) +* Rod Vagg @rvagg (CTC) +* Seth Thompson @s3ththompson (observer/Google) +* Myles Borins @TheAlphaNerd (CTC) +* Trevor Norris @trevnorris (CTC) +* Rich Trott @Trott (CTC) + + +## Standup + +* Anna Henningsen @addaleax (CTC) + * The usual, issues and PR reviews +* Сковорода Никита Андреевич @ChALkeR (CTC) + * Some issue and PR comments and reviews as usual. + * Some more work on docs linting. +* Colin Ihrig @cjihrig (CTC) + * Reviewing issues and PRs. + * Evan Lucas @evanlucas (CTC) + * v6.7.0 release + * More work on types eps +* Jeremiah Senkpiel @Fishrock123 (CTC) + * Issue / PR Review … general stuff + * Working towards ES Modules prototype implementations with Chris Dickinson +* Tracy Hinds @hackygolucky (observer/Node.js Foundation) + * getting the Outreachy info on website +* Josh Gavant @joshgav (observer/Microsoft) + * helping bring in some new MS contributors + * scheduled diag meeting for next week +* Michael Dawson @mhdawson (CTC) + * Finishing off PPC migration + * Fixing AIX issues when building from node-private + * Some work on ABI-stable node + * Misc PR review/lands + * Keeping up with issues + * Post-mortem nodereport review +* Brian White @mscdex (CTC) + * Worked on various performance improvements in node core + * Reviewed PRs, commented on issues +* Ali Ijaz Sheikh @ofrobots (CTC) + * Looking at node+V8 (5.5) integration build failures that seem related to recent parser improvements + * Investigating performance with the new interpreter + * Working with @matthewloring on FFI +* Jenn Turner @renrutnnej (observer/Node.js Foundation) + * No update, just observing +* Rod Vagg @rvagg (CTC) + * Security releases, supposed to be on vacation +* Seth Thompson @s3ththompson (observer/Google) + * async/await landed in V8 Tip of Tree. on track to ship with V8 5.5 + * expect a doc from V8 language team on promise hook API to allow microtask introspection in the near future +* Myles Borins @TheAlphaNerd (CTC) + * issue / pr review + * helping with security release + * backporting inspector + * auditing v4 backlog + * really have to get to that tap reporter + * coming up with outreachy mentor project +* Trevor Norris @trevnorris (CTC) + * AsyncHooks +* Rich Trott @Trott (CTC) + * mentoring more first-time contributors (via Node Todo) + * doc, test PRs + * ramping up a tiny bit on Build WG stuff, but just a tiny bit + + +## Agenda + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + +### nodejs/CTC + +* Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) + +### nodejs/node + +* meta: update NODE_MODULE_VERSION to 51 [#8808](https://github.com/nodejs/node/pull/8808) +* General v7.0.0 / v6 LTS Planning / Discussion + + +## Previous Meeting Review + +* deps: update V8 to 5.4 [#8317](https://github.com/nodejs/node/pull/8317) +* Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) +* Decide on what problem points for ES Modules we care about the most. [#15](https://github.com/nodejs/CTC/issues/15) + + +## Minutes + +### Scheduling Meetings [ctc#14](https://github.com/nodejs/CTC/issues/14) + +@trott: This is a status report. Initial proposal was to dive in and start rotating meetings. Some were on board, some were concerned. Nikita started Google spreadsheet to figure things out. + +One proposal is to move back one hour (12pm Pacific) which would be a mild improvement for Ben and Nikita. + +Input received from NA and EU but not Asia and Australia. Once we have that information we can figure out what might work. + +--- + +### meta: update NODE_MODULE_VERSION to 51 [#8808](https://github.com/nodejs/node/pull/8808) + +`process.versions.modules` == 48 for v6.7.0. + +Set in build script, we bump this number for each semver-minor. We’d update to 49, but Electron has been bumping in between, so we need to go to 51. + +@thealphanerd: Had a way to do this in the past, but never landed a version of V8 on master [before a release]. So those using master cannot rely on this check. + +Proposal is to add this to master now and v7.x when released. But should we wait to bump till the actual release? + +@rvagg: If you’re using master, it’s been a bit “buyer beware” in the past. + +@thealphanerd: Node-pre-gyp uses the module version number to determine whether to pull the pre-built binary or to rebuild. So that’s causing problems. + +@ofrobots: Is there a disadvantage to doing this now? + +@rvagg: Doesn’t seem to be. + +@joshgav: Any concern that we’d have to bump again at v7.x release? + +@rvagg: We’ll just bump again. + +@addaleax: We should watch what Electron is doing cause they pull in every V8 version. + +@trevnorris: Could it happen that newer version of V8 has a lower module version number? + +@trott: if module version mapped to V8 version we could always be in sync. + +@ofrobots: Problem is that ABI is more than just V8. Also, we’re moving to a VM-neutral API/ABI in the future and that will remove the relationship to a V8 version. + +@rvagg: We should coordinate with Electron and draw from the same pool of numbers. + +@ofrobots: A good point for a bump would be when we bring a new V8 into master. + +@rvagg: This would make testing those nightlies easier. + +@trevnorris: Sounds to me that we can’t map reliably map a version of Node to a version of V8. So pulling from the same pool as Electron might be misleading to developers. If the number in Electron doesn’t match a Node version there would be a conflict. + +@rvagg: People are tracking which module versions map to what, so they could follow this too. + +@trevnorris: Maybe we can give Electron the minor numbers. + +@rvagg: NW.js also had a similar issue. + +@thealphanerd: Electron bumped to 5.1 in an ABI-breaking way, so we have two versions of Node ABIs out there, cause they needed to stay closer to Chromium. + +@rvagg: They don’t need to keep up with the latest version of V8. + +@thealphanerd: Let’s talk offline. + +@rvagg: Back to GitHub? Or do we need to decide now? + +@thealphanerd : PR has a lot of LGTMs, would like to see this land today or tomorrow so we can unbreak master. + +@ofrobots: Two points - one, what to do now; two, what to do going forward? + +Ali and Myles will work on a policy going forward. + +@rvagg: Might belong in LTS repo as we’ve been doing a lot of versioning stuff there. + +**Next steps**: + +* If there are objections raise them in the issue, otherwise ready to merge. + +--- + +### General v7.0.0 / v6 LTS Planning / Discussion + +@Fishrock123: Make sure all are in the loop. + +Throw v0.10 in too since it’s end of life at end of October. + +@rvagg: LTS map says *first* of October. Some people expect that cause the docs say that. + +@Fishrock123: We discussed keeping it alive till end of December like v0.12, cause that’s when OpenSSL is EOL’ed. + +@mhdawson: If the doc says Oct 1 what’s the downside to sticking with that? + +@rvagg: We may have communicated Oct 31 through some channels, so some people may expect that. + +Or perhaps when v7.x is first released. + +Having said that, it’s been >2 years, so people have had time to migrate. + +@rvagg: Originally 0.12 was slated for EOL in April 2017, we moved it back because of the OpenSSL issue. + +@Fishrock123: Official LTS policy is target date is when the next release/LTS is cut. That’s usually midway through month. + +@rvagg: Push to LTS WG to resolve ASAP. + +@rvagg: James pushing another beta later this week or early next week. + +@Fishrock123: v7.x is now on semver-major freeze. + +@rvagg: There are some semver-major commits in master which aren’t in v7 release. + +@Fishrock123: Might still need to update? Might have been left out by James intentionally? + +@thealphanerd: Not a ton of semver-major things on master. There are the V8 upgrades (patches), and a move of a method to fs/internal. + +Big one is npm@4 coming through the pipeline 1-2 weeks before Node release, should we include that. + +@rvagg: npm@3 had problems originally so we delayed. Should we do the same for npm@4? + +@addaleax: I’d feel comfortable with landing it. Kat said they aren’t concerned if 4 is included now or not. + +@Fishrock123: Things which are deprecated in v4 will still be deprecated (not removed) in v5, so we could bump all the way to v5 in a later release. + +@rvagg: We don’t have to synchronize all these dates to one, we can be flexible if needed. + +@thealphanerd: If we have a date other than late October it might be a good idea to offer a date. + +@ofrobots: Tentatively Oct 18 is the target stable date for V8 5.4. As tentative as usual, not clear till the last moment. Low chance that V8 will be moving a lot around Oct 18. Haven’t seen this date slip by more than 1-2 days. Very low chance that V8 will destablizie us. + +@thealphanerd: Oct 25 as a tentative date for v7.x? + +@rvagg: Ali and Seth, what’s the risk of setting that date now? + +@ofrobots: Close to Oct 18 I can highlight any potential risk. + +@rvagg: Let’s say that - 25th is tentative date, we’ll communicate if there’s any change. Any objections? (No.) + +That will also be the day we switch v6 to LTS. + +@thealphanerd: Doing release of v6 LTS earlier might be helpful so we have that out of the way for potential v7 issues. + +@rvagg: Discussion on this will move to LTS WG. Join the LTS WG on Monday to discuss. + +@thealphanerd: Could use someone to be responsible for v6 LTS, please volunteer. + +@rvagg: It’s been helpful to have a single person for v4 LTS, but we need to find a model that scales in the future. + +@Fishrock123: Would be helpful to schedule LTS a week earlier to avoid problems. + +--- + +### Supported platforms proposal from Build WG [#488](https://github.com/nodejs/build/issues/488) + +Current proposal: + +@trott should make a CTC agenda item next week? + +@rvagg: Give input on that issue before it comes to CTC. Build WG must review and sign off on as well. + +@rvagg: Some discussion about tiers, this affects OS vendors. + +--- + +### Other + +@thealphanerd: Node.js is going to be working with Outreachy project to help people from underrepresented groups get involved. + +We need projects for these people to work on in 3 months. If you can think of good parts of the project to assign… would love to hear your suggestions. + +@rvagg: GitHub thread? + +@hackygolucky: I’ll create a new one and ping @nodejs/collaborators. + +@rvagg: Are we getting a satisfactory response on the call for mentors? + +@hackygolucky: 5 primary mentors and a number of supplementals. 4 sponsors, which means we can accept 4 mentees. + +@rvagg: If someone wants to be a supplemental is that still open? + +@hackygolucky: Thread is still open: https://github.com/nodejs/education/issues/7 + +--- + +## Q/A on public channels + +None. + +--- + +## Upcoming Meetings + +* CTC: 2016-10-05 +* TSC: 2016-10-06 +* Build: 2016-10-11 +* Diagnostics: 2016-10-05, 12pm Pacific +* Benchmarking: +* LTS: 2016-10-03 +* Post-Mortem: +* API: + From 31690a690cffceef9b9a51af913f0c6d6b4c5225 Mon Sep 17 00:00:00 2001 From: Josh Gavant Date: Thu, 27 Oct 2016 13:18:08 -0700 Subject: [PATCH 070/119] doc: add 2016-10-05 CTC meeting minutes PR-URL: https://github.com/nodejs/node/pull/9326 Reviewed-By: James M Snell Reviewed-By: Rich Trott --- doc/ctc-meetings/2016-10-05.md | 312 +++++++++++++++++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 doc/ctc-meetings/2016-10-05.md diff --git a/doc/ctc-meetings/2016-10-05.md b/doc/ctc-meetings/2016-10-05.md new file mode 100644 index 00000000000000..ffaba688db7925 --- /dev/null +++ b/doc/ctc-meetings/2016-10-05.md @@ -0,0 +1,312 @@ +# Node Foundation CTC Meeting 2016-10-05 + +## Links + +* **Audio Recording**: TBP +* **GitHub Issue**: [#8915](https://github.com/nodejs/node/issues/8915) +* **Minutes Google Doc**: +* _Previous Minutes Google Doc_: + + +## Present + +* Anna Henningsen @addaleax (CTC) +* Bradley Meck @bmeck (observer/GoDaddy/TC39) +* Colin Ihrig @cjihrig (CTC) +* Evan Lucas @evanlucas (CTC) +* Jeremiah Senkpiel @Fishrock123 (CTC) +* Tracy Hinds @hackygolucky (observer/Node.js Foundation) +* Michael Dawson @mhdawson (CTC) +* Julien Gilli @misterdjules (CTC) +* Mikeal Rogers @mikeal (observer/Node.js Foundation) +* Jenn Turner @renrutnnej (observer/Node.js Foundation) +* Rod Vagg @rvagg (CTC) +* Seth Thompson @s3ththompson (observer/Google) +* Myles Borins @TheAlphaNerd (CTC) +* Sakthipriyan Vairamani @thefourtheye (observer) +* Trevor Norris @trevnorris (CTC) +* Rich Trott @Trott (CTC) +* Josh Gavant @joshgav (observer/Microsoft) + + +## Standup + +* Anna Henningsen @addaleax (CTC) + * Nothing noteworthy +* Bradley Meck @bmeck (observer/GoDaddy/TC39) + * Went to TC39, got late linking and re-linking fully discussed + * Working on live named imports talks and spec changes +* Colin Ihrig @cjihrig (CTC) + * Reviewing of issues and PRs. +* Evan Lucas @evanlucas (CTC) + * Worked a little on improving the commit linter + * Submitted a PR improving process.nextTick perf by 10-20% in some cases +* Jeremiah Senkpiel @Fishrock123 (CTC) + * merged existsSync undeprecation + * other PRs & Issues +* Tracy Hinds @hackygolucky (observer/Node.js Foundation) + * Outreachy application drive, issue open in the CTC repo + * Met last week to talk about code & lean @ Austin event +* Michael Dawson @mhdawson (CTC) + * Miscellaneous PR review + * fix a v8 test issue + * ABI Stable API meeting, reviews, discussion + * Closed out PPC migration +* Julien Gilli @misterdjules (CTC) + * Investigated SmartOS-specific issues. +* Mikeal Rogers @mikeal (observer/Node.js Foundation) + * Working on new budget for 2017 for the NF + * @ TC39 last week, very productive, looking for a way to be involved longer-term +* Brian White @mscdex (CTC) + * Continued work on various optimizations in core + * Submitted a few misc. cleanup PRs + * Reviewed PRs, commented on issues +* Jenn Turner @renrutnnej (observer/Node.js Foundation) + * No update, observing +* Rod Vagg @rvagg (CTC) + * Little build of build, little bit of LTS, little bit of NF work +* Seth Thompson @s3ththompson (observer/Google) + * async await on track to ship + * V8 inspector work ongoing +* Steven R Loomis @srl295 (observer/IBM/ICU) + * Regrets for today (and out next week) - ICU 58 will be out in a couple of weeks and will have an updated PR at that time… +* Myles Borins @TheAlphaNerd (CTC) + * v4.x backporting + * define outreachy project + * fix regressions in citgm + * work on new communication plan for LTS dates +* Sakthipriyan Vairamani @thefourtheye (observer) + * was sick for much of the week, so not much to report +* Trevor Norris @trevnorris (CTC) + * Fix performance regressions from async hooks + * Almost finished bringing PR compliant with EP. Soon tests and proper API documentation will follow. + * Engaged with the V8 team regarding the MicrotaskQueue API (https://bugs.chromium.org/p/v8/issues/detail?id=4643#c19) +* Rich Trott @Trott (CTC) + * CTC meeting rotation proposal + * 2FA for Collaborators + * miscellaneous issue tracker/commit activity +* Josh Gavant @joshgav (observer) + * time away + * diagnostics WG meeting + + +## Agenda + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + +### nodejs/node + +* doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) +* Intl: Consider deprecating Intl.v8BreakIterator [#8865](https://github.com/nodejs/node/issues/8865) +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + +### nodejs/CTC + +* Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) + + +## Previous Meeting Review + +* Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) +* meta: update NODE_MODULE_VERSION to 51 [#8808](https://github.com/nodejs/node/pull/8808) + * If there are objections raise them in the issue, otherwise ready to merge. +* General v7.0.0 / v6 LTS Planning / Discussion + + +## Minutes + +### doc: add supported platforms list [#8922](https://github.com/nodejs/node/pull/8922) + +@johanbergstrom put this together in collaboration with libuv and v8 teams. + +@rvagg: Has everyone reviewed that would like to? + +We rely on a few dependencies that make us who we are — most importantly V8 and libuv. We therefore need to adopt their supported platforms and potentially add to their lists based on test and/or release coverage. + +@trott: Do we mean that we support whatever they support? + +@Fishrock123: Could be clarified. Intent is that we must start with what they offer and anything additional falls to us (Node). + +@rvagg: Our supported platform list is narrower than that of libuv and v8. + +@?: It should say we’re a subset due to the constraints. + +@rvagg: Removing that might be the way to go. + +Any objections to list as it stands? + +Applies to v6, probably the same for v7. Will need to be changed for v4. + +If there are concerns, raise in issue. + +**Next steps**: + +* Raise any concerns in issue. + +--- + +### Intl: Consider deprecating Intl.v8BreakIterator [#8865](https://github.com/nodejs/node/issues/8865) + +Want to move to a different API: `Intl.Segmentor`, so want to deprecate this one. + +@mikeal: We need to discourage community from using this API so we can move to a more standards-compliant implementation. + +@rvagg: We expose this API because V8 exposes it. + +@bmeck: APIs exposed by V8 can be removed… + +@rvagg: New API is before TC-39, could take a while. Also, what is the timeframe for removal? + +Is it possible this will be removed in 5.5 or 5.6, which may land in Node v7.x, in which case it would be a breaking change we’d have to polyfill. + +Or will it be removed later and we can include it in Node v8.x. + +@mikeal: V8 (Daniel) wants to remove this as soon as possible, but depends on TC-39. + +@bmeck: Also some small percentage of web uses this so not able to completely remove yet anyway. + +@seththompson: We wait till stage 3 at TC-39 to implement. As far as removing v8BreakIterator, we don’t necessarily rely on usage. + +Will investigate this further with Daniel. + +@rvagg: No problem with removing it, but need a signal as to when it will be removed. + +@seththompson: Dan is out of office through next week. + +**Next steps**: + +* Continue discussion in GitHub. + +--- + +### net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) + +see also: + +@jasnell added this item, would be a semver-major change, can it be landed in v7. + +@rvagg: Adds error message when `.listen()` is called twice, EADDRINUSE. + +@addaleax: (#8294)[https://github.com/nodejs/node/pull/8294] documented that .listen() twice restarts the server. Does that conflict with this? + +@Fishrock123: When `close()` is called it resets the listen listener to `false`. + +@rvagg: Is this the only way to close? + +@addaleax: Might be… + +@rvagg: Will keep on agenda for James to discuss. + +@Fishrock123: Is anyone opposed to this? + +@evanlucas: Have we tested against the ecosystem? + +No, but it’s a poor usage anyway. + +@trott: delay until next week when James is here. + +@trevnorris: If you run this twice on the same server object, it overwrites the `_handle` property, orphaning the original handle. + +@mhdawson: Do they get a new handle to use? + +@trott: Put this into the issue. + +**Next steps**: + +* Discuss again next week. + +--- + +### Scheduling Meetings [#14](https://github.com/nodejs/CTC/issues/14) + +@trott: All possibilities are bad. Choosing the best of bad options. Hope to give proposed schedule a shot for 4 weeks and then evaluate. Or should we shoot this down and move on? + +@rvagg: To start next week, Oct 12? + +@trott: Yes. + +@rvagg: Any objections to next week: UTC 4:00pm, US Pacific 9am, US East 12 noon. + +Better for Europe and India. + +No. + +Next steps: + +* Do next week at new time. + +--- + +### General v7.0.0 / v6 LTS Planning / Discussion + +LTS group agreed to put out v6 LTS week of 10/17. + +Week after would be v7 final. + +@thealphanerd: We should do a release the week before v6 LTS to include all semver-minor changes we want in. + +@Fishrock123 will manage this release next week (10/10). + +@rvagg will manage v6 LTS the week after (10/17). + +@rvagg: What is status on V8 5.4 for 10/18? + +@seththompson: @ofrobots to confirm, no known problems. + +@rvagg: Still looking for someone to handle backports and releases for v6 LTS. + +@Fishrock123: We could switch Myles to v6 and someone else can pick up v4. + +@thealphanerd: As long as v4 is still “active” we have to go through everything. Some discussion of how to automate process. + +There will be more backports to v6, but also that stuff will be a lot clearer, if it can be backported. + +Would be good to come up with a better process for how things end up in staging. Instead of getting everything in there in the last minute. + +@Fishrock123: I disagree that if v4 is active it needs to have the same amount of activity all the way through. There has been an understanding that it would get more and more difficult to backport features, focus only on backporting security fixes. + +@thealphanerd: I found non-trivial number of items which would’ve been missed by automation. + +I’m a little bit uncomfortable with not auditing everything. Things that would get missed are more important than they sometimes seem. + +Myles, Evan, and Jeremiah to discuss tooling to help make auditing less work. + +@rvagg: Need to resolve Intl.v8BreakIterator for v7 - if we need to deprecate or remove it would be good to do so now. + +@SethThompson: Plan is to not deprecate anything until Intl.Segmentor reaches more conclusiveness in TC-39. But team would be fine if Node deprecates sooner. + +Current open issues for v7: https://github.com/nodejs/node/milestone/15 + +@rvagg: We won’t have OpenSSL 1.1.0 in Node in the near future, but it may be possible to compile against it. This isn’t a blocker for v7, doesn’t require semver-major. + +@rvagg: Should we ship another version of 0.10 with npm updated to include updated license? Comment in LTS WG. + +--- + +## Q/A on public channels + +Alex: Can we get a comment on stability of v6 at this point? + +@rvagg: We’ll have a standard v6 release next Tuesday, and the following Tuesday we’ll drop to LTS and stability push will start. Expect it to be as stable as the v4 releases. + +If you’re planning to move to v6 LTS, it’s worth testing now. + +@Fishrock123: Not many new features in next week’s v6.x.x release. Some regressions early in v6 lifecycle, none now. + +@evanlucas: Regression in inspector. + +@rvagg: Inspector is still marked experimental for now. That may change in the v6 lifetime. But for now it shouldn’t be treated as stable as the other features. + +--- + +## Upcoming Meetings + +* CTC: 2016-10-12, 9am Pacific +* TSC: 2016-10-06, 1pm Pacific +* Build: 2016-10-11 +* Diagnostics: first week of November +* Benchmarking: +* LTS: 2016-10-17 +* Post-Mortem: +* API: + From 355041960d9b495e10f53389f0ea497dc611016c Mon Sep 17 00:00:00 2001 From: cjihrig Date: Thu, 27 Oct 2016 17:37:40 -0400 Subject: [PATCH 071/119] events: remove unnecessary checks This commit removes two truthy checks for object properties that are immediately followed by a strict equality check. The other item in the comparison is guaranteed to be a function by this point in the code, so the truthy check is redundant. PR-URL: https://github.com/nodejs/node/pull/9330 Reviewed-By: Rich Trott Reviewed-By: James M Snell Reviewed-By: Anna Henningsen --- lib/events.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/events.js b/lib/events.js index da2dc599cacc32..e7202bfedd0c55 100644 --- a/lib/events.js +++ b/lib/events.js @@ -327,7 +327,7 @@ EventEmitter.prototype.removeListener = if (!list) return this; - if (list === listener || (list.listener && list.listener === listener)) { + if (list === listener || list.listener === listener) { if (--this._eventsCount === 0) this._events = new EventHandlers(); else { @@ -339,8 +339,7 @@ EventEmitter.prototype.removeListener = position = -1; for (i = list.length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { + if (list[i] === listener || list[i].listener === listener) { originalListener = list[i].listener; position = i; break; From 827000ee62a04cd4b867004842c6a8b2d7307b55 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Wed, 19 Oct 2016 16:53:39 -0700 Subject: [PATCH 072/119] deps: Intl: ICU 58 bump: configure/LICENSE/docs * bump to ICU 58.1 - update URL / hash * does not attempt to reduce size - yet * patch to work around http://bugs.icu-project.org/trac/ticket/12822 ( compile issue on Windows) * Fix ICU shrinker to delete old license.html file (update to https://github.com/nodejs/node/pull/8674 ) Fixes: https://github.com/nodejs/node/issues/7844 PR-URL: https://github.com/nodejs/node/pull/9234 Reviewed-By: James M Snell --- LICENSE | 93 +- configure | 4 +- tools/icu/README.md | 15 +- tools/icu/patches/58/source/i18n/digitlst.cpp | 1095 +++++++++++++++++ tools/icu/shrink-icu-src.py | 17 +- 5 files changed, 1162 insertions(+), 62 deletions(-) create mode 100644 tools/icu/patches/58/source/i18n/digitlst.cpp diff --git a/LICENSE b/LICENSE index 254d5484323b93..4ffd4869b2360a 100644 --- a/LICENSE +++ b/LICENSE @@ -98,12 +98,53 @@ The externally maintained libraries used by Node.js are: - ICU, located at deps/icu-small, is licensed as follows: """ - ICU License - ICU 1.8.1 and later + COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + + Copyright © 1991-2016 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in http://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 + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that either + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, or + (b) this copyright and permission notice appear in associated + Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. + + --------------------- + + Third-Party Software Licenses + + This section contains third-party software notices and/or additional + terms for licensed third-party software components included within ICU + libraries. + + 1. ICU License - ICU 1.8.1 to ICU 57.1 COPYRIGHT AND PERMISSION NOTICE Copyright (c) 1995-2016 International Business Machines Corporation and others - All rights reserved. Permission is hereby granted, free of charge, to any person obtaining @@ -134,54 +175,6 @@ The externally maintained libraries used by Node.js are: All trademarks and registered trademarks mentioned herein are the property of their respective owners. - --------------------- - - Third-Party Software Licenses - - This section contains third-party software notices and/or additional - terms for licensed third-party software components included within ICU - libraries. - - 1. Unicode Data Files and Software - - COPYRIGHT AND PERMISSION NOTICE - - Copyright © 1991-2016 Unicode, Inc. All rights reserved. - Distributed under the Terms of Use in - http://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 - (the "Data Files") or Unicode software and any associated documentation - (the "Software") to deal in the Data Files or Software - without restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, and/or sell copies of - the Data Files or Software, and to permit persons to whom the Data Files - or Software are furnished to do so, provided that - (a) this copyright and permission notice appear with all copies - of the Data Files or Software, - (b) this copyright and permission notice appear in associated - documentation, and - (c) there is clear notice in each modified Data File or in the Software - as well as in the documentation associated with the Data File(s) or - Software that the data or software has been modified. - - THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF - ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT OF THIRD PARTY RIGHTS. - IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS - NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL - DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THE DATA FILES OR SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in these Data Files or Software without prior - written authorization of the copyright holder. - 2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt) # The Google Chrome software developed by Google is licensed under diff --git a/configure b/configure index fdbda66320e4ee..02e6296b56f8af 100755 --- a/configure +++ b/configure @@ -967,8 +967,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): icus = [ { - 'url': 'https://ssl.icu-project.org/files/icu4c/57.1/icu4c-57_1-src.zip', - 'md5': 'f797503ecaebf1d38920013dc7893066', + 'url': 'https://ssl.icu-project.org/files/icu4c/58.1/icu4c-58_1-src.zip', + 'md5': 'd6476b355f66a11fbe12db1d61d90d69', }, ] def icu_download(path): diff --git a/tools/icu/README.md b/tools/icu/README.md index 2e53563cddf0f7..ed540c672599ed 100644 --- a/tools/icu/README.md +++ b/tools/icu/README.md @@ -8,11 +8,12 @@ ```shell ./configure \ --with-intl=small-icu \ - --with-icu-source=http://download.icu-project.org/files/icu4c/56.1/icu4c-56_1-src.zip + --with-icu-source=http://download.icu-project.org/files/icu4c/58.1/icu4c-58_1-src.tgz make ``` -(the equivalent `vcbuild.bat` commands should work also.) +(The equivalent `vcbuild.bat` commands should work also. Note that we use the `.tgz` and not the `.zip` here, +that is because of line endings.) - (note- may need to make changes in `icu-generic.gyp` or `tools/icu/patches` for version specific stuff) @@ -58,6 +59,14 @@ new Intl.DateTimeFormat('es',{month:'long'}).format(new Date(9E8)); - You are ready to check in the updated `deps/small-icu`. This is a big commit, so make this a separate commit from other changes. +- Now, rebuild the Node license. + +```shell +# clean up - remove deps/icu +make clean +tools/license-builder.sh +``` + - Now, fix the default URL for the `full-icu` build in `/configure`, in the `configure_intl()` function. It should match the ICU URL used in the first step. When this is done, the following should build with full ICU. @@ -70,7 +79,7 @@ make make test-ci ``` -- commit the change to `configure`. +- commit the change to `configure` along with the updated `LICENSE` file. ----- diff --git a/tools/icu/patches/58/source/i18n/digitlst.cpp b/tools/icu/patches/58/source/i18n/digitlst.cpp new file mode 100644 index 00000000000000..9711a6cc22880b --- /dev/null +++ b/tools/icu/patches/58/source/i18n/digitlst.cpp @@ -0,0 +1,1095 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +********************************************************************** +* Copyright (C) 1997-2015, International Business Machines +* Corporation and others. All Rights Reserved. +********************************************************************** +* +* File DIGITLST.CPP +* +* Modification History: +* +* Date Name Description +* 03/21/97 clhuang Converted from java. +* 03/21/97 clhuang Implemented with new APIs. +* 03/27/97 helena Updated to pass the simple test after code review. +* 03/31/97 aliu Moved isLONG_MIN to here, and fixed it. +* 04/15/97 aliu Changed MAX_COUNT to DBL_DIG. Changed Digit to char. +* Reworked representation by replacing fDecimalAt +* with fExponent. +* 04/16/97 aliu Rewrote set() and getDouble() to use sprintf/atof +* to do digit conversion. +* 09/09/97 aliu Modified for exponential notation support. +* 08/02/98 stephen Added nearest/even rounding +* Fixed bug in fitsIntoLong +****************************************************************************** +*/ + +#if defined(__CYGWIN__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif + +#include "digitlst.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/putil.h" +#include "charstr.h" +#include "cmemory.h" +#include "cstring.h" +#include "mutex.h" +#include "putilimp.h" +#include "uassert.h" +#include "digitinterval.h" +#include "ucln_in.h" +#include "umutex.h" +#include +#include +#include +#include +#include + +#if !defined(U_USE_STRTOD_L) +# if U_PLATFORM_USES_ONLY_WIN32_API +# define U_USE_STRTOD_L 1 +# elif defined(U_HAVE_STRTOD_L) +# define U_USE_STRTOD_L U_HAVE_STRTOD_L +# else +# define U_USE_STRTOD_L 0 +# endif +#endif + +// Patch for http://bugs.icu-project.org/trac/ticket/12822 +#if U_USE_STRTOD_L +# if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CYGWIN +# include +# else +# include +# endif +#endif + +// *************************************************************************** +// class DigitList +// A wrapper onto decNumber. +// Used to be standalone. +// *************************************************************************** + +/** + * This is the zero digit. The base for the digits returned by getDigit() + * Note that it is the platform invariant digit, and is not Unicode. + */ +#define kZero '0' + + +/* Only for 32 bit numbers. Ignore the negative sign. */ +//static const char LONG_MIN_REP[] = "2147483648"; +//static const char I64_MIN_REP[] = "9223372036854775808"; + + +U_NAMESPACE_BEGIN + +// ------------------------------------- +// default constructor + +DigitList::DigitList() +{ + uprv_decContextDefault(&fContext, DEC_INIT_BASE); + fContext.traps = 0; + uprv_decContextSetRounding(&fContext, DEC_ROUND_HALF_EVEN); + fContext.digits = fStorage.getCapacity(); + + fDecNumber = fStorage.getAlias(); + uprv_decNumberZero(fDecNumber); + + internalSetDouble(0.0); +} + +// ------------------------------------- + +DigitList::~DigitList() +{ +} + +// ------------------------------------- +// copy constructor + +DigitList::DigitList(const DigitList &other) +{ + fDecNumber = fStorage.getAlias(); + *this = other; +} + + +// ------------------------------------- +// assignment operator + +DigitList& +DigitList::operator=(const DigitList& other) +{ + if (this != &other) + { + uprv_memcpy(&fContext, &other.fContext, sizeof(decContext)); + + if (other.fStorage.getCapacity() > fStorage.getCapacity()) { + fDecNumber = fStorage.resize(other.fStorage.getCapacity()); + } + // Always reset the fContext.digits, even if fDecNumber was not reallocated, + // because above we copied fContext from other.fContext. + fContext.digits = fStorage.getCapacity(); + uprv_decNumberCopy(fDecNumber, other.fDecNumber); + + { + // fDouble is lazily created and cached. + // Avoid potential races with that happening with other.fDouble + // while we are doing the assignment. + Mutex mutex; + + if(other.fHave==kDouble) { + fUnion.fDouble = other.fUnion.fDouble; + } + fHave = other.fHave; + } + } + return *this; +} + +// ------------------------------------- +// operator == (does not exactly match the old DigitList function) + +UBool +DigitList::operator==(const DigitList& that) const +{ + if (this == &that) { + return TRUE; + } + decNumber n; // Has space for only a none digit value. + decContext c; + uprv_decContextDefault(&c, DEC_INIT_BASE); + c.digits = 1; + c.traps = 0; + + uprv_decNumberCompare(&n, this->fDecNumber, that.fDecNumber, &c); + UBool result = decNumberIsZero(&n); + return result; +} + +// ------------------------------------- +// comparison function. Returns +// Not Comparable : -2 +// < : -1 +// == : 0 +// > : +1 +int32_t DigitList::compare(const DigitList &other) { + decNumber result; + int32_t savedDigits = fContext.digits; + fContext.digits = 1; + uprv_decNumberCompare(&result, this->fDecNumber, other.fDecNumber, &fContext); + fContext.digits = savedDigits; + if (decNumberIsZero(&result)) { + return 0; + } else if (decNumberIsSpecial(&result)) { + return -2; + } else if (result.bits & DECNEG) { + return -1; + } else { + return 1; + } +} + + +// ------------------------------------- +// Reduce - remove trailing zero digits. +void +DigitList::reduce() { + uprv_decNumberReduce(fDecNumber, fDecNumber, &fContext); +} + + +// ------------------------------------- +// trim - remove trailing fraction zero digits. +void +DigitList::trim() { + uprv_decNumberTrim(fDecNumber); +} + +// ------------------------------------- +// Resets the digit list; sets all the digits to zero. + +void +DigitList::clear() +{ + uprv_decNumberZero(fDecNumber); + uprv_decContextSetRounding(&fContext, DEC_ROUND_HALF_EVEN); + internalSetDouble(0.0); +} + + +/** + * Formats a int64_t number into a base 10 string representation, and NULL terminates it. + * @param number The number to format + * @param outputStr The string to output to. Must be at least MAX_DIGITS+2 in length (21), + * to hold the longest int64_t value. + * @return the number of digits written, not including the sign. + */ +static int32_t +formatBase10(int64_t number, char *outputStr) { + // The number is output backwards, starting with the LSD. + // Fill the buffer from the far end. After the number is complete, + // slide the string contents to the front. + + const int32_t MAX_IDX = MAX_DIGITS+2; + int32_t destIdx = MAX_IDX; + outputStr[--destIdx] = 0; + + int64_t n = number; + if (number < 0) { // Negative numbers are slightly larger than a postive + outputStr[--destIdx] = (char)(-(n % 10) + kZero); + n /= -10; + } + do { + outputStr[--destIdx] = (char)(n % 10 + kZero); + n /= 10; + } while (n > 0); + + if (number < 0) { + outputStr[--destIdx] = '-'; + } + + // Slide the number to the start of the output str + U_ASSERT(destIdx >= 0); + int32_t length = MAX_IDX - destIdx; + uprv_memmove(outputStr, outputStr+MAX_IDX-length, length); + + return length; +} + + +// ------------------------------------- +// +// setRoundingMode() +// For most modes, the meaning and names are the same between the decNumber library +// (which DigitList follows) and the ICU Formatting Rounding Mode values. +// The flag constants are different, however. +// +// Note that ICU's kRoundingUnnecessary is not implemented directly by DigitList. +// This mode, inherited from Java, means that numbers that would not format exactly +// will return an error when formatting is attempted. + +void +DigitList::setRoundingMode(DecimalFormat::ERoundingMode m) { + enum rounding r; + + switch (m) { + case DecimalFormat::kRoundCeiling: r = DEC_ROUND_CEILING; break; + case DecimalFormat::kRoundFloor: r = DEC_ROUND_FLOOR; break; + case DecimalFormat::kRoundDown: r = DEC_ROUND_DOWN; break; + case DecimalFormat::kRoundUp: r = DEC_ROUND_UP; break; + case DecimalFormat::kRoundHalfEven: r = DEC_ROUND_HALF_EVEN; break; + case DecimalFormat::kRoundHalfDown: r = DEC_ROUND_HALF_DOWN; break; + case DecimalFormat::kRoundHalfUp: r = DEC_ROUND_HALF_UP; break; + case DecimalFormat::kRoundUnnecessary: r = DEC_ROUND_HALF_EVEN; break; + default: + // TODO: how to report the problem? + // Leave existing mode unchanged. + r = uprv_decContextGetRounding(&fContext); + } + uprv_decContextSetRounding(&fContext, r); + +} + + +// ------------------------------------- + +void +DigitList::setPositive(UBool s) { + if (s) { + fDecNumber->bits &= ~DECNEG; + } else { + fDecNumber->bits |= DECNEG; + } + internalClear(); +} +// ------------------------------------- + +void +DigitList::setDecimalAt(int32_t d) { + U_ASSERT((fDecNumber->bits & DECSPECIAL) == 0); // Not Infinity or NaN + U_ASSERT(d-1>-999999999); + U_ASSERT(d-1< 999999999); + int32_t adjustedDigits = fDecNumber->digits; + if (decNumberIsZero(fDecNumber)) { + // Account for difference in how zero is represented between DigitList & decNumber. + adjustedDigits = 0; + } + fDecNumber->exponent = d - adjustedDigits; + internalClear(); +} + +int32_t +DigitList::getDecimalAt() { + U_ASSERT((fDecNumber->bits & DECSPECIAL) == 0); // Not Infinity or NaN + if (decNumberIsZero(fDecNumber) || ((fDecNumber->bits & DECSPECIAL) != 0)) { + return fDecNumber->exponent; // Exponent should be zero for these cases. + } + return fDecNumber->exponent + fDecNumber->digits; +} + +void +DigitList::setCount(int32_t c) { + U_ASSERT(c <= fContext.digits); + if (c == 0) { + // For a value of zero, DigitList sets all fields to zero, while + // decNumber keeps one digit (with that digit being a zero) + c = 1; + fDecNumber->lsu[0] = 0; + } + fDecNumber->digits = c; + internalClear(); +} + +int32_t +DigitList::getCount() const { + if (decNumberIsZero(fDecNumber) && fDecNumber->exponent==0) { + // The extra test for exponent==0 is needed because parsing sometimes appends + // zero digits. It's bogus, decimalFormatter parsing needs to be cleaned up. + return 0; + } else { + return fDecNumber->digits; + } +} + +void +DigitList::setDigit(int32_t i, char v) { + int32_t count = fDecNumber->digits; + U_ASSERT(i='0' && v<='9'); + v &= 0x0f; + fDecNumber->lsu[count-i-1] = v; + internalClear(); +} + +char +DigitList::getDigit(int32_t i) { + int32_t count = fDecNumber->digits; + U_ASSERT(ilsu[count-i-1] + '0'; +} + +// copied from DigitList::getDigit() +uint8_t +DigitList::getDigitValue(int32_t i) { + int32_t count = fDecNumber->digits; + U_ASSERT(ilsu[count-i-1]; +} + +// ------------------------------------- +// Appends the digit to the digit list if it's not out of scope. +// Ignores the digit, otherwise. +// +// This function is horribly inefficient to implement with decNumber because +// the digits are stored least significant first, which requires moving all +// existing digits down one to make space for the new one to be appended. +// +void +DigitList::append(char digit) +{ + U_ASSERT(digit>='0' && digit<='9'); + // Ignore digits which exceed the precision we can represent + // And don't fix for larger precision. Fix callers instead. + if (decNumberIsZero(fDecNumber)) { + // Zero needs to be special cased because of the difference in the way + // that the old DigitList and decNumber represent it. + // digit cout was zero for digitList, is one for decNumber + fDecNumber->lsu[0] = digit & 0x0f; + fDecNumber->digits = 1; + fDecNumber->exponent--; // To match the old digit list implementation. + } else { + int32_t nDigits = fDecNumber->digits; + if (nDigits < fContext.digits) { + int i; + for (i=nDigits; i>0; i--) { + fDecNumber->lsu[i] = fDecNumber->lsu[i-1]; + } + fDecNumber->lsu[0] = digit & 0x0f; + fDecNumber->digits++; + // DigitList emulation - appending doesn't change the magnitude of existing + // digits. With decNumber's decimal being after the + // least signficant digit, we need to adjust the exponent. + fDecNumber->exponent--; + } + } + internalClear(); +} + +// ------------------------------------- + +/** + * Currently, getDouble() depends on strtod() to do its conversion. + * + * WARNING!! + * This is an extremely costly function. ~1/2 of the conversion time + * can be linked to this function. + */ +double +DigitList::getDouble() const +{ + { + Mutex mutex; + if (fHave == kDouble) { + return fUnion.fDouble; + } + } + + double tDouble = 0.0; + if (isZero()) { + tDouble = 0.0; + if (decNumberIsNegative(fDecNumber)) { + tDouble /= -1; + } + } else if (isInfinite()) { + if (std::numeric_limits::has_infinity) { + tDouble = std::numeric_limits::infinity(); + } else { + tDouble = std::numeric_limits::max(); + } + if (!isPositive()) { + tDouble = -tDouble; //this was incorrectly "-fDouble" originally. + } + } else { + MaybeStackArray s; + // Note: 14 is a magic constant from the decNumber library documentation, + // the max number of extra characters beyond the number of digits + // needed to represent the number in string form. Add a few more + // for the additional digits we retain. + + // Round down to appx. double precision, if the number is longer than that. + // Copy the number first, so that we don't modify the original. + if (getCount() > MAX_DBL_DIGITS + 3) { + DigitList numToConvert(*this); + numToConvert.reduce(); // Removes any trailing zeros, so that digit count is good. + numToConvert.round(MAX_DBL_DIGITS+3); + uprv_decNumberToString(numToConvert.fDecNumber, s.getAlias()); + // TODO: how many extra digits should be included for an accurate conversion? + } else { + uprv_decNumberToString(this->fDecNumber, s.getAlias()); + } + U_ASSERT(uprv_strlen(&s[0]) < MAX_DBL_DIGITS+18); + + char *end = NULL; + tDouble = decimalStrToDouble(s.getAlias(), &end); + } + { + Mutex mutex; + DigitList *nonConstThis = const_cast(this); + nonConstThis->internalSetDouble(tDouble); + } + return tDouble; +} + +#if U_USE_STRTOD_L && U_PLATFORM_USES_ONLY_WIN32_API +# define locale_t _locale_t +# define freelocale _free_locale +# define strtod_l _strtod_l +#endif + +#if U_USE_STRTOD_L +static locale_t gCLocale = (locale_t)0; +#endif +static icu::UInitOnce gCLocaleInitOnce = U_INITONCE_INITIALIZER; + +U_CDECL_BEGIN +// Cleanup callback func +static UBool U_CALLCONV digitList_cleanup(void) +{ +#if U_USE_STRTOD_L + if (gCLocale != (locale_t)0) { + freelocale(gCLocale); + } +#endif + return TRUE; +} +// C Locale initialization func +static void U_CALLCONV initCLocale(void) { + ucln_i18n_registerCleanup(UCLN_I18N_DIGITLIST, digitList_cleanup); +#if U_USE_STRTOD_L +# if U_PLATFORM_USES_ONLY_WIN32_API + gCLocale = _create_locale(LC_ALL, "C"); +# else + gCLocale = newlocale(LC_ALL_MASK, "C", (locale_t)0); +# endif +#endif +} +U_CDECL_END + +double +DigitList::decimalStrToDouble(char *decstr, char **end) { + umtx_initOnce(gCLocaleInitOnce, &initCLocale); +#if U_USE_STRTOD_L + return strtod_l(decstr, end, gCLocale); +#else + char *decimalPt = strchr(decstr, '.'); + if (decimalPt) { + // We need to know the decimal separator character that will be used with strtod(). + // Depends on the C runtime global locale. + // Most commonly is '.' + char rep[MAX_DIGITS]; + sprintf(rep, "%+1.1f", 1.0); + *decimalPt = rep[2]; + } + return uprv_strtod(decstr, end); +#endif +} + +// ------------------------------------- + +/** + * convert this number to an int32_t. Round if there is a fractional part. + * Return zero if the number cannot be represented. + */ +int32_t DigitList::getLong() /*const*/ +{ + int32_t result = 0; + if (getUpperExponent() > 10) { + // Overflow, absolute value too big. + return result; + } + if (fDecNumber->exponent != 0) { + // Force to an integer, with zero exponent, rounding if necessary. + // (decNumberToInt32 will only work if the exponent is exactly zero.) + DigitList copy(*this); + DigitList zero; + uprv_decNumberQuantize(copy.fDecNumber, copy.fDecNumber, zero.fDecNumber, &fContext); + result = uprv_decNumberToInt32(copy.fDecNumber, &fContext); + } else { + result = uprv_decNumberToInt32(fDecNumber, &fContext); + } + return result; +} + + +/** + * convert this number to an int64_t. Truncate if there is a fractional part. + * Return zero if the number cannot be represented. + */ +int64_t DigitList::getInt64() /*const*/ { + // TODO: fast conversion if fHave == fDouble + + // Truncate if non-integer. + // Return 0 if out of range. + // Range of in64_t is -9223372036854775808 to 9223372036854775807 (19 digits) + // + if (getUpperExponent() > 19) { + // Overflow, absolute value too big. + return 0; + } + + // The number of integer digits may differ from the number of digits stored + // in the decimal number. + // for 12.345 numIntDigits = 2, number->digits = 5 + // for 12E4 numIntDigits = 6, number->digits = 2 + // The conversion ignores the fraction digits in the first case, + // and fakes up extra zero digits in the second. + // TODO: It would be faster to store a table of powers of ten to multiply by + // instead of looping over zero digits, multiplying each time. + + int32_t numIntDigits = getUpperExponent(); + uint64_t value = 0; + for (int32_t i = 0; i < numIntDigits; i++) { + // Loop is iterating over digits starting with the most significant. + // Numbers are stored with the least significant digit at index zero. + int32_t digitIndex = fDecNumber->digits - i - 1; + int32_t v = (digitIndex >= 0) ? fDecNumber->lsu[digitIndex] : 0; + value = value * (uint64_t)10 + (uint64_t)v; + } + + if (decNumberIsNegative(fDecNumber)) { + value = ~value; + value += 1; + } + int64_t svalue = (int64_t)value; + + // Check overflow. It's convenient that the MSD is 9 only on overflow, the amount of + // overflow can't wrap too far. The test will also fail -0, but + // that does no harm; the right answer is 0. + if (numIntDigits == 19) { + if (( decNumberIsNegative(fDecNumber) && svalue>0) || + (!decNumberIsNegative(fDecNumber) && svalue<0)) { + svalue = 0; + } + } + + return svalue; +} + + +/** + * Return a string form of this number. + * Format is as defined by the decNumber library, for interchange of + * decimal numbers. + */ +void DigitList::getDecimal(CharString &str, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + + // A decimal number in string form can, worst case, be 14 characters longer + // than the number of digits. So says the decNumber library doc. + int32_t maxLength = fDecNumber->digits + 14; + int32_t capacity = 0; + char *buffer = str.clear().getAppendBuffer(maxLength, 0, capacity, status); + if (U_FAILURE(status)) { + return; // Memory allocation error on growing the string. + } + U_ASSERT(capacity >= maxLength); + uprv_decNumberToString(this->fDecNumber, buffer); + U_ASSERT((int32_t)uprv_strlen(buffer) <= maxLength); + str.append(buffer, -1, status); +} + +/** + * Return true if this is an integer value that can be held + * by an int32_t type. + */ +UBool +DigitList::fitsIntoLong(UBool ignoreNegativeZero) /*const*/ +{ + if (decNumberIsSpecial(this->fDecNumber)) { + // NaN or Infinity. Does not fit in int32. + return FALSE; + } + uprv_decNumberTrim(this->fDecNumber); + if (fDecNumber->exponent < 0) { + // Number contains fraction digits. + return FALSE; + } + if (decNumberIsZero(this->fDecNumber) && !ignoreNegativeZero && + (fDecNumber->bits & DECNEG) != 0) { + // Negative Zero, not ingored. Cannot represent as a long. + return FALSE; + } + if (getUpperExponent() < 10) { + // The number is 9 or fewer digits. + // The max and min int32 are 10 digts, so this number fits. + // This is the common case. + return TRUE; + } + + // TODO: Should cache these constants; construction is relatively costly. + // But not of huge consequence; they're only needed for 10 digit ints. + UErrorCode status = U_ZERO_ERROR; + DigitList min32; min32.set("-2147483648", status); + if (this->compare(min32) < 0) { + return FALSE; + } + DigitList max32; max32.set("2147483647", status); + if (this->compare(max32) > 0) { + return FALSE; + } + if (U_FAILURE(status)) { + return FALSE; + } + return true; +} + + + +/** + * Return true if the number represented by this object can fit into + * a long. + */ +UBool +DigitList::fitsIntoInt64(UBool ignoreNegativeZero) /*const*/ +{ + if (decNumberIsSpecial(this->fDecNumber)) { + // NaN or Infinity. Does not fit in int32. + return FALSE; + } + uprv_decNumberTrim(this->fDecNumber); + if (fDecNumber->exponent < 0) { + // Number contains fraction digits. + return FALSE; + } + if (decNumberIsZero(this->fDecNumber) && !ignoreNegativeZero && + (fDecNumber->bits & DECNEG) != 0) { + // Negative Zero, not ingored. Cannot represent as a long. + return FALSE; + } + if (getUpperExponent() < 19) { + // The number is 18 or fewer digits. + // The max and min int64 are 19 digts, so this number fits. + // This is the common case. + return TRUE; + } + + // TODO: Should cache these constants; construction is relatively costly. + // But not of huge consequence; they're only needed for 19 digit ints. + UErrorCode status = U_ZERO_ERROR; + DigitList min64; min64.set("-9223372036854775808", status); + if (this->compare(min64) < 0) { + return FALSE; + } + DigitList max64; max64.set("9223372036854775807", status); + if (this->compare(max64) > 0) { + return FALSE; + } + if (U_FAILURE(status)) { + return FALSE; + } + return true; +} + + +// ------------------------------------- + +void +DigitList::set(int32_t source) +{ + set((int64_t)source); + internalSetDouble(source); +} + +// ------------------------------------- +/** + * Set an int64, via decnumber + */ +void +DigitList::set(int64_t source) +{ + char str[MAX_DIGITS+2]; // Leave room for sign and trailing nul. + formatBase10(source, str); + U_ASSERT(uprv_strlen(str) < sizeof(str)); + + uprv_decNumberFromString(fDecNumber, str, &fContext); + internalSetDouble(static_cast(source)); +} + +// ------------------------------------- +/** + * Set the DigitList from a decimal number string. + * + * The incoming string _must_ be nul terminated, even though it is arriving + * as a StringPiece because that is what the decNumber library wants. + * We can get away with this for an internal function; it would not + * be acceptable for a public API. + */ +void +DigitList::set(StringPiece source, UErrorCode &status, uint32_t /*fastpathBits*/) { + if (U_FAILURE(status)) { + return; + } + +#if 0 + if(fastpathBits==(kFastpathOk|kNoDecimal)) { + int32_t size = source.size(); + const char *data = source.data(); + int64_t r = 0; + int64_t m = 1; + // fast parse + while(size>0) { + char ch = data[--size]; + if(ch=='+') { + break; + } else if(ch=='-') { + r = -r; + break; + } else { + int64_t d = ch-'0'; + //printf("CH[%d]=%c, %d, *=%d\n", size,ch, (int)d, (int)m); + r+=(d)*m; + m *= 10; + } + } + //printf("R=%d\n", r); + set(r); + } else +#endif + { + // Figure out a max number of digits to use during the conversion, and + // resize the number up if necessary. + int32_t numDigits = source.length(); + if (numDigits > fContext.digits) { + // fContext.digits == fStorage.getCapacity() + decNumber *t = fStorage.resize(numDigits, fStorage.getCapacity()); + if (t == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + fDecNumber = t; + fContext.digits = numDigits; + } + + fContext.status = 0; + uprv_decNumberFromString(fDecNumber, source.data(), &fContext); + if ((fContext.status & DEC_Conversion_syntax) != 0) { + status = U_DECIMAL_NUMBER_SYNTAX_ERROR; + } + } + internalClear(); +} + +/** + * Set the digit list to a representation of the given double value. + * This method supports both fixed-point and exponential notation. + * @param source Value to be converted. + */ +void +DigitList::set(double source) +{ + // for now, simple implementation; later, do proper IEEE stuff + char rep[MAX_DIGITS + 8]; // Extra space for '+', '.', e+NNN, and '\0' (actually +8 is enough) + + // Generate a representation of the form /[+-][0-9].[0-9]+e[+-][0-9]+/ + // Can also generate /[+-]nan/ or /[+-]inf/ + // TODO: Use something other than sprintf() here, since it's behavior is somewhat platform specific. + // That is why infinity is special cased here. + if (uprv_isInfinite(source)) { + if (uprv_isNegativeInfinity(source)) { + uprv_strcpy(rep,"-inf"); // Handle negative infinity + } else { + uprv_strcpy(rep,"inf"); + } + } else { + sprintf(rep, "%+1.*e", MAX_DBL_DIGITS - 1, source); + } + U_ASSERT(uprv_strlen(rep) < sizeof(rep)); + + // uprv_decNumberFromString() will parse the string expecting '.' as a + // decimal separator, however sprintf() can use ',' in certain locales. + // Overwrite a ',' with '.' here before proceeding. + char *decimalSeparator = strchr(rep, ','); + if (decimalSeparator != NULL) { + *decimalSeparator = '.'; + } + + // Create a decNumber from the string. + uprv_decNumberFromString(fDecNumber, rep, &fContext); + uprv_decNumberTrim(fDecNumber); + internalSetDouble(source); +} + +// ------------------------------------- + +/* + * Multiply + * The number will be expanded if need be to retain full precision. + * In practice, for formatting, multiply is by 10, 100 or 1000, so more digits + * will not be required for this use. + */ +void +DigitList::mult(const DigitList &other, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + fContext.status = 0; + int32_t requiredDigits = this->digits() + other.digits(); + if (requiredDigits > fContext.digits) { + reduce(); // Remove any trailing zeros + int32_t requiredDigits = this->digits() + other.digits(); + ensureCapacity(requiredDigits, status); + } + uprv_decNumberMultiply(fDecNumber, fDecNumber, other.fDecNumber, &fContext); + internalClear(); +} + +// ------------------------------------- + +/* + * Divide + * The number will _not_ be expanded for inexact results. + * TODO: probably should expand some, for rounding increments that + * could add a few digits, e.g. .25, but not expand arbitrarily. + */ +void +DigitList::div(const DigitList &other, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + uprv_decNumberDivide(fDecNumber, fDecNumber, other.fDecNumber, &fContext); + internalClear(); +} + +// ------------------------------------- + +/* + * ensureCapacity. Grow the digit storage for the number if it's less than the requested + * amount. Never reduce it. Available size is kept in fContext.digits. + */ +void +DigitList::ensureCapacity(int32_t requestedCapacity, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (requestedCapacity <= 0) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (requestedCapacity > DEC_MAX_DIGITS) { + // Don't report an error for requesting too much. + // Arithemetic Results will be rounded to what can be supported. + // At 999,999,999 max digits, exceeding the limit is not too likely! + requestedCapacity = DEC_MAX_DIGITS; + } + if (requestedCapacity > fContext.digits) { + decNumber *newBuffer = fStorage.resize(requestedCapacity, fStorage.getCapacity()); + if (newBuffer == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + fContext.digits = requestedCapacity; + fDecNumber = newBuffer; + } +} + +// ------------------------------------- + +/** + * Round the representation to the given number of digits. + * @param maximumDigits The maximum number of digits to be shown. + * Upon return, count will be less than or equal to maximumDigits. + */ +void +DigitList::round(int32_t maximumDigits) +{ + reduce(); + if (maximumDigits >= fDecNumber->digits) { + return; + } + int32_t savedDigits = fContext.digits; + fContext.digits = maximumDigits; + uprv_decNumberPlus(fDecNumber, fDecNumber, &fContext); + fContext.digits = savedDigits; + uprv_decNumberTrim(fDecNumber); + reduce(); + internalClear(); +} + + +void +DigitList::roundFixedPoint(int32_t maximumFractionDigits) { + reduce(); // Remove trailing zeros. + if (fDecNumber->exponent >= -maximumFractionDigits) { + return; + } + decNumber scale; // Dummy decimal number, but with the desired number of + uprv_decNumberZero(&scale); // fraction digits. + scale.exponent = -maximumFractionDigits; + scale.lsu[0] = 1; + + uprv_decNumberQuantize(fDecNumber, fDecNumber, &scale, &fContext); + reduce(); + internalClear(); +} + +// ------------------------------------- + +void +DigitList::toIntegralValue() { + uprv_decNumberToIntegralValue(fDecNumber, fDecNumber, &fContext); +} + + +// ------------------------------------- +UBool +DigitList::isZero() const +{ + return decNumberIsZero(fDecNumber); +} + +// ------------------------------------- +int32_t +DigitList::getUpperExponent() const { + return fDecNumber->digits + fDecNumber->exponent; +} + +DigitInterval & +DigitList::getSmallestInterval(DigitInterval &result) const { + result.setLeastSignificantInclusive(fDecNumber->exponent); + result.setMostSignificantExclusive(getUpperExponent()); + return result; +} + +uint8_t +DigitList::getDigitByExponent(int32_t exponent) const { + int32_t idx = exponent - fDecNumber->exponent; + if (idx < 0 || idx >= fDecNumber->digits) { + return 0; + } + return fDecNumber->lsu[idx]; +} + +void +DigitList::appendDigitsTo(CharString &str, UErrorCode &status) const { + str.append((const char *) fDecNumber->lsu, fDecNumber->digits, status); +} + +void +DigitList::roundAtExponent(int32_t exponent, int32_t maxSigDigits) { + reduce(); + if (maxSigDigits < fDecNumber->digits) { + int32_t minExponent = getUpperExponent() - maxSigDigits; + if (exponent < minExponent) { + exponent = minExponent; + } + } + if (exponent <= fDecNumber->exponent) { + return; + } + int32_t digits = getUpperExponent() - exponent; + if (digits > 0) { + round(digits); + } else { + roundFixedPoint(-exponent); + } +} + +void +DigitList::quantize(const DigitList &quantity, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + div(quantity, status); + roundAtExponent(0); + mult(quantity, status); + reduce(); +} + +int32_t +DigitList::getScientificExponent( + int32_t minIntDigitCount, int32_t exponentMultiplier) const { + // The exponent for zero is always zero. + if (isZero()) { + return 0; + } + int32_t intDigitCount = getUpperExponent(); + int32_t exponent; + if (intDigitCount >= minIntDigitCount) { + int32_t maxAdjustment = intDigitCount - minIntDigitCount; + exponent = (maxAdjustment / exponentMultiplier) * exponentMultiplier; + } else { + int32_t minAdjustment = minIntDigitCount - intDigitCount; + exponent = ((minAdjustment + exponentMultiplier - 1) / exponentMultiplier) * -exponentMultiplier; + } + return exponent; +} + +int32_t +DigitList::toScientific( + int32_t minIntDigitCount, int32_t exponentMultiplier) { + int32_t exponent = getScientificExponent( + minIntDigitCount, exponentMultiplier); + shiftDecimalRight(-exponent); + return exponent; +} + +void +DigitList::shiftDecimalRight(int32_t n) { + fDecNumber->exponent += n; + internalClear(); +} + +U_NAMESPACE_END +#endif // #if !UCONFIG_NO_FORMATTING + +//eof diff --git a/tools/icu/shrink-icu-src.py b/tools/icu/shrink-icu-src.py index d0c82d87468dc0..406c5c317f51e4 100644 --- a/tools/icu/shrink-icu-src.py +++ b/tools/icu/shrink-icu-src.py @@ -48,18 +48,17 @@ def icu_ignore(dir, files): ign = ign + files # except... ign.remove('source') - ign.remove('license.html') - ign.remove('LICENSE') + if 'LICENSE' in ign: + ign.remove('LICENSE') + # license.html will be removed (it's obviated by LICENSE) + elif 'license.html' in ign: + ign.remove('license.html') elif subdir == 'source': - ign = ign + ['layout','samples','test','extra','config','layoutex','allinone'] + ign = ign + ['layout','samples','test','extra','config','layoutex','allinone','data'] ign = ign + ['runConfigureICU','install-sh','mkinstalldirs','configure'] elif subdir == 'source/tools': ign = ign + ['tzcode','ctestfw','gensprep','gennorm2','gendict','icuswap', 'genbrk','gencfu','gencolusb','genren','memcheck','makeconv','gencnval','icuinfo','gentest'] - elif subdir == 'source/data': - ign = ign + ['unidata','curr','zone','unit','lang','region','misc','sprep'] - # else: - # print '!%s! [%s]' % (subdir, files) ign = ign + ['.DS_Store', 'Makefile', 'Makefile.in'] for file in files: @@ -103,6 +102,10 @@ def icu_info(icu_full_path): shutil.copytree(options.icusrc, options.icusmall, ignore=icu_ignore) print '%s --> %s' % (src_datafile, dst_datafile) +# now, make the data dir (since we ignored it) +os.mkdir(os.path.join(os.path.join(options.icusmall, "source", "data"))) +os.mkdir(os.path.join(os.path.join(options.icusmall, "source", "data", "in"))) + # OK, now copy the data file shutil.copy(src_datafile, dst_datafile) From 3d1766f49299f71e3eeb95d96702f68a264dff11 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Wed, 19 Oct 2016 17:24:31 -0700 Subject: [PATCH 073/119] deps: Intl: ICU 58 bump - small icu (BIG COMMIT) This commit contains the ICU 58.1 delta. It is especially large because of the ICU license change, and, because the line endings were off previously. * bump to ICU 58.1 - check in small ICU source * from 58.1 final http://site.icu-project.org/download/58 Fixes: https://github.com/nodejs/node/issues/7844 PR-URL: https://github.com/nodejs/node/pull/9234 Reviewed-By: James M Snell --- deps/icu-small/LICENSE | 94 +- deps/icu-small/README-SMALL-ICU.txt | 4 +- deps/icu-small/license.html | 18 - deps/icu-small/source/common/appendable.cpp | 2 + deps/icu-small/source/common/bmpset.cpp | 2 + deps/icu-small/source/common/bmpset.h | 2 + deps/icu-small/source/common/brkeng.cpp | 2 + deps/icu-small/source/common/brkeng.h | 2 + deps/icu-small/source/common/brkiter.cpp | 4 + deps/icu-small/source/common/bytestream.cpp | 2 + deps/icu-small/source/common/bytestrie.cpp | 2 + .../source/common/bytestriebuilder.cpp | 10 +- .../source/common/bytestrieiterator.cpp | 10 +- deps/icu-small/source/common/caniter.cpp | 2 + deps/icu-small/source/common/chariter.cpp | 2 + deps/icu-small/source/common/charstr.cpp | 4 +- deps/icu-small/source/common/charstr.h | 8 +- deps/icu-small/source/common/cmemory.c | 2 + deps/icu-small/source/common/cmemory.h | 12 +- deps/icu-small/source/common/common.rc | 2 + deps/icu-small/source/common/cpputils.h | 20 +- deps/icu-small/source/common/cstr.cpp | 24 +- deps/icu-small/source/common/cstr.h | 9 +- deps/icu-small/source/common/cstring.c | 2 + deps/icu-small/source/common/cstring.h | 2 + deps/icu-small/source/common/cwchar.c | 2 + deps/icu-small/source/common/cwchar.h | 2 + deps/icu-small/source/common/dictbe.cpp | 6 +- deps/icu-small/source/common/dictbe.h | 2 + .../source/common/dictionarydata.cpp | 2 + deps/icu-small/source/common/dictionarydata.h | 2 + deps/icu-small/source/common/dtintrv.cpp | 2 + deps/icu-small/source/common/errorcode.cpp | 2 + deps/icu-small/source/common/filteredbrk.cpp | 48 +- .../source/common/filterednormalizer2.cpp | 2 + deps/icu-small/source/common/hash.h | 2 + deps/icu-small/source/common/icudataver.c | 2 + deps/icu-small/source/common/icuplug.cpp | 2 + deps/icu-small/source/common/icuplugimp.h | 2 + .../icu-small/source/common/listformatter.cpp | 2 + .../source/common/loadednormalizer2impl.cpp | 2 + deps/icu-small/source/common/localsvc.h | 2 + deps/icu-small/source/common/locavailable.cpp | 2 + deps/icu-small/source/common/locbased.cpp | 2 + deps/icu-small/source/common/locbased.h | 2 + deps/icu-small/source/common/locdispnames.cpp | 4 +- deps/icu-small/source/common/locdspnm.cpp | 117 +- deps/icu-small/source/common/locid.cpp | 81 +- deps/icu-small/source/common/loclikely.cpp | 5 +- deps/icu-small/source/common/locmap.c | 64 +- deps/icu-small/source/common/locmap.h | 2 + deps/icu-small/source/common/locresdata.cpp | 2 + deps/icu-small/source/common/locutil.cpp | 2 + deps/icu-small/source/common/locutil.h | 2 + deps/icu-small/source/common/messageimpl.h | 2 + .../source/common/messagepattern.cpp | 4 +- deps/icu-small/source/common/msvcres.h | 2 + deps/icu-small/source/common/mutex.h | 2 + deps/icu-small/source/common/norm2_nfc_data.h | 1114 +-- deps/icu-small/source/common/norm2allmodes.h | 2 + deps/icu-small/source/common/normalizer2.cpp | 2 + .../source/common/normalizer2impl.cpp | 2 + .../icu-small/source/common/normalizer2impl.h | 2 + deps/icu-small/source/common/normlzr.cpp | 2 + deps/icu-small/source/common/parsepos.cpp | 2 + deps/icu-small/source/common/patternprops.cpp | 2 + deps/icu-small/source/common/patternprops.h | 2 + deps/icu-small/source/common/pluralmap.cpp | 2 + deps/icu-small/source/common/pluralmap.h | 2 + deps/icu-small/source/common/propname.cpp | 2 + deps/icu-small/source/common/propname.h | 2 + deps/icu-small/source/common/propname_data.h | 1768 ++--- deps/icu-small/source/common/propsvec.c | 12 +- deps/icu-small/source/common/propsvec.h | 2 + deps/icu-small/source/common/punycode.cpp | 2 + deps/icu-small/source/common/punycode.h | 2 + deps/icu-small/source/common/putil.cpp | 83 +- deps/icu-small/source/common/putilimp.h | 14 +- deps/icu-small/source/common/rbbi.cpp | 17 +- deps/icu-small/source/common/rbbicst.pl | 4 + deps/icu-small/source/common/rbbidata.cpp | 2 + deps/icu-small/source/common/rbbidata.h | 2 + deps/icu-small/source/common/rbbinode.cpp | 59 +- deps/icu-small/source/common/rbbinode.h | 6 +- deps/icu-small/source/common/rbbirb.cpp | 2 + deps/icu-small/source/common/rbbirb.h | 2 + deps/icu-small/source/common/rbbirpt.h | 2 + deps/icu-small/source/common/rbbiscan.cpp | 26 +- deps/icu-small/source/common/rbbiscan.h | 2 + deps/icu-small/source/common/rbbisetb.cpp | 4 +- deps/icu-small/source/common/rbbisetb.h | 2 + deps/icu-small/source/common/rbbistbl.cpp | 25 +- deps/icu-small/source/common/rbbitblb.cpp | 8 +- deps/icu-small/source/common/rbbitblb.h | 2 + deps/icu-small/source/common/resbund.cpp | 2 + deps/icu-small/source/common/resbund_cnv.cpp | 2 + deps/icu-small/source/common/resource.cpp | 46 +- deps/icu-small/source/common/resource.h | 257 +- deps/icu-small/source/common/ruleiter.cpp | 2 + deps/icu-small/source/common/ruleiter.h | 2 + deps/icu-small/source/common/schriter.cpp | 2 + deps/icu-small/source/common/serv.cpp | 2 + deps/icu-small/source/common/serv.h | 2 + deps/icu-small/source/common/servlk.cpp | 2 + deps/icu-small/source/common/servlkf.cpp | 2 + deps/icu-small/source/common/servloc.h | 2 + deps/icu-small/source/common/servls.cpp | 2 + deps/icu-small/source/common/servnotf.cpp | 2 + deps/icu-small/source/common/servnotf.h | 2 + deps/icu-small/source/common/servrbf.cpp | 2 + deps/icu-small/source/common/servslkf.cpp | 2 + deps/icu-small/source/common/sharedobject.cpp | 2 + deps/icu-small/source/common/sharedobject.h | 2 + .../source/common/simpleformatter.cpp | 2 + deps/icu-small/source/common/sprpimpl.h | 2 + deps/icu-small/source/common/stringpiece.cpp | 2 + .../source/common/stringtriebuilder.cpp | 2 + deps/icu-small/source/common/uarrsort.c | 12 +- deps/icu-small/source/common/uarrsort.h | 2 + deps/icu-small/source/common/uassert.h | 2 + deps/icu-small/source/common/ubidi.c | 6 +- deps/icu-small/source/common/ubidi_props.c | 2 + deps/icu-small/source/common/ubidi_props.h | 2 + .../source/common/ubidi_props_data.h | 1114 +-- deps/icu-small/source/common/ubidiimp.h | 2 + deps/icu-small/source/common/ubidiln.c | 2 + deps/icu-small/source/common/ubiditransform.c | 528 ++ deps/icu-small/source/common/ubidiwrt.c | 2 + deps/icu-small/source/common/ubrk.cpp | 2 + deps/icu-small/source/common/ubrkimpl.h | 2 + deps/icu-small/source/common/ucase.cpp | 26 +- deps/icu-small/source/common/ucase.h | 5 +- .../source/common/ucase_props_data.h | 1313 ++-- deps/icu-small/source/common/ucasemap.cpp | 291 +- .../common/ucasemap_titlecase_brkiter.cpp | 2 + deps/icu-small/source/common/ucat.c | 2 + deps/icu-small/source/common/uchar.c | 12 +- .../source/common/uchar_props_data.h | 5991 +++++++++-------- deps/icu-small/source/common/ucharstrie.cpp | 2 + .../source/common/ucharstriebuilder.cpp | 4 +- .../source/common/ucharstrieiterator.cpp | 2 + deps/icu-small/source/common/uchriter.cpp | 2 + deps/icu-small/source/common/ucln.h | 2 + deps/icu-small/source/common/ucln_cmn.cpp | 2 + deps/icu-small/source/common/ucln_cmn.h | 2 + deps/icu-small/source/common/ucln_imp.h | 2 + deps/icu-small/source/common/ucmndata.c | 2 + deps/icu-small/source/common/ucmndata.h | 2 + deps/icu-small/source/common/ucnv.c | 6 +- deps/icu-small/source/common/ucnv2022.cpp | 65 +- deps/icu-small/source/common/ucnv_bld.cpp | 2 + deps/icu-small/source/common/ucnv_bld.h | 2 + deps/icu-small/source/common/ucnv_cb.c | 2 + deps/icu-small/source/common/ucnv_cnv.c | 2 + deps/icu-small/source/common/ucnv_cnv.h | 2 + deps/icu-small/source/common/ucnv_ct.c | 2 + deps/icu-small/source/common/ucnv_err.c | 2 + deps/icu-small/source/common/ucnv_ext.cpp | 4 +- deps/icu-small/source/common/ucnv_ext.h | 2 + deps/icu-small/source/common/ucnv_imp.h | 2 + deps/icu-small/source/common/ucnv_io.cpp | 37 +- deps/icu-small/source/common/ucnv_io.h | 10 +- deps/icu-small/source/common/ucnv_lmb.c | 2 + deps/icu-small/source/common/ucnv_set.c | 2 + deps/icu-small/source/common/ucnv_u16.c | 22 +- deps/icu-small/source/common/ucnv_u32.c | 17 +- deps/icu-small/source/common/ucnv_u7.c | 7 +- deps/icu-small/source/common/ucnv_u8.c | 7 +- deps/icu-small/source/common/ucnvbocu.cpp | 10 +- deps/icu-small/source/common/ucnvdisp.c | 2 + deps/icu-small/source/common/ucnvhz.c | 2 + deps/icu-small/source/common/ucnvisci.c | 2 + deps/icu-small/source/common/ucnvlat1.c | 2 + deps/icu-small/source/common/ucnvmbcs.cpp | 53 +- deps/icu-small/source/common/ucnvmbcs.h | 2 + deps/icu-small/source/common/ucnvscsu.c | 2 + deps/icu-small/source/common/ucnvsel.cpp | 2 + deps/icu-small/source/common/ucol_data.h | 2 + deps/icu-small/source/common/ucol_swp.cpp | 2 + deps/icu-small/source/common/ucol_swp.h | 2 + deps/icu-small/source/common/ucurr.cpp | 11 +- deps/icu-small/source/common/ucurrimp.h | 2 + deps/icu-small/source/common/udata.cpp | 61 +- deps/icu-small/source/common/udatamem.c | 2 + deps/icu-small/source/common/udatamem.h | 2 + deps/icu-small/source/common/udataswp.c | 6 +- deps/icu-small/source/common/udataswp.h | 16 + deps/icu-small/source/common/uelement.h | 2 + deps/icu-small/source/common/uenum.c | 2 + deps/icu-small/source/common/uenumimp.h | 2 + deps/icu-small/source/common/uhash.c | 2 + deps/icu-small/source/common/uhash.h | 6 +- deps/icu-small/source/common/uhash_us.cpp | 2 + deps/icu-small/source/common/uidna.cpp | 14 +- deps/icu-small/source/common/uinit.cpp | 2 + deps/icu-small/source/common/uinvchar.c | 2 + deps/icu-small/source/common/uinvchar.h | 2 + deps/icu-small/source/common/uiter.cpp | 2 + deps/icu-small/source/common/ulist.c | 67 +- deps/icu-small/source/common/ulist.h | 6 +- .../source/common/ulistformatter.cpp | 2 + deps/icu-small/source/common/uloc.cpp | 105 +- deps/icu-small/source/common/uloc_keytype.cpp | 7 +- deps/icu-small/source/common/uloc_tag.c | 102 +- deps/icu-small/source/common/ulocimp.h | 2 + deps/icu-small/source/common/umapfile.c | 2 + deps/icu-small/source/common/umapfile.h | 2 + deps/icu-small/source/common/umath.c | 2 + deps/icu-small/source/common/umutex.cpp | 21 +- deps/icu-small/source/common/umutex.h | 20 +- deps/icu-small/source/common/unames.cpp | 2 + .../source/common/unicode/appendable.h | 2 + .../icu-small/source/common/unicode/brkiter.h | 7 + .../source/common/unicode/bytestream.h | 2 + .../source/common/unicode/bytestrie.h | 5 +- .../source/common/unicode/bytestriebuilder.h | 6 +- .../icu-small/source/common/unicode/caniter.h | 2 + .../source/common/unicode/chariter.h | 2 + deps/icu-small/source/common/unicode/dbbi.h | 2 + .../icu-small/source/common/unicode/docmain.h | 4 +- .../icu-small/source/common/unicode/dtintrv.h | 2 + .../icu-small/source/common/unicode/enumset.h | 2 + .../source/common/unicode/errorcode.h | 2 + .../source/common/unicode/filteredbrk.h | 22 +- .../source/common/unicode/icudataver.h | 2 + .../icu-small/source/common/unicode/icuplug.h | 14 +- deps/icu-small/source/common/unicode/idna.h | 10 +- .../source/common/unicode/listformatter.h | 2 + .../source/common/unicode/localpointer.h | 47 +- .../source/common/unicode/locdspnm.h | 2 + deps/icu-small/source/common/unicode/locid.h | 2 + .../source/common/unicode/messagepattern.h | 2 + .../source/common/unicode/normalizer2.h | 2 + .../icu-small/source/common/unicode/normlzr.h | 8 +- .../source/common/unicode/parseerr.h | 2 + .../source/common/unicode/parsepos.h | 2 + .../source/common/unicode/platform.h | 8 + deps/icu-small/source/common/unicode/ptypes.h | 2 + deps/icu-small/source/common/unicode/putil.h | 2 + deps/icu-small/source/common/unicode/rbbi.h | 74 +- deps/icu-small/source/common/unicode/rep.h | 2 + .../icu-small/source/common/unicode/resbund.h | 2 + .../source/common/unicode/schriter.h | 2 + .../source/common/unicode/simpleformatter.h | 2 + .../source/common/unicode/std_string.h | 2 + .../icu-small/source/common/unicode/strenum.h | 2 + .../source/common/unicode/stringpiece.h | 8 +- .../source/common/unicode/stringtriebuilder.h | 14 +- .../source/common/unicode/symtable.h | 2 + deps/icu-small/source/common/unicode/ubidi.h | 28 +- .../source/common/unicode/ubiditransform.h | 321 + deps/icu-small/source/common/unicode/ubrk.h | 31 +- .../source/common/unicode/ucasemap.h | 2 + deps/icu-small/source/common/unicode/ucat.h | 2 + deps/icu-small/source/common/unicode/uchar.h | 261 +- .../source/common/unicode/ucharstrie.h | 2 + .../source/common/unicode/ucharstriebuilder.h | 2 + .../source/common/unicode/uchriter.h | 2 + deps/icu-small/source/common/unicode/uclean.h | 2 + deps/icu-small/source/common/unicode/ucnv.h | 9 +- .../icu-small/source/common/unicode/ucnv_cb.h | 2 + .../source/common/unicode/ucnv_err.h | 2 + .../icu-small/source/common/unicode/ucnvsel.h | 2 + .../icu-small/source/common/unicode/uconfig.h | 2 + deps/icu-small/source/common/unicode/ucurr.h | 6 +- deps/icu-small/source/common/unicode/udata.h | 9 +- .../source/common/unicode/udisplaycontext.h | 36 +- deps/icu-small/source/common/unicode/uenum.h | 2 + deps/icu-small/source/common/unicode/uidna.h | 2 + deps/icu-small/source/common/unicode/uiter.h | 2 + .../source/common/unicode/uldnames.h | 2 + .../source/common/unicode/ulistformatter.h | 2 + deps/icu-small/source/common/unicode/uloc.h | 12 +- .../source/common/unicode/umachine.h | 25 + deps/icu-small/source/common/unicode/umisc.h | 2 + .../icu-small/source/common/unicode/unifilt.h | 2 + .../source/common/unicode/unifunct.h | 2 + .../source/common/unicode/unimatch.h | 2 + deps/icu-small/source/common/unicode/uniset.h | 4 +- deps/icu-small/source/common/unicode/unistr.h | 26 +- deps/icu-small/source/common/unicode/unorm.h | 8 +- deps/icu-small/source/common/unicode/unorm2.h | 2 + .../icu-small/source/common/unicode/uobject.h | 2 + .../icu-small/source/common/unicode/urename.h | 20 +- deps/icu-small/source/common/unicode/urep.h | 2 + deps/icu-small/source/common/unicode/ures.h | 8 +- .../icu-small/source/common/unicode/uscript.h | 52 +- deps/icu-small/source/common/unicode/uset.h | 6 +- .../source/common/unicode/usetiter.h | 2 + deps/icu-small/source/common/unicode/ushape.h | 2 + deps/icu-small/source/common/unicode/usprep.h | 2 + .../icu-small/source/common/unicode/ustring.h | 2 + .../source/common/unicode/ustringtrie.h | 2 + deps/icu-small/source/common/unicode/utext.h | 2 + deps/icu-small/source/common/unicode/utf.h | 2 + deps/icu-small/source/common/unicode/utf16.h | 2 + deps/icu-small/source/common/unicode/utf32.h | 2 + deps/icu-small/source/common/unicode/utf8.h | 2 + .../icu-small/source/common/unicode/utf_old.h | 2 + deps/icu-small/source/common/unicode/utrace.h | 20 + deps/icu-small/source/common/unicode/utypes.h | 168 +- .../icu-small/source/common/unicode/uvernum.h | 23 +- .../source/common/unicode/uversion.h | 2 + deps/icu-small/source/common/unifiedcache.cpp | 2 + deps/icu-small/source/common/unifiedcache.h | 4 +- deps/icu-small/source/common/unifilt.cpp | 2 + deps/icu-small/source/common/unifunct.cpp | 2 + deps/icu-small/source/common/uniset.cpp | 10 +- .../source/common/uniset_closure.cpp | 2 + deps/icu-small/source/common/uniset_props.cpp | 2 + deps/icu-small/source/common/unisetspan.cpp | 2 + deps/icu-small/source/common/unisetspan.h | 2 + deps/icu-small/source/common/unistr.cpp | 143 +- deps/icu-small/source/common/unistr_case.cpp | 2 + .../source/common/unistr_case_locale.cpp | 2 + deps/icu-small/source/common/unistr_cnv.cpp | 2 + deps/icu-small/source/common/unistr_props.cpp | 2 + .../common/unistr_titlecase_brkiter.cpp | 2 + deps/icu-small/source/common/unistrappender.h | 2 + deps/icu-small/source/common/unorm.cpp | 2 + deps/icu-small/source/common/unormcmp.cpp | 2 + deps/icu-small/source/common/unormimp.h | 2 + deps/icu-small/source/common/uobject.cpp | 2 + deps/icu-small/source/common/uposixdefs.h | 2 + deps/icu-small/source/common/uprops.cpp | 2 + deps/icu-small/source/common/uprops.h | 11 +- deps/icu-small/source/common/ures_cnv.c | 2 + deps/icu-small/source/common/uresbund.cpp | 82 +- deps/icu-small/source/common/uresdata.cpp | 347 +- deps/icu-small/source/common/uresdata.h | 32 +- deps/icu-small/source/common/uresimp.h | 12 +- deps/icu-small/source/common/ureslocs.h | 2 + deps/icu-small/source/common/usc_impl.c | 2 + deps/icu-small/source/common/usc_impl.h | 2 + deps/icu-small/source/common/uscript.c | 2 + .../icu-small/source/common/uscript_props.cpp | 26 +- deps/icu-small/source/common/uset.cpp | 2 + deps/icu-small/source/common/uset_imp.h | 2 + deps/icu-small/source/common/uset_props.cpp | 2 + deps/icu-small/source/common/usetiter.cpp | 2 + deps/icu-small/source/common/ushape.cpp | 22 +- deps/icu-small/source/common/usprep.cpp | 2 + deps/icu-small/source/common/ustack.cpp | 2 + deps/icu-small/source/common/ustr_cnv.cpp | 2 + deps/icu-small/source/common/ustr_cnv.h | 2 + deps/icu-small/source/common/ustr_imp.h | 40 + .../source/common/ustr_titlecase_brkiter.cpp | 2 + deps/icu-small/source/common/ustr_wcs.cpp | 16 +- deps/icu-small/source/common/ustrcase.cpp | 699 +- .../source/common/ustrcase_locale.cpp | 2 + deps/icu-small/source/common/ustrenum.cpp | 2 + deps/icu-small/source/common/ustrenum.h | 2 + deps/icu-small/source/common/ustrfmt.c | 2 + deps/icu-small/source/common/ustrfmt.h | 2 + deps/icu-small/source/common/ustring.cpp | 8 +- deps/icu-small/source/common/ustrtrns.cpp | 2 + deps/icu-small/source/common/utext.cpp | 2 + deps/icu-small/source/common/utf_impl.c | 2 + deps/icu-small/source/common/util.cpp | 2 + deps/icu-small/source/common/util.h | 2 + deps/icu-small/source/common/util_props.cpp | 2 + deps/icu-small/source/common/utrace.c | 2 + deps/icu-small/source/common/utracimp.h | 2 + deps/icu-small/source/common/utrie.cpp | 6 +- deps/icu-small/source/common/utrie.h | 2 + deps/icu-small/source/common/utrie2.cpp | 2 + deps/icu-small/source/common/utrie2.h | 2 + .../source/common/utrie2_builder.cpp | 12 +- deps/icu-small/source/common/utrie2_impl.h | 2 + deps/icu-small/source/common/uts46.cpp | 30 +- deps/icu-small/source/common/utypeinfo.h | 2 + deps/icu-small/source/common/utypes.c | 2 + deps/icu-small/source/common/uvector.cpp | 2 + deps/icu-small/source/common/uvector.h | 2 + deps/icu-small/source/common/uvectr32.cpp | 2 + deps/icu-small/source/common/uvectr32.h | 2 + deps/icu-small/source/common/uvectr64.cpp | 2 + deps/icu-small/source/common/uvectr64.h | 2 + deps/icu-small/source/common/wintz.c | 2 + deps/icu-small/source/common/wintz.h | 2 + deps/icu-small/source/data/in/icudt57l.dat | Bin 1933056 -> 0 bytes deps/icu-small/source/data/in/icudt58l.dat | Bin 0 -> 2680800 bytes .../source/i18n/affixpatternparser.cpp | 8 +- .../source/i18n/affixpatternparser.h | 2 + deps/icu-small/source/i18n/alphaindex.cpp | 2 + deps/icu-small/source/i18n/anytrans.cpp | 2 + deps/icu-small/source/i18n/anytrans.h | 2 + deps/icu-small/source/i18n/astro.cpp | 2 + deps/icu-small/source/i18n/astro.h | 2 + deps/icu-small/source/i18n/basictz.cpp | 2 + deps/icu-small/source/i18n/bocsu.cpp | 2 + deps/icu-small/source/i18n/bocsu.h | 2 + deps/icu-small/source/i18n/brktrans.cpp | 2 + deps/icu-small/source/i18n/brktrans.h | 2 + deps/icu-small/source/i18n/buddhcal.cpp | 2 + deps/icu-small/source/i18n/buddhcal.h | 2 + deps/icu-small/source/i18n/calendar.cpp | 33 +- deps/icu-small/source/i18n/casetrn.cpp | 2 + deps/icu-small/source/i18n/casetrn.h | 2 + deps/icu-small/source/i18n/cecal.cpp | 2 + deps/icu-small/source/i18n/cecal.h | 2 + deps/icu-small/source/i18n/chnsecal.cpp | 2 + deps/icu-small/source/i18n/chnsecal.h | 2 + deps/icu-small/source/i18n/choicfmt.cpp | 2 + deps/icu-small/source/i18n/coleitr.cpp | 2 + deps/icu-small/source/i18n/coll.cpp | 2 + deps/icu-small/source/i18n/collation.cpp | 2 + deps/icu-small/source/i18n/collation.h | 2 + .../source/i18n/collationbuilder.cpp | 2 + deps/icu-small/source/i18n/collationbuilder.h | 2 + .../source/i18n/collationcompare.cpp | 2 + deps/icu-small/source/i18n/collationcompare.h | 2 + deps/icu-small/source/i18n/collationdata.cpp | 2 + deps/icu-small/source/i18n/collationdata.h | 2 + .../source/i18n/collationdatabuilder.cpp | 2 + .../source/i18n/collationdatabuilder.h | 2 + .../source/i18n/collationdatareader.cpp | 2 + .../source/i18n/collationdatareader.h | 2 + .../source/i18n/collationdatawriter.cpp | 2 + .../source/i18n/collationdatawriter.h | 2 + .../source/i18n/collationfastlatin.cpp | 2 + .../source/i18n/collationfastlatin.h | 2 + .../source/i18n/collationfastlatinbuilder.cpp | 6 +- .../source/i18n/collationfastlatinbuilder.h | 2 + deps/icu-small/source/i18n/collationfcd.cpp | 106 +- deps/icu-small/source/i18n/collationfcd.h | 2 + .../source/i18n/collationiterator.cpp | 2 + .../icu-small/source/i18n/collationiterator.h | 2 + deps/icu-small/source/i18n/collationkeys.cpp | 2 + deps/icu-small/source/i18n/collationkeys.h | 2 + deps/icu-small/source/i18n/collationroot.cpp | 4 +- deps/icu-small/source/i18n/collationroot.h | 4 +- .../source/i18n/collationrootelements.cpp | 2 + .../source/i18n/collationrootelements.h | 2 + .../source/i18n/collationruleparser.cpp | 4 +- .../source/i18n/collationruleparser.h | 2 + deps/icu-small/source/i18n/collationsets.cpp | 2 + deps/icu-small/source/i18n/collationsets.h | 2 + .../source/i18n/collationsettings.cpp | 2 + .../icu-small/source/i18n/collationsettings.h | 2 + .../source/i18n/collationtailoring.cpp | 2 + .../source/i18n/collationtailoring.h | 2 + .../source/i18n/collationweights.cpp | 2 + deps/icu-small/source/i18n/collationweights.h | 2 + deps/icu-small/source/i18n/collunsafe.h | 2 + .../source/i18n/compactdecimalformat.cpp | 529 +- deps/icu-small/source/i18n/coptccal.cpp | 2 + deps/icu-small/source/i18n/coptccal.h | 2 + deps/icu-small/source/i18n/cpdtrans.cpp | 2 + deps/icu-small/source/i18n/cpdtrans.h | 2 + deps/icu-small/source/i18n/csdetect.cpp | 2 + deps/icu-small/source/i18n/csdetect.h | 2 + deps/icu-small/source/i18n/csmatch.cpp | 2 + deps/icu-small/source/i18n/csmatch.h | 2 + deps/icu-small/source/i18n/csr2022.cpp | 2 + deps/icu-small/source/i18n/csr2022.h | 2 + deps/icu-small/source/i18n/csrecog.cpp | 2 + deps/icu-small/source/i18n/csrecog.h | 2 + deps/icu-small/source/i18n/csrmbcs.cpp | 2 + deps/icu-small/source/i18n/csrmbcs.h | 2 + deps/icu-small/source/i18n/csrsbcs.cpp | 2 + deps/icu-small/source/i18n/csrsbcs.h | 2 + deps/icu-small/source/i18n/csrucode.cpp | 2 + deps/icu-small/source/i18n/csrucode.h | 2 + deps/icu-small/source/i18n/csrutf8.cpp | 2 + deps/icu-small/source/i18n/csrutf8.h | 2 + deps/icu-small/source/i18n/curramt.cpp | 2 + deps/icu-small/source/i18n/currfmt.cpp | 2 + deps/icu-small/source/i18n/currfmt.h | 2 + deps/icu-small/source/i18n/currpinf.cpp | 2 + deps/icu-small/source/i18n/currunit.cpp | 2 + deps/icu-small/source/i18n/dangical.cpp | 2 + deps/icu-small/source/i18n/dangical.h | 2 + deps/icu-small/source/i18n/datefmt.cpp | 4 +- deps/icu-small/source/i18n/dayperiodrules.cpp | 209 +- deps/icu-small/source/i18n/dayperiodrules.h | 4 +- deps/icu-small/source/i18n/dcfmtimp.h | 2 + deps/icu-small/source/i18n/dcfmtsym.cpp | 371 +- deps/icu-small/source/i18n/decContext.c | 2 + deps/icu-small/source/i18n/decContext.h | 2 + deps/icu-small/source/i18n/decNumber.c | 2 + deps/icu-small/source/i18n/decNumber.h | 2 + deps/icu-small/source/i18n/decNumberLocal.h | 2 + deps/icu-small/source/i18n/decfmtst.cpp | 2 + deps/icu-small/source/i18n/decfmtst.h | 2 + .../source/i18n/decimalformatpattern.cpp | 2 + .../source/i18n/decimalformatpattern.h | 6 +- .../source/i18n/decimalformatpatternimpl.h | 2 + deps/icu-small/source/i18n/decimfmt.cpp | 46 +- deps/icu-small/source/i18n/decimfmtimpl.cpp | 12 +- deps/icu-small/source/i18n/decimfmtimpl.h | 4 +- deps/icu-small/source/i18n/digitaffix.cpp | 2 + deps/icu-small/source/i18n/digitaffix.h | 2 + .../source/i18n/digitaffixesandpadding.cpp | 2 + .../source/i18n/digitaffixesandpadding.h | 2 + deps/icu-small/source/i18n/digitformatter.cpp | 2 + deps/icu-small/source/i18n/digitformatter.h | 2 + deps/icu-small/source/i18n/digitgrouping.cpp | 2 + deps/icu-small/source/i18n/digitgrouping.h | 2 + deps/icu-small/source/i18n/digitinterval.cpp | 2 + deps/icu-small/source/i18n/digitinterval.h | 2 + deps/icu-small/source/i18n/digitlst.cpp | 126 +- deps/icu-small/source/i18n/digitlst.h | 7 +- deps/icu-small/source/i18n/dt_impl.h | 92 + deps/icu-small/source/i18n/dtfmtsym.cpp | 1186 ++-- deps/icu-small/source/i18n/dtitv_impl.h | 2 + deps/icu-small/source/i18n/dtitvfmt.cpp | 47 +- deps/icu-small/source/i18n/dtitvinf.cpp | 237 +- deps/icu-small/source/i18n/dtptngen.cpp | 816 +-- deps/icu-small/source/i18n/dtptngen_impl.h | 53 +- deps/icu-small/source/i18n/dtrule.cpp | 2 + deps/icu-small/source/i18n/esctrn.cpp | 2 + deps/icu-small/source/i18n/esctrn.h | 2 + deps/icu-small/source/i18n/ethpccal.cpp | 2 + deps/icu-small/source/i18n/ethpccal.h | 2 + deps/icu-small/source/i18n/fmtable.cpp | 6 +- deps/icu-small/source/i18n/fmtable_cnv.cpp | 2 + deps/icu-small/source/i18n/fmtableimp.h | 2 + deps/icu-small/source/i18n/format.cpp | 2 + deps/icu-small/source/i18n/fphdlimp.cpp | 2 + deps/icu-small/source/i18n/fphdlimp.h | 2 + deps/icu-small/source/i18n/fpositer.cpp | 7 +- deps/icu-small/source/i18n/funcrepl.cpp | 2 + deps/icu-small/source/i18n/funcrepl.h | 2 + deps/icu-small/source/i18n/gender.cpp | 2 + deps/icu-small/source/i18n/gregocal.cpp | 2 + deps/icu-small/source/i18n/gregoimp.cpp | 171 +- deps/icu-small/source/i18n/gregoimp.h | 67 +- deps/icu-small/source/i18n/hebrwcal.cpp | 2 + deps/icu-small/source/i18n/hebrwcal.h | 2 + deps/icu-small/source/i18n/i18n.rc | 2 + .../icu-small/source/i18n/identifier_info.cpp | 310 - deps/icu-small/source/i18n/identifier_info.h | 189 - deps/icu-small/source/i18n/indiancal.cpp | 2 + deps/icu-small/source/i18n/indiancal.h | 2 + deps/icu-small/source/i18n/inputext.cpp | 2 + deps/icu-small/source/i18n/inputext.h | 2 + deps/icu-small/source/i18n/islamcal.cpp | 4 +- deps/icu-small/source/i18n/islamcal.h | 4 +- deps/icu-small/source/i18n/japancal.cpp | 2 + deps/icu-small/source/i18n/japancal.h | 2 + deps/icu-small/source/i18n/measfmt.cpp | 254 +- deps/icu-small/source/i18n/measunit.cpp | 301 +- deps/icu-small/source/i18n/measure.cpp | 2 + deps/icu-small/source/i18n/msgfmt.cpp | 2 + deps/icu-small/source/i18n/msgfmt_impl.h | 2 + deps/icu-small/source/i18n/name2uni.cpp | 2 + deps/icu-small/source/i18n/name2uni.h | 2 + deps/icu-small/source/i18n/nfrlist.h | 2 + deps/icu-small/source/i18n/nfrs.cpp | 2 + deps/icu-small/source/i18n/nfrs.h | 2 + deps/icu-small/source/i18n/nfrule.cpp | 2 + deps/icu-small/source/i18n/nfrule.h | 2 + deps/icu-small/source/i18n/nfsubs.cpp | 2 + deps/icu-small/source/i18n/nfsubs.h | 2 + deps/icu-small/source/i18n/nortrans.cpp | 2 + deps/icu-small/source/i18n/nortrans.h | 2 + deps/icu-small/source/i18n/nultrans.cpp | 2 + deps/icu-small/source/i18n/nultrans.h | 2 + deps/icu-small/source/i18n/numfmt.cpp | 10 +- deps/icu-small/source/i18n/numsys.cpp | 2 + deps/icu-small/source/i18n/numsys_impl.h | 2 + deps/icu-small/source/i18n/olsontz.cpp | 2 + deps/icu-small/source/i18n/olsontz.h | 2 + deps/icu-small/source/i18n/persncal.cpp | 2 + deps/icu-small/source/i18n/persncal.h | 2 + deps/icu-small/source/i18n/pluralaffix.cpp | 2 + deps/icu-small/source/i18n/pluralaffix.h | 2 + deps/icu-small/source/i18n/plurfmt.cpp | 6 +- deps/icu-small/source/i18n/plurrule.cpp | 2 + deps/icu-small/source/i18n/plurrule_impl.h | 2 + deps/icu-small/source/i18n/precision.cpp | 2 + deps/icu-small/source/i18n/precision.h | 2 + deps/icu-small/source/i18n/quant.cpp | 2 + deps/icu-small/source/i18n/quant.h | 2 + .../source/i18n/quantityformatter.cpp | 2 + .../icu-small/source/i18n/quantityformatter.h | 2 + deps/icu-small/source/i18n/rbnf.cpp | 2 + deps/icu-small/source/i18n/rbt.cpp | 2 + deps/icu-small/source/i18n/rbt.h | 2 + deps/icu-small/source/i18n/rbt_data.cpp | 2 + deps/icu-small/source/i18n/rbt_data.h | 2 + deps/icu-small/source/i18n/rbt_pars.cpp | 2 + deps/icu-small/source/i18n/rbt_pars.h | 2 + deps/icu-small/source/i18n/rbt_rule.cpp | 4 +- deps/icu-small/source/i18n/rbt_rule.h | 2 + deps/icu-small/source/i18n/rbt_set.cpp | 2 + deps/icu-small/source/i18n/rbt_set.h | 2 + deps/icu-small/source/i18n/rbtz.cpp | 2 + deps/icu-small/source/i18n/regexcmp.cpp | 8 +- deps/icu-small/source/i18n/regexcmp.h | 2 + deps/icu-small/source/i18n/regexcst.h | 2 + deps/icu-small/source/i18n/regexcst.pl | 2 + deps/icu-small/source/i18n/regeximp.cpp | 2 + deps/icu-small/source/i18n/regeximp.h | 2 + deps/icu-small/source/i18n/regexst.cpp | 2 + deps/icu-small/source/i18n/regexst.h | 2 + deps/icu-small/source/i18n/regextxt.cpp | 2 + deps/icu-small/source/i18n/regextxt.h | 2 + deps/icu-small/source/i18n/region.cpp | 13 +- deps/icu-small/source/i18n/region_impl.h | 2 + deps/icu-small/source/i18n/reldatefmt.cpp | 371 +- deps/icu-small/source/i18n/reldtfmt.cpp | 199 +- deps/icu-small/source/i18n/reldtfmt.h | 9 +- deps/icu-small/source/i18n/rematch.cpp | 2 + deps/icu-small/source/i18n/remtrans.cpp | 2 + deps/icu-small/source/i18n/remtrans.h | 2 + deps/icu-small/source/i18n/repattrn.cpp | 2 + .../source/i18n/rulebasedcollator.cpp | 4 +- .../source/i18n/scientificnumberformatter.cpp | 2 + deps/icu-small/source/i18n/scriptset.cpp | 46 + deps/icu-small/source/i18n/scriptset.h | 8 + deps/icu-small/source/i18n/search.cpp | 2 + deps/icu-small/source/i18n/selfmt.cpp | 2 + deps/icu-small/source/i18n/selfmtimpl.h | 2 + .../source/i18n/sharedbreakiterator.cpp | 2 + .../source/i18n/sharedbreakiterator.h | 2 + deps/icu-small/source/i18n/sharedcalendar.h | 2 + .../source/i18n/shareddateformatsymbols.h | 2 + .../source/i18n/sharednumberformat.h | 2 + .../icu-small/source/i18n/sharedpluralrules.h | 2 + .../source/i18n/significantdigitinterval.h | 2 + deps/icu-small/source/i18n/simpletz.cpp | 2 + .../source/i18n/smallintformatter.cpp | 2 + .../icu-small/source/i18n/smallintformatter.h | 2 + deps/icu-small/source/i18n/smpdtfmt.cpp | 101 +- deps/icu-small/source/i18n/smpdtfst.cpp | 2 + deps/icu-small/source/i18n/smpdtfst.h | 2 + deps/icu-small/source/i18n/sortkey.cpp | 2 + deps/icu-small/source/i18n/standardplural.cpp | 2 + deps/icu-small/source/i18n/standardplural.h | 2 + deps/icu-small/source/i18n/strmatch.cpp | 2 + deps/icu-small/source/i18n/strmatch.h | 2 + deps/icu-small/source/i18n/strrepl.cpp | 2 + deps/icu-small/source/i18n/strrepl.h | 2 + deps/icu-small/source/i18n/stsearch.cpp | 2 + deps/icu-small/source/i18n/taiwncal.cpp | 2 + deps/icu-small/source/i18n/taiwncal.h | 2 + deps/icu-small/source/i18n/timezone.cpp | 6 +- deps/icu-small/source/i18n/titletrn.cpp | 2 + deps/icu-small/source/i18n/titletrn.h | 2 + deps/icu-small/source/i18n/tmunit.cpp | 2 + deps/icu-small/source/i18n/tmutamt.cpp | 2 + deps/icu-small/source/i18n/tmutfmt.cpp | 201 +- deps/icu-small/source/i18n/tolowtrn.cpp | 2 + deps/icu-small/source/i18n/tolowtrn.h | 2 + deps/icu-small/source/i18n/toupptrn.cpp | 2 + deps/icu-small/source/i18n/toupptrn.h | 2 + deps/icu-small/source/i18n/translit.cpp | 2 + deps/icu-small/source/i18n/transreg.cpp | 2 + deps/icu-small/source/i18n/transreg.h | 2 + deps/icu-small/source/i18n/tridpars.cpp | 4 +- deps/icu-small/source/i18n/tridpars.h | 4 +- deps/icu-small/source/i18n/tzfmt.cpp | 2 + deps/icu-small/source/i18n/tzgnames.cpp | 2 + deps/icu-small/source/i18n/tzgnames.h | 2 + deps/icu-small/source/i18n/tznames.cpp | 38 + deps/icu-small/source/i18n/tznames_impl.cpp | 1029 +-- deps/icu-small/source/i18n/tznames_impl.h | 25 +- deps/icu-small/source/i18n/tzrule.cpp | 2 + deps/icu-small/source/i18n/tztrans.cpp | 2 + deps/icu-small/source/i18n/ucal.cpp | 2 + deps/icu-small/source/i18n/ucln_in.cpp | 4 +- deps/icu-small/source/i18n/ucln_in.h | 5 +- deps/icu-small/source/i18n/ucol.cpp | 2 + deps/icu-small/source/i18n/ucol_imp.h | 4 +- deps/icu-small/source/i18n/ucol_res.cpp | 178 +- deps/icu-small/source/i18n/ucol_sit.cpp | 2 + deps/icu-small/source/i18n/ucoleitr.cpp | 6 +- deps/icu-small/source/i18n/ucsdet.cpp | 2 + deps/icu-small/source/i18n/udat.cpp | 2 + .../source/i18n/udateintervalformat.cpp | 2 + deps/icu-small/source/i18n/udatpg.cpp | 2 + deps/icu-small/source/i18n/ufieldpositer.cpp | 2 + .../source/i18n/uitercollationiterator.cpp | 2 + .../source/i18n/uitercollationiterator.h | 2 + deps/icu-small/source/i18n/ulocdata.c | 2 + deps/icu-small/source/i18n/umsg.cpp | 4 +- deps/icu-small/source/i18n/umsg_imp.h | 2 + deps/icu-small/source/i18n/unesctrn.cpp | 4 +- deps/icu-small/source/i18n/unesctrn.h | 2 + deps/icu-small/source/i18n/uni2name.cpp | 2 + deps/icu-small/source/i18n/uni2name.h | 2 + .../source/i18n/unicode/alphaindex.h | 2 + deps/icu-small/source/i18n/unicode/basictz.h | 2 + deps/icu-small/source/i18n/unicode/calendar.h | 2 + deps/icu-small/source/i18n/unicode/choicfmt.h | 2 + deps/icu-small/source/i18n/unicode/coleitr.h | 2 + deps/icu-small/source/i18n/unicode/coll.h | 2 + .../i18n/unicode/compactdecimalformat.h | 7 +- deps/icu-small/source/i18n/unicode/curramt.h | 2 + deps/icu-small/source/i18n/unicode/currpinf.h | 2 + deps/icu-small/source/i18n/unicode/currunit.h | 2 + deps/icu-small/source/i18n/unicode/datefmt.h | 2 + deps/icu-small/source/i18n/unicode/dcfmtsym.h | 2 + deps/icu-small/source/i18n/unicode/decimfmt.h | 14 +- deps/icu-small/source/i18n/unicode/dtfmtsym.h | 40 +- deps/icu-small/source/i18n/unicode/dtitvfmt.h | 2 + deps/icu-small/source/i18n/unicode/dtitvinf.h | 11 +- deps/icu-small/source/i18n/unicode/dtptngen.h | 22 +- deps/icu-small/source/i18n/unicode/dtrule.h | 2 + deps/icu-small/source/i18n/unicode/fieldpos.h | 7 +- deps/icu-small/source/i18n/unicode/fmtable.h | 6 +- deps/icu-small/source/i18n/unicode/format.h | 2 + deps/icu-small/source/i18n/unicode/fpositer.h | 2 + deps/icu-small/source/i18n/unicode/gender.h | 2 + deps/icu-small/source/i18n/unicode/gregocal.h | 2 + deps/icu-small/source/i18n/unicode/measfmt.h | 23 +- deps/icu-small/source/i18n/unicode/measunit.h | 74 +- deps/icu-small/source/i18n/unicode/measure.h | 2 + deps/icu-small/source/i18n/unicode/msgfmt.h | 2 + deps/icu-small/source/i18n/unicode/numfmt.h | 14 +- deps/icu-small/source/i18n/unicode/numsys.h | 2 + deps/icu-small/source/i18n/unicode/plurfmt.h | 2 + deps/icu-small/source/i18n/unicode/plurrule.h | 2 + deps/icu-small/source/i18n/unicode/rbnf.h | 8 + deps/icu-small/source/i18n/unicode/rbtz.h | 2 + deps/icu-small/source/i18n/unicode/regex.h | 2 + deps/icu-small/source/i18n/unicode/region.h | 4 +- .../source/i18n/unicode/reldatefmt.h | 28 +- .../i18n/unicode/scientificnumberformatter.h | 2 + deps/icu-small/source/i18n/unicode/search.h | 2 + deps/icu-small/source/i18n/unicode/selfmt.h | 2 + deps/icu-small/source/i18n/unicode/simpletz.h | 2 + deps/icu-small/source/i18n/unicode/smpdtfmt.h | 10 +- deps/icu-small/source/i18n/unicode/sortkey.h | 2 + deps/icu-small/source/i18n/unicode/stsearch.h | 2 + deps/icu-small/source/i18n/unicode/tblcoll.h | 4 +- deps/icu-small/source/i18n/unicode/timezone.h | 2 + deps/icu-small/source/i18n/unicode/tmunit.h | 8 + deps/icu-small/source/i18n/unicode/tmutamt.h | 2 + deps/icu-small/source/i18n/unicode/tmutfmt.h | 5 + deps/icu-small/source/i18n/unicode/translit.h | 2 + deps/icu-small/source/i18n/unicode/tzfmt.h | 2 + deps/icu-small/source/i18n/unicode/tznames.h | 18 +- deps/icu-small/source/i18n/unicode/tzrule.h | 2 + deps/icu-small/source/i18n/unicode/tztrans.h | 2 + deps/icu-small/source/i18n/unicode/ucal.h | 12 +- deps/icu-small/source/i18n/unicode/ucol.h | 39 +- deps/icu-small/source/i18n/unicode/ucoleitr.h | 2 + deps/icu-small/source/i18n/unicode/ucsdet.h | 2 + deps/icu-small/source/i18n/unicode/udat.h | 24 +- .../source/i18n/unicode/udateintervalformat.h | 2 + deps/icu-small/source/i18n/unicode/udatpg.h | 17 +- .../source/i18n/unicode/ufieldpositer.h | 6 +- .../source/i18n/unicode/uformattable.h | 10 +- deps/icu-small/source/i18n/unicode/ugender.h | 2 + deps/icu-small/source/i18n/unicode/ulocdata.h | 22 +- deps/icu-small/source/i18n/unicode/umsg.h | 2 + deps/icu-small/source/i18n/unicode/unirepl.h | 2 + deps/icu-small/source/i18n/unicode/unum.h | 38 +- deps/icu-small/source/i18n/unicode/unumsys.h | 2 + .../source/i18n/unicode/upluralrules.h | 8 +- deps/icu-small/source/i18n/unicode/uregex.h | 2 + deps/icu-small/source/i18n/unicode/uregion.h | 8 +- .../source/i18n/unicode/ureldatefmt.h | 20 +- deps/icu-small/source/i18n/unicode/usearch.h | 14 +- deps/icu-small/source/i18n/unicode/uspoof.h | 1135 +++- deps/icu-small/source/i18n/unicode/utmscale.h | 2 + deps/icu-small/source/i18n/unicode/utrans.h | 2 + deps/icu-small/source/i18n/unicode/vtzone.h | 2 + deps/icu-small/source/i18n/unum.cpp | 2 + deps/icu-small/source/i18n/unumsys.cpp | 2 + deps/icu-small/source/i18n/upluralrules.cpp | 2 + deps/icu-small/source/i18n/uregex.cpp | 2 + deps/icu-small/source/i18n/uregexc.cpp | 2 + deps/icu-small/source/i18n/uregion.cpp | 2 + deps/icu-small/source/i18n/usearch.cpp | 8 +- deps/icu-small/source/i18n/uspoof.cpp | 538 +- deps/icu-small/source/i18n/uspoof_build.cpp | 6 +- deps/icu-small/source/i18n/uspoof_conf.cpp | 254 +- deps/icu-small/source/i18n/uspoof_conf.h | 14 +- deps/icu-small/source/i18n/uspoof_impl.cpp | 624 +- deps/icu-small/source/i18n/uspoof_impl.h | 215 +- deps/icu-small/source/i18n/uspoof_wsconf.cpp | 435 -- deps/icu-small/source/i18n/uspoof_wsconf.h | 70 - deps/icu-small/source/i18n/usrchimp.h | 2 + .../source/i18n/utf16collationiterator.cpp | 2 + .../source/i18n/utf16collationiterator.h | 2 + .../source/i18n/utf8collationiterator.cpp | 2 + .../source/i18n/utf8collationiterator.h | 2 + deps/icu-small/source/i18n/utmscale.c | 2 + deps/icu-small/source/i18n/utrans.cpp | 2 + deps/icu-small/source/i18n/valueformatter.cpp | 2 + deps/icu-small/source/i18n/valueformatter.h | 2 + deps/icu-small/source/i18n/visibledigits.cpp | 23 +- deps/icu-small/source/i18n/visibledigits.h | 2 + deps/icu-small/source/i18n/vtzone.cpp | 2 + deps/icu-small/source/i18n/vzone.cpp | 2 + deps/icu-small/source/i18n/vzone.h | 2 + deps/icu-small/source/i18n/windtfmt.cpp | 18 +- deps/icu-small/source/i18n/windtfmt.h | 2 + deps/icu-small/source/i18n/winnmfmt.cpp | 22 +- deps/icu-small/source/i18n/winnmfmt.h | 2 + deps/icu-small/source/i18n/wintzimpl.cpp | 2 + deps/icu-small/source/i18n/wintzimpl.h | 2 + deps/icu-small/source/i18n/zonemeta.cpp | 2 + deps/icu-small/source/i18n/zonemeta.h | 2 + deps/icu-small/source/i18n/zrule.cpp | 2 + deps/icu-small/source/i18n/zrule.h | 2 + deps/icu-small/source/i18n/ztrans.cpp | 2 + deps/icu-small/source/i18n/ztrans.h | 2 + deps/icu-small/source/io/io.rc | 2 + deps/icu-small/source/io/locbund.cpp | 2 + deps/icu-small/source/io/locbund.h | 2 + deps/icu-small/source/io/sprintf.c | 4 +- deps/icu-small/source/io/sscanf.c | 4 +- deps/icu-small/source/io/ucln_io.cpp | 4 +- deps/icu-small/source/io/ucln_io.h | 2 + deps/icu-small/source/io/ufile.c | 2 + deps/icu-small/source/io/ufile.h | 2 + deps/icu-small/source/io/ufmt_cmn.c | 2 + deps/icu-small/source/io/ufmt_cmn.h | 2 + deps/icu-small/source/io/unicode/ustdio.h | 2 + deps/icu-small/source/io/unicode/ustream.h | 2 + deps/icu-small/source/io/uprintf.cpp | 2 + deps/icu-small/source/io/uprintf.h | 2 + deps/icu-small/source/io/uprntf_p.c | 2 + deps/icu-small/source/io/uscanf.c | 2 + deps/icu-small/source/io/uscanf.h | 2 + deps/icu-small/source/io/uscanf_p.c | 2 + deps/icu-small/source/io/ustdio.c | 4 +- deps/icu-small/source/io/ustream.cpp | 2 + deps/icu-small/source/stubdata/stubdata.c | 2 + .../source/tools/genccode/genccode.c | 2 + deps/icu-small/source/tools/gencmn/gencmn.c | 2 + deps/icu-small/source/tools/genrb/derb.cpp | 2 + deps/icu-small/source/tools/genrb/errmsg.c | 2 + deps/icu-small/source/tools/genrb/errmsg.h | 2 + deps/icu-small/source/tools/genrb/genrb.cpp | 2 + deps/icu-small/source/tools/genrb/genrb.h | 2 + deps/icu-small/source/tools/genrb/parse.cpp | 2 + deps/icu-small/source/tools/genrb/parse.h | 2 + .../icu-small/source/tools/genrb/prscmnts.cpp | 2 + deps/icu-small/source/tools/genrb/prscmnts.h | 2 + deps/icu-small/source/tools/genrb/rbutil.c | 2 + deps/icu-small/source/tools/genrb/rbutil.h | 2 + deps/icu-small/source/tools/genrb/read.c | 2 + deps/icu-small/source/tools/genrb/read.h | 2 + deps/icu-small/source/tools/genrb/reslist.cpp | 2 + deps/icu-small/source/tools/genrb/reslist.h | 2 + deps/icu-small/source/tools/genrb/rle.c | 2 + deps/icu-small/source/tools/genrb/rle.h | 2 + deps/icu-small/source/tools/genrb/ustr.c | 4 +- deps/icu-small/source/tools/genrb/ustr.h | 2 + deps/icu-small/source/tools/genrb/wrtjava.cpp | 2 + deps/icu-small/source/tools/genrb/wrtxml.cpp | 2 + deps/icu-small/source/tools/icupkg/icupkg.cpp | 2 + .../source/tools/pkgdata/pkgdata.cpp | 2 + .../icu-small/source/tools/pkgdata/pkgtypes.c | 2 + .../icu-small/source/tools/pkgdata/pkgtypes.h | 2 + .../source/tools/toolutil/collationinfo.cpp | 2 + .../source/tools/toolutil/collationinfo.h | 2 + .../source/tools/toolutil/dbgutil.cpp | 2 + .../icu-small/source/tools/toolutil/dbgutil.h | 2 + .../source/tools/toolutil/denseranges.cpp | 2 + .../source/tools/toolutil/denseranges.h | 2 + .../source/tools/toolutil/filestrm.c | 2 + .../source/tools/toolutil/filestrm.h | 2 + .../source/tools/toolutil/filetools.cpp | 26 +- .../source/tools/toolutil/filetools.h | 2 + .../source/tools/toolutil/flagparser.c | 4 +- .../source/tools/toolutil/flagparser.h | 2 + .../source/tools/toolutil/package.cpp | 4 +- .../icu-small/source/tools/toolutil/package.h | 2 + .../source/tools/toolutil/pkg_genc.c | 2 + .../source/tools/toolutil/pkg_genc.h | 2 + .../source/tools/toolutil/pkg_gencmn.c | 2 + .../source/tools/toolutil/pkg_gencmn.h | 2 + .../source/tools/toolutil/pkg_icu.cpp | 2 + .../icu-small/source/tools/toolutil/pkg_icu.h | 2 + .../icu-small/source/tools/toolutil/pkg_imp.h | 2 + .../source/tools/toolutil/pkgitems.cpp | 2 + .../icu-small/source/tools/toolutil/ppucd.cpp | 2 + deps/icu-small/source/tools/toolutil/ppucd.h | 2 + .../source/tools/toolutil/swapimpl.cpp | 4 +- .../source/tools/toolutil/swapimpl.h | 2 + .../source/tools/toolutil/toolutil.cpp | 4 +- .../source/tools/toolutil/toolutil.h | 2 + .../icu-small/source/tools/toolutil/ucbuf.cpp | 2 + deps/icu-small/source/tools/toolutil/ucbuf.h | 2 + .../source/tools/toolutil/ucln_tu.cpp | 2 + deps/icu-small/source/tools/toolutil/ucm.c | 6 +- deps/icu-small/source/tools/toolutil/ucm.h | 2 + .../source/tools/toolutil/ucmstate.c | 2 + .../source/tools/toolutil/udbgutil.cpp | 8 +- .../source/tools/toolutil/udbgutil.h | 2 + .../source/tools/toolutil/unewdata.c | 6 +- .../source/tools/toolutil/unewdata.h | 2 + .../source/tools/toolutil/uoptions.c | 2 + .../source/tools/toolutil/uoptions.h | 2 + deps/icu-small/source/tools/toolutil/uparse.c | 2 + deps/icu-small/source/tools/toolutil/uparse.h | 2 + .../source/tools/toolutil/writesrc.c | 34 +- .../source/tools/toolutil/writesrc.h | 2 + .../source/tools/toolutil/xmlparser.cpp | 2 + .../source/tools/toolutil/xmlparser.h | 2 + 897 files changed, 17113 insertions(+), 12491 deletions(-) delete mode 100644 deps/icu-small/license.html mode change 100644 => 100755 deps/icu-small/source/common/rbbicst.pl create mode 100644 deps/icu-small/source/common/ubiditransform.c create mode 100644 deps/icu-small/source/common/unicode/ubiditransform.h delete mode 100644 deps/icu-small/source/data/in/icudt57l.dat create mode 100644 deps/icu-small/source/data/in/icudt58l.dat create mode 100644 deps/icu-small/source/i18n/dt_impl.h delete mode 100644 deps/icu-small/source/i18n/identifier_info.cpp delete mode 100644 deps/icu-small/source/i18n/identifier_info.h mode change 100644 => 100755 deps/icu-small/source/i18n/regexcst.pl mode change 100644 => 100755 deps/icu-small/source/i18n/unicode/selfmt.h delete mode 100644 deps/icu-small/source/i18n/uspoof_wsconf.cpp delete mode 100644 deps/icu-small/source/i18n/uspoof_wsconf.h diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 81662a05a769c3..90be7cdf052615 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -1,9 +1,50 @@ -ICU License - ICU 1.8.1 and later +COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + +Copyright © 1991-2016 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in http://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 +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. + +--------------------- + +Third-Party Software Licenses + +This section contains third-party software notices and/or additional +terms for licensed third-party software components included within ICU +libraries. + +1. ICU License - ICU 1.8.1 to ICU 57.1 COPYRIGHT AND PERMISSION NOTICE Copyright (c) 1995-2016 International Business Machines Corporation and others - All rights reserved. Permission is hereby granted, free of charge, to any person obtaining @@ -31,58 +72,9 @@ shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. - All trademarks and registered trademarks mentioned herein are the property of their respective owners. ---------------------- - -Third-Party Software Licenses - -This section contains third-party software notices and/or additional -terms for licensed third-party software components included within ICU -libraries. - -1. Unicode Data Files and Software - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2016 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in -http://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 -(the "Data Files") or Unicode software and any associated documentation -(the "Software") to deal in the Data Files or Software -without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files -or Software are furnished to do so, provided that -(a) this copyright and permission notice appear with all copies -of the Data Files or Software, -(b) this copyright and permission notice appear in associated -documentation, and -(c) there is clear notice in each modified Data File or in the Software -as well as in the documentation associated with the Data File(s) or -Software that the data or software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THE DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, -use or other dealings in these Data Files or Software without prior -written authorization of the copyright holder. - 2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt) # The Google Chrome software developed by Google is licensed under diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index 3f614659fbf9dd..7b45134f658c39 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 57 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt57l.dat : Reduced-size data file +It is a strict subset of ICU 58 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt58l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/license.html b/deps/icu-small/license.html deleted file mode 100644 index 3430616d661af7..00000000000000 --- a/deps/icu-small/license.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - -ICU License - moved to LICENSE - - - -

- The ICU license is now in plain text format, see LICENSE. -Update links and software appropriately. -

- - Copyright (c) 1995-2016 International Business Machines Corporation and others - - - diff --git a/deps/icu-small/source/common/appendable.cpp b/deps/icu-small/source/common/appendable.cpp index e46d0790181004..1a597b5de52e58 100644 --- a/deps/icu-small/source/common/appendable.cpp +++ b/deps/icu-small/source/common/appendable.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2012, International Business Machines diff --git a/deps/icu-small/source/common/bmpset.cpp b/deps/icu-small/source/common/bmpset.cpp index 7cd32eb99c9e33..ebcd0d23bf9f59 100644 --- a/deps/icu-small/source/common/bmpset.cpp +++ b/deps/icu-small/source/common/bmpset.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/bmpset.h b/deps/icu-small/source/common/bmpset.h index d9e08eaa66fe10..8975cd61d5cc21 100644 --- a/deps/icu-small/source/common/bmpset.h +++ b/deps/icu-small/source/common/bmpset.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index c40bcdb0b581fe..96a7dc9348d810 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************************ * Copyright (C) 2006-2016, International Business Machines Corporation diff --git a/deps/icu-small/source/common/brkeng.h b/deps/icu-small/source/common/brkeng.h index 932b8db2b5f8c5..73fdb81dffaaaa 100644 --- a/deps/icu-small/source/common/brkeng.h +++ b/deps/icu-small/source/common/brkeng.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ************************************************************************************ * Copyright (C) 2006-2012, International Business Machines Corporation and others. * diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index a05a0e4c20baa8..b768c20f0bac10 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and @@ -418,6 +420,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) break; case UBRK_SENTENCE: result = BreakIterator::buildInstance(loc, "sentence", kind, status); +#if !UCONFIG_NO_FILTERED_BREAK_ITERATION { char ssKeyValue[kKeyValueLenMax] = {0}; UErrorCode kvStatus = U_ZERO_ERROR; @@ -430,6 +433,7 @@ BreakIterator::makeInstance(const Locale& loc, int32_t kind, UErrorCode& status) } } } +#endif break; case UBRK_TITLE: result = BreakIterator::buildInstance(loc, "title", kind, status); diff --git a/deps/icu-small/source/common/bytestream.cpp b/deps/icu-small/source/common/bytestream.cpp index ebd4148e02f2d1..5a5c2e4410e936 100644 --- a/deps/icu-small/source/common/bytestream.cpp +++ b/deps/icu-small/source/common/bytestream.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2011, International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/common/bytestrie.cpp b/deps/icu-small/source/common/bytestrie.cpp index 8a1ab4c62bbc17..093cd8ddb12106 100644 --- a/deps/icu-small/source/common/bytestrie.cpp +++ b/deps/icu-small/source/common/bytestrie.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2011, International Business Machines diff --git a/deps/icu-small/source/common/bytestriebuilder.cpp b/deps/icu-small/source/common/bytestriebuilder.cpp index f252e2d41fe5d7..913d85a21217be 100644 --- a/deps/icu-small/source/common/bytestriebuilder.cpp +++ b/deps/icu-small/source/common/bytestriebuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines @@ -35,7 +37,7 @@ class BytesTrieElement : public UMemory { public: // Use compiler's default constructor, initializes nothing. - void setTo(const StringPiece &s, int32_t val, CharString &strings, UErrorCode &errorCode); + void setTo(StringPiece s, int32_t val, CharString &strings, UErrorCode &errorCode); StringPiece getString(const CharString &strings) const { int32_t offset=stringOffset; @@ -86,7 +88,7 @@ class BytesTrieElement : public UMemory { }; void -BytesTrieElement::setTo(const StringPiece &s, int32_t val, +BytesTrieElement::setTo(StringPiece s, int32_t val, CharString &strings, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; @@ -143,7 +145,7 @@ BytesTrieBuilder::~BytesTrieBuilder() { } BytesTrieBuilder & -BytesTrieBuilder::add(const StringPiece &s, int32_t value, UErrorCode &errorCode) { +BytesTrieBuilder::add(StringPiece s, int32_t value, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return *this; } @@ -165,7 +167,7 @@ BytesTrieBuilder::add(const StringPiece &s, int32_t value, UErrorCode &errorCode return *this; // error instead of dereferencing null } if(elementsLength>0) { - uprv_memcpy(newElements, elements, elementsLength*sizeof(BytesTrieElement)); + uprv_memcpy(newElements, elements, (size_t)elementsLength*sizeof(BytesTrieElement)); } delete[] elements; elements=newElements; diff --git a/deps/icu-small/source/common/bytestrieiterator.cpp b/deps/icu-small/source/common/bytestrieiterator.cpp index e50f07c24fee65..4d04247c4933d0 100644 --- a/deps/icu-small/source/common/bytestrieiterator.cpp +++ b/deps/icu-small/source/common/bytestrieiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines @@ -139,7 +141,6 @@ BytesTrie::Iterator::next(UErrorCode &errorCode) { } else { pos_=skipValue(pos, node); } - sp_.set(str_->data(), str_->length()); return TRUE; } if(maxLength_>0 && str_->length()==maxLength_) { @@ -167,10 +168,14 @@ BytesTrie::Iterator::next(UErrorCode &errorCode) { } } +StringPiece +BytesTrie::Iterator::getString() const { + return str_ == NULL ? StringPiece() : str_->toStringPiece(); +} + UBool BytesTrie::Iterator::truncateAndStop() { pos_=NULL; - sp_.set(str_->data(), str_->length()); value_=-1; // no real value for str return TRUE; } @@ -199,7 +204,6 @@ BytesTrie::Iterator::branchNext(const uint8_t *pos, int32_t length, UErrorCode & str_->append((char)trieByte, errorCode); if(isFinal) { pos_=NULL; - sp_.set(str_->data(), str_->length()); value_=value; return NULL; } else { diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index ac1206df129501..c3af281b82f420 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 1996-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/chariter.cpp b/deps/icu-small/source/common/chariter.cpp index 2d923ea0a6b5a8..625ac49eaccdb9 100644 --- a/deps/icu-small/source/common/chariter.cpp +++ b/deps/icu-small/source/common/chariter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/common/charstr.cpp b/deps/icu-small/source/common/charstr.cpp index 1b27c683de2f18..c792181378ec0b 100644 --- a/deps/icu-small/source/common/charstr.cpp +++ b/deps/icu-small/source/common/charstr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2015, International Business Machines @@ -144,7 +146,7 @@ UBool CharString::ensureCapacity(int32_t capacity, return TRUE; } -CharString &CharString::appendPathPart(const StringPiece &s, UErrorCode &errorCode) { +CharString &CharString::appendPathPart(StringPiece s, UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return *this; } diff --git a/deps/icu-small/source/common/charstr.h b/deps/icu-small/source/common/charstr.h index d2e20c4813ce1d..9758c5c542b3f0 100644 --- a/deps/icu-small/source/common/charstr.h +++ b/deps/icu-small/source/common/charstr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2015, International Business Machines @@ -39,7 +41,7 @@ template class U_COMMON_API MaybeStackArray; class U_COMMON_API CharString : public UMemory { public: CharString() : len(0) { buffer[0]=0; } - CharString(const StringPiece &s, UErrorCode &errorCode) : len(0) { + CharString(StringPiece s, UErrorCode &errorCode) : len(0) { buffer[0]=0; append(s, errorCode); } @@ -76,7 +78,7 @@ class U_COMMON_API CharString : public UMemory { CharString &truncate(int32_t newLength); CharString &append(char c, UErrorCode &errorCode); - CharString &append(const StringPiece &s, UErrorCode &errorCode) { + CharString &append(StringPiece s, UErrorCode &errorCode) { return append(s.data(), s.length(), errorCode); } CharString &append(const CharString &s, UErrorCode &errorCode) { @@ -115,7 +117,7 @@ class U_COMMON_API CharString : public UMemory { * First appends a U_FILE_SEP_CHAR if necessary. * Does nothing if s is empty. */ - CharString &appendPathPart(const StringPiece &s, UErrorCode &errorCode); + CharString &appendPathPart(StringPiece s, UErrorCode &errorCode); /** * Appends a U_FILE_SEP_CHAR if this string is not empty diff --git a/deps/icu-small/source/common/cmemory.c b/deps/icu-small/source/common/cmemory.c index 2b624accc187db..0054e3de8b2466 100644 --- a/deps/icu-small/source/common/cmemory.c +++ b/deps/icu-small/source/common/cmemory.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index 8c62868855a12b..d2e48e5f305fd9 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -281,7 +283,7 @@ inline T *LocalMemory::allocateInsteadAndCopy(int32_t newCapacity, int32_t le if(length>newCapacity) { length=newCapacity; } - uprv_memcpy(p, LocalPointerBase::ptr, length*sizeof(T)); + uprv_memcpy(p, LocalPointerBase::ptr, (size_t)length*sizeof(T)); } uprv_free(LocalPointerBase::ptr); LocalPointerBase::ptr=p; @@ -428,7 +430,7 @@ inline T *MaybeStackArray::resize(int32_t newCapacity, int32_t if(length>newCapacity) { length=newCapacity; } - uprv_memcpy(p, ptr, length*sizeof(T)); + uprv_memcpy(p, ptr, (size_t)length*sizeof(T)); } releaseArray(); ptr=p; @@ -459,7 +461,7 @@ inline T *MaybeStackArray::orphanOrClone(int32_t length, int32 if(p==NULL) { return NULL; } - uprv_memcpy(p, ptr, length*sizeof(T)); + uprv_memcpy(p, ptr, (size_t)length*sizeof(T)); } resultCapacity=length; ptr=stackArray; @@ -607,7 +609,7 @@ inline H *MaybeStackHeaderAndArray::resize(int32_t newCapac length=newCapacity; } } - uprv_memcpy(p, ptr, sizeof(H)+length*sizeof(T)); + uprv_memcpy(p, ptr, sizeof(H)+(size_t)length*sizeof(T)); releaseMemory(); ptr=p; capacity=newCapacity; @@ -638,7 +640,7 @@ inline H *MaybeStackHeaderAndArray::orphanOrClone(int32_t l if(p==NULL) { return NULL; } - uprv_memcpy(p, ptr, sizeof(H)+length*sizeof(T)); + uprv_memcpy(p, ptr, sizeof(H)+(size_t)length*sizeof(T)); } resultCapacity=length; ptr=&stackHeader; diff --git a/deps/icu-small/source/common/common.rc b/deps/icu-small/source/common/common.rc index b6e405a93aec80..5c723a27c52820 100644 --- a/deps/icu-small/source/common/common.rc +++ b/deps/icu-small/source/common/common.rc @@ -1,6 +1,8 @@ // Do not edit with Microsoft Developer Studio Resource Editor. // It will permanently substitute version numbers that are intended to be // picked up by the pre-processor during each build. +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (c) 2001-2010 International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/common/cpputils.h b/deps/icu-small/source/common/cpputils.h index b2e0cbc8d61cc7..57af69a7129483 100644 --- a/deps/icu-small/source/common/cpputils.h +++ b/deps/icu-small/source/common/cpputils.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -24,45 +26,45 @@ static inline void uprv_arrayCopy(const double* src, double* dst, int32_t count) -{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const double* src, int32_t srcStart, double* dst, int32_t dstStart, int32_t count) -{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int8_t* src, int8_t* dst, int32_t count) - { uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); } + { uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int8_t* src, int32_t srcStart, int8_t* dst, int32_t dstStart, int32_t count) -{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int16_t* src, int16_t* dst, int32_t count) -{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int16_t* src, int32_t srcStart, int16_t* dst, int32_t dstStart, int32_t count) -{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int32_t* src, int32_t* dst, int32_t count) -{ uprv_memcpy(dst, src, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst, src, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const int32_t* src, int32_t srcStart, int32_t* dst, int32_t dstStart, int32_t count) -{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)count * sizeof(*src)); } static inline void uprv_arrayCopy(const UChar *src, int32_t srcStart, UChar *dst, int32_t dstStart, int32_t count) -{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); } +{ uprv_memcpy(dst+dstStart, src+srcStart, (size_t)count * sizeof(*src)); } /** * Copy an array of UnicodeString OBJECTS (not pointers). diff --git a/deps/icu-small/source/common/cstr.cpp b/deps/icu-small/source/common/cstr.cpp index c30719361eacc5..356367e0bcaea3 100644 --- a/deps/icu-small/source/common/cstr.cpp +++ b/deps/icu-small/source/common/cstr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015-2016, International Business Machines @@ -6,22 +8,40 @@ * file name: charstr.cpp */ #include "unicode/utypes.h" +#include "unicode/putil.h" #include "unicode/unistr.h" -#include "charstr.h" #include "cstr.h" +#include "charstr.h" +#include "uinvchar.h" + U_NAMESPACE_BEGIN CStr::CStr(const UnicodeString &in) { UErrorCode status = U_ZERO_ERROR; - int32_t length = in.extract(0, in.length(), NULL, (uint32_t)0); +#if !UCONFIG_NO_CONVERSION || U_CHARSET_IS_UTF8 + int32_t length = in.extract(0, in.length(), static_cast(NULL), static_cast(0)); int32_t resultCapacity = 0; char *buf = s.getAppendBuffer(length, length, resultCapacity, status); if (U_SUCCESS(status)) { in.extract(0, in.length(), buf, resultCapacity); s.append(buf, length, status); } +#else + // No conversion available. Convert any invariant characters; substitute '?' for the rest. + // Note: can't just call u_UCharsToChars() or CharString.appendInvariantChars() on the + // whole string because they require that the entire input be invariant. + char buf[2]; + for (int i=0; ifirst()); + // Don't suppress a break opportunity at the beginning of text. + return fDelegate->first(); } int32_t @@ -415,7 +418,9 @@ SimpleFilteredSentenceBreakIterator::previous(void) { } UBool SimpleFilteredSentenceBreakIterator::isBoundary(int32_t offset) { - if(!fDelegate->isBoundary(offset)) return false; // no break to suppress + if (!fDelegate->isBoundary(offset)) return false; // no break to suppress + + if (fData->fBackwardsTrie.isNull()) return true; // no data = no suppressions UErrorCode status = U_ZERO_ERROR; resetState(status); @@ -476,13 +481,42 @@ SimpleFilteredBreakIteratorBuilder::SimpleFilteredBreakIteratorBuilder(const Loc : fSet(status) { if(U_SUCCESS(status)) { - LocalUResourceBundlePointer b(ures_open(U_ICUDATA_BRKITR, fromLocale.getBaseName(), &status)); - LocalUResourceBundlePointer exceptions(ures_getByKeyWithFallback(b.getAlias(), "exceptions", NULL, &status)); - LocalUResourceBundlePointer breaks(ures_getByKeyWithFallback(exceptions.getAlias(), "SentenceBreak", NULL, &status)); - if(U_FAILURE(status)) return; // leaves the builder empty, if you try to use it. + UErrorCode subStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer b(ures_open(U_ICUDATA_BRKITR, fromLocale.getBaseName(), &subStatus)); + if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) { + status = subStatus; // copy the failing status +#if FB_DEBUG + fprintf(stderr, "open BUNDLE %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status)); +#endif + return; // leaves the builder empty, if you try to use it. + } + LocalUResourceBundlePointer exceptions(ures_getByKeyWithFallback(b.getAlias(), "exceptions", NULL, &subStatus)); + if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) { + status = subStatus; // copy the failing status +#if FB_DEBUG + fprintf(stderr, "open EXCEPTIONS %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status)); +#endif + return; // leaves the builder empty, if you try to use it. + } + LocalUResourceBundlePointer breaks(ures_getByKeyWithFallback(exceptions.getAlias(), "SentenceBreak", NULL, &subStatus)); + +#if FB_DEBUG + { + UErrorCode subsub = subStatus; + fprintf(stderr, "open SentenceBreak %s => %s, %s\n", fromLocale.getBaseName(), ures_getLocale(breaks.getAlias(), &subsub), u_errorName(subStatus)); + } +#endif + + if (U_FAILURE(subStatus) || (subStatus == U_USING_DEFAULT_WARNING) ) { + status = subStatus; // copy the failing status +#if FB_DEBUG + fprintf(stderr, "open %s : %s, %s\n", fromLocale.getBaseName(), "[exit]", u_errorName(status)); +#endif + return; // leaves the builder empty, if you try to use it. + } LocalUResourceBundlePointer strs; - UErrorCode subStatus = status; + subStatus = status; // Pick up inherited warning status now do { strs.adoptInstead(ures_getNextResource(breaks.getAlias(), strs.orphan(), &subStatus)); if(strs.isValid() && U_SUCCESS(subStatus)) { diff --git a/deps/icu-small/source/common/filterednormalizer2.cpp b/deps/icu-small/source/common/filterednormalizer2.cpp index 44ed9c13a0265e..fb6e831af7a4c5 100644 --- a/deps/icu-small/source/common/filterednormalizer2.cpp +++ b/deps/icu-small/source/common/filterednormalizer2.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index d308a57c3d3024..a03fcae9548ab1 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2014, International Business Machines diff --git a/deps/icu-small/source/common/icudataver.c b/deps/icu-small/source/common/icudataver.c index 227af0453e83e2..367e58f59b6910 100644 --- a/deps/icu-small/source/common/icudataver.c +++ b/deps/icu-small/source/common/icudataver.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/icuplug.cpp b/deps/icu-small/source/common/icuplug.cpp index 477a348b5acc4f..a0ec46b1f99bea 100644 --- a/deps/icu-small/source/common/icuplug.cpp +++ b/deps/icu-small/source/common/icuplug.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/icuplugimp.h b/deps/icu-small/source/common/icuplugimp.h index 0b5afb1ecd8a42..895b35357b0e4c 100644 --- a/deps/icu-small/source/common/icuplugimp.h +++ b/deps/icu-small/source/common/icuplugimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/listformatter.cpp b/deps/icu-small/source/common/listformatter.cpp index a02549eba9f3cd..9225c22f163eb7 100644 --- a/deps/icu-small/source/common/listformatter.cpp +++ b/deps/icu-small/source/common/listformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 42fafdce9e1abe..b3b7b5d6212496 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/common/localsvc.h b/deps/icu-small/source/common/localsvc.h index e8bc5a693c1526..4c0686d4495ed9 100644 --- a/deps/icu-small/source/common/localsvc.h +++ b/deps/icu-small/source/common/localsvc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 2006 International Business Machines Corporation * diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 10782837f2ddd4..3a92c3c3eb65a3 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/locbased.cpp b/deps/icu-small/source/common/locbased.cpp index ba289621f9a997..f2f56adda170f0 100644 --- a/deps/icu-small/source/common/locbased.cpp +++ b/deps/icu-small/source/common/locbased.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/common/locbased.h b/deps/icu-small/source/common/locbased.h index f740026b05623e..453d5a8a30299b 100644 --- a/deps/icu-small/source/common/locbased.h +++ b/deps/icu-small/source/common/locbased.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 6d6a06e680eaec..bb10b8946b3327 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -852,7 +854,7 @@ uloc_getDisplayKeywordValue( const char* locale, /* now copy the dispName over if not NULL */ if(dispName != NULL){ if(dispNameLen <= destCapacity){ - uprv_memcpy(dest, dispName, dispNameLen * U_SIZEOF_UCHAR); + u_memcpy(dest, dispName, dispNameLen); return u_terminateUChars(dest, destCapacity, dispNameLen, status); }else{ *status = U_BUFFER_OVERFLOW_ERROR; diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 7bd4ecead48d9b..a17478ce6d8a61 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2016, International Business Machines Corporation and @@ -278,7 +280,11 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { SimpleFormatter format; SimpleFormatter keyTypeFormat; UDisplayContext capitalizationContext; +#if !UCONFIG_NO_BREAK_ITERATION BreakIterator* capitalizationBrkIter; +#else + UObject* capitalizationBrkIter; +#endif static UMutex capitalizationBrkIterLock; UnicodeString formatOpenParen; UnicodeString formatReplaceOpenParen; @@ -341,6 +347,8 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { UnicodeString& keyValueDisplayName(const char* key, const char* value, UnicodeString& result, UBool skipAdjust) const; void initialize(void); + + struct CapitalizationContextSink; }; UMutex LocaleDisplayNamesImpl::capitalizationBrkIterLock = U_MUTEX_INITIALIZER; @@ -386,6 +394,54 @@ LocaleDisplayNamesImpl::LocaleDisplayNamesImpl(const Locale& locale, initialize(); } +struct LocaleDisplayNamesImpl::CapitalizationContextSink : public ResourceSink { + UBool hasCapitalizationUsage; + LocaleDisplayNamesImpl& parent; + + CapitalizationContextSink(LocaleDisplayNamesImpl& _parent) + : hasCapitalizationUsage(FALSE), parent(_parent) {} + virtual ~CapitalizationContextSink(); + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable contexts = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i = 0; contexts.getKeyAndValue(i, key, value); ++i) { + + CapContextUsage usageEnum; + if (uprv_strcmp(key, "key") == 0) { + usageEnum = kCapContextUsageKey; + } else if (uprv_strcmp(key, "keyValue") == 0) { + usageEnum = kCapContextUsageKeyValue; + } else if (uprv_strcmp(key, "languages") == 0) { + usageEnum = kCapContextUsageLanguage; + } else if (uprv_strcmp(key, "script") == 0) { + usageEnum = kCapContextUsageScript; + } else if (uprv_strcmp(key, "territory") == 0) { + usageEnum = kCapContextUsageTerritory; + } else if (uprv_strcmp(key, "variant") == 0) { + usageEnum = kCapContextUsageVariant; + } else { + continue; + } + + int32_t len = 0; + const int32_t* intVector = value.getIntVector(len, errorCode); + if (U_FAILURE(errorCode)) { return; } + if (len < 2) { continue; } + + int32_t titlecaseInt = (parent.capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU) ? intVector[0] : intVector[1]; + if (titlecaseInt == 0) { continue; } + + parent.fCapitalization[usageEnum] = TRUE; + hasCapitalizationUsage = TRUE; + } + } +}; + +// Virtual destructors must be defined out of line. +LocaleDisplayNamesImpl::CapitalizationContextSink::~CapitalizationContextSink() {} + void LocaleDisplayNamesImpl::initialize(void) { LocaleDisplayNamesImpl *nonConstThis = (LocaleDisplayNamesImpl *)this; @@ -428,58 +484,21 @@ LocaleDisplayNamesImpl::initialize(void) { uprv_memset(fCapitalization, 0, sizeof(fCapitalization)); #if !UCONFIG_NO_BREAK_ITERATION - // The following is basically copied from DateFormatSymbols::initializeData - typedef struct { - const char * usageName; - LocaleDisplayNamesImpl::CapContextUsage usageEnum; - } ContextUsageNameToEnum; - const ContextUsageNameToEnum contextUsageTypeMap[] = { - // Entries must be sorted by usageTypeName; entry with NULL name terminates list. - { "key", kCapContextUsageKey }, - { "keyValue", kCapContextUsageKeyValue }, - { "languages", kCapContextUsageLanguage }, - { "script", kCapContextUsageScript }, - { "territory", kCapContextUsageTerritory }, - { "variant", kCapContextUsageVariant }, - { NULL, (CapContextUsage)0 }, - }; // Only get the context data if we need it! This is a const object so we know now... // Also check whether we will need a break iterator (depends on the data) UBool needBrkIter = FALSE; if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE) { - int32_t len = 0; - UResourceBundle *localeBundle = ures_open(NULL, locale.getName(), &status); - if (U_SUCCESS(status)) { - UResourceBundle *contextTransforms = ures_getByKeyWithFallback(localeBundle, "contextTransforms", NULL, &status); - if (U_SUCCESS(status)) { - UResourceBundle *contextTransformUsage; - while ( (contextTransformUsage = ures_getNextResource(contextTransforms, NULL, &status)) != NULL ) { - const int32_t * intVector = ures_getIntVector(contextTransformUsage, &len, &status); - if (U_SUCCESS(status) && intVector != NULL && len >= 2) { - const char* usageKey = ures_getKey(contextTransformUsage); - if (usageKey != NULL) { - const ContextUsageNameToEnum * typeMapPtr = contextUsageTypeMap; - int32_t compResult = 0; - // linear search; list is short and we cannot be sure that bsearch is available - while ( typeMapPtr->usageName != NULL && (compResult = uprv_strcmp(usageKey, typeMapPtr->usageName)) > 0 ) { - ++typeMapPtr; - } - if (typeMapPtr->usageName != NULL && compResult == 0) { - int32_t titlecaseInt = (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU)? intVector[0]: intVector[1]; - if (titlecaseInt != 0) { - fCapitalization[typeMapPtr->usageEnum] = TRUE;; - needBrkIter = TRUE; - } - } - } - } - status = U_ZERO_ERROR; - ures_close(contextTransformUsage); - } - ures_close(contextTransforms); - } - ures_close(localeBundle); + LocalUResourceBundlePointer resource(ures_open(NULL, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + CapitalizationContextSink sink(*this); + ures_getAllItemsWithFallback(resource.getAlias(), "contextTransforms", sink, status); + if (status == U_MISSING_RESOURCE_ERROR) { + // Silently ignore. Not every locale has contextTransforms. + status = U_ZERO_ERROR; + } else if (U_FAILURE(status)) { + return; } + needBrkIter = sink.hasCapitalizationUsage; } // Get a sentence break iterator if we will need it if (needBrkIter || capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) { @@ -494,8 +513,10 @@ LocaleDisplayNamesImpl::initialize(void) { } LocaleDisplayNamesImpl::~LocaleDisplayNamesImpl() { +#if !UCONFIG_NO_BREAK_ITERATION delete capitalizationBrkIter; - } +#endif +} const Locale& LocaleDisplayNamesImpl::getLocale() const { diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index d6ca74dfafeb64..d2781db95bdd8c 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -42,6 +44,7 @@ #include "uhash.h" #include "ucln_cmn.h" #include "ustr_imp.h" +#include "charstr.h" U_CDECL_BEGIN static UBool U_CALLCONV locale_cleanup(void); @@ -57,6 +60,12 @@ static UMutex gDefaultLocaleMutex = U_MUTEX_INITIALIZER; static UHashtable *gDefaultLocalesHashT = NULL; static Locale *gDefaultLocale = NULL; +/** + * \def ULOC_STRING_LIMIT + * strings beyond this value crash in CharString + */ +#define ULOC_STRING_LIMIT 357913941 + U_NAMESPACE_END typedef enum ELocalePos { @@ -283,13 +292,12 @@ Locale::Locale( const char * newLanguage, } else { - MaybeStackArray togo; + UErrorCode status = U_ZERO_ERROR; int32_t size = 0; int32_t lsize = 0; int32_t csize = 0; int32_t vsize = 0; int32_t ksize = 0; - char *p; // Calculate the size of the resulting string. @@ -297,13 +305,23 @@ Locale::Locale( const char * newLanguage, if ( newLanguage != NULL ) { lsize = (int32_t)uprv_strlen(newLanguage); + if ( lsize < 0 || lsize > ULOC_STRING_LIMIT ) { // int32 wrap + setToBogus(); + return; + } size = lsize; } + CharString togo(newLanguage, lsize, status); // start with newLanguage + // _Country if ( newCountry != NULL ) { csize = (int32_t)uprv_strlen(newCountry); + if ( csize < 0 || csize > ULOC_STRING_LIMIT ) { // int32 wrap + setToBogus(); + return; + } size += csize; } @@ -318,6 +336,10 @@ Locale::Locale( const char * newLanguage, // remove trailing _'s vsize = (int32_t)uprv_strlen(newVariant); + if ( vsize < 0 || vsize > ULOC_STRING_LIMIT ) { // int32 wrap + setToBogus(); + return; + } while( (vsize>1) && (newVariant[vsize-1] == SEP_CHAR) ) { vsize--; @@ -342,70 +364,56 @@ Locale::Locale( const char * newLanguage, if ( newKeywords != NULL) { ksize = (int32_t)uprv_strlen(newKeywords); + if ( ksize < 0 || ksize > ULOC_STRING_LIMIT ) { + setToBogus(); + return; + } size += ksize + 1; } - // NOW we have the full locale string.. - - /*if the whole string is longer than our internal limit, we need - to go to the heap for temporary buffers*/ - if (size >= togo.getCapacity()) - { - // If togo_heap could not be created, initialize with default settings. - if (togo.resize(size+1) == NULL) { - init(NULL, FALSE); - } - } - - togo[0] = 0; - // Now, copy it back. - p = togo.getAlias(); - if ( lsize != 0 ) - { - uprv_strcpy(p, newLanguage); - p += lsize; - } + + // newLanguage is already copied if ( ( vsize != 0 ) || (csize != 0) ) // at least: __v { // ^ - *p++ = SEP_CHAR; + togo.append(SEP_CHAR, status); } if ( csize != 0 ) { - uprv_strcpy(p, newCountry); - p += csize; + togo.append(newCountry, status); } if ( vsize != 0) { - *p++ = SEP_CHAR; // at least: __v - - uprv_strncpy(p, newVariant, vsize); // Must use strncpy because - p += vsize; // of trimming (above). - *p = 0; // terminate + togo.append(SEP_CHAR, status) + .append(newVariant, vsize, status); } if ( ksize != 0) { if (uprv_strchr(newKeywords, '=')) { - *p++ = '@'; /* keyword parsing */ + togo.append('@', status); /* keyword parsing */ } else { - *p++ = '_'; /* Variant parsing with a script */ + togo.append('_', status); /* Variant parsing with a script */ if ( vsize == 0) { - *p++ = '_'; /* No country found */ + togo.append('_', status); /* No country found */ } } - uprv_strcpy(p, newKeywords); - p += ksize; + togo.append(newKeywords, status); } + if (U_FAILURE(status)) { + // Something went wrong with appending, etc. + setToBogus(); + return; + } // Parse it, because for example 'language' might really be a complete // string. - init(togo.getAlias(), FALSE); + init(togo.data(), FALSE); } } @@ -662,6 +670,7 @@ Locale::setToBogus() { *script = 0; *country = 0; fIsBogus = TRUE; + variantBegin = 0; } const Locale& U_EXPORT2 diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index 09b53298841ef9..9dcfc90cbd151c 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -1330,6 +1332,8 @@ Locale::isRightToLeft() const { return uloc_isRightToLeft(getBaseName()); } +U_NAMESPACE_END + // The following must at least allow for rg key value (6) plus terminator (1). #define ULOC_RG_BUFLEN 8 @@ -1379,4 +1383,3 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, return u_terminateChars(region, regionCapacity, rgLen, status); } -U_NAMESPACE_END diff --git a/deps/icu-small/source/common/locmap.c b/deps/icu-small/source/common/locmap.c index f545a04d487962..0d0aac42e15c19 100644 --- a/deps/icu-small/source/common/locmap.c +++ b/deps/icu-small/source/common/locmap.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1996-2016, International Business Machines @@ -213,11 +215,8 @@ ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) ILCID_POSIX_SUBTABLE(ckb) { {0x92, "ckb"}, - {0x92, "ku"}, {0x7c92, "ckb_Arab"}, - {0x7c92, "ku_Arab"}, - {0x0492, "ckb_Arab_IQ"}, - {0x0492, "ku_Arab_IQ"} + {0x0492, "ckb_Arab_IQ"} }; /* Declared as cs_CZ to get around compiler errors on z/OS, which defines cs as a function */ @@ -1019,33 +1018,40 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr const char *pPosixID = NULL; #ifdef USE_WINDOWS_LOCALE_API - int32_t tmpLen = 0; - char locName[157]; /* ULOC_FULLNAME_CAPACITY */ - - tmpLen = GetLocaleInfoA(hostid, LOCALE_SNAME, (LPSTR)locName, UPRV_LENGTHOF(locName)); - if (tmpLen > 1) { - /* Windows locale name may contain sorting variant, such as "es-ES_tradnl". - In such case, we need special mapping data found in the hardcoded table - in this source file. */ - char *p = uprv_strchr(locName, '_'); - if (p) { - /* Keep the base locale, without variant */ - *p = 0; - tmpLen = uprv_strlen(locName); - } else { - /* No hardcoded table lookup necessary */ - bLookup = FALSE; - } - /* Change the tag separator from '-' to '_' */ - p = locName; - while (*p) { - if (*p == '-') { - *p = '_'; + // 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 + // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot + // use the Windows API to resolve locale ID for this specific case. + if (hostid & 0x3FF != 0x92) { + int32_t tmpLen = 0; + char locName[157]; /* ULOC_FULLNAME_CAPACITY */ + + tmpLen = GetLocaleInfoA(hostid, LOCALE_SNAME, (LPSTR)locName, UPRV_LENGTHOF(locName)); + if (tmpLen > 1) { + /* Windows locale name may contain sorting variant, such as "es-ES_tradnl". + In such case, we need special mapping data found in the hardcoded table + in this source file. */ + char *p = uprv_strchr(locName, '_'); + if (p) { + /* Keep the base locale, without variant */ + *p = 0; + tmpLen = uprv_strlen(locName); + } + else { + /* No hardcoded table lookup necessary */ + bLookup = FALSE; + } + /* Change the tag separator from '-' to '_' */ + p = locName; + while (*p) { + if (*p == '-') { + *p = '_'; + } + p++; } - p++; + FIX_LANGUAGE_ID_TAG(locName, tmpLen); + pPosixID = locName; } - FIX_LANGUAGE_ID_TAG(locName, tmpLen); - pPosixID = locName; } #endif if (bLookup) { diff --git a/deps/icu-small/source/common/locmap.h b/deps/icu-small/source/common/locmap.h index 4345e216bd7136..a9b892ee426fc4 100644 --- a/deps/icu-small/source/common/locmap.h +++ b/deps/icu-small/source/common/locmap.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index 15cbc38471cac2..9ede0cac20bfce 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 0b73d9d3e740b5..2f704953a2d0ca 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2002-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/locutil.h b/deps/icu-small/source/common/locutil.h index cf64e343d06649..64f7dcc2c052f7 100644 --- a/deps/icu-small/source/common/locutil.h +++ b/deps/icu-small/source/common/locutil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2002-2005, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/messageimpl.h b/deps/icu-small/source/common/messageimpl.h index 9af400cd27ddf2..980f777e8df7b4 100644 --- a/deps/icu-small/source/common/messageimpl.h +++ b/deps/icu-small/source/common/messageimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/messagepattern.cpp b/deps/icu-small/source/common/messagepattern.cpp index 7265b81eda1741..ddd2287e4cabd9 100644 --- a/deps/icu-small/source/common/messagepattern.cpp +++ b/deps/icu-small/source/common/messagepattern.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2012, International Business Machines @@ -114,7 +116,7 @@ MessagePatternList::copyFrom( errorCode=U_MEMORY_ALLOCATION_ERROR; return; } - uprv_memcpy(a.getAlias(), other.a.getAlias(), length*sizeof(T)); + uprv_memcpy(a.getAlias(), other.a.getAlias(), (size_t)length*sizeof(T)); } } diff --git a/deps/icu-small/source/common/msvcres.h b/deps/icu-small/source/common/msvcres.h index 4d087a2ac95a77..0514ee440ef554 100644 --- a/deps/icu-small/source/common/msvcres.h +++ b/deps/icu-small/source/common/msvcres.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html //{{NO_DEPENDENCIES}} // Copyright (c) 2003-2010 International Business Machines // Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/common/mutex.h b/deps/icu-small/source/common/mutex.h index cd2fcb16e48f95..78de718751f9f2 100644 --- a/deps/icu-small/source/common/mutex.h +++ b/deps/icu-small/source/common/mutex.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 9925afa3413761..4ddba0f8ba64c4 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1999-2016, International Business Machines * Corporation and others. All Rights Reserved. @@ -10,524 +12,534 @@ #ifdef INCLUDED_FROM_NORMALIZER2_CPP static const UVersionInfo norm2_nfc_data_formatVersion={2,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={8,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={9,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x40,0x49c0,0x8614,0x8714,0x8714,0x8714,0x8714,0x8714,0xc0,0x300,0x56e,0x14e7,0x1e2a,0xfe00,0x941,0 +0x40,0x4bb8,0x880c,0x890c,0x890c,0x890c,0x890c,0x890c,0xc0,0x300,0x56e,0x14e7,0x1e2a,0xfe00,0x941,0 }; -static const uint16_t norm2_nfc_data_trieIndex[9400]={ -0x28d,0x295,0x29d,0x2a5,0x2b3,0x2bb,0x2c3,0x2cb,0x2d3,0x2db,0x2e3,0x2eb,0x2f3,0x2fb,0x301,0x309, -0x311,0x319,0x2ac,0x2b4,0x31e,0x326,0x2ac,0x2b4,0x32e,0x336,0x33e,0x346,0x34e,0x356,0x35e,0x366, -0x36e,0x376,0x37e,0x386,0x38e,0x396,0x39e,0x3a6,0x2ac,0x2b4,0x2ac,0x2b4,0x3ad,0x3b5,0x3bd,0x3c5, -0x3c9,0x3d1,0x3d7,0x3df,0x2ac,0x2b4,0x3e7,0x3ef,0x3f3,0x3fb,0x403,0x40b,0x2ac,0x2b4,0x409,0x411, -0x416,0x41d,0x421,0x2ac,0x2ac,0x2ac,0x2ac,0x429,0x2ac,0x431,0x439,0x2ac,0x2ac,0x441,0x449,0x2ac, -0x2ac,0x451,0x459,0x2ac,0x2ac,0x461,0x469,0x2ac,0x2ac,0x441,0x470,0x2ac,0x478,0x47e,0x486,0x2ac, -0x2ac,0x2ac,0x48d,0x2ac,0x2ac,0x493,0x49b,0x2ac,0x2ac,0x47e,0x4a2,0x2ac,0x2ac,0x2ac,0x4a8,0x2ac, -0x2ac,0x4b0,0x4b7,0x2ac,0x2ac,0x4ba,0x4c1,0x2ac,0x4c4,0x4cb,0x4d3,0x4db,0x4e3,0x4eb,0x4f2,0x2ac, -0x2ac,0x4f9,0x2ac,0x2ac,0x500,0x2ac,0x2ac,0x2ac,0x8ea,0x2ac,0x2ac,0x8f2,0x2ac,0x8f8,0x900,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x504,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x50c,0x50c,0x2ac,0x2ac,0x2ac,0x2ac,0x512,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x51a,0x2ac,0x2ac,0x2ac,0x51d,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x524,0x2ac,0x2ac,0x52c,0x2ac,0x534,0x2ac,0x2ac,0x53c,0x541,0x549,0x54f,0x2ac,0x555,0x2ac,0x55c, -0x2ac,0x561,0x2ac,0x2ac,0x2ac,0x2ac,0x567,0x56f,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x577,0x57c, -0x584,0x58c,0x594,0x59c,0x5a4,0x5ac,0x5b4,0x5bc,0x5c4,0x5cc,0x5d4,0x5dc,0x5e4,0x5ec,0x5f4,0x5fc, -0x604,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x608,0x610,0x2ac,0x617,0x2ac,0x2ac,0x61b,0x622,0x627,0x2ac, -0x62f,0x637,0x63f,0x647,0x64f,0x657,0x2ac,0x65f,0x2ac,0x665,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x668,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x670,0x2ac,0x2ac,0x2ac,0x675,0x2ac,0x2ac,0x2ac,0x67d, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x685,0x68c,0x694,0x69c,0x6a4,0x6ac,0x6b4,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x6bc,0x6c4,0x2ac,0x2ac,0x6cc,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x6d3,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x6da,0x6e2,0x2ac,0x6e8,0x6ec,0x2ac,0x2ac,0x562,0x6f4,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x6f8,0x700,0x703,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x469, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908, -0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x908,0x90f,0x2ac,0x2ac, -0x917,0x91e,0x28d,0x925,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d, -0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d,0x28d, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x70b,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743, -0x74b,0x753,0x75b,0x763,0x76b,0x773,0x77b,0x2ac,0x782,0x78a,0x792,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x79a,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0xab4,0xab4,0xacc,0xb0c,0xb4c,0xb8c,0xbcc,0xc04,0xc44,0xab0,0xc78,0xab0,0xcb8,0xcf8,0xd38,0xd78, -0xdb8,0xdf8,0xe38,0xe78,0xab0,0xab0,0xeb4,0xef4,0xf24,0xf5c,0xab0,0xf9c,0xfcc,0x100c,0xab0,0x1024, -0x880,0x8b0,0x8ee,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x928,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x944,0x188,0x188,0x97a,0x188,0x188,0x9b4,0x188,0x188, +static const uint16_t norm2_nfc_data_trieIndex[9652]={ +0x2a8,0x2b0,0x2b8,0x2c0,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c,0x324, +0x32c,0x334,0x2c7,0x2cf,0x339,0x341,0x2c7,0x2cf,0x349,0x351,0x359,0x361,0x369,0x371,0x379,0x381, +0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b9,0x3c1,0x2c7,0x2cf,0x2c7,0x2cf,0x3c8,0x3d0,0x3d8,0x3e0, +0x3e4,0x3ec,0x3f2,0x3fa,0x2c7,0x2cf,0x402,0x40a,0x40e,0x416,0x41e,0x426,0x2c7,0x2cf,0x424,0x42c, +0x431,0x438,0x43c,0x2c7,0x2c7,0x2c7,0x443,0x44b,0x2c7,0x453,0x45b,0x2c7,0x2c7,0x463,0x46b,0x2c7, +0x2c7,0x473,0x47b,0x2c7,0x2c7,0x483,0x48b,0x2c7,0x2c7,0x463,0x492,0x2c7,0x49a,0x4a0,0x4a8,0x2c7, +0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4a0,0x4c4,0x2c7,0x2c7,0x2c7,0x4ca,0x2c7, +0x2c7,0x4d2,0x4d9,0x2c7,0x2c7,0x4dc,0x4e3,0x2c7,0x4e6,0x4ed,0x4f5,0x4fd,0x505,0x50d,0x514,0x2c7, +0x2c7,0x51b,0x2c7,0x2c7,0x522,0x2c7,0x2c7,0x2c7,0x929,0x2c7,0x2c7,0x931,0x2c7,0x937,0x93f,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x526,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52e,0x52e,0x2c7,0x2c7,0x2c7,0x2c7,0x534,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x53c,0x2c7,0x2c7,0x2c7,0x53f,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x546,0x2c7,0x2c7,0x54e,0x2c7,0x556,0x2c7,0x2c7,0x55e,0x563,0x56b,0x571,0x2c7,0x577,0x2c7,0x57e, +0x2c7,0x583,0x2c7,0x2c7,0x2c7,0x2c7,0x589,0x591,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x599,0x59e, +0x5a6,0x5ae,0x5b6,0x5be,0x5c6,0x5ce,0x5d6,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e, +0x626,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x62a,0x632,0x2c7,0x639,0x2c7,0x2c7,0x63d,0x644,0x649,0x2c7, +0x651,0x659,0x661,0x669,0x671,0x679,0x2c7,0x681,0x2c7,0x687,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x68a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x692,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x69f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x6a7,0x6ae,0x6b6,0x6be,0x6c6,0x6ce,0x6d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x6de,0x6e6,0x2c7,0x2c7,0x6ee,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x6fc,0x704,0x2c7,0x70a,0x70e,0x2c7,0x2c7,0x584,0x716,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x71a,0x722,0x725,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, +0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x94e,0x2c7,0x2c7, +0x956,0x95d,0x2a8,0x964,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, +0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x72d,0x735,0x73d,0x745,0x74d,0x755,0x75d,0x765, +0x76d,0x775,0x77d,0x785,0x78d,0x795,0x79d,0x2c7,0x7a4,0x7ac,0x7b4,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x7bc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0xb20,0xb20,0xb38,0xb78,0xbb8,0xbf8,0xc38,0xc70,0xcb0,0xb1c,0xce4,0xb1c,0xd24,0xd64,0xda4,0xde4, +0xe24,0xe64,0xea4,0xee4,0xb1c,0xb1c,0xf20,0xf60,0xf90,0xfc8,0xb1c,0x1008,0x1038,0x1078,0xb1c,0x1090, +0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x951,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96d,0x188,0x188,0x9a3,0x188,0x9e3,0xa1d,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,0x9f4, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x79e, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x7a6,0x2ac,0x2ac,0x2ac,0x7a9,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x7b0,0x7b4,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x7bc,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x6d3,0x675,0x7be,0x7c6,0x2ac,0x2ac,0x7ce,0x7d5,0x2ac,0x562,0x2ac,0x2ac,0x7dd,0x2ac,0x2ac,0x7e0, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x7e6,0x2ac,0x441,0x7ed,0x7f4,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x7fa,0x802,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x807,0x80f,0x2ac,0x2ac,0x675, -0x2ac,0x2ac,0x2ac,0x812,0x2ac,0x2ac,0x2ac,0x818,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x81c, -0x2ac,0x822,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x828,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x830,0x838,0x840,0x846,0x84e,0x2ac,0x2ac,0x2ac,0x856,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x85a,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x862,0x86a,0x872,0x87a,0x882,0x88a,0x892,0x89a,0x8a2,0x8aa,0x8b2,0x8ba, -0x8c2,0x8ca,0x8d2,0x8da,0x8e2,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,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,4,6,0,0,8,0x28,0x2e,0x38,0x44,0x66,0x68,0x76,0x84,0xa2,0xa4, -0xae,0xba,0xc0,0xd2,0xf2,0,0xf6,0x106,0x114,0x122,0x148,0x14c,0x158,0x15c,0x16e,0, -0,0,0,0,0,0x17a,0x19a,0x1a0,0x1aa,0x1b6,0x1d8,0x1da,0x1e8,0x1f8,0x214,0x218, -0x222,0x22e,0x234,0x246,0x266,0,0x26a,0x27a,0x288,0x298,0x2be,0x2c2,0x2d0,0x2d4,0x2e8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x2f4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x941,0x944,0x56f,0x947, -0x57a,0x57f,0x2fa,0x584,0x94a,0x94d,0x589,0x950,0x953,0x956,0x959,0x594,0,0x95c,0x95f,0x962, -0x599,0x5a4,0x5ad,0,0x2fe,0x965,0x968,0x96b,0x5b2,0x96e,0,0,0x971,0x974,0x5bd,0x977, -0x5c8,0x5cd,0x300,0x5d2,0x97a,0x97d,0x5d7,0x980,0x983,0x986,0x989,0x5e2,0,0x98c,0x98f,0x992, -0x5e7,0x5f2,0x5fb,0,0x304,0x995,0x998,0x99b,0x600,0x99e,0,0x9a1,0x9a4,0x9a7,0x60b,0x616, -0x9aa,0x9ad,0x9b0,0x9b3,0x9b6,0x9b9,0x9bc,0x9bf,0x9c2,0x9c5,0x9c8,0x9cb,0,0,0x621,0x628, -0x9ce,0x9d1,0x9d4,0x9d7,0x9da,0x9dd,0x9e0,0x9e3,0x9e6,0x9e9,0x9ec,0x9ef,0x9f2,0x9f5,0x9f8,0x9fb, -0x9fe,0xa01,0,0,0xa04,0xa07,0xa0a,0xa0d,0xa10,0xa13,0xa16,0xa19,0xa1c,0,0,0, -0xa1f,0xa22,0xa25,0xa28,0,0xa2b,0xa2e,0xa31,0xa34,0xa37,0xa3a,0,0,0,0,0xa3d, -0xa40,0xa43,0xa46,0xa49,0xa4c,0,0,0,0x62f,0x636,0xa4f,0xa52,0xa55,0xa58,0,0, -0xa5b,0xa5e,0xa61,0xa64,0xa67,0xa6a,0x63d,0x642,0xa6d,0xa70,0xa73,0xa76,0x647,0x64c,0xa79,0xa7c, -0xa7f,0xa82,0,0,0x651,0x656,0x65b,0x660,0xa85,0xa88,0xa8b,0xa8e,0xa91,0xa94,0xa97,0xa9a, -0xa9d,0xaa0,0xaa3,0xaa6,0xaa9,0xaac,0xaaf,0xab2,0xab5,0xab8,0xabb,0x306,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x665,0x672,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x67f,0x68c,0,0,0, -0,0,0,0x308,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xabe,0xac1,0xac4,0xac7,0xaca,0xacd,0xad0,0xad3,0xad7,0xadc,0xae1,0xae6,0xaeb,0xaf0,0xaf5, -0xafa,0,0xaff,0xb04,0xb09,0xb0e,0xb12,0xb15,0,0,0xb18,0xb1b,0xb1e,0xb21,0x699,0x69e, -0xb25,0xb2a,0xb2e,0xb31,0xb34,0,0,0,0xb37,0xb3a,0,0,0xb3d,0xb40,0xb44,0xb49, -0xb4d,0xb50,0xb53,0xb56,0xb59,0xb5c,0xb5f,0xb62,0xb65,0xb68,0xb6b,0xb6e,0xb71,0xb74,0xb77,0xb7a, -0xb7d,0xb80,0xb83,0xb86,0xb89,0xb8c,0xb8f,0xb92,0xb95,0xb98,0xb9b,0xb9e,0xba1,0xba4,0xba7,0xbaa, -0,0,0xbad,0xbb0,0,0,0,0,0,0,0x6a3,0x6a8,0x6ad,0x6b2,0xbb4,0xbb9, -0xbbe,0xbc3,0x6b7,0x6bc,0xbc8,0xbcd,0xbd1,0xbd4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x30a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xfee6,0xfee6, -0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xffe6,0xfee6,0xffe6,0xfee6,0xffe6,0xfee6,0xfee6,0xffe8,0xffdc,0xffdc, -0xffdc,0xffdc,0xffe8,0xfed8,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffca,0xffca,0xfedc,0xfedc,0xfedc,0xfedc,0xfeca, -0xfeca,0xffdc,0xffdc,0xffdc,0xffdc,0xfedc,0xfedc,0xffdc,0xfedc,0xfedc,0xffdc,0xffdc,0xff01,0xff01,0xff01,0xff01, -0xfe01,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0x14e8,0x14eb,0xfee6,0x14ee,0x14f1,0xfef0,0xffe6,0xffdc, -0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6, -0xffe8,0xffdc,0xffdc,0xffe6,0xffe9,0xffea,0xffea,0xffe9,0xffea,0xffea,0xffe9,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0x14f4,0,0,0, -0,0,0,0,0,0,0x14f6,0,0,0,0,0,0,0xbd7,0xbda,0x14f8, -0xbdd,0xbe0,0xbe3,0,0xbe6,0,0xbe9,0xbec,0xbf0,0x30c,0,0,0,0x31a,0,0x322, -0,0x32c,0,0,0,0,0,0x33a,0,0x342,0,0,0,0x344,0,0, -0,0x350,0xbf4,0xbf7,0x6c1,0xbfa,0x6c6,0xbfd,0xc01,0x35a,0,0,0,0x36a,0,0x372, -0,0x37e,0,0,0,0,0,0x38e,0,0x396,0,0,0,0x39a,0,0, -0,0x3aa,0x6cb,0x6d4,0xc05,0xc08,0x6dd,0,0,0,0x3b6,0xc0b,0xc0e,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xc11,0xc14,0,0xc17,0,0,0x3ba,0xc1a, -0,0,0,0,0xc1d,0xc20,0xc23,0,0x3bc,0,0,0x3c0,0,0x3c2,0x3c8,0x3cc, -0x3ce,0xc26,0x3d6,0,0,0,0x3d8,0,0,0,0,0x3da,0,0,0,0x3e2, -0,0,0,0x3e4,0,0x3e6,0,0,0x3e8,0,0,0x3ec,0,0x3ee,0x3f4,0x3f8, -0x3fa,0xc29,0x402,0,0,0,0x404,0,0,0,0,0x406,0,0,0,0x40e, -0,0,0,0x410,0,0x412,0,0,0xc2c,0xc2f,0,0xc32,0,0,0x414,0xc35, -0,0,0,0,0xc38,0xc3b,0xc3e,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x416,0x418,0xc41,0xc44, -0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xc47,0xc4a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xc4d,0xc50,0xc53,0xc56,0,0,0xc59,0xc5c, -0x41a,0x41c,0xc5f,0xc62,0xc65,0xc68,0xc6b,0xc6e,0,0,0xc71,0xc74,0xc77,0xc7a,0xc7d,0xc80, -0x41e,0x420,0xc83,0xc86,0xc89,0xc8c,0xc8f,0xc92,0xc95,0xc98,0xc9b,0xc9e,0xca1,0xca4,0,0, -0xca7,0xcaa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffde,0xffdc, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6, -0xffe6,0xffde,0xffe4,0xffe6,0xff0a,0xff0b,0xff0c,0xff0d,0xff0e,0xff0f,0xff10,0xff11,0xff12,0xff13,0xff13,0xff14, -0xff15,0xff16,0,0xff17,0,0xff18,0xff19,0,0xffe6,0xffdc,0,0xff12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5d, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c0, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c8,0x2c7,0x2c7,0x2c7,0x7cb,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x7d2,0x7d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7de,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6f5,0x697,0x7e0,0x7e8,0x2c7,0x2c7,0x7f0,0x7f7,0x2c7,0x584,0x2c7,0x2c7,0x7ff,0x2c7,0x2c7,0x802, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x808,0x2c7,0x463,0x80f,0x816,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x81e,0x2c7,0x2c7,0x822,0x82a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x82f,0x837,0x2c7,0x2c7,0x697, +0x2c7,0x2c7,0x2c7,0x83a,0x2c7,0x2c7,0x2c7,0x840,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x844,0x2c7,0x84a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x850,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x858,0x860,0x868, +0x86e,0x876,0x2c7,0x2c7,0x2c7,0x87e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x886,0x88e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x892,0x2c7,0x2c7,0x2c7,0x899,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a1,0x8a9,0x8b1, +0x8b9,0x8c1,0x8c9,0x8d1,0x8d9,0x8e1,0x8e9,0x8f1,0x8f9,0x901,0x909,0x911,0x919,0x921,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7,0x2a7,0x2a7, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,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,4,6,0, +0,8,0x28,0x2e,0x38,0x44,0x66,0x68,0x76,0x84,0xa2,0xa4,0xae,0xba,0xc0,0xd2, +0xf2,0,0xf6,0x106,0x114,0x122,0x148,0x14c,0x158,0x15c,0x16e,0,0,0,0,0, +0,0x17a,0x19a,0x1a0,0x1aa,0x1b6,0x1d8,0x1da,0x1e8,0x1f8,0x214,0x218,0x222,0x22e,0x234,0x246, +0x266,0,0x26a,0x27a,0x288,0x298,0x2be,0x2c2,0x2d0,0x2d4,0x2e8,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x2f4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x941,0x944,0x56f,0x947,0x57a,0x57f,0x2fa,0x584, +0x94a,0x94d,0x589,0x950,0x953,0x956,0x959,0x594,0,0x95c,0x95f,0x962,0x599,0x5a4,0x5ad,0, +0x2fe,0x965,0x968,0x96b,0x5b2,0x96e,0,0,0x971,0x974,0x5bd,0x977,0x5c8,0x5cd,0x300,0x5d2, +0x97a,0x97d,0x5d7,0x980,0x983,0x986,0x989,0x5e2,0,0x98c,0x98f,0x992,0x5e7,0x5f2,0x5fb,0, +0x304,0x995,0x998,0x99b,0x600,0x99e,0,0x9a1,0x9a4,0x9a7,0x60b,0x616,0x9aa,0x9ad,0x9b0,0x9b3, +0x9b6,0x9b9,0x9bc,0x9bf,0x9c2,0x9c5,0x9c8,0x9cb,0,0,0x621,0x628,0x9ce,0x9d1,0x9d4,0x9d7, +0x9da,0x9dd,0x9e0,0x9e3,0x9e6,0x9e9,0x9ec,0x9ef,0x9f2,0x9f5,0x9f8,0x9fb,0x9fe,0xa01,0,0, +0xa04,0xa07,0xa0a,0xa0d,0xa10,0xa13,0xa16,0xa19,0xa1c,0,0,0,0xa1f,0xa22,0xa25,0xa28, +0,0xa2b,0xa2e,0xa31,0xa34,0xa37,0xa3a,0,0,0,0,0xa3d,0xa40,0xa43,0xa46,0xa49, +0xa4c,0,0,0,0x62f,0x636,0xa4f,0xa52,0xa55,0xa58,0,0,0xa5b,0xa5e,0xa61,0xa64, +0xa67,0xa6a,0x63d,0x642,0xa6d,0xa70,0xa73,0xa76,0x647,0x64c,0xa79,0xa7c,0xa7f,0xa82,0,0, +0x651,0x656,0x65b,0x660,0xa85,0xa88,0xa8b,0xa8e,0xa91,0xa94,0xa97,0xa9a,0xa9d,0xaa0,0xaa3,0xaa6, +0xaa9,0xaac,0xaaf,0xab2,0xab5,0xab8,0xabb,0x306,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x665,0x672,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x67f,0x68c,0,0,0,0,0,0,0x308, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xabe,0xac1,0xac4, +0xac7,0xaca,0xacd,0xad0,0xad3,0xad7,0xadc,0xae1,0xae6,0xaeb,0xaf0,0xaf5,0xafa,0,0xaff,0xb04, +0xb09,0xb0e,0xb12,0xb15,0,0,0xb18,0xb1b,0xb1e,0xb21,0x699,0x69e,0xb25,0xb2a,0xb2e,0xb31, +0xb34,0,0,0,0xb37,0xb3a,0,0,0xb3d,0xb40,0xb44,0xb49,0xb4d,0xb50,0xb53,0xb56, +0xb59,0xb5c,0xb5f,0xb62,0xb65,0xb68,0xb6b,0xb6e,0xb71,0xb74,0xb77,0xb7a,0xb7d,0xb80,0xb83,0xb86, +0xb89,0xb8c,0xb8f,0xb92,0xb95,0xb98,0xb9b,0xb9e,0xba1,0xba4,0xba7,0xbaa,0,0,0xbad,0xbb0, +0,0,0,0,0,0,0x6a3,0x6a8,0x6ad,0x6b2,0xbb4,0xbb9,0xbbe,0xbc3,0x6b7,0x6bc, +0xbc8,0xbcd,0xbd1,0xbd4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x30a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6, +0xfee6,0xffe6,0xffe6,0xfee6,0xffe6,0xfee6,0xffe6,0xfee6,0xfee6,0xffe8,0xffdc,0xffdc,0xffdc,0xffdc,0xffe8,0xfed8, +0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffca,0xffca,0xfedc,0xfedc,0xfedc,0xfedc,0xfeca,0xfeca,0xffdc,0xffdc,0xffdc, +0xffdc,0xfedc,0xfedc,0xffdc,0xfedc,0xfedc,0xffdc,0xffdc,0xff01,0xff01,0xff01,0xff01,0xfe01,0xffdc,0xffdc,0xffdc, +0xffdc,0xffe6,0xffe6,0xffe6,0x14e8,0x14eb,0xfee6,0x14ee,0x14f1,0xfef0,0xffe6,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, +0xffe6,0xffdc,0xffdc,0,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe8,0xffdc,0xffdc,0xffe6, +0xffe9,0xffea,0xffea,0xffe9,0xffea,0xffea,0xffe9,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0x14f4,0,0,0,0,0,0,0, +0,0,0x14f6,0,0,0,0,0,0,0xbd7,0xbda,0x14f8,0xbdd,0xbe0,0xbe3,0, +0xbe6,0,0xbe9,0xbec,0xbf0,0x30c,0,0,0,0x31a,0,0x322,0,0x32c,0,0, +0,0,0,0x33a,0,0x342,0,0,0,0x344,0,0,0,0x350,0xbf4,0xbf7, +0x6c1,0xbfa,0x6c6,0xbfd,0xc01,0x35a,0,0,0,0x36a,0,0x372,0,0x37e,0,0, +0,0,0,0x38e,0,0x396,0,0,0,0x39a,0,0,0,0x3aa,0x6cb,0x6d4, +0xc05,0xc08,0x6dd,0,0,0,0x3b6,0xc0b,0xc0e,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xc11,0xc14,0,0xc17,0,0,0x3ba,0xc1a,0,0,0,0, +0xc1d,0xc20,0xc23,0,0x3bc,0,0,0x3c0,0,0x3c2,0x3c8,0x3cc,0x3ce,0xc26,0x3d6,0, +0,0,0x3d8,0,0,0,0,0x3da,0,0,0,0x3e2,0,0,0,0x3e4, +0,0x3e6,0,0,0x3e8,0,0,0x3ec,0,0x3ee,0x3f4,0x3f8,0x3fa,0xc29,0x402,0, +0,0,0x404,0,0,0,0,0x406,0,0,0,0x40e,0,0,0,0x410, +0,0x412,0,0,0xc2c,0xc2f,0,0xc32,0,0,0x414,0xc35,0,0,0,0, +0xc38,0xc3b,0xc3e,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x416,0x418,0xc41,0xc44,0,0,0,0, +0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc47,0xc4a,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xc4d,0xc50,0xc53,0xc56,0,0,0xc59,0xc5c,0x41a,0x41c,0xc5f,0xc62, +0xc65,0xc68,0xc6b,0xc6e,0,0,0xc71,0xc74,0xc77,0xc7a,0xc7d,0xc80,0x41e,0x420,0xc83,0xc86, +0xc89,0xc8c,0xc8f,0xc92,0xc95,0xc98,0xc9b,0xc9e,0xca1,0xca4,0,0,0xca7,0xcaa,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffde,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffde,0xffe4,0xffe6, +0xff0a,0xff0b,0xff0c,0xff0d,0xff0e,0xff0f,0xff10,0xff11,0xff12,0xff13,0xff13,0xff14,0xff15,0xff16,0,0xff17, +0,0xff18,0xff19,0,0xffe6,0xffdc,0,0xff12,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff1e,0xff1f,0xff20,0,0,0,0,0, +0,0,0xcad,0xcb0,0xcb3,0xcb6,0xcb9,0x422,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x428,0,0x42a,0xff1b,0xff1c,0xff1d,0xff1e,0xff1f,0xff20,0xff21,0xff22,0xfee6,0xfee6,0xfedc,0xffdc,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff23,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xcbc,0x42c,0xcbf,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x42e,0xcc2,0,0x430,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0,0,0xffe6, +0xffe6,0,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xff24,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc, +0xffdc,0xffdc,0xffe6,0xffdc,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6, +0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff1e,0xff1f,0xff20,0, -0,0,0,0,0,0,0xcad,0xcb0,0xcb3,0xcb6,0xcb9,0x422,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x428,0,0x42a,0xff1b,0xff1c,0xff1d,0xff1e,0xff1f,0xff20,0xff21,0xff22,0xfee6, -0xfee6,0xfedc,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xff23,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xcbc,0x42c,0xcbf,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x42e,0xcc2, -0,0x430,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc, -0xffe6,0,0,0xffe6,0xffe6,0,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xff24,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6, -0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffe6,0xffdc,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6, -0xffdc,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffdc,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffdc, +0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xff1b,0xff1c,0xff1d,0xffe6, +0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, +0,0,0,0,0x432,0xcc5,0,0,0,0,0,0,0x434,0xcc8,0,0x436, +0xccb,0,0,0,0,0,0,0,0xfe07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xffe6,0xffdc,0xffe6, +0xffe6,0,0,0,0x14fa,0x14fd,0x1500,0x1503,0x1506,0x1509,0x150c,0x150f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff07,0,0xfe00,0,0,0,0,0, +0,0,0,0x438,0,0,0,0xcce,0xcd1,0xff09,0,0,0,0,0,0, +0,0,0,0xfe00,0,0,0,0,0x1512,0x1515,0,0x1518,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x151b, +0,0,0x151e,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, +0,0,0,0,0,0x1521,0x1524,0x1527,0,0,0x152a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x43c, +0xcd4,0,0,0xcd7,0xcda,0xff09,0,0,0,0,0,0,0,0,0xfe00,0xfe00, +0,0,0,0,0x152d,0x1530,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x442,0,0xcdd,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe00,0, +0,0,0,0,0,0,0x444,0x448,0,0,0xce0,0xce3,0xce6,0xff09,0,0, +0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, +0,0,0x44a,0,0xce9,0,0,0,0,0xff09,0,0,0,0,0,0, +0,0xff54,0xfe5b,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff07,0,0,0x44c,0xcec,0,0xfe00,0,0,0,0x44e,0xcef,0xcf2,0,0x6e2,0xcf6, +0,0xff09,0,0,0,0,0,0,0,0xfe00,0xfe00,0,0,0,0,0, +0,0,0,0,0,0,0x454,0x458,0,0,0xcfa,0xcfd,0xd00,0xff09,0,0, +0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, +0,0,0xfe09,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, +0,0x45a,0xd03,0,0x6e7,0xd07,0xd0b,0xfe00,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff67,0xff67,0xff09,0,0,0,0,0,0,0,0,0,0xff6b,0xff6b,0xff6b,0xff6b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff76,0xff76,0,0,0,0,0,0, +0,0,0,0,0xff7a,0xff7a,0xff7a,0xff7a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xffdc,0,0xffdc,0,0xffd8,0,0, +0,0,0,0,0,0,0,0x1533,0,0,0,0,0,0,0,0, +0,0x1536,0,0,0,0,0x1539,0,0,0,0,0x153c,0,0,0,0, +0x153f,0,0,0,0,0,0,0,0,0,0,0,0,0x1542,0,0, +0,0,0,0,0,0xff81,0xff82,0x1546,0xff84,0x154a,0x154d,0,0x1550,0,0xff82,0xff82, +0xff82,0xff82,0,0,0xff82,0x1554,0xffe6,0xffe6,0xff09,0,0xffe6,0xffe6,0,0,0,0, +0,0,0,0,0,0,0,0x1557,0,0,0,0,0,0,0,0, +0,0x155a,0,0,0,0,0x155d,0,0,0,0,0x1560,0,0,0,0, +0x1563,0,0,0,0,0,0,0,0,0,0,0,0,0x1566,0,0, +0,0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x460,0xd0e,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0, +0,0,0,0xff07,0,0xff09,0xff09,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0xffe6,0,0, +0,0,0,0,0,0,0,0,0,0xffe4,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xffde,0xffe6,0xffdc,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, -0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc, -0,0,0,0,0,0,0,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6, -0xffe6,0xffdc,0xffdc,0xffdc,0xff1b,0xff1c,0xff1d,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0x432,0xcc5,0,0, -0,0,0,0,0x434,0xcc8,0,0x436,0xccb,0,0,0,0,0,0,0, -0xfe07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xff09,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0,0,0,0x14fa,0x14fd,0x1500,0x1503, -0x1506,0x1509,0x150c,0x150f,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0,0xfe00,0,0,0,0,0,0,0,0,0x438,0,0,0,0xcce, -0xcd1,0xff09,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0x1512,0x1515,0,0x1518,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x151b,0,0,0x151e,0,0,0,0,0, -0xff07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xff09,0,0,0,0,0,0,0,0,0,0,0,0x1521,0x1524,0x1527, -0,0,0x152a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x43c,0xcd4,0,0,0xcd7,0xcda,0xff09,0,0, -0,0,0,0,0,0,0xfe00,0xfe00,0,0,0,0,0x152d,0x1530,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x442,0,0xcdd,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0x444,0x448, -0,0,0xce0,0xce3,0xce6,0xff09,0,0,0,0,0,0,0,0,0,0xfe00, -0,0,0,0,0,0,0,0,0,0,0x44a,0,0xce9,0,0,0, -0,0xff09,0,0,0,0,0,0,0,0xff54,0xfe5b,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0,0x44c,0xcec,0,0xfe00,0, -0,0,0x44e,0xcef,0xcf2,0,0x6e2,0xcf6,0,0xff09,0,0,0,0,0,0, -0,0xfe00,0xfe00,0,0,0,0,0,0,0,0,0,0,0,0x454,0x458, -0,0,0xcfa,0xcfd,0xd00,0xff09,0,0,0,0,0,0,0,0,0,0xfe00, -0,0,0,0,0,0,0,0,0,0,0xfe09,0,0,0,0,0xfe00, -0,0,0,0,0,0,0,0,0,0x45a,0xd03,0,0x6e7,0xd07,0xd0b,0xfe00, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff67,0xff67,0xff09,0,0,0,0,0, -0,0,0,0,0xff6b,0xff6b,0xff6b,0xff6b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff76,0xff76,0,0,0,0,0,0,0,0,0,0,0xff7a,0xff7a,0xff7a,0xff7a, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffdc,0xffdc,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xffdc,0,0xffdc,0,0xffd8,0,0,0,0,0,0,0,0,0,0x1533, -0,0,0,0,0,0,0,0,0,0x1536,0,0,0,0,0x1539,0, -0,0,0,0x153c,0,0,0,0,0x153f,0,0,0,0,0,0,0, -0,0,0,0,0,0x1542,0,0,0,0,0,0,0,0xff81,0xff82,0x1546, -0xff84,0x154a,0x154d,0,0x1550,0,0xff82,0xff82,0xff82,0xff82,0,0,0xff82,0x1554,0xffe6,0xffe6, -0xff09,0,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0x1557, -0,0,0,0,0,0,0,0,0,0x155a,0,0,0,0,0x155d,0, -0,0,0,0x1560,0,0,0,0,0x1563,0,0,0,0,0,0,0, -0,0,0,0,0,0x1566,0,0,0,0,0,0,0,0,0xffdc,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x460,0xd0e,0,0,0,0,0, -0,0,0xfe00,0,0,0,0,0,0,0,0,0xff07,0,0xff09,0xff09,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffdc,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffdc,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc, +0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0x462,0xd11,0x464, +0xd14,0x466,0xd17,0x468,0xd1a,0x46a,0xd1d,0,0,0x46c,0xd20,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0xffe4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffde,0xffe6,0xffdc, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffdc,0,0,0,0,0,0,0, +0xff07,0xfe00,0,0,0,0,0x46e,0xd23,0x470,0xd26,0x472,0x474,0xd29,0xd2c,0x476,0xd2f, 0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffdc, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0,0, -0,0,0,0,0,0x462,0xd11,0x464,0xd14,0x466,0xd17,0x468,0xd1a,0x46a,0xd1d,0, -0,0x46c,0xd20,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0xfe00,0,0,0,0,0x46e,0xd23, -0x470,0xd26,0x472,0x474,0xd29,0xd2c,0x476,0xd2f,0xff09,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, +0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xff09,0xff09,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff07,0, +0,0,0,0,0,0,0,0,0,0,0xff09,0xff09,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xffe6,0xffe6,0xffe6,0,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, +0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0, +0,0xffdc,0,0,0,0,0,0,0xffe6,0,0,0,0xffe6,0xffe6,0,0, +0,0,0,0,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6, +0xffe6,0xffea,0xffd6,0xffdc,0xffca,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, +0,0,0,0xffe6,0xffe9,0xffdc,0xffe6,0xffdc,0xd32,0xd35,0xd38,0xd3b,0xd3e,0xd41,0xd44,0xd47, +0xd4b,0xd50,0xd54,0xd57,0xd5a,0xd5d,0xd60,0xd63,0xd66,0xd69,0xd6c,0xd6f,0xd73,0xd78,0xd7d,0xd82, +0xd86,0xd89,0xd8c,0xd8f,0xd93,0xd98,0xd9c,0xd9f,0xda2,0xda5,0xda8,0xdab,0xdae,0xdb1,0xdb4,0xdb7, +0xdba,0xdbd,0xdc0,0xdc3,0xdc6,0xdc9,0xdcd,0xdd2,0xdd6,0xdd9,0xddc,0xddf,0xde2,0xde5,0x6ec,0x6f1, +0xde9,0xdee,0xdf2,0xdf5,0xdf8,0xdfb,0xdfe,0xe01,0xe04,0xe07,0xe0a,0xe0d,0xe10,0xe13,0xe16,0xe19, +0xe1c,0xe1f,0xe22,0xe25,0xe29,0xe2e,0xe33,0xe38,0xe3d,0xe42,0xe47,0xe4c,0xe50,0xe53,0xe56,0xe59, +0xe5c,0xe5f,0x6f6,0x6fb,0xe63,0xe68,0xe6c,0xe6f,0xe72,0xe75,0x700,0x705,0xe79,0xe7e,0xe83,0xe88, +0xe8d,0xe92,0xe96,0xe99,0xe9c,0xe9f,0xea2,0xea5,0xea8,0xeab,0xeae,0xeb1,0xeb4,0xeb7,0xeba,0xebd, +0xec1,0xec6,0xecb,0xed0,0xed4,0xed7,0xeda,0xedd,0xee0,0xee3,0xee6,0xee9,0xeec,0xeef,0xef2,0xef5, +0xef8,0xefb,0xefe,0xf01,0xf04,0xf07,0xf0a,0xf0d,0xf10,0xf13,0xf16,0xf19,0xf1c,0xf1f,0xf22,0xf25, +0xf28,0xf2b,0,0xf2e,0,0,0,0,0x70a,0x711,0xf31,0xf34,0xf38,0xf3d,0xf42,0xf47, +0xf4c,0xf51,0xf56,0xf5b,0xf60,0xf65,0xf6a,0xf6f,0xf74,0xf79,0xf7e,0xf83,0xf88,0xf8d,0xf92,0xf97, +0x718,0x71d,0xf9b,0xf9e,0xfa1,0xfa4,0xfa8,0xfad,0xfb2,0xfb7,0xfbc,0xfc1,0xfc6,0xfcb,0xfd0,0xfd5, +0xfd9,0xfdc,0xfdf,0xfe2,0x722,0x727,0xfe5,0xfe8,0xfec,0xff1,0xff6,0xffb,0x1000,0x1005,0x100a,0x100f, +0x1014,0x1019,0x101e,0x1023,0x1028,0x102d,0x1032,0x1037,0x103c,0x1041,0x1046,0x104b,0x104f,0x1052,0x1055,0x1058, +0x105c,0x1061,0x1066,0x106b,0x1070,0x1075,0x107a,0x107f,0x1084,0x1089,0x108d,0x1090,0x1093,0x1096,0x1099,0x109c, +0x109f,0x10a2,0,0,0,0,0,0,0x72c,0x737,0x743,0x74a,0x751,0x758,0x75f,0x766, +0x76c,0x777,0x783,0x78a,0x791,0x798,0x79f,0x7a6,0x7ac,0x7b3,0x10a6,0x10ab,0x10b0,0x10b5,0,0, +0x7ba,0x7c1,0x10ba,0x10bf,0x10c4,0x10c9,0,0,0x7c8,0x7d3,0x7df,0x7e6,0x7ed,0x7f4,0x7fb,0x802, +0x808,0x813,0x81f,0x826,0x82d,0x834,0x83b,0x842,0x848,0x851,0x10ce,0x10d3,0x10d8,0x10dd,0x10e2,0x10e7, +0x85a,0x863,0x10ec,0x10f1,0x10f6,0x10fb,0x1100,0x1105,0x86c,0x873,0x110a,0x110f,0x1114,0x1119,0,0, +0x87a,0x881,0x111e,0x1123,0x1128,0x112d,0,0,0x888,0x891,0x1132,0x1137,0x113c,0x1141,0x1146,0x114b, +0,0x89a,0,0x1150,0,0x1155,0,0x115a,0x8a3,0x8ae,0x8ba,0x8c1,0x8c8,0x8cf,0x8d6,0x8dd, +0x8e3,0x8ee,0x8fa,0x901,0x908,0x90f,0x916,0x91d,0x923,0x156a,0x115e,0x156e,0x928,0x1572,0x1161,0x1576, +0x1164,0x157a,0x1167,0x157e,0x92d,0x1582,0,0,0x116b,0x1170,0x1177,0x117f,0x1187,0x118f,0x1197,0x119f, +0x11a5,0x11aa,0x11b1,0x11b9,0x11c1,0x11c9,0x11d1,0x11d9,0x11df,0x11e4,0x11eb,0x11f3,0x11fb,0x1203,0x120b,0x1213, +0x1219,0x121e,0x1225,0x122d,0x1235,0x123d,0x1245,0x124d,0x1253,0x1258,0x125f,0x1267,0x126f,0x1277,0x127f,0x1287, +0x128d,0x1292,0x1299,0x12a1,0x12a9,0x12b1,0x12b9,0x12c1,0x12c6,0x12c9,0x12cd,0x12d1,0x12d5,0,0x932,0x12da, +0x12de,0x12e1,0x12e4,0x1586,0x12e7,0,0x1589,0x478,0,0x12ea,0x12ee,0x12f2,0x12f6,0,0x937,0x12fb, +0x12ff,0x158c,0x1302,0x1590,0x1305,0x1308,0x130b,0x130e,0x1311,0x1314,0x1318,0x1595,0,0,0x131c,0x1320, +0x1324,0x1327,0x132a,0x159a,0,0x132d,0x1330,0x1333,0x1336,0x1339,0x133d,0x159f,0x1341,0x1344,0x1347,0x134b, +0x134f,0x1352,0x1355,0x15a4,0x1358,0x135b,0x15a8,0x15ab,0,0,0x135f,0x1363,0x1367,0,0x93c,0x136c, +0x1370,0x15ae,0x1373,0x15b2,0x1376,0x15b5,0x47e,0,0xfdc1,0xfdc1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xff01,0xff01,0xffe6,0xffe6,0xffe6,0xffe6, +0xff01,0xff01,0xff01,0xffe6,0xffe6,0,0,0,0,0xffe6,0,0,0,0xff01,0xff01,0xffe6, +0xffdc,0xffe6,0xff01,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x15b7,0,0,0,0x15b9,0x15bc, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x484,0,0x486,0,0x488,0,0,0,0,0,0x1379,0x137c, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x137f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x1382,0x1385,0x1388,0x48a,0,0x48c,0,0x48e,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x490,0x138b,0,0,0,0x492,0x138e,0,0x494, +0x1391,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x496,0x1394,0x498,0x1397,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49a,0,0,0,0,0x139a,0,0x49c,0x139d,0x49e,0,0x13a0,0x4a0,0x13a3,0,0, +0,0x4a2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x13a6,0x4a4,0x13a9,0,0x4a6,0x4a8,0,0,0,0,0,0, +0,0x13ac,0x13af,0x13b2,0x13b5,0x13b8,0x4aa,0x4ac,0x13bb,0x13be,0x4ae,0x4b0,0x13c1,0x13c4,0x4b2,0x4b4, +0x4b6,0x4b8,0,0,0x13c7,0x13ca,0x4ba,0x4bc,0x13cd,0x13d0,0x4be,0x4c0,0x13d3,0x13d6,0,0, +0,0,0,0,0,0x4c2,0x4c4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x4c6,0,0,0,0,0,0x4c8,0x4ca,0,0x4cc, +0x13d9,0x13dc,0x13df,0x13e2,0,0,0x4ce,0x4d0,0x4d2,0x4d4,0,0,0,0,0,0, +0,0,0,0,0x13e5,0x13e8,0x13eb,0x13ee,0,0,0,0,0,0,0x13f1,0x13f4, +0x13f7,0x13fa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x15bf,0x15c1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x15c3,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xff09,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, +0,0,0,0,0,0,0xffda,0xffe4,0xffe8,0xffde,0xffe0,0xffe0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x4d6,0, +0,0,0,0x4d8,0x13fd,0x4da,0x1400,0x4dc,0x1403,0x4de,0x1406,0x4e0,0x1409,0x4e2,0x140c,0x4e4, +0x140f,0x4e6,0x1412,0x4e8,0x1415,0x4ea,0x1418,0x4ec,0x141b,0x4ee,0x141e,0,0x4f0,0x1421,0x4f2,0x1424, +0x4f4,0x1427,0,0,0,0,0,0x4f6,0x142a,0x142d,0x4fa,0x1430,0x1433,0x4fe,0x1436,0x1439, +0x502,0x143c,0x143f,0x506,0x1442,0x1445,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1448,0,0,0, +0,0xfe08,0xfe08,0,0,0x50a,0x144b,0,0,0,0,0,0,0,0x50c,0, +0,0,0,0x50e,0x144e,0x510,0x1451,0x512,0x1454,0x514,0x1457,0x516,0x145a,0x518,0x145d,0x51a, +0x1460,0x51c,0x1463,0x51e,0x1466,0x520,0x1469,0x522,0x146c,0x524,0x146f,0,0x526,0x1472,0x528,0x1475, +0x52a,0x1478,0,0,0,0,0,0x52c,0x147b,0x147e,0x530,0x1481,0x1484,0x534,0x1487,0x148a, +0x538,0x148d,0x1490,0x53c,0x1493,0x1496,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x540,0x542,0x544,0x546,0,0x1499,0,0,0x149c, +0x149f,0x14a2,0x14a5,0,0,0x548,0x14a8,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xffe6,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff09, +0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0xff09,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff07,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0, -0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0xff01,0xff01, -0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0,0,0xffdc,0,0,0,0,0,0, -0xffe6,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0,0xffe6,0xffe6,0xffdc,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffea,0xffd6,0xffdc,0xffca,0xffe6,0xffe6,0xffe6, 0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0xffe9,0xffdc,0xffe6,0xffdc, -0xd32,0xd35,0xd38,0xd3b,0xd3e,0xd41,0xd44,0xd47,0xd4b,0xd50,0xd54,0xd57,0xd5a,0xd5d,0xd60,0xd63, -0xd66,0xd69,0xd6c,0xd6f,0xd73,0xd78,0xd7d,0xd82,0xd86,0xd89,0xd8c,0xd8f,0xd93,0xd98,0xd9c,0xd9f, -0xda2,0xda5,0xda8,0xdab,0xdae,0xdb1,0xdb4,0xdb7,0xdba,0xdbd,0xdc0,0xdc3,0xdc6,0xdc9,0xdcd,0xdd2, -0xdd6,0xdd9,0xddc,0xddf,0xde2,0xde5,0x6ec,0x6f1,0xde9,0xdee,0xdf2,0xdf5,0xdf8,0xdfb,0xdfe,0xe01, -0xe04,0xe07,0xe0a,0xe0d,0xe10,0xe13,0xe16,0xe19,0xe1c,0xe1f,0xe22,0xe25,0xe29,0xe2e,0xe33,0xe38, -0xe3d,0xe42,0xe47,0xe4c,0xe50,0xe53,0xe56,0xe59,0xe5c,0xe5f,0x6f6,0x6fb,0xe63,0xe68,0xe6c,0xe6f, -0xe72,0xe75,0x700,0x705,0xe79,0xe7e,0xe83,0xe88,0xe8d,0xe92,0xe96,0xe99,0xe9c,0xe9f,0xea2,0xea5, -0xea8,0xeab,0xeae,0xeb1,0xeb4,0xeb7,0xeba,0xebd,0xec1,0xec6,0xecb,0xed0,0xed4,0xed7,0xeda,0xedd, -0xee0,0xee3,0xee6,0xee9,0xeec,0xeef,0xef2,0xef5,0xef8,0xefb,0xefe,0xf01,0xf04,0xf07,0xf0a,0xf0d, -0xf10,0xf13,0xf16,0xf19,0xf1c,0xf1f,0xf22,0xf25,0xf28,0xf2b,0,0xf2e,0,0,0,0, -0x70a,0x711,0xf31,0xf34,0xf38,0xf3d,0xf42,0xf47,0xf4c,0xf51,0xf56,0xf5b,0xf60,0xf65,0xf6a,0xf6f, -0xf74,0xf79,0xf7e,0xf83,0xf88,0xf8d,0xf92,0xf97,0x718,0x71d,0xf9b,0xf9e,0xfa1,0xfa4,0xfa8,0xfad, -0xfb2,0xfb7,0xfbc,0xfc1,0xfc6,0xfcb,0xfd0,0xfd5,0xfd9,0xfdc,0xfdf,0xfe2,0x722,0x727,0xfe5,0xfe8, -0xfec,0xff1,0xff6,0xffb,0x1000,0x1005,0x100a,0x100f,0x1014,0x1019,0x101e,0x1023,0x1028,0x102d,0x1032,0x1037, -0x103c,0x1041,0x1046,0x104b,0x104f,0x1052,0x1055,0x1058,0x105c,0x1061,0x1066,0x106b,0x1070,0x1075,0x107a,0x107f, -0x1084,0x1089,0x108d,0x1090,0x1093,0x1096,0x1099,0x109c,0x109f,0x10a2,0,0,0,0,0,0, -0x72c,0x737,0x743,0x74a,0x751,0x758,0x75f,0x766,0x76c,0x777,0x783,0x78a,0x791,0x798,0x79f,0x7a6, -0x7ac,0x7b3,0x10a6,0x10ab,0x10b0,0x10b5,0,0,0x7ba,0x7c1,0x10ba,0x10bf,0x10c4,0x10c9,0,0, -0x7c8,0x7d3,0x7df,0x7e6,0x7ed,0x7f4,0x7fb,0x802,0x808,0x813,0x81f,0x826,0x82d,0x834,0x83b,0x842, -0x848,0x851,0x10ce,0x10d3,0x10d8,0x10dd,0x10e2,0x10e7,0x85a,0x863,0x10ec,0x10f1,0x10f6,0x10fb,0x1100,0x1105, -0x86c,0x873,0x110a,0x110f,0x1114,0x1119,0,0,0x87a,0x881,0x111e,0x1123,0x1128,0x112d,0,0, -0x888,0x891,0x1132,0x1137,0x113c,0x1141,0x1146,0x114b,0,0x89a,0,0x1150,0,0x1155,0,0x115a, -0x8a3,0x8ae,0x8ba,0x8c1,0x8c8,0x8cf,0x8d6,0x8dd,0x8e3,0x8ee,0x8fa,0x901,0x908,0x90f,0x916,0x91d, -0x923,0x156a,0x115e,0x156e,0x928,0x1572,0x1161,0x1576,0x1164,0x157a,0x1167,0x157e,0x92d,0x1582,0,0, -0x116b,0x1170,0x1177,0x117f,0x1187,0x118f,0x1197,0x119f,0x11a5,0x11aa,0x11b1,0x11b9,0x11c1,0x11c9,0x11d1,0x11d9, -0x11df,0x11e4,0x11eb,0x11f3,0x11fb,0x1203,0x120b,0x1213,0x1219,0x121e,0x1225,0x122d,0x1235,0x123d,0x1245,0x124d, -0x1253,0x1258,0x125f,0x1267,0x126f,0x1277,0x127f,0x1287,0x128d,0x1292,0x1299,0x12a1,0x12a9,0x12b1,0x12b9,0x12c1, -0x12c6,0x12c9,0x12cd,0x12d1,0x12d5,0,0x932,0x12da,0x12de,0x12e1,0x12e4,0x1586,0x12e7,0,0x1589,0x478, -0,0x12ea,0x12ee,0x12f2,0x12f6,0,0x937,0x12fb,0x12ff,0x158c,0x1302,0x1590,0x1305,0x1308,0x130b,0x130e, -0x1311,0x1314,0x1318,0x1595,0,0,0x131c,0x1320,0x1324,0x1327,0x132a,0x159a,0,0x132d,0x1330,0x1333, -0x1336,0x1339,0x133d,0x159f,0x1341,0x1344,0x1347,0x134b,0x134f,0x1352,0x1355,0x15a4,0x1358,0x135b,0x15a8,0x15ab, -0,0,0x135f,0x1363,0x1367,0,0x93c,0x136c,0x1370,0x15ae,0x1373,0x15b2,0x1376,0x15b5,0x47e,0, -0xfdc1,0xfdc1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xff01,0xff01,0xffe6,0xffe6,0xffe6,0xffe6,0xff01,0xff01,0xff01,0xffe6,0xffe6,0,0,0, -0,0xffe6,0,0,0,0xff01,0xff01,0xffe6,0xffdc,0xffe6,0xff01,0xff01,0xffdc,0xffdc,0xffdc,0xffdc, -0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x15b7,0,0,0,0x15b9,0x15bc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x484,0,0x486,0, -0x488,0,0,0,0,0,0x1379,0x137c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x137f,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x1382,0x1385,0x1388,0x48a,0,0x48c,0, -0x48e,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x490, -0x138b,0,0,0,0x492,0x138e,0,0x494,0x1391,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x496, -0x1394,0x498,0x1397,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49a,0,0,0,0,0x139a,0,0x49c, -0x139d,0x49e,0,0x13a0,0x4a0,0x13a3,0,0,0,0x4a2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x13a6,0x4a4,0x13a9,0, -0x4a6,0x4a8,0,0,0,0,0,0,0,0x13ac,0x13af,0x13b2,0x13b5,0x13b8,0x4aa,0x4ac, -0x13bb,0x13be,0x4ae,0x4b0,0x13c1,0x13c4,0x4b2,0x4b4,0x4b6,0x4b8,0,0,0x13c7,0x13ca,0x4ba,0x4bc, -0x13cd,0x13d0,0x4be,0x4c0,0x13d3,0x13d6,0,0,0,0,0,0,0,0x4c2,0x4c4,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x4c6,0, -0,0,0,0,0x4c8,0x4ca,0,0x4cc,0x13d9,0x13dc,0x13df,0x13e2,0,0,0x4ce,0x4d0, -0x4d2,0x4d4,0,0,0,0,0,0,0,0,0,0,0x13e5,0x13e8,0x13eb,0x13ee, -0,0,0,0,0,0,0x13f1,0x13f4,0x13f7,0x13fa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x15bf,0x15c1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x15c3,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, 0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, +0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xff09,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0xffda,0xffe4, -0xffe8,0xffde,0xffe0,0xffe0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x4d6,0,0,0,0,0x4d8,0x13fd,0x4da,0x1400,0x4dc, -0x1403,0x4de,0x1406,0x4e0,0x1409,0x4e2,0x140c,0x4e4,0x140f,0x4e6,0x1412,0x4e8,0x1415,0x4ea,0x1418,0x4ec, -0x141b,0x4ee,0x141e,0,0x4f0,0x1421,0x4f2,0x1424,0x4f4,0x1427,0,0,0,0,0,0x4f6, -0x142a,0x142d,0x4fa,0x1430,0x1433,0x4fe,0x1436,0x1439,0x502,0x143c,0x143f,0x506,0x1442,0x1445,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1448,0,0,0,0,0xfe08,0xfe08,0,0,0x50a,0x144b,0, -0,0,0,0,0,0,0x50c,0,0,0,0,0x50e,0x144e,0x510,0x1451,0x512, -0x1454,0x514,0x1457,0x516,0x145a,0x518,0x145d,0x51a,0x1460,0x51c,0x1463,0x51e,0x1466,0x520,0x1469,0x522, -0x146c,0x524,0x146f,0,0x526,0x1472,0x528,0x1475,0x52a,0x1478,0,0,0,0,0,0x52c, -0x147b,0x147e,0x530,0x1481,0x1484,0x534,0x1487,0x148a,0x538,0x148d,0x1490,0x53c,0x1493,0x1496,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x540, -0x542,0x544,0x546,0,0x1499,0,0,0x149c,0x149f,0x14a2,0x14a5,0,0,0x548,0x14a8,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, +0,0,0,0,0,0,0,0,0xffe6,0,0xffe6,0xffe6,0xffdc,0,0,0xffe6, +0xffe6,0,0,0,0,0,0xffe6,0xffe6,0,0xffe6,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, +0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, +0,0,0,0,0x15c6,0x15c8,0x15ca,0x15cc,0x15ce,0x15d0,0x15d2,0x15d4,0x15d4,0x15d6,0x15d8,0x15da, +0x15dc,0x15de,0x15e0,0x15e2,0x15e4,0x15e6,0x15e8,0x15ea,0x15ec,0x15ee,0x15f0,0x15f2,0x15f4,0x15f6,0x15f8,0x15fa, +0x15fc,0x15fe,0x1600,0x1602,0x1604,0x1606,0x1608,0x160a,0x160c,0x160e,0x1610,0x1612,0x1614,0x1616,0x1618,0x161a, +0x161c,0x161e,0x1620,0x1622,0x1624,0x1626,0x1628,0x162a,0x162c,0x162e,0x1630,0x1632,0x1634,0x1636,0x1638,0x163a, +0x163c,0x163e,0x1640,0x1642,0x1644,0x1646,0x1648,0x164a,0x164c,0x164e,0x1650,0x1652,0x1654,0x1656,0x1658,0x165a, +0x165c,0x165e,0x1660,0x1662,0x1664,0x1666,0x1668,0x166a,0x166c,0x166e,0x1670,0x1672,0x1674,0x1676,0x1678,0x167a, +0x15ec,0x167c,0x167e,0x1680,0x1682,0x1684,0x1686,0x1688,0x168a,0x168c,0x168e,0x1690,0x1692,0x1694,0x1696,0x1698, +0x169a,0x169c,0x169e,0x16a0,0x16a2,0x16a4,0x16a6,0x16a8,0x16aa,0x16ac,0x16ae,0x16b0,0x16b2,0x16b4,0x16b6,0x16b8, +0x16ba,0x16bc,0x16be,0x16c0,0x16c2,0x16c4,0x16c6,0x16c8,0x16ca,0x16cc,0x16ce,0x16d0,0x16d2,0x16d4,0x16d6,0x16d8, +0x16da,0x16dc,0x16de,0x16e0,0x16e2,0x16e4,0x16e6,0x16e8,0x16ea,0x16ec,0x16ee,0x16f0,0x16f2,0x16f4,0x16f6,0x16f8, +0x16fa,0x16fc,0x16fe,0x1700,0x1702,0x16a0,0x1704,0x1706,0x1708,0x170a,0x170c,0x170e,0x1710,0x1712,0x1680,0x1714, +0x1716,0x1718,0x171a,0x171c,0x171e,0x1720,0x1722,0x1724,0x1726,0x1728,0x172a,0x172c,0x172e,0x1730,0x1732,0x1734, +0x1736,0x1738,0x173a,0x15ec,0x173c,0x173e,0x1740,0x1742,0x1744,0x1746,0x1748,0x174a,0x174c,0x174e,0x1750,0x1752, +0x1754,0x1756,0x1758,0x175a,0x175c,0x175e,0x1760,0x1762,0x1764,0x1766,0x1768,0x176a,0x176c,0x176e,0x1770,0x1684, +0x1772,0x1774,0x1776,0x1778,0x177a,0x177c,0x177e,0x1780,0x1782,0x1784,0x1786,0x1788,0x178a,0x178c,0x178e,0x1790, +0x1792,0x1794,0x1796,0x1798,0x179a,0x179c,0x179e,0x17a0,0x17a2,0x17a4,0x17a6,0x17a8,0x17aa,0x17ac,0x17ae,0x17b0, +0x17b2,0x17b4,0x17b6,0x17b8,0x17ba,0x17bc,0x17be,0x17c0,0x17c2,0x17c4,0x17c6,0x17c8,0x17ca,0x17cc,0x17ce,0x17d0, +0x17d2,0x17d4,0,0,0x17d6,0,0x17d8,0,0,0x17da,0x17dc,0x17de,0x17e0,0x17e2,0x17e4,0x17e6, +0x17e8,0x17ea,0x17ec,0,0x17ee,0,0x17f0,0,0,0x17f2,0x17f4,0,0,0,0x17f6,0x17f8, +0x17fa,0x17fc,0x17fe,0x1800,0x1802,0x1804,0x1806,0x1808,0x180a,0x180c,0x180e,0x1810,0x1812,0x1814,0x1816,0x1818, +0x181a,0x181c,0x181e,0x1820,0x1822,0x1824,0x1826,0x1828,0x182a,0x182c,0x182e,0x1830,0x1832,0x1834,0x1836,0x1838, +0x183a,0x183c,0x183e,0x1840,0x1842,0x1844,0x1846,0x1848,0x184a,0x184c,0x184e,0x16ee,0x1850,0x1852,0x1854,0x1856, +0x1858,0x185a,0x185a,0x185c,0x185e,0x1860,0x1862,0x1864,0x1866,0x1868,0x186a,0x17f2,0x186c,0x186e,0x1870,0x1872, +0x1874,0x1877,0,0,0x1879,0x187b,0x187d,0x187f,0x1881,0x1883,0x1885,0x1887,0x180e,0x1889,0x188b,0x188d, +0x17d6,0x188f,0x1891,0x1893,0x1895,0x1897,0x1899,0x189b,0x189d,0x189f,0x18a1,0x18a3,0x18a5,0x1820,0x18a7,0x1822, +0x18a9,0x18ab,0x18ad,0x18af,0x18b1,0x17d8,0x1616,0x18b3,0x18b5,0x18b7,0x16a2,0x1750,0x18b9,0x18bb,0x1830,0x18bd, +0x1832,0x18bf,0x18c1,0x18c3,0x17dc,0x18c5,0x18c7,0x18c9,0x18cb,0x18cd,0x17de,0x18cf,0x18d1,0x18d3,0x18d5,0x18d7, +0x18d9,0x184e,0x18db,0x18dd,0x16ee,0x18df,0x1856,0x18e1,0x18e3,0x18e5,0x18e7,0x18e9,0x1860,0x18eb,0x17f0,0x18ed, +0x1862,0x167c,0x18ef,0x1864,0x18f1,0x1868,0x18f3,0x18f5,0x18f7,0x18f9,0x18fb,0x186c,0x17e8,0x18fd,0x186e,0x18ff, +0x1870,0x1901,0x15d4,0x1903,0x1906,0x1909,0x190c,0x190e,0x1910,0x1912,0x1915,0x1918,0x191b,0x191d,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x191f,0xff1a,0x1922, +0,0,0,0,0,0,0,0,0,0,0x1925,0x1928,0x192c,0x1931,0x1935,0x1938, +0x193b,0x193e,0x1941,0x1944,0x1947,0x194a,0x194d,0,0x1950,0x1953,0x1956,0x1959,0x195c,0,0x195f,0, +0x1962,0x1965,0,0x1968,0x196b,0,0x196e,0x1971,0x1974,0x1977,0x197a,0x197d,0x1980,0x1983,0x1986,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0, +0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0,0, +0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xffdc,0,0xffe6,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0,0, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xffe6,0xff01,0xffdc,0,0,0,0,0xff09,0,0,0,0,0,0xffe6,0xffdc,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0,0xffe6,0xffe6,0xffdc,0,0,0xffe6,0xffe6,0,0,0,0,0,0xffe6,0xffe6, -0,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0,0,0,0,0,0,0,0,0,0x15c6,0x15c8,0x15ca,0x15cc, -0x15ce,0x15d0,0x15d2,0x15d4,0x15d4,0x15d6,0x15d8,0x15da,0x15dc,0x15de,0x15e0,0x15e2,0x15e4,0x15e6,0x15e8,0x15ea, -0x15ec,0x15ee,0x15f0,0x15f2,0x15f4,0x15f6,0x15f8,0x15fa,0x15fc,0x15fe,0x1600,0x1602,0x1604,0x1606,0x1608,0x160a, -0x160c,0x160e,0x1610,0x1612,0x1614,0x1616,0x1618,0x161a,0x161c,0x161e,0x1620,0x1622,0x1624,0x1626,0x1628,0x162a, -0x162c,0x162e,0x1630,0x1632,0x1634,0x1636,0x1638,0x163a,0x163c,0x163e,0x1640,0x1642,0x1644,0x1646,0x1648,0x164a, -0x164c,0x164e,0x1650,0x1652,0x1654,0x1656,0x1658,0x165a,0x165c,0x165e,0x1660,0x1662,0x1664,0x1666,0x1668,0x166a, -0x166c,0x166e,0x1670,0x1672,0x1674,0x1676,0x1678,0x167a,0x15ec,0x167c,0x167e,0x1680,0x1682,0x1684,0x1686,0x1688, -0x168a,0x168c,0x168e,0x1690,0x1692,0x1694,0x1696,0x1698,0x169a,0x169c,0x169e,0x16a0,0x16a2,0x16a4,0x16a6,0x16a8, -0x16aa,0x16ac,0x16ae,0x16b0,0x16b2,0x16b4,0x16b6,0x16b8,0x16ba,0x16bc,0x16be,0x16c0,0x16c2,0x16c4,0x16c6,0x16c8, -0x16ca,0x16cc,0x16ce,0x16d0,0x16d2,0x16d4,0x16d6,0x16d8,0x16da,0x16dc,0x16de,0x16e0,0x16e2,0x16e4,0x16e6,0x16e8, -0x16ea,0x16ec,0x16ee,0x16f0,0x16f2,0x16f4,0x16f6,0x16f8,0x16fa,0x16fc,0x16fe,0x1700,0x1702,0x16a0,0x1704,0x1706, -0x1708,0x170a,0x170c,0x170e,0x1710,0x1712,0x1680,0x1714,0x1716,0x1718,0x171a,0x171c,0x171e,0x1720,0x1722,0x1724, -0x1726,0x1728,0x172a,0x172c,0x172e,0x1730,0x1732,0x1734,0x1736,0x1738,0x173a,0x15ec,0x173c,0x173e,0x1740,0x1742, -0x1744,0x1746,0x1748,0x174a,0x174c,0x174e,0x1750,0x1752,0x1754,0x1756,0x1758,0x175a,0x175c,0x175e,0x1760,0x1762, -0x1764,0x1766,0x1768,0x176a,0x176c,0x176e,0x1770,0x1684,0x1772,0x1774,0x1776,0x1778,0x177a,0x177c,0x177e,0x1780, -0x1782,0x1784,0x1786,0x1788,0x178a,0x178c,0x178e,0x1790,0x1792,0x1794,0x1796,0x1798,0x179a,0x179c,0x179e,0x17a0, -0x17a2,0x17a4,0x17a6,0x17a8,0x17aa,0x17ac,0x17ae,0x17b0,0x17b2,0x17b4,0x17b6,0x17b8,0x17ba,0x17bc,0x17be,0x17c0, -0x17c2,0x17c4,0x17c6,0x17c8,0x17ca,0x17cc,0x17ce,0x17d0,0x17d2,0x17d4,0,0,0x17d6,0,0x17d8,0, -0,0x17da,0x17dc,0x17de,0x17e0,0x17e2,0x17e4,0x17e6,0x17e8,0x17ea,0x17ec,0,0x17ee,0,0x17f0,0, -0,0x17f2,0x17f4,0,0,0,0x17f6,0x17f8,0x17fa,0x17fc,0x17fe,0x1800,0x1802,0x1804,0x1806,0x1808, -0x180a,0x180c,0x180e,0x1810,0x1812,0x1814,0x1816,0x1818,0x181a,0x181c,0x181e,0x1820,0x1822,0x1824,0x1826,0x1828, -0x182a,0x182c,0x182e,0x1830,0x1832,0x1834,0x1836,0x1838,0x183a,0x183c,0x183e,0x1840,0x1842,0x1844,0x1846,0x1848, -0x184a,0x184c,0x184e,0x16ee,0x1850,0x1852,0x1854,0x1856,0x1858,0x185a,0x185a,0x185c,0x185e,0x1860,0x1862,0x1864, -0x1866,0x1868,0x186a,0x17f2,0x186c,0x186e,0x1870,0x1872,0x1874,0x1877,0,0,0x1879,0x187b,0x187d,0x187f, -0x1881,0x1883,0x1885,0x1887,0x180e,0x1889,0x188b,0x188d,0x17d6,0x188f,0x1891,0x1893,0x1895,0x1897,0x1899,0x189b, -0x189d,0x189f,0x18a1,0x18a3,0x18a5,0x1820,0x18a7,0x1822,0x18a9,0x18ab,0x18ad,0x18af,0x18b1,0x17d8,0x1616,0x18b3, -0x18b5,0x18b7,0x16a2,0x1750,0x18b9,0x18bb,0x1830,0x18bd,0x1832,0x18bf,0x18c1,0x18c3,0x17dc,0x18c5,0x18c7,0x18c9, -0x18cb,0x18cd,0x17de,0x18cf,0x18d1,0x18d3,0x18d5,0x18d7,0x18d9,0x184e,0x18db,0x18dd,0x16ee,0x18df,0x1856,0x18e1, -0x18e3,0x18e5,0x18e7,0x18e9,0x1860,0x18eb,0x17f0,0x18ed,0x1862,0x167c,0x18ef,0x1864,0x18f1,0x1868,0x18f3,0x18f5, -0x18f7,0x18f9,0x18fb,0x186c,0x17e8,0x18fd,0x186e,0x18ff,0x1870,0x1901,0x15d4,0x1903,0x1906,0x1909,0x190c,0x190e, -0x1910,0x1912,0x1915,0x1918,0x191b,0x191d,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x191f,0xff1a,0x1922,0,0,0,0,0,0,0,0, -0,0,0x1925,0x1928,0x192c,0x1931,0x1935,0x1938,0x193b,0x193e,0x1941,0x1944,0x1947,0x194a,0x194d,0, -0x1950,0x1953,0x1956,0x1959,0x195c,0,0x195f,0,0x1962,0x1965,0,0x1968,0x196b,0,0x196e,0x1971, -0x1974,0x1977,0x197a,0x197d,0x1980,0x1983,0x1986,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc, -0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0,0xffdc,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xff01,0xffdc,0,0,0,0,0xff09, -0,0,0,0,0,0xffe6,0xffdc,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x54a,0x14ab,0x54d,0x14b0,0,0,0,0,0,0,0,0,0x550,0,0, -0,0,0,0x14b5,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xff09,0xfe07,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x54a,0x14ab,0x54d,0x14b0,0,0,0, +0,0,0,0,0,0x550,0,0,0,0,0,0x14b5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xff09,0xfe07,0,0,0,0,0, +0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe00,0,0,0,0,0,0,0x14ba,0x14bf,0,0x553,0x556,0xff09, +0xff09,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, +0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07,0, +0,0,0,0,0,0,0,0,0,0xff07,0xff09,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x559,0,0,0,0x14c4,0x14c9,0xff09,0,0,0,0,0,0, +0,0,0,0xfe00,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xff07,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0,0,0x14ba,0x14bf,0,0x553,0x556,0xff09,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xff09,0xff07,0,0,0,0,0,0,0,0,0, -0,0xff07,0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x559,0,0,0,0x14c4, -0x14c9,0xff09,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0, 0,0x55f,0xfe00,0x14ce,0x14d3,0xfe00,0x14d8,0,0,0,0xff09,0xff07,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -552,59 +564,65 @@ static const uint16_t norm2_nfc_data_trieIndex[9400]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, +0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, +0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0,0xffe6,0xffe6, +0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0, -0,0,0,0,0,0,0,0,0x1a09,0x1a0b,0x1a0d,0x1a0f,0x1a12,0x1802,0x1a14,0x1a16, -0x1a18,0x1a1a,0x1804,0x1a1c,0x1a1e,0x1a20,0x1806,0x1a23,0x1a25,0x1a27,0x1a29,0x1a2c,0x1a2e,0x1a30,0x1a32,0x1a35, -0x1a37,0x1a39,0x1a3b,0x187b,0x1a3d,0x1a40,0x1a42,0x1a44,0x1a46,0x1a48,0x1a4a,0x1a4c,0x1a4e,0x1885,0x1808,0x180a, -0x1887,0x1a50,0x1a52,0x1688,0x1a54,0x180c,0x1a56,0x1a58,0x1a5a,0x1a5c,0x1a5c,0x1a5c,0x1a5e,0x1a61,0x1a63,0x1a65, -0x1a67,0x1a6a,0x1a6c,0x1a6e,0x1a70,0x1a72,0x1a74,0x1a76,0x1a78,0x1a7a,0x1a7c,0x1a7e,0x1a80,0x1a82,0x1a82,0x188b, -0x1a84,0x1a86,0x1a88,0x1a8a,0x1810,0x1a8c,0x1a8e,0x1a90,0x17ba,0x1a92,0x1a94,0x1a96,0x1a98,0x1a9a,0x1a9c,0x1a9e, -0x1aa0,0x1aa2,0x1aa5,0x1aa7,0x1aa9,0x1aab,0x1aad,0x1aaf,0x1ab1,0x1ab4,0x1ab7,0x1ab9,0x1abb,0x1abd,0x1abf,0x1ac1, -0x1ac3,0x1ac5,0x1ac7,0x1ac7,0x1ac9,0x1acc,0x1ace,0x1680,0x1ad0,0x1ad2,0x1ad5,0x1ad7,0x1ad9,0x1adb,0x1add,0x1adf, -0x181a,0x1ae1,0x1ae3,0x1ae5,0x1ae8,0x1aea,0x1aed,0x1aef,0x1af1,0x1af3,0x1af5,0x1af7,0x1af9,0x1afb,0x1afd,0x1aff, -0x1b01,0x1b03,0x1b06,0x1b08,0x1b0a,0x1b0c,0x1614,0x1b0e,0x1b11,0x1b13,0x1b13,0x1b16,0x1b18,0x1b18,0x1b1a,0x1b1c, -0x1b1f,0x1b22,0x1b24,0x1b26,0x1b28,0x1b2a,0x1b2c,0x1b2e,0x1b30,0x1b32,0x1b34,0x181c,0x1b36,0x1b39,0x1b3b,0x1b3d, -0x18a3,0x1b3d,0x1b3f,0x1820,0x1b41,0x1b43,0x1b45,0x1b47,0x1822,0x15de,0x1b49,0x1b4b,0x1b4d,0x1b4f,0x1b51,0x1b53, -0x1b55,0x1b58,0x1b5a,0x1b5c,0x1b5e,0x1b60,0x1b62,0x1b65,0x1b67,0x1b69,0x1b6b,0x1b6d,0x1b6f,0x1b71,0x1b73,0x1b75, -0x1824,0x1b77,0x1b79,0x1b7c,0x1b7e,0x1b80,0x1b82,0x1828,0x1b84,0x1b86,0x1b88,0x1b8a,0x1b8c,0x1b8e,0x1b90,0x1b92, -0x1616,0x18b3,0x1b94,0x1b96,0x1b98,0x1b9a,0x1b9d,0x1b9f,0x1ba1,0x1ba3,0x182a,0x1ba5,0x1ba8,0x1baa,0x1bac,0x190c, -0x1bae,0x1bb0,0x1bb2,0x1bb4,0x1bb6,0x1bb9,0x1bbb,0x1bbd,0x1bbf,0x1bc2,0x1bc4,0x1bc6,0x1bc8,0x16a2,0x1bca,0x1bcc, -0x1bcf,0x1bd2,0x1bd5,0x1bd7,0x1bda,0x1bdc,0x1bde,0x1be0,0x1be2,0x182c,0x1750,0x1be4,0x1be6,0x1be8,0x1bea,0x1bed, -0x1bef,0x1bf1,0x1bf3,0x18bb,0x1bf5,0x1bf7,0x1bfa,0x1bfc,0x1bfe,0x1c01,0x1c04,0x1c06,0x18bd,0x1c08,0x1c0a,0x1c0c, -0x1c0e,0x1c10,0x1c12,0x1c14,0x1c17,0x1c19,0x1c1c,0x1c1e,0x1c21,0x18c1,0x1c23,0x1c25,0x1c28,0x1c2a,0x1c2c,0x1c2f, -0x1c32,0x1c34,0x1c36,0x1c38,0x1c3a,0x1c3a,0x1c3c,0x1c3e,0x18c5,0x1c40,0x1c42,0x1c44,0x1c46,0x1c48,0x1c4b,0x1c4d, -0x1686,0x1c50,0x1c53,0x1c55,0x1c58,0x1c5b,0x1c5e,0x1c60,0x18d1,0x1c62,0x1c65,0x1c68,0x1c6b,0x1c6e,0x1c70,0x1c70, -0x18d3,0x1910,0x1c72,0x1c74,0x1c76,0x1c78,0x1c7b,0x163a,0x18d7,0x1c7d,0x1c7f,0x1842,0x1c82,0x1c85,0x17e6,0x1c88, -0x1c8a,0x184a,0x1c8c,0x1c8e,0x1c90,0x1c93,0x1c93,0x1c96,0x1c98,0x1c9a,0x1c9d,0x1c9f,0x1ca1,0x1ca3,0x1ca6,0x1ca8, -0x1caa,0x1cac,0x1cae,0x1cb0,0x1cb3,0x1cb5,0x1cb7,0x1cb9,0x1cbb,0x1cbd,0x1cbf,0x1cc2,0x1cc5,0x1cc7,0x1cca,0x1ccc, -0x1ccf,0x1cd1,0x1856,0x1cd3,0x1cd6,0x1cd9,0x1cdb,0x1cde,0x1ce0,0x1ce3,0x1ce5,0x1ce7,0x1ce9,0x1ceb,0x1ced,0x1cef, -0x1cf2,0x1cf5,0x1cf8,0x1b16,0x1cfb,0x1cfd,0x1cff,0x1d01,0x1d03,0x1d05,0x1d07,0x1d09,0x1d0b,0x1d0d,0x1d0f,0x1d11, -0x16aa,0x1d14,0x1d16,0x1d18,0x1d1a,0x1d1c,0x1d1e,0x185c,0x1d20,0x1d22,0x1d24,0x1d26,0x1d28,0x1d2b,0x1d2e,0x1d31, -0x1d33,0x1d35,0x1d37,0x1d39,0x1d3c,0x1d3e,0x1d41,0x1d43,0x1d45,0x1d48,0x1d4b,0x1d4d,0x1630,0x1d4f,0x1d51,0x1d53, -0x1d55,0x1d57,0x1d59,0x18e5,0x1d5b,0x1d5d,0x1d5f,0x1d61,0x1d63,0x1d65,0x1d67,0x1d69,0x1d6b,0x1d6d,0x1d70,0x1d72, -0x1d74,0x1d76,0x1d78,0x1d7a,0x1d7d,0x1d80,0x1d82,0x1d84,0x18ef,0x18f1,0x1d86,0x1d88,0x1d8b,0x1d8d,0x1d8f,0x1d91, -0x1d93,0x1d96,0x1d99,0x1d9b,0x1d9d,0x1d9f,0x1da2,0x18f3,0x1da4,0x1da7,0x1daa,0x1dac,0x1dae,0x1db0,0x1db3,0x1db5, -0x1db7,0x1db9,0x1dbb,0x1dbd,0x1dbf,0x1dc1,0x1dc4,0x1dc6,0x1dc8,0x1dca,0x1dcd,0x1dcf,0x1dd1,0x1dd3,0x1dd5,0x1dd8, -0x1ddb,0x1ddd,0x1ddf,0x1de1,0x1de4,0x1de6,0x18ff,0x18ff,0x1de9,0x1deb,0x1dee,0x1df0,0x1df2,0x1df4,0x1df6,0x1df8, -0x1dfa,0x1dfc,0x1901,0x1dff,0x1e01,0x1e03,0x1e05,0x1e07,0x1e09,0x1e0c,0x1e0e,0x1e11,0x1e14,0x1e17,0x1e19,0x1e1b, -0x1e1d,0x1e1f,0x1e21,0x1e23,0x1e25,0x1e27,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,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0,0, -0,0,0,0,0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e, +0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff07,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1a09,0x1a0b,0x1a0d,0x1a0f,0x1a12,0x1802,0x1a14,0x1a16,0x1a18,0x1a1a,0x1804,0x1a1c, +0x1a1e,0x1a20,0x1806,0x1a23,0x1a25,0x1a27,0x1a29,0x1a2c,0x1a2e,0x1a30,0x1a32,0x1a35,0x1a37,0x1a39,0x1a3b,0x187b, +0x1a3d,0x1a40,0x1a42,0x1a44,0x1a46,0x1a48,0x1a4a,0x1a4c,0x1a4e,0x1885,0x1808,0x180a,0x1887,0x1a50,0x1a52,0x1688, +0x1a54,0x180c,0x1a56,0x1a58,0x1a5a,0x1a5c,0x1a5c,0x1a5c,0x1a5e,0x1a61,0x1a63,0x1a65,0x1a67,0x1a6a,0x1a6c,0x1a6e, +0x1a70,0x1a72,0x1a74,0x1a76,0x1a78,0x1a7a,0x1a7c,0x1a7e,0x1a80,0x1a82,0x1a82,0x188b,0x1a84,0x1a86,0x1a88,0x1a8a, +0x1810,0x1a8c,0x1a8e,0x1a90,0x17ba,0x1a92,0x1a94,0x1a96,0x1a98,0x1a9a,0x1a9c,0x1a9e,0x1aa0,0x1aa2,0x1aa5,0x1aa7, +0x1aa9,0x1aab,0x1aad,0x1aaf,0x1ab1,0x1ab4,0x1ab7,0x1ab9,0x1abb,0x1abd,0x1abf,0x1ac1,0x1ac3,0x1ac5,0x1ac7,0x1ac7, +0x1ac9,0x1acc,0x1ace,0x1680,0x1ad0,0x1ad2,0x1ad5,0x1ad7,0x1ad9,0x1adb,0x1add,0x1adf,0x181a,0x1ae1,0x1ae3,0x1ae5, +0x1ae8,0x1aea,0x1aed,0x1aef,0x1af1,0x1af3,0x1af5,0x1af7,0x1af9,0x1afb,0x1afd,0x1aff,0x1b01,0x1b03,0x1b06,0x1b08, +0x1b0a,0x1b0c,0x1614,0x1b0e,0x1b11,0x1b13,0x1b13,0x1b16,0x1b18,0x1b18,0x1b1a,0x1b1c,0x1b1f,0x1b22,0x1b24,0x1b26, +0x1b28,0x1b2a,0x1b2c,0x1b2e,0x1b30,0x1b32,0x1b34,0x181c,0x1b36,0x1b39,0x1b3b,0x1b3d,0x18a3,0x1b3d,0x1b3f,0x1820, +0x1b41,0x1b43,0x1b45,0x1b47,0x1822,0x15de,0x1b49,0x1b4b,0x1b4d,0x1b4f,0x1b51,0x1b53,0x1b55,0x1b58,0x1b5a,0x1b5c, +0x1b5e,0x1b60,0x1b62,0x1b65,0x1b67,0x1b69,0x1b6b,0x1b6d,0x1b6f,0x1b71,0x1b73,0x1b75,0x1824,0x1b77,0x1b79,0x1b7c, +0x1b7e,0x1b80,0x1b82,0x1828,0x1b84,0x1b86,0x1b88,0x1b8a,0x1b8c,0x1b8e,0x1b90,0x1b92,0x1616,0x18b3,0x1b94,0x1b96, +0x1b98,0x1b9a,0x1b9d,0x1b9f,0x1ba1,0x1ba3,0x182a,0x1ba5,0x1ba8,0x1baa,0x1bac,0x190c,0x1bae,0x1bb0,0x1bb2,0x1bb4, +0x1bb6,0x1bb9,0x1bbb,0x1bbd,0x1bbf,0x1bc2,0x1bc4,0x1bc6,0x1bc8,0x16a2,0x1bca,0x1bcc,0x1bcf,0x1bd2,0x1bd5,0x1bd7, +0x1bda,0x1bdc,0x1bde,0x1be0,0x1be2,0x182c,0x1750,0x1be4,0x1be6,0x1be8,0x1bea,0x1bed,0x1bef,0x1bf1,0x1bf3,0x18bb, +0x1bf5,0x1bf7,0x1bfa,0x1bfc,0x1bfe,0x1c01,0x1c04,0x1c06,0x18bd,0x1c08,0x1c0a,0x1c0c,0x1c0e,0x1c10,0x1c12,0x1c14, +0x1c17,0x1c19,0x1c1c,0x1c1e,0x1c21,0x18c1,0x1c23,0x1c25,0x1c28,0x1c2a,0x1c2c,0x1c2f,0x1c32,0x1c34,0x1c36,0x1c38, +0x1c3a,0x1c3a,0x1c3c,0x1c3e,0x18c5,0x1c40,0x1c42,0x1c44,0x1c46,0x1c48,0x1c4b,0x1c4d,0x1686,0x1c50,0x1c53,0x1c55, +0x1c58,0x1c5b,0x1c5e,0x1c60,0x18d1,0x1c62,0x1c65,0x1c68,0x1c6b,0x1c6e,0x1c70,0x1c70,0x18d3,0x1910,0x1c72,0x1c74, +0x1c76,0x1c78,0x1c7b,0x163a,0x18d7,0x1c7d,0x1c7f,0x1842,0x1c82,0x1c85,0x17e6,0x1c88,0x1c8a,0x184a,0x1c8c,0x1c8e, +0x1c90,0x1c93,0x1c93,0x1c96,0x1c98,0x1c9a,0x1c9d,0x1c9f,0x1ca1,0x1ca3,0x1ca6,0x1ca8,0x1caa,0x1cac,0x1cae,0x1cb0, +0x1cb3,0x1cb5,0x1cb7,0x1cb9,0x1cbb,0x1cbd,0x1cbf,0x1cc2,0x1cc5,0x1cc7,0x1cca,0x1ccc,0x1ccf,0x1cd1,0x1856,0x1cd3, +0x1cd6,0x1cd9,0x1cdb,0x1cde,0x1ce0,0x1ce3,0x1ce5,0x1ce7,0x1ce9,0x1ceb,0x1ced,0x1cef,0x1cf2,0x1cf5,0x1cf8,0x1b16, +0x1cfb,0x1cfd,0x1cff,0x1d01,0x1d03,0x1d05,0x1d07,0x1d09,0x1d0b,0x1d0d,0x1d0f,0x1d11,0x16aa,0x1d14,0x1d16,0x1d18, +0x1d1a,0x1d1c,0x1d1e,0x185c,0x1d20,0x1d22,0x1d24,0x1d26,0x1d28,0x1d2b,0x1d2e,0x1d31,0x1d33,0x1d35,0x1d37,0x1d39, +0x1d3c,0x1d3e,0x1d41,0x1d43,0x1d45,0x1d48,0x1d4b,0x1d4d,0x1630,0x1d4f,0x1d51,0x1d53,0x1d55,0x1d57,0x1d59,0x18e5, +0x1d5b,0x1d5d,0x1d5f,0x1d61,0x1d63,0x1d65,0x1d67,0x1d69,0x1d6b,0x1d6d,0x1d70,0x1d72,0x1d74,0x1d76,0x1d78,0x1d7a, +0x1d7d,0x1d80,0x1d82,0x1d84,0x18ef,0x18f1,0x1d86,0x1d88,0x1d8b,0x1d8d,0x1d8f,0x1d91,0x1d93,0x1d96,0x1d99,0x1d9b, +0x1d9d,0x1d9f,0x1da2,0x18f3,0x1da4,0x1da7,0x1daa,0x1dac,0x1dae,0x1db0,0x1db3,0x1db5,0x1db7,0x1db9,0x1dbb,0x1dbd, +0x1dbf,0x1dc1,0x1dc4,0x1dc6,0x1dc8,0x1dca,0x1dcd,0x1dcf,0x1dd1,0x1dd3,0x1dd5,0x1dd8,0x1ddb,0x1ddd,0x1ddf,0x1de1, +0x1de4,0x1de6,0x18ff,0x18ff,0x1de9,0x1deb,0x1dee,0x1df0,0x1df2,0x1df4,0x1df6,0x1df8,0x1dfa,0x1dfc,0x1901,0x1dff, +0x1e01,0x1e03,0x1e05,0x1e07,0x1e09,0x1e0c,0x1e0e,0x1e11,0x1e14,0x1e17,0x1e19,0x1e1b,0x1e1d,0x1e1f,0x1e21,0x1e23, +0x1e25,0x1e27,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,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, +0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0,0,0,0,0,0, +0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, +0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x56e,0x56e,0x56e,0x56e, 0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e, +0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1e29,0,0x1e29,0,0x1e29,0x1e29,0,0x1e29, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1e29,0,0x1e29,0, -0x1e29,0x1e29,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x1e29,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x1e29,0,0,0,0,0x1e29,0,0,0, 0,0,0x1e29,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x1e29,0,0,0,0,0x1e29,0,0,0,0x1e29,0,0x1e29,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1e27,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e27,0, +0,0,0,0 }; static const uint16_t norm2_nfc_data_extraData[7722]={ @@ -1094,7 +1112,7 @@ static const uint16_t norm2_nfc_data_extraData[7722]={ }; static const uint8_t norm2_nfc_data_smallFCD[256]={ -0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0x87,0x66,0x66,0x46,0x64,0x44,0x66,0x5b, +0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x44,0x66,0x5b, 0x12,0,0,4,0,0,0,0x43,0x20,2,0x29,0xae,0xc2,0xc0,0xff,0xff, 0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0, 0xfe,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1114,16 +1132,16 @@ static const uint8_t norm2_nfc_data_smallFCD[256]={ static const UTrie2 norm2_nfc_data_trie={ norm2_nfc_data_trieIndex, - norm2_nfc_data_trieIndex+2612, + norm2_nfc_data_trieIndex+2720, NULL, - 2612, - 6788, + 2720, + 6932, 0x188, - 0xab0, + 0xb1c, 0x0, 0x0, 0x30000, - 0x24b4, + 0x25b0, NULL, 0, FALSE, FALSE, 0, NULL }; diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index 64c84a217c348a..943e83d56704c6 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index af80e98edb89d2..34f1cf063d50bc 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index 84b67b9df02771..906c03a689bc16 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/normalizer2impl.h b/deps/icu-small/source/common/normalizer2impl.h index eb026dbecda12a..a6bf967979f48a 100644 --- a/deps/icu-small/source/common/normalizer2impl.h +++ b/deps/icu-small/source/common/normalizer2impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/normlzr.cpp b/deps/icu-small/source/common/normlzr.cpp index 7c4c54ce368e5e..3cf7446f174a4f 100644 --- a/deps/icu-small/source/common/normlzr.cpp +++ b/deps/icu-small/source/common/normlzr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************* * COPYRIGHT: diff --git a/deps/icu-small/source/common/parsepos.cpp b/deps/icu-small/source/common/parsepos.cpp index 26f882051292b8..af6ac6c1f7d1b7 100644 --- a/deps/icu-small/source/common/parsepos.cpp +++ b/deps/icu-small/source/common/parsepos.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2003-2003, International Business Machines diff --git a/deps/icu-small/source/common/patternprops.cpp b/deps/icu-small/source/common/patternprops.cpp index b2c524998667e3..30c3f683914816 100644 --- a/deps/icu-small/source/common/patternprops.cpp +++ b/deps/icu-small/source/common/patternprops.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/patternprops.h b/deps/icu-small/source/common/patternprops.h index 0ceab510a1c071..f309c2dbadb083 100644 --- a/deps/icu-small/source/common/patternprops.h +++ b/deps/icu-small/source/common/patternprops.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/pluralmap.cpp b/deps/icu-small/source/common/pluralmap.cpp index 61c36e4a7f4a3a..d3e892124ea24c 100644 --- a/deps/icu-small/source/common/pluralmap.cpp +++ b/deps/icu-small/source/common/pluralmap.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines Corporation and * others. All Rights Reserved. diff --git a/deps/icu-small/source/common/pluralmap.h b/deps/icu-small/source/common/pluralmap.h index 63ccf8d31d14f9..76e95c5826003a 100644 --- a/deps/icu-small/source/common/pluralmap.h +++ b/deps/icu-small/source/common/pluralmap.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/propname.cpp b/deps/icu-small/source/common/propname.cpp index b638547ff6f801..4107869ee1e0d4 100644 --- a/deps/icu-small/source/common/propname.cpp +++ b/deps/icu-small/source/common/propname.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2014, International Business Machines diff --git a/deps/icu-small/source/common/propname.h b/deps/icu-small/source/common/propname.h index c20ae45490d9b5..c93d3d75032503 100644 --- a/deps/icu-small/source/common/propname.h +++ b/deps/icu-small/source/common/propname.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2011, International Business Machines diff --git a/deps/icu-small/source/common/propname_data.h b/deps/icu-small/source/common/propname_data.h index 3acc640b19a9a6..4863b26dc7ec12 100644 --- a/deps/icu-small/source/common/propname_data.h +++ b/deps/icu-small/source/common/propname_data.h @@ -1,104 +1,108 @@ -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: propname_data.h - * - * machine-generated by: icu/tools/unicode/c/genprops/pnamesbuilder.cpp - */ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: propname_data.h +// +// machine-generated by: icu/tools/unicode/c/genprops/pnamesbuilder.cpp + #ifdef INCLUDED_FROM_PROPNAME_CPP U_NAMESPACE_BEGIN -const int32_t PropNameData::indexes[8]={0x20,0x12d0,0x446f,0x8a58,0x8a58,0x8a58,0x2f,0}; +const int32_t PropNameData::indexes[8]={0x20,0x135c,0x468d,0x8e95,0x8e95,0x8e95,0x2f,0}; -const int32_t PropNameData::valueMaps[1196]={ +const int32_t PropNameData::valueMaps[1231]={ 6,0,0x3d,0,0xd5,0x356,0xd5,0x36c,0xd5,0x381,0xd5,0x397,0xd5,0x3a2,0xd5,0x3c3, 0xd5,0x3d3,0xd5,0x3e2,0xd5,0x3f0,0xd5,0x414,0xd5,0x42b,0xd5,0x443,0xd5,0x45a,0xd5,0x469, 0xd5,0x478,0xd5,0x489,0xd5,0x497,0xd5,0x4a9,0xd5,0x4c3,0xd5,0x4de,0xd5,0x4f3,0xd5,0x510, 0xd5,0x521,0xd5,0x52c,0xd5,0x54b,0xd5,0x561,0xd5,0x572,0xd5,0x582,0xd5,0x59d,0xd5,0x5b6, -0xd5,0x5c7,0xd5,0x5e1,0xd5,0x5f4,0xd5,0x604,0xd5,0x61e,0xd5,0x62b,0xd5,0x642,0xd5,0x656, -0xd5,0x66c,0xd5,0x680,0xd5,0x696,0xd5,0x6b0,0xd5,0x6c8,0xd5,0x6e4,0xd5,0x6ec,0xd5,0x6f4, -0xd5,0x6fc,0xd5,0x704,0xd5,0x70d,0xd5,0x71a,0xd5,0x72d,0xd5,0x74a,0xd5,0x767,0xd5,0x784, -0xd5,0x7a2,0xd5,0x7c0,0xd5,0x7e4,0xd5,0x7f1,0xd5,0x818,0xd5,0x837,0xd5,0x1000,0x1016,0x860, -0x14f,0xa80,0x16a,0x292f,0xdb,0x294e,0x275,0x2a8c,0x28b,0x2ae6,0x295,0x2d43,0x2b7,0x3458,0x311,0x34c8, -0x31b,0x3756,0x347,0x3794,0x34f,0x40ea,0x3fa,0x4168,0x404,0x418d,0x40a,0x41a7,0x410,0x41c8,0x417,0x41e2, -0xdb,0x4207,0xdb,0x422d,0x41e,0x42b3,0x42f,0x432c,0x442,0x43c9,0x457,0x2000,0x2001,0x4400,0x45e,0x3000, -0x3001,0x448c,0,0x4000,0x400e,0x449e,0,0x44a7,0,0x44c1,0,0x44d2,0,0x44e3,0,0x44f9, -0,0x4502,0,0x451f,0,0x453d,0,0x455b,0,0x4579,0,0x458f,0,0x45a3,0,0x45b9, -0,0x7000,0x7001,0x45d2,0,0x6f5,0x12,0,1,0x12,0x20,0x713,0x49,0,1,7, +0xd5,0x5c7,0xd5,0x5e1,0xd5,0x5f4,0xd5,0x604,0xd5,0x61e,0xd5,0x637,0xd5,0x64e,0xd5,0x662, +0xd5,0x678,0xd5,0x68c,0xd5,0x6a2,0xd5,0x6bc,0xd5,0x6d4,0xd5,0x6f0,0xd5,0x6f8,0xd5,0x700, +0xd5,0x708,0xd5,0x710,0xd5,0x719,0xd5,0x726,0xd5,0x739,0xd5,0x756,0xd5,0x773,0xd5,0x790, +0xd5,0x7ae,0xd5,0x7cc,0xd5,0x7f0,0xd5,0x7fd,0xd5,0x824,0xd5,0x843,0xd5,0x1000,0x1016,0x86c, +0x14f,0xa8c,0x16a,0x2a61,0xdb,0x2a80,0x280,0x2bbe,0x296,0x2c18,0x2a0,0x2e75,0x2c2,0x35d7,0x31f,0x3647, +0x329,0x38f8,0x358,0x3936,0x360,0x42e5,0x413,0x4363,0x41d,0x4388,0x423,0x43a2,0x429,0x43c3,0x430,0x43dd, +0xdb,0x4402,0xdb,0x4428,0x437,0x44d2,0x44d,0x454b,0x460,0x45e8,0x47a,0x2000,0x2001,0x461f,0x481,0x3000, +0x3001,0x46ab,0,0x4000,0x400e,0x46bd,0,0x46c6,0,0x46e0,0,0x46f1,0,0x4702,0,0x4718, +0,0x4721,0,0x473e,0,0x475c,0,0x477a,0,0x4798,0,0x47ae,0,0x47c2,0,0x47d8, +0,0x7000,0x7001,0x47f1,0,0x702,0x12,0,1,0x12,0x20,0x720,0x49,0,1,7, 8,9,0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x54,0x5b,0x67, 0x6b,0x76,0x7a,0x81,0x82,0x84,0x85,0xc8,0xca,0xd6,0xd8,0xda,0xdc,0xde,0xe0,0xe2, 0xe4,0xe6,0xe8,0xe9,0xea,0xf0,0x2e,0x40,0x4c,0x56,0x67,0x72,0x7f,0x8c,0x99,0xa6, 0xb3,0xc0,0xcd,0xda,0xe7,0xf4,0x101,0x10e,0x11b,0x128,0x135,0x142,0x14f,0x15c,0x169,0x176, 0x183,0x190,0x19d,0x1aa,0x1b7,0x1c4,0x1d1,0x1de,0x1eb,0x1fa,0x209,0x218,0x227,0x236,0x245,0x254, -0x263,0x27d,0x291,0x2a5,0x2c0,0x2cf,0x2d8,0x2e8,0x2f0,0x2f9,0x308,0x311,0x321,0x332,0x343,0x8a5, -1,0,0x17,0x86f,0x880,0x891,0x8a5,0x8bc,0x8d4,0x8e6,0x8fb,0x912,0x927,0x937,0x949,0x966, -0x982,0x994,0x9b1,0x9cd,0x9e9,0x9fe,0xa13,0xa2d,0xa48,0xa63,0xa47,1,0,0x107,0xa8b,0xa98, -0xaab,0xad3,0xaf1,0xb0f,0xb27,0xb52,0xb7c,0xb94,0xba7,0xbba,0xbc9,0xbd8,0xbe7,0xbf6,0xc0d,0xc1e, -0xc31,0xc44,0xc51,0xc5e,0xc6d,0xc7e,0xc93,0xca4,0xcaf,0xcb8,0xcc9,0xcda,0xced,0xcff,0xd12,0xd25, -0xd64,0xd71,0xd7e,0xd8b,0xda0,0xdd0,0xdea,0xe0b,0xe36,0xe59,0xeb7,0xede,0xef9,0xf08,0xf2f,0xf57, -0xf7a,0xf9d,0xfc7,0xfe0,0xfff,0x1022,0x1046,0x1059,0x1073,0x109d,0x10b5,0x10dd,0x1106,0x1119,0x112c,0x113f, -0x1166,0x1175,0x1195,0x11c3,0x11e1,0x120f,0x122b,0x1246,0x125f,0x1278,0x1299,0x12c9,0x12e8,0x130a,0x133e,0x136b, -0x13b0,0x13d1,0x13fb,0x141c,0x1445,0x1458,0x148b,0x14a2,0x14b1,0x14c2,0x14ed,0x1504,0x1535,0x1563,0x15a6,0x15b1, -0x15ea,0x15fb,0x160c,0x1619,0x162c,0x1666,0x168a,0x16ae,0x16e8,0x1720,0x174b,0x1763,0x178f,0x17bb,0x17c8,0x17d7, -0x17f4,0x1816,0x1844,0x1864,0x188b,0x18b2,0x18d1,0x18e4,0x18f5,0x1906,0x192b,0x1950,0x1977,0x19ab,0x19d8,0x19f6, -0x1a09,0x1a22,0x1a5b,0x1a6a,0x1a8a,0x1aac,0x1ace,0x1ae5,0x1afc,0x1b29,0x1b42,0x1b5b,0x1b8c,0x1bb6,0x1bd1,0x1be4, -0x1c03,0x1c0c,0x1c1f,0x1c3d,0x1c5b,0x1c6e,0x1c85,0x1c9a,0x1ccf,0x1cf3,0x1d08,0x1d17,0x1d2a,0x1d4e,0x1d57,0x1d7b, -0x1d92,0x1da5,0x1db4,0x1dbf,0x1de0,0x1df8,0x1e07,0x1e16,0x1e25,0x1e3c,0x1e51,0x1e66,0x1e9f,0x1eb2,0x1ece,0x1ed9, -0x1ee6,0x1f14,0x1f38,0x1f5b,0x1f6e,0x1f90,0x1fa3,0x1fbe,0x1fe1,0x2004,0x2029,0x203a,0x2069,0x2096,0x20ad,0x20c8, -0x20d7,0x2102,0x213a,0x2174,0x21a2,0x21b3,0x21c0,0x21e4,0x21f3,0x220f,0x2229,0x2246,0x227e,0x2293,0x22c0,0x22df, -0x230d,0x232d,0x2361,0x2370,0x239a,0x23bd,0x23e8,0x23f3,0x2404,0x241f,0x2443,0x2450,0x2465,0x248c,0x24b7,0x24ee, -0x2501,0x2512,0x2542,0x2553,0x2562,0x2577,0x2595,0x25a8,0x25bb,0x25d2,0x25ef,0x25fa,0x2603,0x2625,0x263a,0x265f, -0x2676,0x269f,0x26ba,0x26cf,0x26e8,0x2709,0x273e,0x274f,0x2780,0x27a4,0x27b5,0x27ce,0x27d9,0x2806,0x2828,0x2856, -0x2889,0x2898,0x28a9,0x28c6,0x2908,0x1afc,1,0,0x12,0x2965,0x2975,0x2988,0x2998,0x29a8,0x29b7,0x29c7, -0x29d9,0x29ec,0x29fe,0x2a0e,0x2a1e,0x2a2d,0x2a3c,0x2a4c,0x2a59,0x2a68,0x2a7c,0x1bba,1,0,6,0x2aa1, -0x2aac,0x2ab9,0x2ac6,0x2ad3,0x2ade,0x1bfe,1,0,0x1e,0x2afb,0x2b0a,0x2b1f,0x2b34,0x2b49,0x2b5d,0x2b6e, -0x2b82,0x2b95,0x2ba6,0x2bbf,0x2bd1,0x2be2,0x2bf6,0x2c09,0x2c21,0x2c33,0x2c3e,0x2c4e,0x2c5c,0x2c71,0x2c86,0x2c9c, -0x2cb6,0x2ccc,0x2cdc,0x2cf0,0x2d04,0x2d15,0x2d2d,0x1e29,1,0,0x56,0x2d55,0x2d78,0x2d81,0x2d8e,0x2d99, -0x2da2,0x2dad,0x2db6,0x2dcf,0x2dd4,0x2ddd,0x2dfa,0x2e03,0x2e10,0x2e19,0x2e3d,0x2e44,0x2e4d,0x2e60,0x2e6b,0x2e74, -0x2e7f,0x2e98,0x2ea1,0x2eb0,0x2ebb,0x2ec4,0x2ecf,0x2ed8,0x2edf,0x2ee8,0x2ef3,0x2efc,0x2f15,0x2f1e,0x2f2b,0x2f36, -0x2f47,0x2f52,0x2f67,0x2f7e,0x2f87,0x2f90,0x2fa9,0x2fb4,0x2fbd,0x2fc6,0x2fdd,0x2ffa,0x3005,0x3016,0x3021,0x3028, -0x3035,0x3042,0x306f,0x3084,0x308d,0x30a8,0x30cb,0x30ec,0x310d,0x3132,0x3159,0x317a,0x319d,0x31be,0x31e5,0x3206, -0x322b,0x324a,0x3269,0x3288,0x32a5,0x32c6,0x32e7,0x330a,0x332f,0x334e,0x336d,0x338e,0x33b5,0x33da,0x33f9,0x341a, -0x343d,0x20dd,1,0,6,0x3469,0x3478,0x3488,0x3498,0x34a8,0x34b9,0x213b,1,0,0x28,0x34d7, -0x34e3,0x34f1,0x3500,0x350f,0x351f,0x3530,0x3544,0x3559,0x356f,0x3582,0x3596,0x35a6,0x35af,0x35ba,0x35ca,0x35e6, -0x35f8,0x3606,0x3615,0x3621,0x3636,0x364a,0x365d,0x366b,0x367f,0x368d,0x3697,0x36a9,0x36b5,0x36c3,0x36d3,0x36da, -0x36e1,0x36e8,0x36ef,0x36f6,0x370c,0x372d,0x373f,0x237d,1,0,4,0x3767,0x3772,0x377e,0x3788,0x23a3, -1,0,0xa7,0x379f,0x37ac,0x37c1,0x37ce,0x37dd,0x37eb,0x37fa,0x3809,0x381b,0x382a,0x3838,0x3849,0x3858, -0x3867,0x3874,0x3880,0x388f,0x389e,0x38a8,0x38b5,0x38c2,0x38d1,0x38df,0x38ee,0x38fa,0x3904,0x3910,0x3920,0x3930, -0x393e,0x394a,0x395b,0x3967,0x3973,0x3981,0x398e,0x399a,0x39a7,0xca4,0x39b4,0x39c2,0x39dc,0x39e5,0x39f3,0x3a01, -0x3a0d,0x3a1c,0x3a2a,0x3a38,0x3a44,0x3a53,0x3a61,0x3a6f,0x3a7c,0x3a8b,0x3aa6,0x3ab5,0x3ac6,0x3ad7,0x3aea,0x3afc, -0x3b0b,0x3b1d,0x3b2c,0x3b38,0x3b43,0x1db4,0x3b50,0x3b5b,0x3b66,0x3b71,0x3b7c,0x3b97,0x3ba2,0x3bad,0x3bb8,0x3bcb, -0x3bdf,0x3bea,0x3bf9,0x3c08,0x3c13,0x3c1e,0x3c2b,0x3c3a,0x3c48,0x3c53,0x3c6e,0x3c78,0x3c89,0x3c9a,0x3ca9,0x3cba, -0x3cc5,0x3cd0,0x3cdb,0x3ce6,0x3cf1,0x3cfc,0x3d07,0x3d11,0x3d1c,0x3d2c,0x3d37,0x3d45,0x3d52,0x3d5d,0x3d6c,0x3d79, -0x3d86,0x3d95,0x3da2,0x3db3,0x3dc5,0x3dd5,0x3de0,0x3df3,0x3e0a,0x3e18,0x3e25,0x3e30,0x3e3d,0x3e4e,0x3e6a,0x3e80, -0x3e8b,0x3ea8,0x3eb8,0x3ec7,0x3ed2,0x3edd,0x1ece,0x3ee9,0x3ef4,0x3f0c,0x3f1c,0x3f2b,0x3f39,0x3f47,0x3f52,0x3f5d, -0x3f71,0x3f88,0x3fa0,0x3fb0,0x3fc0,0x3fd0,0x3fe2,0x3fed,0x3ff8,0x4002,0x400d,0x401b,0x402e,0x403a,0x4045,0x4050, -0x406c,0x4079,0x4087,0x40a0,0x27ce,0x40af,0x25ef,0x40bc,0x40ca,0x40dc,0x2c00,1,0,6,0x4104,0x4117, -0x4127,0x4135,0x4146,0x4156,0x2c5c,0x12,0,1,0x4180,0x4186,0x2c69,0x12,0,1,0x4180,0x4186, -0x2c76,1,0,3,0x4180,0x4186,0x41bf,0x2c8c,1,0,3,0x4180,0x4186,0x41bf,0x2ca2,1, -0,0xd,0x4249,0x4253,0x425f,0x4266,0x4271,0x4276,0x427d,0x4284,0x428d,0x4292,0x4297,0x42a7,0x373f,0x2d10, -1,0,0xf,0x4249,0x42c6,0x42d0,0x42da,0x42e5,0x3615,0x42ef,0x42fb,0x4303,0x430a,0x4314,0x425f,0x4266, -0x4276,0x431e,0x2d97,1,0,0x11,0x4249,0x433b,0x42da,0x4347,0x4354,0x4362,0x3615,0x436d,0x425f,0x437e, -0x4276,0x438d,0x439b,0x373f,0x372d,0x43a7,0x43b8,0x2e6f,1,0,3,0x43e7,0x43ef,0x43f7,0x2e88,0x36, -1,2,4,8,0xe,0x10,0x20,0x3e,0x40,0x80,0x100,0x1c0,0x200,0x400,0x800,0xe00, -0x1000,0x2000,0x4000,0x7000,0x8000,0x10000,0x20000,0x40000,0x78001,0x80000,0x100000,0x200000,0x400000,0x800000,0x1000000,0x2000000, -0x4000000,0x8000000,0xf000000,0x10000000,0x20000000,0x30f80000,0x2afb,0x2b0a,0x2b1f,0x2b34,0x442e,0x2b49,0x2b5d,0x4424,0x2b6e,0x2b82, -0x2b95,0x443f,0x2ba6,0x2bbf,0x2bd1,0x4456,0x2be2,0x2bf6,0x2c09,0x447f,0x2c21,0x2c33,0x2c3e,0x2c4e,0x441b,0x2c5c, -0x2c71,0x2c86,0x2c9c,0x2cb6,0x2ccc,0x2cdc,0x2cf0,0x2d04,0x4475,0x2d15,0x2d2d,0x4460 +0x263,0x27d,0x291,0x2a5,0x2c0,0x2cf,0x2d8,0x2e8,0x2f0,0x2f9,0x308,0x311,0x321,0x332,0x343,0x8b2, +1,0,0x17,0x87b,0x88c,0x89d,0x8b1,0x8c8,0x8e0,0x8f2,0x907,0x91e,0x933,0x943,0x955,0x972, +0x98e,0x9a0,0x9bd,0x9d9,0x9f5,0xa0a,0xa1f,0xa39,0xa54,0xa6f,0xa54,1,0,0x112,0xa97,0xaa4, +0xab7,0xadf,0xafd,0xb1b,0xb33,0xb5e,0xb88,0xba0,0xbb3,0xbc6,0xbd5,0xbe4,0xbf3,0xc02,0xc19,0xc2a, +0xc3d,0xc50,0xc5d,0xc6a,0xc79,0xc8a,0xc9f,0xcb0,0xcbb,0xcc4,0xcd5,0xce6,0xcf9,0xd0b,0xd1e,0xd31, +0xd70,0xd7d,0xd8a,0xd97,0xdac,0xddc,0xdf6,0xe17,0xe42,0xe65,0xec3,0xeea,0xf05,0xf14,0xf3b,0xf63, +0xf86,0xfa9,0xfd3,0xfec,0x100b,0x102e,0x1052,0x1065,0x107f,0x10a9,0x10c1,0x10e9,0x1112,0x1125,0x1138,0x114b, +0x1172,0x1181,0x11a1,0x11cf,0x11ed,0x121b,0x1237,0x1252,0x126b,0x1284,0x12a5,0x12d5,0x12f4,0x1316,0x134a,0x1377, +0x13bc,0x13dd,0x1407,0x1428,0x1451,0x1464,0x1497,0x14ae,0x14bd,0x14ce,0x14f9,0x1510,0x1541,0x156f,0x15b2,0x15bd, +0x15f6,0x1607,0x1618,0x1625,0x1638,0x1672,0x1696,0x16ba,0x16f4,0x172c,0x1757,0x176f,0x179b,0x17c7,0x17d4,0x17e3, +0x1800,0x1822,0x1850,0x1870,0x1897,0x18be,0x18dd,0x18f0,0x1901,0x1912,0x1937,0x195c,0x1983,0x19b7,0x19e4,0x1a02, +0x1a15,0x1a2e,0x1a67,0x1a76,0x1a96,0x1ab8,0x1ada,0x1af1,0x1b08,0x1b35,0x1b4e,0x1b67,0x1b98,0x1bc2,0x1bdd,0x1bf0, +0x1c0f,0x1c18,0x1c2b,0x1c49,0x1c67,0x1c7a,0x1c91,0x1ca6,0x1cdb,0x1cff,0x1d14,0x1d23,0x1d36,0x1d5a,0x1d63,0x1d87, +0x1d9e,0x1db1,0x1dc0,0x1dcb,0x1dec,0x1e04,0x1e13,0x1e22,0x1e31,0x1e48,0x1e5d,0x1e72,0x1eab,0x1ebe,0x1eda,0x1ee5, +0x1ef2,0x1f20,0x1f44,0x1f67,0x1f7a,0x1f9c,0x1faf,0x1fca,0x1fed,0x2010,0x2035,0x2046,0x2075,0x20a2,0x20b9,0x20d4, +0x20e3,0x210e,0x2146,0x2180,0x21ae,0x21bf,0x21cc,0x21f0,0x21ff,0x221b,0x2235,0x2252,0x228a,0x229f,0x22cc,0x22eb, +0x2319,0x2339,0x236d,0x237c,0x23a6,0x23c9,0x23f4,0x23ff,0x2410,0x242b,0x244f,0x245c,0x2471,0x2498,0x24c3,0x24fa, +0x250d,0x251e,0x254e,0x255f,0x256e,0x2583,0x25a1,0x25b4,0x25c7,0x25de,0x25fb,0x2606,0x260f,0x2631,0x2646,0x266b, +0x2682,0x26ab,0x26c6,0x26db,0x26f4,0x2715,0x274a,0x275b,0x278c,0x27b0,0x27c1,0x27da,0x27e5,0x2812,0x2834,0x2862, +0x2895,0x28a4,0x28b5,0x28d2,0x2914,0x293b,0x2948,0x295d,0x2981,0x29a7,0x29e0,0x29f1,0x2a15,0x2a20,0x2a2d,0x2a3c, +0x1b91,1,0,0x12,0x2a97,0x2aa7,0x2aba,0x2aca,0x2ada,0x2ae9,0x2af9,0x2b0b,0x2b1e,0x2b30,0x2b40,0x2b50, +0x2b5f,0x2b6e,0x2b7e,0x2b8b,0x2b9a,0x2bae,0x1c4f,1,0,6,0x2bd3,0x2bde,0x2beb,0x2bf8,0x2c05,0x2c10, +0x1c93,1,0,0x1e,0x2c2d,0x2c3c,0x2c51,0x2c66,0x2c7b,0x2c8f,0x2ca0,0x2cb4,0x2cc7,0x2cd8,0x2cf1,0x2d03, +0x2d14,0x2d28,0x2d3b,0x2d53,0x2d65,0x2d70,0x2d80,0x2d8e,0x2da3,0x2db8,0x2dce,0x2de8,0x2dfe,0x2e0e,0x2e22,0x2e36, +0x2e47,0x2e5f,0x1ebe,1,0,0x59,0x2e87,0x2eaa,0x2eb3,0x2ec0,0x2ecb,0x2ed4,0x2edf,0x2ee8,0x2f01,0x2f06, +0x2f0f,0x2f2c,0x2f35,0x2f42,0x2f4b,0x2f6f,0x2f76,0x2f7f,0x2f92,0x2f9d,0x2fa6,0x2fb1,0x2fca,0x2fd3,0x2fe2,0x2fed, +0x2ff6,0x3001,0x300a,0x3011,0x301a,0x3025,0x302e,0x3047,0x3050,0x305d,0x3068,0x3079,0x3084,0x3099,0x30b0,0x30b9, +0x30c2,0x30db,0x30e6,0x30ef,0x30f8,0x310f,0x312c,0x3137,0x3148,0x3153,0x315a,0x3167,0x3174,0x31a1,0x31b6,0x31bf, +0x31da,0x31fd,0x321e,0x323f,0x3264,0x328b,0x32ac,0x32cf,0x32f0,0x3317,0x3338,0x335d,0x337c,0x339b,0x33ba,0x33d7, +0x33f8,0x3419,0x343c,0x3461,0x3480,0x349f,0x34c0,0x34e7,0x350c,0x352b,0x354c,0x356f,0x358a,0x35a3,0x35be,0x2191, +1,0,6,0x35e8,0x35f7,0x3607,0x3617,0x3627,0x3638,0x21ef,1,0,0x2b,0x3656,0x3662,0x3670, +0x367f,0x368e,0x369e,0x36af,0x36c3,0x36d8,0x36ee,0x3701,0x3715,0x3725,0x372e,0x3739,0x3749,0x3765,0x3777,0x3785, +0x3794,0x37a0,0x37b5,0x37c9,0x37dc,0x37ea,0x37fe,0x380c,0x3816,0x3828,0x3834,0x3842,0x3852,0x3859,0x3860,0x3867, +0x386e,0x3875,0x388b,0x38ac,0x38be,0x38d5,0x38e0,0x38ef,0x2448,1,0,4,0x3909,0x3914,0x3920,0x392a, +0x246e,1,0,0xaf,0x3941,0x394e,0x3963,0x3970,0x397f,0x398d,0x399c,0x39ab,0x39bd,0x39cc,0x39da,0x39eb, +0x39fa,0x3a09,0x3a16,0x3a22,0x3a31,0x3a40,0x3a4a,0x3a57,0x3a64,0x3a73,0x3a81,0x3a90,0x3a9c,0x3aa6,0x3ab2,0x3ac2, +0x3ad2,0x3ae0,0x3aec,0x3afd,0x3b09,0x3b15,0x3b23,0x3b30,0x3b3c,0x3b49,0xcb0,0x3b56,0x3b64,0x3b7e,0x3b87,0x3b95, +0x3ba3,0x3baf,0x3bbe,0x3bcc,0x3bda,0x3be6,0x3bf5,0x3c03,0x3c11,0x3c1e,0x3c2d,0x3c48,0x3c57,0x3c68,0x3c79,0x3c8c, +0x3c9e,0x3cad,0x3cbf,0x3cce,0x3cda,0x3ce5,0x1dc0,0x3cf2,0x3cfd,0x3d08,0x3d13,0x3d1e,0x3d39,0x3d44,0x3d4f,0x3d5a, +0x3d6d,0x3d81,0x3d8c,0x3d9b,0x3daa,0x3db5,0x3dc0,0x3dcd,0x3ddc,0x3dea,0x3df5,0x3e10,0x3e1a,0x3e2b,0x3e3c,0x3e4b, +0x3e5c,0x3e67,0x3e72,0x3e7d,0x3e88,0x3e93,0x3e9e,0x3ea9,0x3eb3,0x3ebe,0x3ece,0x3ed9,0x3ee7,0x3ef4,0x3eff,0x3f0e, +0x3f1b,0x3f28,0x3f37,0x3f44,0x3f55,0x3f67,0x3f77,0x3f82,0x3f95,0x3fac,0x3fba,0x3fc7,0x3fd2,0x3fdf,0x3ff0,0x400c, +0x4022,0x402d,0x404a,0x405a,0x4069,0x4074,0x407f,0x1eda,0x408b,0x4096,0x40ae,0x40be,0x40cd,0x40db,0x40e9,0x40f4, +0x40ff,0x4113,0x412a,0x4142,0x4152,0x4162,0x4172,0x4184,0x418f,0x419a,0x41a4,0x41af,0x41bd,0x41d0,0x41dc,0x41e9, +0x41f4,0x4210,0x421d,0x422b,0x4244,0x27da,0x4253,0x25fb,0x4260,0x426e,0x4280,0x428e,0x429a,0x42aa,0x2a15,0x42b8, +0x42c4,0x42cf,0x42da,0x2d1f,1,0,6,0x42ff,0x4312,0x4322,0x4330,0x4341,0x4351,0x2d7b,0x12,0, +1,0x437b,0x4381,0x2d88,0x12,0,1,0x437b,0x4381,0x2d95,1,0,3,0x437b,0x4381,0x43ba, +0x2dab,1,0,3,0x437b,0x4381,0x43ba,0x2dc1,1,0,0x12,0x4444,0x444e,0x445a,0x4461,0x446c, +0x4471,0x4478,0x447f,0x4488,0x448d,0x4492,0x44a2,0x38be,0x38d5,0x44ae,0x38e0,0x44be,0x38ef,0x2e6a,1,0, +0xf,0x4444,0x44e5,0x44ef,0x44f9,0x4504,0x3794,0x450e,0x451a,0x4522,0x4529,0x4533,0x445a,0x4461,0x4471,0x453d, +0x2ef1,1,0,0x16,0x4444,0x455a,0x44f9,0x4566,0x4573,0x4581,0x3794,0x458c,0x445a,0x459d,0x4471,0x45ac, +0x45ba,0x38be,0x38ac,0x45c6,0x45d7,0x38d5,0x44ae,0x38e0,0x44be,0x38ef,0x3001,1,0,3,0x4606,0x460e, +0x4616,0x301a,0x36,1,2,4,8,0xe,0x10,0x20,0x3e,0x40,0x80,0x100,0x1c0,0x200, +0x400,0x800,0xe00,0x1000,0x2000,0x4000,0x7000,0x8000,0x10000,0x20000,0x40000,0x78001,0x80000,0x100000,0x200000,0x400000, +0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0xf000000,0x10000000,0x20000000,0x30f80000,0x2c2d,0x2c3c,0x2c51,0x2c66,0x464d,0x2c7b,0x2c8f, +0x4643,0x2ca0,0x2cb4,0x2cc7,0x465e,0x2cd8,0x2cf1,0x2d03,0x4675,0x2d14,0x2d28,0x2d3b,0x469e,0x2d53,0x2d65,0x2d70, +0x2d80,0x463a,0x2d8e,0x2da3,0x2db8,0x2dce,0x2de8,0x2dfe,0x2e0e,0x2e22,0x2e36,0x4694,0x2e47,0x2e5f,0x467f }; -const uint8_t PropNameData::bytesTries[12703]={ -0,0x15,0x6d,0xc3,0x16,0x73,0xc1,0xea,0x76,0x5f,0x76,0x68,0x77,0x90,0x78,1, +const uint8_t PropNameData::bytesTries[13105]={ +0,0x15,0x6d,0xc3,0x23,0x73,0xc1,0xf7,0x76,0x5f,0x76,0x68,0x77,0x90,0x78,1, 0x64,0x50,0x69,0x10,0x64,1,0x63,0x30,0x73,0x62,0x13,0x74,0x61,0x72,0x74,0x63, 0x60,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x61,0x13,0x69,0x67,0x69,0x74,0x81, 1,0x61,0x24,0x73,0x69,0x1e,0x72,0x69,0x61,0x74,0x69,0x6f,0x6e,0x73,0x65,0x6c, 0x65,0x63,0x74,0x6f,0x72,0x69,3,0x62,0xc3,0x14,0x68,0x32,0x6f,0x42,0x73,0x13, 0x70,0x61,0x63,0x65,0x5f,0x17,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x5f,0x16, -0x72,0x64,0x62,0x72,0x65,0x61,0x6b,0xc3,0x14,0x73,0xa2,0x49,0x74,0xa4,0x2e,0x75, +0x72,0x64,0x62,0x72,0x65,0x61,0x6b,0xc3,0x14,0x73,0xa2,0x49,0x74,0xa4,0x3b,0x75, 3,0x63,0xd9,0x40,0xc,0x69,0x52,0x6e,0x58,0x70,0x12,0x70,0x65,0x72,0x5c,0x13, 0x63,0x61,0x73,0x65,0x5c,0x16,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,0xc, 0x12,0x64,0x65,0x6f,0x5b,0x10,0x69,1,0x63,0x3e,0x66,0x1b,0x69,0x65,0x64,0x69, @@ -114,781 +118,807 @@ const uint8_t PropNameData::bytesTries[12703]={ 0x70,0x69,0x6e,0x67,0xd9,0x40,8,0x10,0x63,0xd9,0x40,7,0x62,0xc3,0x13,0x63, 0x34,0x64,0x57,0x65,0x6e,0x66,0x10,0x63,0xd9,0x40,6,0xc2,0xa,2,0x66,0xd9, 0x40,6,0x72,0x28,0x78,0xd9,0x70,0,0x12,0x69,0x70,0x74,0xc2,0xa,0x19,0x65, -0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xd9,0x70,0,1,0x67,0x50,0x6e, -1,0x73,0x3a,0x74,0x18,0x65,0x6e,0x63,0x65,0x62,0x72,0x65,0x61,0x6b,0xc3,0x13, -0x14,0x69,0x74,0x69,0x76,0x65,0x65,1,0x6d,0x2e,0x73,0x13,0x74,0x61,0x72,0x74, -0x73,0x19,0x65,0x6e,0x74,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x73,3,0x63,0x66, -0x65,0x72,0x69,0x98,0x72,0x19,0x61,0x69,0x6c,0x63,0x61,0x6e,0x6f,0x6e,0x69,0x63, -0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x63,0x6c,0x61,0x73, -0x73,0xc3,0x11,0xd8,0x40,0xa,0x11,0x63,0x63,0xc3,0x11,0x11,0x72,0x6d,0x58,0x1e, -0x69,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59, -0x1d,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9, -0x40,0xa,0x6d,0x42,0x6e,0x48,0x70,0xa2,0xda,0x71,0xa4,9,0x72,0x15,0x61,0x64, -0x69,0x63,0x61,0x6c,0x55,0x12,0x61,0x74,0x68,0x4f,6,0x6f,0x39,0x6f,0x32,0x74, -0xc3,9,0x75,0x54,0x76,0xd9,0x30,0,0x12,0x6e,0x63,0x68,0x1f,0x61,0x72,0x61, -0x63,0x74,0x65,0x72,0x63,0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e,0x74,0x51,0x14,0x6d, -0x65,0x72,0x69,0x63,1,0x74,0x32,0x76,0x13,0x61,0x6c,0x75,0x65,0xd9,0x30,0, -0x12,0x79,0x70,0x65,0xc3,9,0x61,0xa2,0x77,0x63,0xa2,0x82,0x66,2,0x63,0x98, -0x64,0xa2,0x53,0x6b,1,0x63,0x56,0x64,1,0x69,0x42,0x71,1,0x63,0xc3,0xd, -0x75,0x17,0x69,0x63,0x6b,0x63,0x68,0x65,0x63,0x6b,0xc3,0xd,0x13,0x6e,0x65,0x72, -0x74,0x6d,1,0x69,0x42,0x71,1,0x63,0xc3,0xf,0x75,0x17,0x69,0x63,0x6b,0x63, -0x68,0x65,0x63,0x6b,0xc3,0xf,0x13,0x6e,0x65,0x72,0x74,0x71,1,0x69,0x42,0x71, -1,0x63,0xc3,0xe,0x75,0x17,0x69,0x63,0x6b,0x63,0x68,0x65,0x63,0x6b,0xc3,0xe, -0x13,0x6e,0x65,0x72,0x74,0x6f,1,0x69,0x42,0x71,1,0x63,0xc3,0xc,0x75,0x17, -0x69,0x63,0x6b,0x63,0x68,0x65,0x63,0x6b,0xc3,0xc,0x13,0x6e,0x65,0x72,0x74,0x6b, -0xd8,0x40,5,1,0x31,0xd9,0x40,0xb,0x6d,0x10,0x65,0xd9,0x40,5,0x12,0x68, -0x61,0x72,0x51,1,0x61,0x2c,0x72,0x12,0x69,0x6e,0x74,0x7f,0x10,0x74,2,0x73, -0x2c,0x74,0x30,0x77,0x10,0x73,0x77,0x11,0x79,0x6e,0x75,0x12,0x65,0x72,0x6e,1, -0x73,0x38,0x77,0x18,0x68,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x77,0x14,0x79, -0x6e,0x74,0x61,0x78,0x75,1,0x6d,0x3c,0x75,0x1a,0x6f,0x74,0x61,0x74,0x69,0x6f, -0x6e,0x6d,0x61,0x72,0x6b,0x53,0x12,0x61,0x72,0x6b,0x53,0x66,0xc1,0xb9,0x69,0xc0, -0xfd,0x69,0xa2,0x6f,0x6a,0xa2,0xca,0x6c,4,0x62,0xc3,8,0x63,0x8c,0x65,0x98, -0x69,0xa2,0x56,0x6f,2,0x65,0x4b,0x67,0x4c,0x77,0x11,0x65,0x72,0x4c,0x13,0x63, -0x61,0x73,0x65,0x4c,0x16,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,4,0x11, -0x69,0x63,0x1f,0x61,0x6c,0x6f,0x72,0x64,0x65,0x72,0x65,0x78,0x63,0x65,0x70,0x74, -0x69,0x6f,0x6e,0x4b,0xd8,0x40,4,0x11,0x63,0x63,0xc3,0x10,0x18,0x61,0x64,0x63, -0x61,0x6e,0x6f,0x6e,0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69, -0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,0x10,0x16,0x6e,0x65,0x62,0x72,0x65,0x61, -0x6b,0xc3,8,1,0x64,0x44,0x73,1,0x63,0xd9,0x40,3,0x6f,0x16,0x63,0x6f, -0x6d,0x6d,0x65,0x6e,0x74,0xd9,0x40,3,2,0x63,0x80,0x65,0x90,0x73,0x40,1, -0x62,0x52,0x74,0x46,1,0x61,0x40,0x72,0x1c,0x69,0x6e,0x61,0x72,0x79,0x6f,0x70, -0x65,0x72,0x61,0x74,0x6f,0x72,0x47,0x11,0x72,0x74,0x41,0x44,0x1c,0x69,0x6e,0x61, -0x72,0x79,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x45,0x3e,0x16,0x6f,0x6e,0x74, -0x69,0x6e,0x75,0x65,0x3f,0x10,0x6f,0x42,0x16,0x67,0x72,0x61,0x70,0x68,0x69,0x63, -0x43,2,0x67,0xc3,6,0x6f,0x26,0x74,0xc3,7,0x11,0x69,0x6e,1,0x63,0x4a, -0x69,0x11,0x6e,0x67,1,0x67,0x2e,0x74,0x12,0x79,0x70,0x65,0xc3,7,0x13,0x72, -0x6f,0x75,0x70,0xc3,6,0x48,0x15,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x49,0x66,0x86, -0x67,0xa2,0x4a,0x68,3,0x61,0x36,0x65,0x58,0x73,0x68,0x79,0x13,0x70,0x68,0x65, -0x6e,0x3d,0x1f,0x6e,0x67,0x75,0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x74, -0x79,0x70,0x65,0xc3,0xb,0x10,0x78,0x3a,0x14,0x64,0x69,0x67,0x69,0x74,0x3b,0x10, -0x74,0xc3,0xb,0x16,0x75,0x6c,0x6c,0x63,0x6f,0x6d,0x70,0x1f,0x6f,0x73,0x69,0x74, -0x69,0x6f,0x6e,0x65,0x78,0x63,0x6c,0x75,0x73,0x69,0x6f,0x6e,0x33,2,0x63,0xa2, -0x44,0x65,0xa2,0x4b,0x72,3,0x61,0x34,0x62,0x84,0x65,0x8a,0x6c,0x12,0x69,0x6e, -0x6b,0x39,0x11,0x70,0x68,0x7c,0x12,0x65,0x6d,0x65,3,0x62,0x5e,0x63,0x30,0x65, -0x48,0x6c,0x12,0x69,0x6e,0x6b,0x39,0x1a,0x6c,0x75,0x73,0x74,0x65,0x72,0x62,0x72, -0x65,0x61,0x6b,0xc3,0x12,0x14,0x78,0x74,0x65,0x6e,0x64,0x37,0x12,0x61,0x73,0x65, -0x35,0x11,0x78,0x74,0x37,0xc2,5,1,0x62,0xc3,0x12,0x6d,0xd9,0x20,0,0x1c, -0x6e,0x65,0x72,0x61,0x6c,0x63,0x61,0x74,0x65,0x67,0x6f,0x72,0x79,0xc2,5,0x13, -0x6d,0x61,0x73,0x6b,0xd9,0x20,0,0x61,0xa2,0x50,0x62,0xa2,0x7e,0x63,0xa2,0xf0, -0x64,0xa4,0xbd,0x65,2,0x61,0x3a,0x6d,0x58,0x78,0x10,0x74,0x30,0x14,0x65,0x6e, -0x64,0x65,0x72,0x31,0xc2,4,0x1b,0x73,0x74,0x61,0x73,0x69,0x61,0x6e,0x77,0x69, -0x64,0x74,0x68,0xc3,4,0x12,0x6f,0x6a,0x69,0x92,1,0x6d,0x3c,0x70,0x1a,0x72, -0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x95,0x16,0x6f,0x64,0x69,0x66, -0x69,0x65,0x72,0x96,0x13,0x62,0x61,0x73,0x65,0x99,3,0x67,0x44,0x68,0x4a,0x6c, -0x4e,0x73,0x1a,0x63,0x69,0x69,0x68,0x65,0x78,0x64,0x69,0x67,0x69,0x74,0x23,0x10, -0x65,0xd9,0x40,0,0x11,0x65,0x78,0x23,1,0x6e,0x38,0x70,0x11,0x68,0x61,0x20, -0x14,0x62,0x65,0x74,0x69,0x63,0x21,0x11,0x75,0x6d,0x79,4,0x63,0xc3,0,0x69, -0x3e,0x6c,0xa2,0x57,0x6d,0xa2,0x64,0x70,1,0x62,0xd9,0x40,0xd,0x74,0xc3,0x15, -0x11,0x64,0x69,2,0x63,0x54,0x6d,0x74,0x70,0x1b,0x61,0x69,0x72,0x65,0x64,0x62, -0x72,0x61,0x63,0x6b,0x65,0x74,0xd8,0x40,0xd,0x13,0x74,0x79,0x70,0x65,0xc3,0x15, -0x24,1,0x6c,0x30,0x6f,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x25,0x12,0x61,0x73,0x73, -0xc3,0,0x26,0x14,0x69,0x72,0x72,0x6f,0x72,1,0x65,0x38,0x69,0x16,0x6e,0x67, -0x67,0x6c,0x79,0x70,0x68,0xd9,0x40,1,0x10,0x64,0x27,2,0x61,0x32,0x6b,0xc3, -1,0x6f,0x11,0x63,0x6b,0xc3,1,0x11,0x6e,0x6b,0x7b,0x10,0x67,0xd9,0x40,1, -6,0x68,0x7c,0x68,0x54,0x69,0x85,0x6f,0xa2,0x6f,0x77,4,0x63,0x30,0x6b,0x36, -0x6c,0x87,0x74,0x8b,0x75,0x89,1,0x66,0x8d,0x6d,0x8f,0x11,0x63,0x66,0x91,0x18, -0x61,0x6e,0x67,0x65,0x73,0x77,0x68,0x65,0x6e,4,0x63,0x44,0x6c,0x6c,0x6e,0x7e, -0x74,0x98,0x75,0x18,0x70,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x64,0x89,0x12,0x61, -0x73,0x65,1,0x66,0x30,0x6d,0x14,0x61,0x70,0x70,0x65,0x64,0x8f,0x14,0x6f,0x6c, -0x64,0x65,0x64,0x8d,0x18,0x6f,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x64,0x87,0x1c, -0x66,0x6b,0x63,0x63,0x61,0x73,0x65,0x66,0x6f,0x6c,0x64,0x65,0x64,0x91,0x18,0x69, -0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x64,0x8b,0x13,0x6d,0x70,0x65,0x78,0x33,0x61, -0x2e,0x63,0xa2,0x48,0x66,0xd9,0x40,2,1,0x6e,0x72,0x73,0x10,0x65,3,0x64, -0x83,0x66,0x3a,0x69,0x4a,0x73,0x17,0x65,0x6e,0x73,0x69,0x74,0x69,0x76,0x65,0x65, -0x15,0x6f,0x6c,0x64,0x69,0x6e,0x67,0xd9,0x40,2,0x17,0x67,0x6e,0x6f,0x72,0x61, -0x62,0x6c,0x65,0x85,0x13,0x6f,0x6e,0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62, -0x69,0x6e,0x69,0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,2,0x10,0x63,0xc3,2, -3,0x61,0x30,0x65,0x34,0x69,0xa2,0x41,0x74,0xc3,3,0x11,0x73,0x68,0x29,2, -0x63,0x3a,0x66,0x58,0x70,0x2c,0x16,0x72,0x65,0x63,0x61,0x74,0x65,0x64,0x2d,0x1d, -0x6f,0x6d,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x74,0x79,0x70,0x65,0xc3,3, -0x15,0x61,0x75,0x6c,0x74,0x69,0x67,0x1f,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x63, -0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e,0x74,0x2b,0x2a,0x10,0x61,0x2e,0x15,0x63,0x72, -0x69,0x74,0x69,0x63,0x2f,3,0x66,0x34,0x6e,0x3e,0x74,0x42,0x79,0x22,0x11,0x65, -0x73,0x23,0x20,0x13,0x61,0x6c,0x73,0x65,0x21,0x20,0x10,0x6f,0x21,0x22,0x12,0x72, -0x75,0x65,0x23,0xa,0x6b,0x5b,0x6f,0x23,0x6f,0x3c,0x72,0x4c,0x76,1,0x69,0x24, -0x72,0x33,0x13,0x72,0x61,0x6d,0x61,0x33,0x10,0x76,0x22,0x14,0x65,0x72,0x6c,0x61, -0x79,0x23,0xa2,0xe2,0x13,0x69,0x67,0x68,0x74,0xa3,0xe2,0x6b,0x58,0x6c,0x74,0x6e, -3,0x6b,0x2f,0x6f,0x30,0x72,0x21,0x75,0x12,0x6b,0x74,0x61,0x2f,0x19,0x74,0x72, -0x65,0x6f,0x72,0x64,0x65,0x72,0x65,0x64,0x21,1,0x61,0x24,0x76,0x31,0x18,0x6e, -0x61,0x76,0x6f,0x69,0x63,0x69,0x6e,0x67,0x31,0xa2,0xe0,0x12,0x65,0x66,0x74,0xa3, -0xe0,0x61,0x5c,0x62,0xa2,0x77,0x63,0xa2,0x96,0x64,0xa4,0xa,0x69,1,0x6f,0x26, -0x73,0xa3,0xf0,0x1a,0x74,0x61,0x73,0x75,0x62,0x73,0x63,0x72,0x69,0x70,0x74,0xa3, -0xf0,0xa2,0xe6,3,0x62,0xa0,0x6c,0xa3,0xe4,0x72,0xa3,0xe8,0x74,2,0x61,0x74, -0x62,0x7c,0x74,0x14,0x61,0x63,0x68,0x65,0x64,1,0x61,0x3e,0x62,0x13,0x65,0x6c, -0x6f,0x77,0xa2,0xca,0x13,0x6c,0x65,0x66,0x74,0xa3,0xc8,0x13,0x62,0x6f,0x76,0x65, -0xa2,0xd6,0x14,0x72,0x69,0x67,0x68,0x74,0xa3,0xd8,0xa2,0xd6,0x10,0x72,0xa3,0xd8, -0xa2,0xca,0x10,0x6c,0xa3,0xc8,0x12,0x6f,0x76,0x65,0xa2,0xe6,1,0x6c,0x30,0x72, -0x13,0x69,0x67,0x68,0x74,0xa3,0xe8,0x12,0x65,0x66,0x74,0xa3,0xe4,0xa2,0xdc,2, -0x65,0x2c,0x6c,0xa3,0xda,0x72,0xa3,0xde,0x12,0x6c,0x6f,0x77,0xa2,0xdc,1,0x6c, -0x30,0x72,0x13,0x69,0x67,0x68,0x74,0xa3,0xde,0x12,0x65,0x66,0x74,0xa3,0xda,0x11, -0x63,0x63,4,0x31,0x3c,0x32,0xa2,0x42,0x33,0xa2,0x56,0x38,0xa2,0x64,0x39,0x10, -0x31,0xa3,0x5b,9,0x35,0xa,0x35,0x3f,0x36,0x41,0x37,0x43,0x38,0x45,0x39,0x47, -0x30,0x30,0x31,0x3c,0x32,0x42,0x33,0x4e,0x34,0x3d,0x34,1,0x33,0xa3,0x67,0x37, -0xa3,0x6b,0x36,0x10,0x38,0xa3,0x76,0x38,1,0x32,0xa3,0x7a,0x39,0xa3,0x81,0x3a, -2,0x30,0xa3,0x82,0x32,0xa3,0x84,0x33,0xa3,0x85,9,0x35,0xa,0x35,0x53,0x36, -0x55,0x37,0x57,0x38,0x59,0x39,0x5b,0x30,0x49,0x31,0x4b,0x32,0x4d,0x33,0x4f,0x34, -0x51,6,0x33,8,0x33,0x63,0x34,0x65,0x35,0x67,0x36,0x69,0x30,0x5d,0x31,0x5f, -0x32,0x61,0x10,0x34,0xa3,0x54,2,0x61,0xa3,0xea,0x62,0xa3,0xe9,0x6f,0x13,0x75, -0x62,0x6c,0x65,1,0x61,0x30,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa3,0xe9,0x13,0x62, -0x6f,0x76,0x65,0xa3,0xea,0xb,0x6e,0xc0,0xca,0x72,0x5f,0x72,0x46,0x73,0xa2,0x48, -0x77,1,0x68,0x24,0x73,0x33,0x17,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x33, -0x22,1,0x69,0x30,0x6c,2,0x65,0x3d,0x69,0x4b,0x6f,0x3f,0x18,0x67,0x68,0x74, -0x74,0x6f,0x6c,0x65,0x66,0x74,0x22,2,0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65, -0x72,0x72,0x69,0x64,0x65,0x3f,0x17,0x6d,0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x3d, -0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4b,0x30,0x1e,0x65,0x67,0x6d,0x65,0x6e,0x74, -0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x31,0x6e,0xa2,0x41,0x6f,0xa2,0x53, -0x70,2,0x61,0x66,0x64,0x86,0x6f,0x1b,0x70,0x64,0x69,0x72,0x65,0x63,0x74,0x69, -0x6f,0x6e,0x61,0x6c,1,0x66,0x32,0x69,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4d, -0x14,0x6f,0x72,0x6d,0x61,0x74,0x41,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73, -0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x2f,1,0x66,0x41,0x69,0x4d,1,0x6f, -0x28,0x73,0x10,0x6d,0x43,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61, -0x72,0x6b,0x43,1,0x6e,0x35,0x74,0x19,0x68,0x65,0x72,0x6e,0x65,0x75,0x74,0x72, -0x61,0x6c,0x35,0x65,0x88,0x65,0x98,0x66,0xa2,0x6a,0x6c,0x20,1,0x65,0x30,0x72, -2,0x65,0x37,0x69,0x49,0x6f,0x39,0x18,0x66,0x74,0x74,0x6f,0x72,0x69,0x67,0x68, -0x74,0x20,2,0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65,0x72,0x72,0x69,0x64,0x65, -0x39,0x17,0x6d,0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x37,0x15,0x73,0x6f,0x6c,0x61, -0x74,0x65,0x49,3,0x6e,0x25,0x73,0x27,0x74,0x29,0x75,0x15,0x72,0x6f,0x70,0x65, -0x61,0x6e,2,0x6e,0x3c,0x73,0x46,0x74,0x18,0x65,0x72,0x6d,0x69,0x6e,0x61,0x74, -0x6f,0x72,0x29,0x14,0x75,0x6d,0x62,0x65,0x72,0x25,0x17,0x65,0x70,0x61,0x72,0x61, -0x74,0x6f,0x72,0x27,1,0x69,0x28,0x73,0x10,0x69,0x47,0x1f,0x72,0x73,0x74,0x73, -0x74,0x72,0x6f,0x6e,0x67,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x47,0x61,0x4e,0x62, -0x84,0x63,1,0x6f,0x24,0x73,0x2d,0x1c,0x6d,0x6d,0x6f,0x6e,0x73,0x65,0x70,0x61, -0x72,0x61,0x74,0x6f,0x72,0x2d,2,0x6c,0x3b,0x6e,0x2b,0x72,0x13,0x61,0x62,0x69, -0x63,1,0x6c,0x30,0x6e,0x14,0x75,0x6d,0x62,0x65,0x72,0x2b,0x14,0x65,0x74,0x74, -0x65,0x72,0x3b,0x2e,1,0x6e,0x45,0x6f,0x1c,0x75,0x6e,0x64,0x61,0x72,0x79,0x6e, -0x65,0x75,0x74,0x72,0x61,0x6c,0x45,0,0x15,0x6d,0xc7,0x44,0x73,0xc3,0x75,0x76, -0x9c,0x76,0x92,0x77,0xa2,0x8b,0x79,0x10,0x69,2,0x6a,0x3c,0x72,0x68,0x73,0x17, -0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,0x48,0x12,0x69,0x6e,0x67,0xa2,0x74, -0x1e,0x68,0x65,0x78,0x61,0x67,0x72,0x61,0x6d,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73, -0xa3,0x74,0x16,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0xa3,0x49,2,0x61,0x36,0x65, -0x7a,0x73,0xa2,0x6c,0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,0xa3,0x9f,0x72,0x1e, -0x69,0x61,0x74,0x69,0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,0x6f,0x72,0x73,0xa2, -0x6c,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x7d,1,0x64, -0x3c,0x72,0x19,0x74,0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x91,0x14, -0x69,0x63,0x65,0x78,0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3, -0xaf,0x18,0x61,0x72,0x61,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0xfc,0x73,0xa2,0x4b, -0x74,0xa6,0x2b,0x75,2,0x63,0x82,0x67,0x92,0x6e,0x1f,0x69,0x66,0x69,0x65,0x64, -0x63,0x61,0x6e,0x61,0x64,0x69,0x61,0x6e,0x61,0x62,0x6f,0x1f,0x72,0x69,0x67,0x69, -0x6e,0x61,0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x62,0x17,0x65,0x78, -0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xad,0x11,0x61,0x73,0x62,0x12,0x65,0x78,0x74, -0xa3,0xad,0x15,0x61,0x72,0x69,0x74,0x69,0x63,0xa3,0x78,7,0x6f,0xc1,0x5b,0x6f, -0x54,0x70,0x68,0x75,0xa2,0x43,0x79,1,0x6c,0x2c,0x72,0x12,0x69,0x61,0x63,0x3b, -0x17,0x6f,0x74,0x69,0x6e,0x61,0x67,0x72,0x69,0xa3,0x8f,0x18,0x72,0x61,0x73,0x6f, -0x6d,0x70,0x65,0x6e,0x67,0xa3,0xda,1,0x61,0x32,0x65,0x14,0x63,0x69,0x61,0x6c, -0x73,0xa3,0x56,0x12,0x63,0x69,0x6e,0x1f,0x67,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65, -0x72,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0x2d,2,0x6e,0x48,0x70,0x76,0x74,0x1d, -0x74,0x6f,0x6e,0x73,0x69,0x67,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa5,6, -0x15,0x64,0x61,0x6e,0x65,0x73,0x65,0xa2,0x9b,0x12,0x73,0x75,0x70,0xa2,0xdb,0x16, -0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xdb,4,0x61,0xa2,0xa8,0x65,0x5c,0x6d, -0x9e,0x70,0xa2,0x4b,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64, -0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x10,0x72,1, -0x61,0x4e,0x73,0x12,0x63,0x72,0x69,0x1f,0x70,0x74,0x73,0x61,0x6e,0x64,0x73,0x75, -0x62,0x73,0x63,0x72,0x69,0x70,0x74,0x73,0x73,0x14,0x6e,0x64,0x73,0x75,0x62,0x73, -0x1b,0x61,0x74,0x68,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,1, -0x6c,0x40,0x75,1,0x61,0x6e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e, -0xa3,0x8e,0x15,0x65,0x6d,0x65,0x6e,0x74,0x61,1,0x6c,0x50,0x72,0x1e,0x79,0x70, -0x72,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x61,0x72,0x65,0x61,1,0x61,0xa3, -0x6d,0x62,0xa3,0x6e,3,0x61,0x5c,0x6d,0x78,0x70,0xa2,0x41,0x73,0x13,0x79,0x6d, -0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61, -0x70,0x68,0x73,0xa5,5,0x14,0x72,0x72,0x6f,0x77,0x73,2,0x61,0xa3,0x67,0x62, -0xa3,0x68,0x63,0xa3,0xfa,0x13,0x61,0x74,0x68,0x65,0x1f,0x6d,0x61,0x74,0x69,0x63, -0x61,0x6c,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,0x19,0x75,0x6e, -0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x61,0x5a,0x68,0x84,0x69,0xa2, -0x5b,0x6d,0x16,0x61,0x6c,0x6c,0x66,0x6f,0x72,0x6d,1,0x73,0xa3,0x54,0x76,0x16, -0x61,0x72,0x69,0x61,0x6e,0x74,0x73,0xa3,0x54,1,0x6d,0x36,0x75,0x16,0x72,0x61, -0x73,0x68,0x74,0x72,0x61,0xa3,0xa1,0x15,0x61,0x72,0x69,0x74,0x61,0x6e,0xa3,0xac, -1,0x61,0x52,0x6f,0x13,0x72,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x6f,0x72,0x6d, -0x61,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa3,0xf7,1,0x72,0x2e,0x76, -0x12,0x69,0x61,0x6e,0xa3,0x79,0x12,0x61,0x64,0x61,0xa3,0xd9,1,0x64,0x50,0x6e, -0x13,0x68,0x61,0x6c,0x61,0x50,0x1d,0x61,0x72,0x63,0x68,0x61,0x69,0x63,0x6e,0x75, -0x6d,0x62,0x65,0x72,0x73,0xa3,0xf9,0x13,0x64,0x68,0x61,0x6d,0xa3,0xf8,4,0x61, -0x68,0x65,0xa2,0x74,0x68,0xa2,0x77,0x69,0xa2,0x7f,0x72,0x1c,0x61,0x6e,0x73,0x70, -0x6f,0x72,0x74,0x61,0x6e,0x64,0x6d,0x61,0x70,0xa2,0xcf,0x16,0x73,0x79,0x6d,0x62, -0x6f,0x6c,0x73,0xa3,0xcf,3,0x67,0x34,0x69,0x5a,0x6b,0xa2,0x46,0x6d,0x11,0x69, -0x6c,0x49,2,0x61,0x2a,0x62,0x32,0x73,0xa3,0x60,0x12,0x6c,0x6f,0x67,0xa3,0x62, -0x13,0x61,0x6e,0x77,0x61,0xa3,0x65,3,0x6c,0x52,0x74,0x56,0x76,0x5e,0x78,0x16, -0x75,0x61,0x6e,0x6a,0x69,0x6e,0x67,0xa2,0x7c,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c, -0x73,0xa3,0x7c,0x10,0x65,0xa3,0x70,0x12,0x68,0x61,0x6d,0xa3,0xae,0x12,0x69,0x65, -0x74,0xa3,0xb7,0x11,0x72,0x69,0xa3,0xdc,0x13,0x6c,0x75,0x67,0x75,0x4b,0x10,0x61, -1,0x61,0x24,0x69,0x53,0x11,0x6e,0x61,0x3d,2,0x62,0x34,0x66,0x3c,0x72,0x13, -0x68,0x75,0x74,0x61,0xa3,0xfb,0x13,0x65,0x74,0x61,0x6e,0x57,0x14,0x69,0x6e,0x61, -0x67,0x68,0xa3,0x90,0x6d,0x84,0x6e,0xa6,0x1a,0x6f,0xa6,0x4e,0x70,0xa8,2,0x72, -1,0x65,0x5c,0x75,1,0x6d,0x2a,0x6e,0x11,0x69,0x63,0x67,0x10,0x69,0xa2,0xc0, -0x1d,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, -0xc0,0x13,0x6a,0x61,0x6e,0x67,0xa3,0xa3,6,0x6f,0x76,0x6f,0x6c,0x72,0xa2,0x51, -0x75,0xa2,0x52,0x79,0x14,0x61,0x6e,0x6d,0x61,0x72,0x58,0x12,0x65,0x78,0x74,2, -0x61,0xa3,0xb6,0x62,0xa3,0xee,0x65,0x13,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb6, -0x62,0xa3,0xee,1,0x64,0x32,0x6e,0x15,0x67,0x6f,0x6c,0x69,0x61,0x6e,0x6b,0x10, -0x69,0xa2,0xec,0x13,0x66,0x69,0x65,0x72,1,0x6c,0x3c,0x74,0x19,0x6f,0x6e,0x65, -0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0xa3,0x8a,0x15,0x65,0x74,0x74,0x65,0x72,0x73, -0x2d,0x10,0x6f,0xa3,0xed,1,0x6c,0x44,0x73,0x11,0x69,0x63,0xa2,0x5c,0x18,0x61, -0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5c,0x13,0x74,0x61,0x6e,0x69,0xa5, -3,0x61,0xa2,0x9b,0x65,0xa4,0x1f,0x69,1,0x61,0xa2,0x8f,0x73,0x10,0x63,5, -0x70,0x18,0x70,0xa2,0x71,0x73,0x36,0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61, -0x6c,0x81,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x8f,0x61,0xa2,0x66,0x65,0x46,0x6d, -0x19,0x61,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1,0x61,0xa3,0x66,0x62, -0xa3,0x69,0x17,0x6c,0x6c,0x61,0x6e,0x65,0x6f,0x75,0x73,2,0x6d,0x3a,0x73,0x6c, -0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x11,0x61,0x74,0x1f,0x68, -0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1, -0x61,0xa3,0x66,0x62,0xa3,0x69,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x8e,0x12,0x61, -0x6e,0x64,1,0x61,0x3c,0x70,0x19,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68, -0x73,0xa3,0xcd,0x14,0x72,0x72,0x6f,0x77,0x73,0xa3,0x73,0x10,0x6f,0xa3,0xd8,3, -0x68,0xa2,0x4f,0x6c,0xa2,0x65,0x6e,0xa2,0x6a,0x74,0x10,0x68,2,0x61,0x3a,0x65, -0x4a,0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x16,0x6c,0x70,0x68, -0x61,0x6e,0x75,0x6d,0xa3,0x5d,0x16,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,1,0x61, -0x36,0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0x7f,0x11,0x6c,0x70,0x1f, -0x68,0x61,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73, -0xa3,0x5d,1,0x61,0x3e,0x6a,0x12,0x6f,0x6e,0x67,0xa2,0xaa,0x14,0x74,0x69,0x6c, -0x65,0x73,0xa3,0xaa,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xe9,0x15,0x61,0x79,0x61,0x6c, -0x61,0x6d,0x4f,1,0x64,0x34,0x69,0x15,0x63,0x68,0x61,0x65,0x61,0x6e,0xa3,0xea, -0x12,0x61,0x69,0x63,0xa3,0xc6,2,0x65,0x66,0x6e,0x98,0x72,0x14,0x6f,0x69,0x74, -0x69,0x63,1,0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68, -0x73,0xa3,0xd7,0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0xd6,0x17,0x74,0x65,0x69, -0x6d,0x61,0x79,0x65,0x6b,0xa2,0xb8,0x12,0x65,0x78,0x74,0xa2,0xd5,0x16,0x65,0x6e, -0x73,0x69,0x6f,0x6e,0x73,0xa3,0xd5,0x18,0x64,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75, -0x69,0xa3,0xeb,5,0x6b,0x1b,0x6b,0x3c,0x6f,0x40,0x75,0x18,0x6d,0x62,0x65,0x72, -0x66,0x6f,0x72,0x6d,0x73,0x7b,0x10,0x6f,0xa3,0x92,0x14,0x62,0x6c,0x6f,0x63,0x6b, -0x21,0x61,0x3a,0x62,0x21,0x65,0x16,0x77,0x74,0x61,0x69,0x6c,0x75,0x65,0xa3,0x8b, -0x16,0x62,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0xef,5,0x70,0x43,0x70,0x36,0x72, -0x6a,0x73,0x14,0x6d,0x61,0x6e,0x79,0x61,0xa3,0x7a,0x18,0x74,0x69,0x63,0x61,0x6c, -0x63,0x68,0x61,0x72,0x1f,0x61,0x63,0x74,0x65,0x72,0x72,0x65,0x63,0x6f,0x67,0x6e, -0x69,0x74,0x69,0x6f,0x6e,0x85,1,0x69,0x46,0x6e,0x1e,0x61,0x6d,0x65,0x6e,0x74, -0x61,0x6c,0x64,0x69,0x6e,0x67,0x62,0x61,0x74,0x73,0xa3,0xf2,0x11,0x79,0x61,0x47, -0x63,0xa2,0x66,0x67,0xa2,0x66,0x6c,1,0x63,0xa2,0x57,0x64,5,0x70,0x2d,0x70, -0x36,0x73,0x56,0x74,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,0xbf,0x11,0x65,0x72,1, -0x6d,0x2e,0x73,0x12,0x69,0x61,0x6e,0xa3,0x8c,0x11,0x69,0x63,0xa3,0xf1,0x1a,0x6f, -0x75,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0xbb,0x68,0x42,0x69,0x54, -0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0xf0,0x17, -0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e,0xa5,4,0x14,0x74,0x61,0x6c,0x69,0x63, -0xa3,0x58,0x13,0x68,0x69,0x6b,0x69,0xa3,0x9d,0x10,0x72,0x85,0x12,0x68,0x61,0x6d, -0x65,5,0x72,0x35,0x72,0x44,0x73,0x64,0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63, -0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73, -0x65,0xa2,0x4e,0x13,0x61,0x72,0x65,0x61,0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72, -0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61, -0x79,0x69,0x6e,0x67,0x63,0x61,0x72,0x64,0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a, -0x75,0x15,0x63,0x69,0x6e,0x68,0x61,0x75,0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d, -0x6f,0x6e,0x67,0xa3,0xf3,0x15,0x6d,0x79,0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61, -0x8e,0x6f,1,0x65,0x74,0x6e,0x16,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72, -1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73, -0xa2,0x72,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15, -0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x97,1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f, -0x73,0xa2,0xa6,0x13,0x64,0x69,0x73,0x63,0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96, -0x67,0xc3,0x8a,0x6a,0xc1,0x81,0x6a,0xa2,0xc5,0x6b,0xa2,0xde,0x6c,4,0x61,0x54, -0x65,0xa2,0x61,0x69,0xa2,0x78,0x6f,0xa2,0xa7,0x79,1,0x63,0x2e,0x64,0x12,0x69, -0x61,0x6e,0xa3,0xa9,0x12,0x69,0x61,0x6e,0xa3,0xa7,1,0x6f,0x55,0x74,0x11,0x69, -0x6e,1,0x31,0x82,0x65,0x11,0x78,0x74,4,0x61,0x5c,0x62,0x29,0x63,0xa3,0x94, -0x64,0xa3,0x95,0x65,0xa2,0xe7,0x13,0x6e,0x64,0x65,0x64,4,0x61,0x36,0x62,0x29, -0x63,0xa3,0x94,0x64,0xa3,0x95,0x65,0xa3,0xe7,0x26,0x18,0x64,0x64,0x69,0x74,0x69, -0x6f,0x6e,0x61,0x6c,0x6d,0x24,0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,0x6d, -0x65,0x6e,0x74,0x25,1,0x70,0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,0x65, -0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,0x6d, -0x2e,0x6e,0x34,0x73,0x10,0x75,0xa3,0xb0,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,0x61, -0x72,1,0x61,0xa3,0xe8,0x62,1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62, -0x61,0x72,0x79,0xa3,0x75,0x17,0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,0x76, -0x1a,0x77,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,0x61, -1,0x6d,0x32,0x76,0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,0x12, -0x65,0x78,0x74,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,1,0x61,0x80,0x68,3,0x61, -0x3c,0x6d,0x4c,0x6f,0x64,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,0x16, -0x72,0x6f,0x73,0x68,0x74,0x68,0x69,0xa3,0x89,0x11,0x65,0x72,0x68,0x16,0x73,0x79, -0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,3,0x69,0x38, -0x6e,0x40,0x74,0x9c,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0xa2,0x12,0x74,0x68,0x69, -0xa3,0xc1,3,0x61,0x34,0x62,0x50,0x67,0x56,0x6e,0x12,0x61,0x64,0x61,0x4d,0x12, -0x73,0x75,0x70,0xa2,0xcb,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xcb,0x11, -0x75,0x6e,0xa3,0x42,0x11,0x78,0x69,0x96,0x17,0x72,0x61,0x64,0x69,0x63,0x61,0x6c, -0x73,0x97,0x14,0x61,0x6b,0x61,0x6e,0x61,0x9e,1,0x65,0x4c,0x70,0x10,0x68,0x1f, -0x6f,0x6e,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73, -0xa3,0x6b,0x11,0x78,0x74,0xa3,0x6b,0x67,0xa2,0x84,0x68,0xa4,0x24,0x69,3,0x64, -0x4a,0x6d,0x8e,0x6e,0xa2,0x44,0x70,0x13,0x61,0x65,0x78,0x74,0x2a,0x16,0x65,0x6e, -0x73,0x69,0x6f,0x6e,0x73,0x2b,1,0x63,0x99,0x65,0x1c,0x6f,0x67,0x72,0x61,0x70, -0x68,0x69,0x63,0x64,0x65,0x73,0x63,0x72,0x1f,0x69,0x70,0x74,0x69,0x6f,0x6e,0x63, -0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,0x73,0x99,0x1c,0x70,0x65,0x72,0x69,0x61, -0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0xba,1,0x64,0x62,0x73,0x1b,0x63, -0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14, -0x74,0x68,0x69,0x61,0x6e,0xa3,0xbd,0x13,0x6c,0x61,0x76,0x69,0xa3,0xbe,0x1c,0x69, -0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,4,0x65, -0x58,0x6c,0xa2,0x63,0x6f,0xa2,0x6b,0x72,0xa2,0x6f,0x75,1,0x6a,0x30,0x72,0x14, -0x6d,0x75,0x6b,0x68,0x69,0x43,0x14,0x61,0x72,0x61,0x74,0x69,0x45,1,0x6e,0x8c, -0x6f,1,0x6d,0x4e,0x72,0x13,0x67,0x69,0x61,0x6e,0x5a,0x12,0x73,0x75,0x70,0xa2, -0x87,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x87,0x1a,0x65,0x74,0x72,0x69, -0x63,0x73,0x68,0x61,0x70,0x65,0x73,0x8c,0x12,0x65,0x78,0x74,0xa2,0xe3,0x14,0x65, -0x6e,0x64,0x65,0x64,0xa3,0xe3,0x1e,0x65,0x72,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74, -0x75,0x61,0x74,0x69,0x6f,0x6e,0x71,0x17,0x61,0x67,0x6f,0x6c,0x69,0x74,0x69,0x63, -0xa3,0x88,0x13,0x74,0x68,0x69,0x63,0xa3,0x59,1,0x61,0x5c,0x65,0x11,0x65,0x6b, -0x30,1,0x61,0x38,0x65,0x11,0x78,0x74,0x6e,0x14,0x65,0x6e,0x64,0x65,0x64,0x6f, -0x17,0x6e,0x64,0x63,0x6f,0x70,0x74,0x69,0x63,0x31,0x13,0x6e,0x74,0x68,0x61,0xa3, -0xe4,2,0x61,0xa2,0x48,0x65,0xa2,0xcf,0x69,1,0x67,0x30,0x72,0x14,0x61,0x67, -0x61,0x6e,0x61,0x9d,0x10,0x68,1,0x70,0x3a,0x73,0x18,0x75,0x72,0x72,0x6f,0x67, -0x61,0x74,0x65,0x73,0xa3,0x4b,1,0x72,0x3c,0x75,0x19,0x73,0x75,0x72,0x72,0x6f, -0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,0x11,0x69,0x76,0x1f,0x61,0x74,0x65,0x75,0x73, -0x65,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c,2,0x6c,0x32, -0x6e,0x9a,0x74,0x12,0x72,0x61,0x6e,0xa5,2,0x10,0x66,2,0x61,0x58,0x6d,0x70, -0x77,0x14,0x69,0x64,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x75,0x6c,0x6c,0x77,0x69, -0x64,0x74,0x68,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x1a,0x6e,0x64,0x66,0x75,0x6c, -0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x57,0x13,0x61,0x72,0x6b,0x73,0xa3,0x52,1, -0x67,0x2e,0x75,0x12,0x6e,0x6f,0x6f,0xa3,0x63,0x11,0x75,0x6c,0xa2,0x4a,2,0x63, -0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,0x4a,0x1f, -0x6f,0x6d,0x70,0x61,0x74,0x69,0x62,0x69,0x6c,0x69,0x74,0x79,0x6a,0x61,0x6d,0x6f, -0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c,0x17,0x65,0x78,0x74,0x65,0x6e,0x64,0x65,0x64, -1,0x61,0xa3,0xb4,0x62,0xa3,0xb9,0x13,0x62,0x72,0x65,0x77,0x37,0x61,0xa2,0xe9, -0x62,0xa6,0x20,0x63,0xa6,0xe8,0x64,0xac,0x5f,0x65,5,0x6d,0xa2,0x6d,0x86,0x6e, -0x96,0x74,0x15,0x68,0x69,0x6f,0x70,0x69,0x63,0x5e,1,0x65,0x40,0x73,0x11,0x75, -0x70,0xa2,0x86,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x86,0x11,0x78,0x74, -0xa2,0x85,1,0x61,0xa3,0xc8,0x65,0x13,0x6e,0x64,0x65,0x64,0xa2,0x85,0x10,0x61, -0xa3,0xc8,0x16,0x6f,0x74,0x69,0x63,0x6f,0x6e,0x73,0xa3,0xce,0x15,0x63,0x6c,0x6f, -0x73,0x65,0x64,2,0x61,0x5a,0x63,0x9e,0x69,0x1c,0x64,0x65,0x6f,0x67,0x72,0x61, -0x70,0x68,0x69,0x63,0x73,0x75,0x70,0xa2,0xc4,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, -0x74,0xa3,0xc4,0x16,0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,0x86,1,0x65,0x2c,0x73, -0x11,0x75,0x70,0xa3,0xc3,0x13,0x72,0x69,0x63,0x73,0x86,0x18,0x75,0x70,0x70,0x6c, -0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc3,0x11,0x6a,0x6b,0xa2,0x44,0x1f,0x6c,0x65,0x74, -0x74,0x65,0x72,0x73,0x61,0x6e,0x64,0x6d,0x6f,0x6e,0x74,0x68,0x73,0xa3,0x44,0x61, -0x36,0x67,0x62,0x6c,0x14,0x62,0x61,0x73,0x61,0x6e,0xa3,0xe2,0x13,0x72,0x6c,0x79, -0x64,0x1f,0x79,0x6e,0x61,0x73,0x74,0x69,0x63,0x63,0x75,0x6e,0x65,0x69,0x66,0x6f, -0x72,0x6d,0xa5,1,0x10,0x79,0x1f,0x70,0x74,0x69,0x61,0x6e,0x68,0x69,0x65,0x72, -0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xc2,6,0x6e,0xc0,0xe5,0x6e,0x3e,0x72, -0xa2,0x5d,0x73,0xa2,0xd8,0x76,0x14,0x65,0x73,0x74,0x61,0x6e,0xa3,0xbc,1,0x61, -0x92,0x63,0x13,0x69,0x65,0x6e,0x74,1,0x67,0x34,0x73,0x15,0x79,0x6d,0x62,0x6f, -0x6c,0x73,0xa3,0xa5,0x13,0x72,0x65,0x65,0x6b,1,0x6d,0x34,0x6e,0x15,0x75,0x6d, -0x62,0x65,0x72,0x73,0xa3,0x7f,0x13,0x75,0x73,0x69,0x63,0xa2,0x7e,0x19,0x61,0x6c, -0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x7e,0x10,0x74,0x1f,0x6f,0x6c,0x69, -0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xfe,2, -0x61,0x32,0x6d,0xa2,0x71,0x72,0x12,0x6f,0x77,0x73,0x7d,0x12,0x62,0x69,0x63,0x38, -3,0x65,0x4a,0x6d,0x66,0x70,0xa2,0x43,0x73,0x11,0x75,0x70,0xa2,0x80,0x16,0x70, -0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x80,0x11,0x78,0x74,1,0x61,0xa3,0xd2,0x65, -0x14,0x6e,0x64,0x65,0x64,0x61,0xa3,0xd2,0x12,0x61,0x74,0x68,0xa2,0xd3,0x18,0x65, -0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x61,0x1f,0x6c,0x70,0x68,0x61,0x62,0x65,0x74, -0x69,0x63,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd3,1,0x66,0x42,0x72,0x1e, -0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,1, -0x61,0xa3,0x51,0x62,0xa3,0x55,0x14,0x65,0x6e,0x69,0x61,0x6e,0x35,0x12,0x63,0x69, -0x69,0x23,0x65,0x98,0x68,0xa2,0x47,0x6c,1,0x63,0x62,0x70,0x17,0x68,0x61,0x62, -0x65,0x74,0x69,0x63,0x70,1,0x66,0xa3,0x50,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74, -0x61,0x74,0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x50,0x16,0x68,0x65,0x6d, -0x69,0x63,0x61,0x6c,0xa2,0xd0,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd0, -0x1a,0x67,0x65,0x61,0x6e,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x77,0x11,0x6f, -0x6d,0xa3,0xfd,6,0x6f,0x71,0x6f,0x64,0x72,0xa2,0x41,0x75,0xa2,0x58,0x79,0x1b, -0x7a,0x61,0x6e,0x74,0x69,0x6e,0x65,0x6d,0x75,0x73,0x69,0x63,0xa2,0x5b,0x18,0x61, -0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5b,1,0x70,0x34,0x78,0x16,0x64, -0x72,0x61,0x77,0x69,0x6e,0x67,0x89,0x14,0x6f,0x6d,0x6f,0x66,0x6f,0xa0,0x12,0x65, -0x78,0x74,0xa2,0x43,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0x43,0x10,0x61,1,0x68, -0x40,0x69,0x12,0x6c,0x6c,0x65,0x92,0x17,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x73, -0x93,0x11,0x6d,0x69,0xa3,0xc9,1,0x67,0x2c,0x68,0x11,0x69,0x64,0xa3,0x64,0x14, -0x69,0x6e,0x65,0x73,0x65,0xa3,0x81,0x61,0x42,0x65,0xa2,0x4b,0x6c,0x1a,0x6f,0x63, -0x6b,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x8b,3,0x6c,0x34,0x6d,0x40,0x73, -0x66,0x74,0x11,0x61,0x6b,0xa3,0xc7,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x93,0x11, -0x75,0x6d,0xa2,0xb1,0x12,0x73,0x75,0x70,0xa2,0xca,0x16,0x70,0x6c,0x65,0x6d,0x65, -0x6e,0x74,0xa3,0xca,1,0x69,0x30,0x73,0x13,0x61,0x76,0x61,0x68,0xa3,0xdd,0x15, -0x63,0x6c,0x61,0x74,0x69,0x6e,0x23,0x14,0x6e,0x67,0x61,0x6c,0x69,0x41,5,0x6f, -0xc1,0x46,0x6f,0xa2,0x4f,0x75,0xa4,0xa,0x79,1,0x70,0x90,0x72,0x14,0x69,0x6c, -0x6c,0x69,0x63,0x32,1,0x65,0x4c,0x73,0x11,0x75,0x70,0xa2,0x61,0x16,0x70,0x6c, -0x65,0x6d,0x65,0x6e,0x74,0xa2,0x61,0x12,0x61,0x72,0x79,0xa3,0x61,0x11,0x78,0x74, -2,0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x65,0x13,0x6e,0x64,0x65,0x64,1,0x61,0xa3, -0x9e,0x62,0xa3,0xa0,0x1c,0x72,0x69,0x6f,0x74,0x73,0x79,0x6c,0x6c,0x61,0x62,0x61, -0x72,0x79,0xa3,0x7b,3,0x6d,0x5a,0x6e,0xa2,0x95,0x70,0xa2,0xa0,0x75,0x17,0x6e, -0x74,0x69,0x6e,0x67,0x72,0x6f,0x64,0xa2,0x9a,0x17,0x6e,0x75,0x6d,0x65,0x72,0x61, -0x6c,0x73,0xa3,0x9a,2,0x62,0x3a,0x6d,0xa2,0x5f,0x70,0x15,0x61,0x74,0x6a,0x61, -0x6d,0x6f,0xa3,0x41,0x14,0x69,0x6e,0x69,0x6e,0x67,2,0x64,0x46,0x68,0x9e,0x6d, -0x1d,0x61,0x72,0x6b,0x73,0x66,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77, -0x1e,0x69,0x61,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c,0x6d,0x61,0x72,0x6b,0x73, -0x2e,2,0x65,0x40,0x66,0xa6,0x1b,0x73,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65, -0x6e,0x74,0xa3,0x83,0x16,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe0,0x17,0x61, -0x6c,0x66,0x6d,0x61,0x72,0x6b,0x73,0xa3,0x52,0x11,0x6f,0x6e,0x1f,0x69,0x6e,0x64, -0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,0x1b, -0x74,0x72,0x6f,0x6c,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x73,0x83,0x12,0x74,0x69, -0x63,0xa2,0x84,0x1b,0x65,0x70,0x61,0x63,0x74,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73, -0xa3,0xdf,1,0x6e,0x3e,0x72,0x1b,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62, -0x6f,0x6c,0x73,0x75,0x15,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa2,0x98,0x16,0x6e,0x75, -0x6d,0x62,0x65,0x72,0x73,0xa2,0x99,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74, -0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x99,0x61,0xa2,0xda,0x68,0xa4,4,0x6a,0x10, -0x6b,0xa2,0x47,4,0x63,0x8e,0x65,0xa2,0x81,0x72,0xa2,0x91,0x73,0xa2,0xa3,0x75, -0x1f,0x6e,0x69,0x66,0x69,0x65,0x64,0x69,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68, -0x73,0xa2,0x47,0x18,0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,4,0x61,0xa3, -0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1,0x65,0xa5,0,0x14,0x6f,0x6d, -0x70,0x61,0x74,0xa2,0x45,1,0x66,0x96,0x69,1,0x62,0x44,0x64,0x17,0x65,0x6f, -0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x12,0x73,0x75,0x70,0xa3,0x5f,0x14,0x69, -0x6c,0x69,0x74,0x79,0xa2,0x45,1,0x66,0x54,0x69,0x18,0x64,0x65,0x6f,0x67,0x72, -0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,0x73,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e, -0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,0x73,0xa3,0x53,0x11,0x78,0x74,4,0x61,0xa3, -0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1,0x65,0xa5,0,0x19,0x61,0x64, -0x69,0x63,0x61,0x6c,0x73,0x73,0x75,0x70,0x94,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e, -0x74,0x95,1,0x74,0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c,0x73,0x9a,0x1d,0x61,0x6e, -0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x9b,0x14,0x72,0x6f, -0x6b,0x65,0x73,0xa3,0x82,2,0x6e,0x48,0x72,0x64,0x75,0x1d,0x63,0x61,0x73,0x69, -0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3,0xde,0x1d,0x61,0x64,0x69, -0x61,0x6e,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x63,0x12,0x69,0x61,0x6e, -0xa3,0xa8,1,0x61,0x50,0x65,0x14,0x72,0x6f,0x6b,0x65,0x65,0x60,0x12,0x73,0x75, -0x70,0xa2,0xff,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xff,1,0x6b,0x26, -0x6d,0xa3,0xa4,0x11,0x6d,0x61,0xa3,0xd4,3,0x65,0x3e,0x69,0x7e,0x6f,0xa2,0x5d, -0x75,0x15,0x70,0x6c,0x6f,0x79,0x61,0x6e,0xa3,0xe1,1,0x73,0x50,0x76,0x16,0x61, -0x6e,0x61,0x67,0x61,0x72,0x69,0x3e,0x12,0x65,0x78,0x74,0xa2,0xb3,0x14,0x65,0x6e, -0x64,0x65,0x64,0xa3,0xb3,0x13,0x65,0x72,0x65,0x74,0xa3,0x5a,1,0x61,0x30,0x6e, -0x14,0x67,0x62,0x61,0x74,0x73,0x91,0x18,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c, -0x73,0x2e,2,0x65,0x30,0x66,0x36,0x73,0x11,0x75,0x70,0xa3,0x83,0x11,0x78,0x74, -0xa3,0xe0,0x18,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x77,0x13,0x6d,0x69, -0x6e,0x6f,0xa2,0xab,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xab,8,0x6d,0x5f,0x6d, -0x3a,0x6e,0x48,0x73,0x7a,0x76,0xa2,0x4b,0x77,0x12,0x69,0x64,0x65,0x43,0x11,0x65, -0x64,0x32,0x12,0x69,0x61,0x6c,0x33,2,0x61,0x40,0x62,0x37,0x6f,1,0x62,0x28, -0x6e,0x10,0x65,0x21,0x13,0x72,0x65,0x61,0x6b,0x37,0x10,0x72,0x34,0x12,0x72,0x6f, -0x77,0x35,2,0x6d,0x38,0x71,0x46,0x75,1,0x62,0x3d,0x70,0x3e,0x11,0x65,0x72, -0x3f,1,0x61,0x24,0x6c,0x39,0x11,0x6c,0x6c,0x39,1,0x72,0x3b,0x75,0x12,0x61, -0x72,0x65,0x3b,0x12,0x65,0x72,0x74,0x40,0x13,0x69,0x63,0x61,0x6c,0x41,0x63,0x58, -0x65,0x92,0x66,0x96,0x69,1,0x6e,0x36,0x73,0x10,0x6f,0x30,0x14,0x6c,0x61,0x74, -0x65,0x64,0x31,0x11,0x69,0x74,0x2e,0x12,0x69,0x61,0x6c,0x2f,2,0x61,0x36,0x69, -0x48,0x6f,0x10,0x6d,0x24,0x12,0x70,0x61,0x74,0x25,0x10,0x6e,0x22,0x15,0x6f,0x6e, -0x69,0x63,0x61,0x6c,0x23,0x13,0x72,0x63,0x6c,0x65,0x27,0x11,0x6e,0x63,0x27,2, -0x69,0x3a,0x6f,0x44,0x72,0x10,0x61,0x2c,0x14,0x63,0x74,0x69,0x6f,0x6e,0x2d,0x10, -0x6e,0x28,0x11,0x61,0x6c,0x29,0x11,0x6e,0x74,0x2b,4,0x61,0x3a,0x66,0x4c,0x68, -0x5e,0x6e,0x70,0x77,0x2a,0x12,0x69,0x64,0x65,0x2b,0x22,0x17,0x6d,0x62,0x69,0x67, -0x75,0x6f,0x75,0x73,0x23,0x26,0x17,0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x27, -0x24,0x17,0x61,0x6c,0x66,0x77,0x69,0x64,0x74,0x68,0x25,0x20,1,0x61,0x30,0x65, -0x14,0x75,0x74,0x72,0x61,0x6c,0x21,0x28,0x13,0x72,0x72,0x6f,0x77,0x29,0xd,0x6e, -0xc0,0xfb,0x73,0x6d,0x73,0x3a,0x74,0x98,0x75,0xa2,0x49,0x7a,2,0x6c,0x3b,0x70, -0x3d,0x73,0x39,5,0x6f,0x28,0x6f,0x57,0x70,0x34,0x75,0x16,0x72,0x72,0x6f,0x67, -0x61,0x74,0x65,0x45,0x11,0x61,0x63,1,0x65,0x32,0x69,0x15,0x6e,0x67,0x6d,0x61, -0x72,0x6b,0x31,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x39,0x63,0x53, -0x6b,0x55,0x6d,0x51,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61,0x73,0x65,0x6c,0x65,0x74, -0x74,0x65,0x72,0x27,1,0x6e,0x40,0x70,0x1c,0x70,0x65,0x72,0x63,0x61,0x73,0x65, -0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x17,0x61,0x73,0x73,0x69,0x67,0x6e,0x65,0x64, -0x21,0x6e,0x8a,0x6f,0xa2,0x47,0x70,8,0x66,0x14,0x66,0x5b,0x69,0x59,0x6f,0x4f, -0x72,0x24,0x73,0x49,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0x43,0x61,0x2c, -0x63,0x4d,0x64,0x47,0x65,0x4b,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65, -0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3d,2,0x64,0x33,0x6c,0x35,0x6f,0x36,0x1b, -0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x2d,1,0x70,0x7c, -0x74,0x12,0x68,0x65,0x72,3,0x6c,0x38,0x6e,0x42,0x70,0x4c,0x73,0x14,0x79,0x6d, -0x62,0x6f,0x6c,0x57,0x14,0x65,0x74,0x74,0x65,0x72,0x2b,0x14,0x75,0x6d,0x62,0x65, -0x72,0x37,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x1c,0x65, -0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,0x66,0x9e,0x66, -0x88,0x69,0xa2,0x4b,0x6c,0xa2,0x5c,0x6d,4,0x61,0x60,0x63,0x31,0x65,0x2f,0x6e, -0x2d,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x30,0x73,0x14,0x79,0x6d, -0x62,0x6f,0x6c,0x55,0x14,0x65,0x74,0x74,0x65,0x72,0x29,0x17,0x74,0x68,0x73,0x79, -0x6d,0x62,0x6f,0x6c,0x51,1,0x69,0x2e,0x6f,0x13,0x72,0x6d,0x61,0x74,0x41,0x1d, -0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x5b,0x10, -0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, -0x6f,0x6e,0x59,6,0x6d,0x18,0x6d,0x29,0x6f,0x28,0x74,0x27,0x75,0x23,0x2a,0x1c, -0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x65,0x28, -0x69,0x3c,0x6c,0x25,0x19,0x74,0x74,0x65,0x72,0x6e,0x75,0x6d,0x62,0x65,0x72,0x35, -0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3b,0x63,0x44,0x64, -0xa2,0x60,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b, -0x2f,6,0x6e,0x39,0x6e,0x46,0x6f,0x4e,0x73,0x45,0x75,0x1b,0x72,0x72,0x65,0x6e, -0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x53,0x20,0x12,0x74,0x72,0x6c,0x3f,0x42, -0x10,0x6e,1,0x6e,0x2c,0x74,0x12,0x72,0x6f,0x6c,0x3f,0x1f,0x65,0x63,0x74,0x6f, -0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x4d,0x63,0x3f,0x66, -0x41,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, -0x6e,0x4b,2,0x61,0x30,0x65,0x4a,0x69,0x12,0x67,0x69,0x74,0x33,0x1c,0x73,0x68, -0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x47,0x1a,0x63,0x69,0x6d, -0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0x33,0,0x12,0x6d,0xc1,0xec,0x73,0xa1, -0x73,0x4e,0x74,0xa2,0x56,0x77,0xa2,0x72,0x79,0xa2,0x73,0x7a,1,0x61,0x2c,0x68, -0x12,0x61,0x69,0x6e,0x8b,0x11,0x69,0x6e,0x85,5,0x74,0x22,0x74,0x38,0x77,0x4c, -0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18,0x72,0x61,0x69,0x67,0x68, -0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b,0x61,0x66,0x6d,0x61,0x2e, -0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11,0x68,0x65,0x65,1,0x65, -0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67,1,0x61,0x4e,0x65,1, -0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62,0x75,0x74,0x61,0x74,0x13, -0x67,0x6f,0x61,0x6c,0x3d,1,0x68,0x71,0x77,0x73,0x11,0x61,0x77,0x79,1,0x65, -0x32,0x75,0x11,0x64,0x68,0x80,0x11,0x68,0x65,0x83,0x10,0x68,0x7a,1,0x62,0x34, -0x77,0x16,0x69,0x74,0x68,0x74,0x61,0x69,0x6c,0x7f,0x14,0x61,0x72,0x72,0x65,0x65, -0x7d,0x6d,0x6c,0x6e,0xa4,0x18,0x70,0xa4,0x35,0x71,0xa4,0x35,0x72,1,0x65,0x38, -0x6f,0x18,0x68,0x69,0x6e,0x67,0x79,0x61,0x79,0x65,0x68,0x93,1,0x68,0x5f,0x76, -0x16,0x65,0x72,0x73,0x65,0x64,0x70,0x65,0x61,2,0x61,0x2e,0x65,0xa2,0xeb,0x69, -0x10,0x6d,0x53,0x17,0x6e,0x69,0x63,0x68,0x61,0x65,0x61,0x6e,0,0x12,0x6e,0x76, -0x73,0x51,0x73,0x3e,0x74,0x5c,0x77,0xa0,0x79,0xa2,0x42,0x7a,0x13,0x61,0x79,0x69, -0x6e,0xa3,0x54,0x10,0x61,1,0x64,0x2e,0x6d,0x12,0x65,0x6b,0x68,0xa3,0x4c,0x11, -0x68,0x65,0xa3,0x4b,3,0x61,0x38,0x65,0x3c,0x68,0x4a,0x77,0x13,0x65,0x6e,0x74, -0x79,0xa3,0x51,0x10,0x77,0xa3,0x4d,1,0x6e,0xa3,0x4e,0x74,0x10,0x68,0xa3,0x4f, -0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x50,0x11,0x61,0x77,0xa3,0x52,0x12,0x6f,0x64, -0x68,0xa3,0x53,0x6e,0x3a,0x6f,0x40,0x70,0x46,0x71,0x4a,0x72,0x12,0x65,0x73,0x68, -0xa3,0x4a,0x11,0x75,0x6e,0xa3,0x46,0x11,0x6e,0x65,0xa3,0x47,0x10,0x65,0xa3,0x48, -0x12,0x6f,0x70,0x68,0xa3,0x49,0x67,0x33,0x67,0x38,0x68,0x40,0x6b,0x5e,0x6c,0x66, -0x6d,0x11,0x65,0x6d,0xa3,0x45,0x13,0x69,0x6d,0x65,0x6c,0xa1,1,0x65,0x32,0x75, -0x14,0x6e,0x64,0x72,0x65,0x64,0xa3,0x42,0x11,0x74,0x68,0xa3,0x41,0x12,0x61,0x70, -0x68,0xa3,0x43,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x44,0x61,0x34,0x62,0x4a,0x64, -0x50,0x66,0x12,0x69,0x76,0x65,0x9f,1,0x6c,0x2a,0x79,0x11,0x69,0x6e,0x97,0x12, -0x65,0x70,0x68,0x95,0x12,0x65,0x74,0x68,0x99,1,0x61,0x30,0x68,0x14,0x61,0x6d, -0x65,0x64,0x68,0x9d,0x13,0x6c,0x65,0x74,0x68,0x9b,0x11,0x65,0x6d,0x51,2,0x6f, -0x2c,0x75,0x50,0x79,0x10,0x61,0x91,1,0x6a,0x28,0x6f,0x10,0x6e,0x55,0x1a,0x6f, -0x69,0x6e,0x69,0x6e,0x67,0x67,0x72,0x6f,0x75,0x70,0x21,0x10,0x6e,0x57,0x10,0x65, -0x59,0x10,0x61,1,0x66,0x5b,0x70,0x10,0x68,0x5d,0x66,0x7b,0x66,0x42,0x67,0x7a, -0x68,0x8a,0x6b,0xa2,0x56,0x6c,0x11,0x61,0x6d,0x4c,0x12,0x61,0x64,0x68,0x4f,2, -0x61,0x3e,0x65,0x4a,0x69,0x19,0x6e,0x61,0x6c,0x73,0x65,0x6d,0x6b,0x61,0x74,0x68, -0x35,0x15,0x72,0x73,0x69,0x79,0x65,0x68,0x8f,0x86,0x10,0x68,0x33,0x10,0x61,1, -0x66,0x37,0x6d,0x11,0x61,0x6c,0x39,1,0x61,0x40,0x65,0x3e,1,0x68,0x28,0x74, -0x10,0x68,0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,0x43,1,0x68,0x3b,0x6d,0x1a,0x7a, -0x61,0x6f,0x6e,0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,0x3d,2,0x61,0x3a,0x68,0x44, -0x6e,0x17,0x6f,0x74,0x74,0x65,0x64,0x68,0x65,0x68,0x4b,1,0x66,0x47,0x70,0x10, -0x68,0x49,0x12,0x61,0x70,0x68,0x89,0x61,0x2c,0x62,0x4c,0x64,0x86,0x65,0x31,1, -0x69,0x38,0x6c,1,0x61,0x28,0x65,0x10,0x66,0x27,0x11,0x70,0x68,0x25,0x10,0x6e, -0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f,0x75,0x73,0x68,0x61,0x73,0x6b,0x69,0x79, -0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65,0x8d,1,0x68,0x29,0x74,0x10,0x68,0x2b, -0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68,0x72,0x69,0x73,0x68,0x2f,7,0x6e,0x2e, -0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21,0x18,0x6f,0x6e,0x6a,0x6f,0x69,0x6e,0x69, -0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68,0x74,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67, -0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e,0x74,0x2b,0x63,0x23, -0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65,0x66,0x74,0x6a,0x6f,0x69,0x6e,0x69,0x6e, -0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x25,0x19, -0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69,0x6e,0x67,0x23,0,0x13,0x6e,0xc0,0xcd, -0x73,0x46,0x73,0x42,0x75,0x72,0x77,0x7e,0x78,0x96,0x7a,0x10,0x77,0x58,0x14,0x73, -0x70,0x61,0x63,0x65,0x59,4,0x61,0x51,0x67,0x53,0x70,0x28,0x75,0x30,0x79,0x57, -0x54,0x12,0x61,0x63,0x65,0x55,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x53,0x15, -0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x21,1,0x6a,0x5d,0x6f,0x17,0x72,0x64,0x6a,0x6f, -0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,0x6e,0x60,0x6f,0xa2,0x41,0x70,0xa2,0x50, -0x71,0xa2,0x6e,0x72,1,0x65,0x24,0x69,0x6f,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c, -0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x6f,4,0x65,0x3e,0x6c,0x5b,0x6f, -0x46,0x73,0x45,0x75,0x46,0x14,0x6d,0x65,0x72,0x69,0x63,0x47,0x15,0x78,0x74,0x6c, -0x69,0x6e,0x65,0x5b,0x17,0x6e,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x45,0x10,0x70, -0x48,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x49, -1,0x6f,0x3e,0x72,0x4c,0x1a,0x65,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69, -0x63,0x4d,0x4a,0x1b,0x73,0x74,0x66,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63, -0x4b,0x10,0x75,0x4e,0x16,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x4f,0x68,0x7b,0x68, -0x50,0x69,0x86,0x6a,0xa2,0x61,0x6c,0xa2,0x65,0x6d,0x1c,0x61,0x6e,0x64,0x61,0x74, -0x6f,0x72,0x79,0x62,0x72,0x65,0x61,0x6b,0x2d,4,0x32,0x5f,0x33,0x61,0x65,0x34, -0x6c,0x6d,0x79,0x3a,0x13,0x70,0x68,0x65,0x6e,0x3b,0x19,0x62,0x72,0x65,0x77,0x6c, -0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,0x28,0x6e,0x3c,0x73,0x41,0x3c,0x18,0x65, -0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x3d,0x3e,1,0x66,0x3e,0x73,0x11,0x65, -0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,0x62,0x6c,0x65,0x3f,0x18,0x69,0x78,0x6e, -0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,0x6c,0x63,0x74,0x65,0x76,0x67,1,0x66, -0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,0x64,0x43,0x61,0x40,0x62,0x70,0x63,0xa2, -0x55,0x65,0xa2,0xdb,0x67,0x10,0x6c,0x38,0x11,0x75,0x65,0x39,2,0x69,0x23,0x6c, -0x34,0x6d,0x16,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x24,0x17,0x70,0x68,0x61, -0x62,0x65,0x74,0x69,0x63,0x25,4,0x32,0x27,0x61,0x29,0x62,0x2b,0x6b,0x2d,0x72, -0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,0x3e,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c, -0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,1,0x65,0x2a,0x6f,0x11,0x74,0x68,0x27, -0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,0x51,0x6d,0x33,0x6f,0x28,0x70,0x69,0x72, -0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,0x74,0x1a,0x69,0x6e,0x67,0x65,0x6e,0x74, -0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,0x74,0x69,0x6f,0x6e,0x61,0x1f,0x6c,0x6a, -0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x6b,1, -0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,0x6f,0x6e,0x74,0x65,0x78,0x74,0x51,0x18, -0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x33,0x61,0x6a,0x62,0x2f,0x6a,0x6b, -0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,0x61,0x38,0x75,0x18,0x6e,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,0x65,0x6e,0x74,0x68,0x65,0x73,0x69,0x73, -0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,0x72,0x65,0x74,0x75,0x72,0x6e,0x35,0x10, -0x78,0x36,0x18,0x63,0x6c,0x61,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x37,1,0x64,0x42, -0x6e,1,0x6f,0x32,0x75,0x26,0x14,0x6d,0x65,0x72,0x69,0x63,0x27,0x11,0x6e,0x65, -0x21,1,0x65,0x2e,0x69,0x24,0x12,0x67,0x69,0x74,0x25,0x22,0x14,0x63,0x69,0x6d, -0x61,0x6c,0x23,0,0x18,0x6e,0xc3,0x79,0x74,0xc1,0x2f,0x77,0x5d,0x77,0x80,0x78, -0xa2,0x44,0x79,0xa2,0x4e,0x7a,5,0x78,0x13,0x78,0x30,0x79,0x36,0x7a,0x11,0x7a, -0x7a,0xa3,0x67,0x11,0x78,0x78,0xa3,0x66,0x11,0x79,0x79,0x21,0x69,0x30,0x6d,0x34, -0x73,0x11,0x79,0x6d,0xa3,0x81,0x11,0x6e,0x68,0x23,0x11,0x74,0x68,0xa3,0x80,1, -0x61,0x2c,0x6f,0x11,0x6c,0x65,0xa3,0x9b,0x11,0x72,0x61,0xa2,0x92,0x15,0x6e,0x67, -0x63,0x69,0x74,0x69,0xa3,0x92,1,0x70,0x2c,0x73,0x11,0x75,0x78,0xa3,0x65,0x11, -0x65,0x6f,0x9b,0x10,0x69,0x72,0x11,0x69,0x69,0x73,0x74,0x4a,0x75,0xa2,0xb5,0x76, -1,0x61,0x2c,0x69,0x11,0x73,0x70,0xa3,0x64,0x10,0x69,0xa2,0x63,0x10,0x69,0xa3, -0x63,5,0x67,0x36,0x67,0x68,0x68,0x6c,0x69,2,0x62,0x3a,0x66,0x4a,0x72,0x10, -0x68,0xa2,0x9e,0x12,0x75,0x74,0x61,0xa3,0x9e,1,0x65,0x24,0x74,0x6f,0x12,0x74, -0x61,0x6e,0x6f,0x14,0x69,0x6e,0x61,0x67,0x68,0x99,0x11,0x6c,0x67,0x75,0x10,0x61, -1,0x61,0x24,0x69,0x6d,0x6a,0x11,0x6e,0x61,0x6b,0x61,0x30,0x65,0xa2,0x56,0x66, -0x11,0x6e,0x67,0x99,6,0x6c,0x1c,0x6c,0x32,0x6d,0x38,0x6e,0x44,0x76,0x10,0x74, -0xa3,0x7f,1,0x65,0x89,0x75,0x97,1,0x69,0x24,0x6c,0x67,0x10,0x6c,0x67,0x10, -0x67,0xa3,0x9a,0x67,0x36,0x69,0x52,0x6b,0x10,0x72,0xa2,0x99,0x10,0x69,0xa3,0x99, -1,0x61,0x30,0x62,0x7a,0x13,0x61,0x6e,0x77,0x61,0x7b,0x12,0x6c,0x6f,0x67,0x75, -2,0x6c,0x32,0x74,0x34,0x76,0x12,0x69,0x65,0x74,0xa3,0x7f,0x10,0x65,0x89,0x12, -0x68,0x61,0x6d,0xa3,0x6a,1,0x6c,0x2a,0x6e,0x10,0x67,0xa3,0x62,0x10,0x75,0x68, -0x11,0x67,0x75,0x69,1,0x67,0x32,0x6e,0x14,0x6b,0x6e,0x6f,0x77,0x6e,0xa3,0x67, -0x11,0x61,0x72,0x8a,0x13,0x69,0x74,0x69,0x63,0x8b,0x71,0xc0,0xef,0x71,0xa2,0xc1, -0x72,0xa2,0xc6,0x73,6,0x69,0x6d,0x69,0x72,0x6f,0xa2,0x4c,0x75,0xa2,0x58,0x79, -1,0x6c,0x46,0x72,4,0x63,0x65,0x65,0xa3,0x5f,0x69,0x2c,0x6a,0xa3,0x60,0x6e, -0xa3,0x61,0x11,0x61,0x63,0x65,0x10,0x6f,0x94,0x16,0x74,0x69,0x6e,0x61,0x67,0x72, -0x69,0x95,2,0x64,0x3c,0x67,0x4c,0x6e,1,0x64,0xa3,0x91,0x68,0x62,0x12,0x61, -0x6c,0x61,0x63,0x10,0x64,0xa2,0xa6,0x12,0x68,0x61,0x6d,0xa3,0xa6,0x17,0x6e,0x77, -0x72,0x69,0x74,0x69,0x6e,0x67,0xa3,0x70,0x11,0x72,0x61,0xa2,0x98,0x16,0x73,0x6f, -0x6d,0x70,0x65,0x6e,0x67,0xa3,0x98,0x11,0x6e,0x64,0xa2,0x71,0x14,0x61,0x6e,0x65, -0x73,0x65,0xa3,0x71,0x61,0x5c,0x67,0xa2,0x43,0x68,1,0x61,0x2a,0x72,0x10,0x64, -0xa3,0x97,2,0x72,0x28,0x76,0x30,0x77,0x87,0x12,0x61,0x64,0x61,0xa3,0x97,0x12, -0x69,0x61,0x6e,0x87,2,0x6d,0x40,0x72,0x58,0x75,0x10,0x72,0xa2,0x6f,0x15,0x61, -0x73,0x68,0x74,0x72,0x61,0xa3,0x6f,1,0x61,0x26,0x72,0xa3,0x7e,0x14,0x72,0x69, -0x74,0x61,0x6e,0xa3,0x7e,1,0x61,0xa3,0x5e,0x62,0xa3,0x85,0x11,0x6e,0x77,0xa3, -0x70,0x11,0x61,0x61,1,0x63,0x2f,0x69,0x23,3,0x65,0x3e,0x6a,0x48,0x6f,0x4e, -0x75,0x10,0x6e,1,0x69,0x24,0x72,0x61,0x10,0x63,0x61,0x13,0x6a,0x61,0x6e,0x67, -0xa3,0x6e,0x11,0x6e,0x67,0xa3,0x6e,0x11,0x72,0x6f,0xa3,0x5d,0x6e,0xa2,0x83,0x6f, -0xa2,0xbc,0x70,5,0x6c,0x1e,0x6c,0x44,0x72,0x4a,0x73,0x1b,0x61,0x6c,0x74,0x65, -0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0x7b,0x11,0x72,0x64,0xa3,0x5c,0x11, -0x74,0x69,0xa3,0x7d,0x61,0x7c,0x65,0xa2,0x54,0x68,3,0x61,0x3e,0x6c,0x4e,0x6e, -0x5e,0x6f,0x16,0x65,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x5b,0x10,0x67,0xa2,0x5a, -0x12,0x73,0x70,0x61,0xa3,0x5a,2,0x69,0xa3,0x7a,0x70,0xa3,0x7b,0x76,0xa3,0x7c, -0x10,0x78,0xa3,0x5b,2,0x68,0x3e,0x6c,0x50,0x75,0x10,0x63,0xa2,0xa5,0x14,0x69, -0x6e,0x68,0x61,0x75,0xa3,0xa5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3, -0x4b,0x10,0x6d,0xa2,0x90,0x14,0x79,0x72,0x65,0x6e,0x65,0xa3,0x90,0x11,0x72,0x6d, -0xa3,0x59,4,0x61,0x38,0x62,0x56,0x65,0x5c,0x6b,0x6a,0x73,0x11,0x68,0x75,0xa3, -0x96,1,0x62,0x2a,0x72,0x10,0x62,0xa3,0x8e,0x15,0x61,0x74,0x61,0x65,0x61,0x6e, -0xa3,0x8f,0x11,0x61,0x74,0xa3,0x8f,0x16,0x77,0x74,0x61,0x69,0x6c,0x75,0x65,0x97, -1,0x67,0x2e,0x6f,0xa2,0x57,0x10,0x6f,0xa3,0x57,0x10,0x62,0xa3,0x84,3,0x67, -0x3e,0x6c,0x50,0x72,0xa2,0x7a,0x73,0x11,0x6d,0x61,0x84,0x12,0x6e,0x79,0x61,0x85, -1,0x61,0x2a,0x68,0x11,0x61,0x6d,0x5b,0x10,0x6d,0x5b,1,0x63,0xa2,0x55,0x64, -5,0x70,0x2c,0x70,0x36,0x73,0x54,0x74,0x14,0x75,0x72,0x6b,0x69,0x63,0xa3,0x58, -0x11,0x65,0x72,1,0x6d,0x2c,0x73,0x12,0x69,0x61,0x6e,0x9b,0x11,0x69,0x63,0xa3, -0x59,0x1a,0x6f,0x75,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0x85,0x68, -0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68,0x61,0x72,0x61,0x62,0x69,0x61,0x6e, -0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69,0x61,0x6e,0xa3,0x4c,0x14,0x74,0x61, -0x6c,0x69,0x63,0x5d,1,0x68,0x26,0x6b,0xa3,0x6d,0x12,0x69,0x6b,0x69,0xa3,0x6d, -2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f,0x11,0x79,0x61,0x5f,0x10,0x68,0xa3, -0x58,0x68,0xc2,0x9c,0x6b,0xc1,0xcf,0x6b,0xa2,0xdc,0x6c,0xa4,0x5d,0x6d,8,0x6f, -0x46,0x6f,0x48,0x72,0x74,0x74,0x80,0x75,0x86,0x79,1,0x61,0x28,0x6d,0x10,0x72, -0x59,0x13,0x6e,0x6d,0x61,0x72,0x59,2,0x64,0x2e,0x6e,0x32,0x6f,0x10,0x6e,0xa3, -0x72,0x10,0x69,0xa3,0xa3,0x10,0x67,0x56,0x14,0x6f,0x6c,0x69,0x61,0x6e,0x57,0x10, -0x6f,0xa2,0x95,0x10,0x6f,0xa3,0x95,0x11,0x65,0x69,0xa3,0x73,0x11,0x6c,0x74,0xa2, -0xa4,0x12,0x61,0x6e,0x69,0xa3,0xa4,0x61,0x34,0x65,0xa0,0x69,0xa2,0x83,0x6c,0x11, -0x79,0x6d,0x55,3,0x68,0x32,0x6c,0x48,0x6e,0x54,0x79,0x10,0x61,0xa3,0x55,1, -0x61,0x26,0x6a,0xa3,0xa0,0x13,0x6a,0x61,0x6e,0x69,0xa3,0xa0,0x15,0x61,0x79,0x61, -0x6c,0x61,0x6d,0x55,1,0x64,0x38,0x69,0xa2,0x79,0x15,0x63,0x68,0x61,0x65,0x61, -0x6e,0xa3,0x79,0xa2,0x54,0x12,0x61,0x69,0x63,0xa3,0x54,2,0x65,0x72,0x6e,0x84, -0x72,1,0x63,0xa3,0x8d,0x6f,0xa2,0x56,0x13,0x69,0x74,0x69,0x63,1,0x63,0x3c, -0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x56,0x15,0x75, -0x72,0x73,0x69,0x76,0x65,0xa3,0x8d,0x17,0x74,0x65,0x69,0x6d,0x61,0x79,0x65,0x6b, -0xa3,0x73,0x10,0x64,0xa2,0x8c,0x17,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3, -0x8c,0x11,0x61,0x6f,0xa3,0x5c,5,0x6f,0x14,0x6f,0x30,0x70,0x36,0x74,0x11,0x68, -0x69,0xa3,0x78,0x11,0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3,0x8a,0x61,0x2e,0x68, -0x98,0x6e,0x11,0x64,0x61,0x4b,4,0x69,0x3c,0x6c,0x44,0x6e,0x48,0x74,0x56,0x79, -0x13,0x61,0x68,0x6c,0x69,0xa3,0x4f,0x12,0x74,0x68,0x69,0xa3,0x78,0x10,0x69,0xa3, -0x4f,1,0x61,0x4d,0x6e,0x12,0x61,0x64,0x61,0x4b,0x14,0x61,0x6b,0x61,0x6e,0x61, -0x4c,0x19,0x6f,0x72,0x68,0x69,0x72,0x61,0x67,0x61,0x6e,0x61,0x8d,3,0x61,0x3c, -0x6d,0x4e,0x6f,0x5a,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0x91,0x10,0x72, -0x92,0x15,0x6f,0x73,0x68,0x74,0x68,0x69,0x93,1,0x65,0x24,0x72,0x4f,0x10,0x72, -0x4f,0x10,0x6a,0xa2,0x9d,0x11,0x6b,0x69,0xa3,0x9d,4,0x61,0x5c,0x65,0x90,0x69, -0xa0,0x6f,0xa2,0x5d,0x79,1,0x63,0x34,0x64,0x10,0x69,0xa2,0x6c,0x11,0x61,0x6e, -0xa3,0x6c,0x10,0x69,0xa2,0x6b,0x11,0x61,0x6e,0xa3,0x6b,2,0x6e,0x42,0x6f,0x46, -0x74,3,0x66,0xa3,0x50,0x67,0xa3,0x51,0x69,0x24,0x6e,0x53,0x10,0x6e,0x53,0x10, -0x61,0xa3,0x6a,0x50,0x10,0x6f,0x51,0x11,0x70,0x63,0xa2,0x52,0x11,0x68,0x61,0xa3, -0x52,2,0x6d,0x2e,0x6e,0x36,0x73,0x10,0x75,0xa3,0x83,0x10,0x62,0x80,0x10,0x75, -0x81,2,0x61,0xa3,0x53,0x62,0x83,0x65,0x11,0x61,0x72,1,0x61,0xa3,0x53,0x62, -0x83,0x11,0x6d,0x61,0xa3,0x8b,0x68,0x60,0x69,0xa2,0x79,0x6a,2,0x61,0x30,0x70, -0x44,0x75,0x11,0x72,0x63,0xa3,0x94,0x11,0x76,0x61,0xa2,0x4e,0x13,0x6e,0x65,0x73, -0x65,0xa3,0x4e,0x11,0x61,0x6e,0xa3,0x69,6,0x6c,0x1a,0x6c,0x34,0x6d,0x3a,0x72, -0x40,0x75,0x11,0x6e,0x67,0xa3,0x4c,0x11,0x75,0x77,0xa3,0x9c,0x11,0x6e,0x67,0xa3, -0x4b,0x11,0x6b,0x74,0x8d,0x61,0x3a,0x65,0x86,0x69,0x11,0x72,0x61,0x48,0x13,0x67, -0x61,0x6e,0x61,0x49,1,0x6e,0x34,0x74,0x10,0x72,0xa2,0xa2,0x11,0x61,0x6e,0xa3, -0xa2,0x42,5,0x73,0xc,0x73,0xa3,0x49,0x74,0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f, -0x77,0x67,0x28,0x69,0x43,0x6f,0x77,0x44,0x11,0x75,0x6c,0x45,0x11,0x62,0x72,0x46, -0x11,0x65,0x77,0x47,2,0x6d,0x2e,0x6e,0x4a,0x74,0x11,0x61,0x6c,0x5d,0x1c,0x70, -0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0x74,2,0x64, -0x66,0x68,0x6a,0x73,0x1b,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70, -0x61,1,0x68,0x32,0x72,0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0x7d,0x13,0x6c,0x61, -0x76,0x69,0xa3,0x7a,0x10,0x73,0xa3,0x4d,0x15,0x65,0x72,0x69,0x74,0x65,0x64,0x23, -0x64,0xc0,0xc7,0x64,0xa2,0x60,0x65,0xa2,0x88,0x67,4,0x65,0x62,0x6c,0x7a,0x6f, -0x8e,0x72,0x9a,0x75,1,0x6a,0x38,0x72,1,0x6d,0x24,0x75,0x41,0x13,0x75,0x6b, -0x68,0x69,0x41,1,0x61,0x24,0x72,0x3f,0x13,0x72,0x61,0x74,0x69,0x3f,0x10,0x6f, -1,0x6b,0xa3,0x48,0x72,0x38,0x13,0x67,0x69,0x61,0x6e,0x39,0x11,0x61,0x67,0x90, -0x15,0x6f,0x6c,0x69,0x74,0x69,0x63,0x91,0x11,0x74,0x68,0x3a,0x11,0x69,0x63,0x3b, -1,0x61,0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b,0x3d,0x10,0x6e,0xa2,0x89, -0x12,0x74,0x68,0x61,0xa3,0x89,2,0x65,0x3e,0x73,0x64,0x75,0x11,0x70,0x6c,0xa2, -0x87,0x13,0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,0x38,0x76,0x10,0x61,0x34,0x15, -0x6e,0x61,0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,0x65,0x74,0x33,0x11,0x72,0x74, -0x33,2,0x67,0x3a,0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63, -0x37,0x10,0x79,2,0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69, -0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,0x11, -0x62,0x61,0xa2,0x88,0x12,0x73,0x61,0x6e,0xa3,0x88,0x61,0xa2,0xa2,0x62,0xa2,0xf9, -0x63,6,0x6f,0x3d,0x6f,0x5a,0x70,0x76,0x75,0x7a,0x79,1,0x70,0x3e,0x72,2, -0x69,0x2a,0x6c,0x31,0x73,0xa3,0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x13,0x72,0x69, -0x6f,0x74,0x7f,1,0x6d,0x30,0x70,0x10,0x74,0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d, -0x6f,0x6e,0x21,0x11,0x72,0x74,0x7f,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3, -0x65,0x61,0x32,0x68,0xa2,0x41,0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e, -0x50,0x72,0x76,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e, -0x69,0x61,0x6e,0xa3,0x9f,0x10,0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64, -0x69,0x61,0x6e,0x61,0x62,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69, -0xa2,0x68,0x11,0x61,0x6e,0xa3,0x68,1,0x61,0x34,0x65,0x10,0x72,0x2c,0x13,0x6f, -0x6b,0x65,0x65,0x2d,1,0x6b,0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,5, -0x6e,0x43,0x6e,0x44,0x72,0x6c,0x76,1,0x65,0x2a,0x73,0x10,0x74,0xa3,0x75,0x13, -0x73,0x74,0x61,0x6e,0xa3,0x75,0x11,0x61,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68, -0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x9c,1,0x61,0x3e,0x6d, -2,0x65,0x2a,0x69,0xa3,0x74,0x6e,0x27,0x13,0x6e,0x69,0x61,0x6e,0x27,0x10,0x62, -0x24,0x11,0x69,0x63,0x25,0x66,0x30,0x67,0x36,0x68,0x11,0x6f,0x6d,0xa3,0xa1,0x11, -0x61,0x6b,0xa3,0x93,0x11,0x68,0x62,0xa3,0x9f,5,0x6f,0x36,0x6f,0x4e,0x72,0x5e, -0x75,1,0x67,0x30,0x68,1,0x64,0x79,0x69,0x10,0x64,0x79,0x10,0x69,0x8e,0x13, -0x6e,0x65,0x73,0x65,0x8f,0x11,0x70,0x6f,0x2a,0x13,0x6d,0x6f,0x66,0x6f,0x2b,0x10, -0x61,1,0x68,0x2e,0x69,0x7c,0x12,0x6c,0x6c,0x65,0x7d,0xa2,0x41,0x11,0x6d,0x69, -0xa3,0x41,0x61,0x2e,0x65,0x82,0x6c,0x11,0x69,0x73,0xa1,3,0x6c,0x3a,0x6d,0x48, -0x73,0x54,0x74,1,0x61,0x24,0x6b,0x9f,0x10,0x6b,0x9f,0x10,0x69,0x9c,0x13,0x6e, -0x65,0x73,0x65,0x9d,0x10,0x75,0xa2,0x82,0x10,0x6d,0xa3,0x82,0x10,0x73,0xa2,0x86, -0x13,0x61,0x76,0x61,0x68,0xa3,0x86,0x11,0x6e,0x67,0x28,0x12,0x61,0x6c,0x69,0x29, -3,0x6c,0x42,0x6e,0x90,0x74,0xa2,0x46,0x76,0x24,0x17,0x6f,0x77,0x65,0x6c,0x6a, -0x61,0x6d,0x6f,0x25,0x22,1,0x65,0x54,0x76,0x28,1,0x73,0x38,0x74,0x2a,0x17, -0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x2b,0x16,0x79,0x6c,0x6c,0x61,0x62,0x6c, -0x65,0x29,0x18,0x61,0x64,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x23,1,0x61,0x21, -0x6f,0x1a,0x74,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x21,0x26,0x1a, -0x72,0x61,0x69,0x6c,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x27,1,0x6e,0x2c,0x79, -0x22,0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,1,0x6e,0x2c,0x79,0x22,0x11,0x65, -0x73,0x23,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73, -0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e, -0x3a,0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10, -0x6f,0x21,9,0x72,0x31,0x72,0x34,0x73,0x5c,0x74,0x31,0x76,0x33,0x78,0x10,0x78, -0x21,1,0x65,0x24,0x69,0x39,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64, -0x69,0x63,0x61,0x74,0x6f,0x72,0x39,1,0x6d,0x35,0x70,0x18,0x61,0x63,0x69,0x6e, -0x67,0x6d,0x61,0x72,0x6b,0x35,0x63,0x44,0x65,0x5c,0x6c,0x6a,0x6f,0x78,0x70,1, -0x70,0x37,0x72,0x14,0x65,0x70,0x65,0x6e,0x64,0x37,2,0x6e,0x23,0x6f,0x24,0x72, -0x25,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x23,0x10,0x78,0x26,0x13,0x74,0x65,0x6e,0x64, -0x27,0x28,1,0x66,0x2b,0x76,0x2c,0x10,0x74,0x2f,0x13,0x74,0x68,0x65,0x72,0x21, -9,0x6e,0x4a,0x6e,0x34,0x6f,0x44,0x73,0x60,0x75,0x94,0x78,0x10,0x78,0x21,0x10, -0x75,0x2a,0x14,0x6d,0x65,0x72,0x69,0x63,0x2b,1,0x6c,0x2c,0x74,0x12,0x68,0x65, -0x72,0x21,0x14,0x65,0x74,0x74,0x65,0x72,0x2d,3,0x63,0x36,0x65,0x46,0x70,0x31, -0x74,0x32,0x12,0x65,0x72,0x6d,0x33,0x3c,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65, -0x3d,0x2e,0x10,0x70,0x2f,0x10,0x70,0x34,0x12,0x70,0x65,0x72,0x35,0x61,0x46,0x63, -0x52,0x65,0x64,0x66,0x72,0x6c,2,0x65,0x2d,0x66,0x3b,0x6f,0x28,0x12,0x77,0x65, -0x72,0x29,0x10,0x74,0x22,0x12,0x65,0x72,0x6d,0x23,1,0x6c,0x24,0x72,0x37,0x24, -0x12,0x6f,0x73,0x65,0x25,0x10,0x78,0x38,0x13,0x74,0x65,0x6e,0x64,0x39,0x10,0x6f, -0x26,0x13,0x72,0x6d,0x61,0x74,0x27,0xd,0x6c,0x76,0x6f,0x36,0x6f,0x30,0x72,0x38, -0x73,0x60,0x78,0x10,0x78,0x21,0x13,0x74,0x68,0x65,0x72,0x21,1,0x65,0x24,0x69, -0x3b,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f, -0x72,0x3b,1,0x69,0x24,0x71,0x3f,0x18,0x6e,0x67,0x6c,0x65,0x71,0x75,0x6f,0x74, -0x65,0x3f,0x6c,0x50,0x6d,0x56,0x6e,2,0x65,0x36,0x6c,0x39,0x75,0x2c,0x14,0x6d, -0x65,0x72,0x69,0x63,0x2d,0x14,0x77,0x6c,0x69,0x6e,0x65,0x39,1,0x65,0x23,0x66, -0x35,3,0x62,0x37,0x69,0x28,0x6c,0x29,0x6e,0x2b,0x10,0x64,1,0x6c,0x34,0x6e, -0x11,0x75,0x6d,0x2a,0x12,0x6c,0x65,0x74,0x37,0x14,0x65,0x74,0x74,0x65,0x72,0x29, -0x65,0x3d,0x65,0x40,0x66,0x5e,0x68,0x6c,0x6b,0x10,0x61,0x26,0x15,0x74,0x61,0x6b, -0x61,0x6e,0x61,0x27,0x10,0x78,0x2e,0x13,0x74,0x65,0x6e,0x64,0x32,0x15,0x6e,0x75, -0x6d,0x6c,0x65,0x74,0x2f,0x10,0x6f,0x24,0x13,0x72,0x6d,0x61,0x74,0x25,1,0x65, -0x24,0x6c,0x3d,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x3d,0x61, -0x46,0x63,0x52,0x64,1,0x6f,0x24,0x71,0x41,0x18,0x75,0x62,0x6c,0x65,0x71,0x75, -0x6f,0x74,0x65,0x41,0x15,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x10,0x72,0x31,2, -0x63,0x32,0x6e,0x3c,0x6f,0x22,0x12,0x70,0x65,0x6e,0x23,0x24,0x13,0x6c,0x6f,0x73, -0x65,0x25,0x20,0x12,0x6f,0x6e,0x65,0x21,0xd,0x6e,0xc1,0x86,0x73,0xa8,0x73,0x4c, -0x74,0xa2,0x76,0x75,0xa2,0x83,0x7a,0xd8,0x70,0,2,0x6c,0xd9,0x20,0,0x70, -0xd9,0x40,0,0x73,0xc3,0,0xfe,0xf,0,0,0,7,0x6f,0x3c,0x6f,0xff, -8,0,0,0,0x70,0x3a,0x75,0x6e,0x79,0x13,0x6d,0x62,0x6f,0x6c,0xff,0xf, -0,0,0,0x11,0x61,0x63,1,0x65,0x34,0x69,0x15,0x6e,0x67,0x6d,0x61,0x72, -0x6b,0xa5,0,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xc3,0,0x16, -0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0xe1,0,0,0x63,0xff,2,0,0,0, -0x65,0x38,0x6b,0xff,4,0,0,0,0x6d,0xff,1,0,0,0,0x16,0x70, -0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x70,0,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61, -0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x31,1,0x6e,0x40,0x70,0x1c,0x70,0x65, -0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x17,0x61,0x73,0x73, -0x69,0x67,0x6e,0x65,0x64,0x23,0x6e,0xa2,0x69,0x6f,0xa2,0x89,0x70,0xfe,0x30,0xf8, -0,0,9,0x69,0x33,0x69,0xff,0x10,0,0,0,0x6f,0xfd,0x80,0,0, -0x72,0x54,0x73,0xf9,0,0,0x75,0x12,0x6e,0x63,0x74,0xfe,0x30,0xf8,0,0, -0x15,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x30,0xf8,0,0,0x17,0x69,0x76,0x61, -0x74,0x65,0x75,0x73,0x65,0xdd,0,0,0x61,0x48,0x63,0xfd,0x40,0,0,0x64, -0xe9,0,0,0x65,0xfd,0x20,0,0,0x66,0xff,0x20,0,0,0,0x1f,0x72, -0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9, -0x40,0,0xbe,0,3,0x64,0xa7,0,0x6c,0xab,0,0x6f,0x30,0x75,0x13,0x6d, -0x62,0x65,0x72,0xbf,0,0xb2,0,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67, -0x6d,0x61,0x72,0x6b,0xa1,1,0x70,0x92,0x74,0x12,0x68,0x65,0x72,0xe6,0x80,1, -3,0x6c,0x40,0x6e,0x4a,0x70,0x56,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,8, -0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,0x61,0x14,0x75,0x6d,0x62,0x65,0x72, -0xb3,0,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x80,0, -0,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xf9, -0,0,0x66,0xc0,0xc4,0x66,0xa2,0x47,0x69,0xa2,0x64,0x6c,0xa2,0x79,0x6d,0xa4, -0xc0,4,0x61,0x6c,0x63,0xa5,0,0x65,0xa3,0x80,0x6e,0xa1,0x6f,0x15,0x64,0x69, -0x66,0x69,0x65,0x72,1,0x6c,0x38,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0xff,4, -0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,0x41,1,0x72,0x3c,0x74,0x16,0x68, -0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,1,0,0,0,0x10,0x6b,0xa5,0xc0,1, -0x69,0x32,0x6f,0x13,0x72,0x6d,0x61,0x74,0xdb,0,0,0x1d,0x6e,0x61,0x6c,0x70, -0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x20,0,0,0,0x10, -0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, -0x6f,0x6e,0xff,0x10,0,0,0,0x9c,7,0x6d,0x18,0x6d,0x41,0x6f,0x28,0x74, -0x31,0x75,0x25,0x60,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74, -0x65,0x72,0x29,0x63,0x3d,0x65,0x28,0x69,0x42,0x6c,0x29,0x13,0x74,0x74,0x65,0x72, -0x9c,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0xab,0,0x1a,0x6e,0x65,0x73,0x65,0x70, -0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x20,0,0x63,0x46,0x64,0xa2,0x96,0x65,0x1b, -0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa3,0x80,0xe6,0x80, -1,7,0x6e,0x57,0x6e,0x52,0x6f,0x5e,0x73,0xe1,0,0,0x75,0x1b,0x72,0x72, -0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,2,0,0,0,0x22, -0x12,0x74,0x72,0x6c,0xd9,0x80,0,0xdc,0,0,1,0x6d,0x62,0x6e,1,0x6e, -0x30,0x74,0x12,0x72,0x6f,0x6c,0xd9,0x80,0,0x1f,0x65,0x63,0x74,0x6f,0x72,0x70, -0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x40,0,0,0x19,0x62, -0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0xc0,0x61,0x58,0x63,0xd9,0x80, -0,0x66,0xdb,0,0,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74,0x75, -0x61,0x74,0x69,0x6f,0x6e,0xfd,0x20,0,0,0x18,0x73,0x65,0x64,0x6c,0x65,0x74, -0x74,0x65,0x72,0x3d,2,0x61,0x32,0x65,0x50,0x69,0x12,0x67,0x69,0x74,0xa7,0, -0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xe9,0, -0,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0xa7,0 +0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xd9,0x70,0,1,0x67,0x6a,0x6e, +1,0x73,0x54,0x74,0x13,0x65,0x6e,0x63,0x65,1,0x62,0x34,0x74,0x16,0x65,0x72, +0x6d,0x69,0x6e,0x61,0x6c,0x67,0x13,0x72,0x65,0x61,0x6b,0xc3,0x13,0x14,0x69,0x74, +0x69,0x76,0x65,0x65,1,0x6d,0x2e,0x73,0x13,0x74,0x61,0x72,0x74,0x73,0x19,0x65, +0x6e,0x74,0x73,0x74,0x61,0x72,0x74,0x65,0x72,0x73,3,0x63,0x66,0x65,0x72,0x69, +0x98,0x72,0x19,0x61,0x69,0x6c,0x63,0x61,0x6e,0x6f,0x6e,0x69,0x63,0x1f,0x61,0x6c, +0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,0x11, +0xd8,0x40,0xa,0x11,0x63,0x63,0xc3,0x11,0x11,0x72,0x6d,0x58,0x1e,0x69,0x6e,0x61, +0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,0x1d,0x74,0x6c, +0x65,0x63,0x61,0x73,0x65,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,0xa,0x6d, +0x42,0x6e,0x48,0x70,0xa2,0xda,0x71,0xa4,9,0x72,0x15,0x61,0x64,0x69,0x63,0x61, +0x6c,0x55,0x12,0x61,0x74,0x68,0x4f,6,0x6f,0x39,0x6f,0x32,0x74,0xc3,9,0x75, +0x54,0x76,0xd9,0x30,0,0x12,0x6e,0x63,0x68,0x1f,0x61,0x72,0x61,0x63,0x74,0x65, +0x72,0x63,0x6f,0x64,0x65,0x70,0x6f,0x69,0x6e,0x74,0x51,0x14,0x6d,0x65,0x72,0x69, +0x63,1,0x74,0x32,0x76,0x13,0x61,0x6c,0x75,0x65,0xd9,0x30,0,0x12,0x79,0x70, +0x65,0xc3,9,0x61,0xa2,0x77,0x63,0xa2,0x82,0x66,2,0x63,0x98,0x64,0xa2,0x53, +0x6b,1,0x63,0x56,0x64,1,0x69,0x42,0x71,1,0x63,0xc3,0xd,0x75,0x17,0x69, +0x63,0x6b,0x63,0x68,0x65,0x63,0x6b,0xc3,0xd,0x13,0x6e,0x65,0x72,0x74,0x6d,1, +0x69,0x42,0x71,1,0x63,0xc3,0xf,0x75,0x17,0x69,0x63,0x6b,0x63,0x68,0x65,0x63, +0x6b,0xc3,0xf,0x13,0x6e,0x65,0x72,0x74,0x71,1,0x69,0x42,0x71,1,0x63,0xc3, +0xe,0x75,0x17,0x69,0x63,0x6b,0x63,0x68,0x65,0x63,0x6b,0xc3,0xe,0x13,0x6e,0x65, +0x72,0x74,0x6f,1,0x69,0x42,0x71,1,0x63,0xc3,0xc,0x75,0x17,0x69,0x63,0x6b, +0x63,0x68,0x65,0x63,0x6b,0xc3,0xc,0x13,0x6e,0x65,0x72,0x74,0x6b,0xd8,0x40,5, +1,0x31,0xd9,0x40,0xb,0x6d,0x10,0x65,0xd9,0x40,5,0x12,0x68,0x61,0x72,0x51, +1,0x61,0x2c,0x72,0x12,0x69,0x6e,0x74,0x7f,0x10,0x74,2,0x73,0x2c,0x74,0x30, +0x77,0x10,0x73,0x77,0x11,0x79,0x6e,0x75,0x12,0x65,0x72,0x6e,1,0x73,0x38,0x77, +0x18,0x68,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x77,0x14,0x79,0x6e,0x74,0x61, +0x78,0x75,1,0x6d,0x3c,0x75,0x1a,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0x6d,0x61, +0x72,0x6b,0x53,0x12,0x61,0x72,0x6b,0x53,0x66,0xc1,0xb9,0x69,0xc0,0xfd,0x69,0xa2, +0x6f,0x6a,0xa2,0xca,0x6c,4,0x62,0xc3,8,0x63,0x8c,0x65,0x98,0x69,0xa2,0x56, +0x6f,2,0x65,0x4b,0x67,0x4c,0x77,0x11,0x65,0x72,0x4c,0x13,0x63,0x61,0x73,0x65, +0x4c,0x16,0x6d,0x61,0x70,0x70,0x69,0x6e,0x67,0xd9,0x40,4,0x11,0x69,0x63,0x1f, +0x61,0x6c,0x6f,0x72,0x64,0x65,0x72,0x65,0x78,0x63,0x65,0x70,0x74,0x69,0x6f,0x6e, +0x4b,0xd8,0x40,4,0x11,0x63,0x63,0xc3,0x10,0x18,0x61,0x64,0x63,0x61,0x6e,0x6f, +0x6e,0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69,0x6e,0x67,0x63, +0x6c,0x61,0x73,0x73,0xc3,0x10,0x16,0x6e,0x65,0x62,0x72,0x65,0x61,0x6b,0xc3,8, +1,0x64,0x44,0x73,1,0x63,0xd9,0x40,3,0x6f,0x16,0x63,0x6f,0x6d,0x6d,0x65, +0x6e,0x74,0xd9,0x40,3,2,0x63,0x80,0x65,0x90,0x73,0x40,1,0x62,0x52,0x74, +0x46,1,0x61,0x40,0x72,0x1c,0x69,0x6e,0x61,0x72,0x79,0x6f,0x70,0x65,0x72,0x61, +0x74,0x6f,0x72,0x47,0x11,0x72,0x74,0x41,0x44,0x1c,0x69,0x6e,0x61,0x72,0x79,0x6f, +0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x45,0x3e,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75, +0x65,0x3f,0x10,0x6f,0x42,0x16,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x43,2,0x67, +0xc3,6,0x6f,0x26,0x74,0xc3,7,0x11,0x69,0x6e,1,0x63,0x4a,0x69,0x11,0x6e, +0x67,1,0x67,0x2e,0x74,0x12,0x79,0x70,0x65,0xc3,7,0x13,0x72,0x6f,0x75,0x70, +0xc3,6,0x48,0x15,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x49,0x66,0x86,0x67,0xa2,0x4a, +0x68,3,0x61,0x36,0x65,0x58,0x73,0x68,0x79,0x13,0x70,0x68,0x65,0x6e,0x3d,0x1f, +0x6e,0x67,0x75,0x6c,0x73,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x74,0x79,0x70,0x65, +0xc3,0xb,0x10,0x78,0x3a,0x14,0x64,0x69,0x67,0x69,0x74,0x3b,0x10,0x74,0xc3,0xb, +0x16,0x75,0x6c,0x6c,0x63,0x6f,0x6d,0x70,0x1f,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, +0x65,0x78,0x63,0x6c,0x75,0x73,0x69,0x6f,0x6e,0x33,2,0x63,0xa2,0x44,0x65,0xa2, +0x4b,0x72,3,0x61,0x34,0x62,0x84,0x65,0x8a,0x6c,0x12,0x69,0x6e,0x6b,0x39,0x11, +0x70,0x68,0x7c,0x12,0x65,0x6d,0x65,3,0x62,0x5e,0x63,0x30,0x65,0x48,0x6c,0x12, +0x69,0x6e,0x6b,0x39,0x1a,0x6c,0x75,0x73,0x74,0x65,0x72,0x62,0x72,0x65,0x61,0x6b, +0xc3,0x12,0x14,0x78,0x74,0x65,0x6e,0x64,0x37,0x12,0x61,0x73,0x65,0x35,0x11,0x78, +0x74,0x37,0xc2,5,1,0x62,0xc3,0x12,0x6d,0xd9,0x20,0,0x1c,0x6e,0x65,0x72, +0x61,0x6c,0x63,0x61,0x74,0x65,0x67,0x6f,0x72,0x79,0xc2,5,0x13,0x6d,0x61,0x73, +0x6b,0xd9,0x20,0,0x61,0xa2,0x50,0x62,0xa2,0x7e,0x63,0xa2,0xf0,0x64,0xa4,0xbd, +0x65,2,0x61,0x3a,0x6d,0x58,0x78,0x10,0x74,0x30,0x14,0x65,0x6e,0x64,0x65,0x72, +0x31,0xc2,4,0x1b,0x73,0x74,0x61,0x73,0x69,0x61,0x6e,0x77,0x69,0x64,0x74,0x68, +0xc3,4,0x12,0x6f,0x6a,0x69,0x92,1,0x6d,0x3c,0x70,0x1a,0x72,0x65,0x73,0x65, +0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x95,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72, +0x96,0x13,0x62,0x61,0x73,0x65,0x99,3,0x67,0x44,0x68,0x4a,0x6c,0x4e,0x73,0x1a, +0x63,0x69,0x69,0x68,0x65,0x78,0x64,0x69,0x67,0x69,0x74,0x23,0x10,0x65,0xd9,0x40, +0,0x11,0x65,0x78,0x23,1,0x6e,0x38,0x70,0x11,0x68,0x61,0x20,0x14,0x62,0x65, +0x74,0x69,0x63,0x21,0x11,0x75,0x6d,0x79,4,0x63,0xc3,0,0x69,0x3e,0x6c,0xa2, +0x57,0x6d,0xa2,0x64,0x70,1,0x62,0xd9,0x40,0xd,0x74,0xc3,0x15,0x11,0x64,0x69, +2,0x63,0x54,0x6d,0x74,0x70,0x1b,0x61,0x69,0x72,0x65,0x64,0x62,0x72,0x61,0x63, +0x6b,0x65,0x74,0xd8,0x40,0xd,0x13,0x74,0x79,0x70,0x65,0xc3,0x15,0x24,1,0x6c, +0x30,0x6f,0x14,0x6e,0x74,0x72,0x6f,0x6c,0x25,0x12,0x61,0x73,0x73,0xc3,0,0x26, +0x14,0x69,0x72,0x72,0x6f,0x72,1,0x65,0x38,0x69,0x16,0x6e,0x67,0x67,0x6c,0x79, +0x70,0x68,0xd9,0x40,1,0x10,0x64,0x27,2,0x61,0x32,0x6b,0xc3,1,0x6f,0x11, +0x63,0x6b,0xc3,1,0x11,0x6e,0x6b,0x7b,0x10,0x67,0xd9,0x40,1,6,0x68,0x7c, +0x68,0x54,0x69,0x85,0x6f,0xa2,0x6f,0x77,4,0x63,0x30,0x6b,0x36,0x6c,0x87,0x74, +0x8b,0x75,0x89,1,0x66,0x8d,0x6d,0x8f,0x11,0x63,0x66,0x91,0x18,0x61,0x6e,0x67, +0x65,0x73,0x77,0x68,0x65,0x6e,4,0x63,0x44,0x6c,0x6c,0x6e,0x7e,0x74,0x98,0x75, +0x18,0x70,0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x64,0x89,0x12,0x61,0x73,0x65,1, +0x66,0x30,0x6d,0x14,0x61,0x70,0x70,0x65,0x64,0x8f,0x14,0x6f,0x6c,0x64,0x65,0x64, +0x8d,0x18,0x6f,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x64,0x87,0x1c,0x66,0x6b,0x63, +0x63,0x61,0x73,0x65,0x66,0x6f,0x6c,0x64,0x65,0x64,0x91,0x18,0x69,0x74,0x6c,0x65, +0x63,0x61,0x73,0x65,0x64,0x8b,0x13,0x6d,0x70,0x65,0x78,0x33,0x61,0x2e,0x63,0xa2, +0x48,0x66,0xd9,0x40,2,1,0x6e,0x72,0x73,0x10,0x65,3,0x64,0x83,0x66,0x3a, +0x69,0x4a,0x73,0x17,0x65,0x6e,0x73,0x69,0x74,0x69,0x76,0x65,0x65,0x15,0x6f,0x6c, +0x64,0x69,0x6e,0x67,0xd9,0x40,2,0x17,0x67,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65, +0x85,0x13,0x6f,0x6e,0x69,0x63,0x1f,0x61,0x6c,0x63,0x6f,0x6d,0x62,0x69,0x6e,0x69, +0x6e,0x67,0x63,0x6c,0x61,0x73,0x73,0xc3,2,0x10,0x63,0xc3,2,3,0x61,0x30, +0x65,0x34,0x69,0xa2,0x41,0x74,0xc3,3,0x11,0x73,0x68,0x29,2,0x63,0x3a,0x66, +0x58,0x70,0x2c,0x16,0x72,0x65,0x63,0x61,0x74,0x65,0x64,0x2d,0x1d,0x6f,0x6d,0x70, +0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x74,0x79,0x70,0x65,0xc3,3,0x15,0x61,0x75, +0x6c,0x74,0x69,0x67,0x1f,0x6e,0x6f,0x72,0x61,0x62,0x6c,0x65,0x63,0x6f,0x64,0x65, +0x70,0x6f,0x69,0x6e,0x74,0x2b,0x2a,0x10,0x61,0x2e,0x15,0x63,0x72,0x69,0x74,0x69, +0x63,0x2f,3,0x66,0x34,0x6e,0x3e,0x74,0x42,0x79,0x22,0x11,0x65,0x73,0x23,0x20, +0x13,0x61,0x6c,0x73,0x65,0x21,0x20,0x10,0x6f,0x21,0x22,0x12,0x72,0x75,0x65,0x23, +0xa,0x6b,0x5b,0x6f,0x23,0x6f,0x3c,0x72,0x4c,0x76,1,0x69,0x24,0x72,0x33,0x13, +0x72,0x61,0x6d,0x61,0x33,0x10,0x76,0x22,0x14,0x65,0x72,0x6c,0x61,0x79,0x23,0xa2, +0xe2,0x13,0x69,0x67,0x68,0x74,0xa3,0xe2,0x6b,0x58,0x6c,0x74,0x6e,3,0x6b,0x2f, +0x6f,0x30,0x72,0x21,0x75,0x12,0x6b,0x74,0x61,0x2f,0x19,0x74,0x72,0x65,0x6f,0x72, +0x64,0x65,0x72,0x65,0x64,0x21,1,0x61,0x24,0x76,0x31,0x18,0x6e,0x61,0x76,0x6f, +0x69,0x63,0x69,0x6e,0x67,0x31,0xa2,0xe0,0x12,0x65,0x66,0x74,0xa3,0xe0,0x61,0x5c, +0x62,0xa2,0x77,0x63,0xa2,0x96,0x64,0xa4,0xa,0x69,1,0x6f,0x26,0x73,0xa3,0xf0, +0x1a,0x74,0x61,0x73,0x75,0x62,0x73,0x63,0x72,0x69,0x70,0x74,0xa3,0xf0,0xa2,0xe6, +3,0x62,0xa0,0x6c,0xa3,0xe4,0x72,0xa3,0xe8,0x74,2,0x61,0x74,0x62,0x7c,0x74, +0x14,0x61,0x63,0x68,0x65,0x64,1,0x61,0x3e,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa2, +0xca,0x13,0x6c,0x65,0x66,0x74,0xa3,0xc8,0x13,0x62,0x6f,0x76,0x65,0xa2,0xd6,0x14, +0x72,0x69,0x67,0x68,0x74,0xa3,0xd8,0xa2,0xd6,0x10,0x72,0xa3,0xd8,0xa2,0xca,0x10, +0x6c,0xa3,0xc8,0x12,0x6f,0x76,0x65,0xa2,0xe6,1,0x6c,0x30,0x72,0x13,0x69,0x67, +0x68,0x74,0xa3,0xe8,0x12,0x65,0x66,0x74,0xa3,0xe4,0xa2,0xdc,2,0x65,0x2c,0x6c, +0xa3,0xda,0x72,0xa3,0xde,0x12,0x6c,0x6f,0x77,0xa2,0xdc,1,0x6c,0x30,0x72,0x13, +0x69,0x67,0x68,0x74,0xa3,0xde,0x12,0x65,0x66,0x74,0xa3,0xda,0x11,0x63,0x63,4, +0x31,0x3c,0x32,0xa2,0x42,0x33,0xa2,0x56,0x38,0xa2,0x64,0x39,0x10,0x31,0xa3,0x5b, +9,0x35,0xa,0x35,0x3f,0x36,0x41,0x37,0x43,0x38,0x45,0x39,0x47,0x30,0x30,0x31, +0x3c,0x32,0x42,0x33,0x4e,0x34,0x3d,0x34,1,0x33,0xa3,0x67,0x37,0xa3,0x6b,0x36, +0x10,0x38,0xa3,0x76,0x38,1,0x32,0xa3,0x7a,0x39,0xa3,0x81,0x3a,2,0x30,0xa3, +0x82,0x32,0xa3,0x84,0x33,0xa3,0x85,9,0x35,0xa,0x35,0x53,0x36,0x55,0x37,0x57, +0x38,0x59,0x39,0x5b,0x30,0x49,0x31,0x4b,0x32,0x4d,0x33,0x4f,0x34,0x51,6,0x33, +8,0x33,0x63,0x34,0x65,0x35,0x67,0x36,0x69,0x30,0x5d,0x31,0x5f,0x32,0x61,0x10, +0x34,0xa3,0x54,2,0x61,0xa3,0xea,0x62,0xa3,0xe9,0x6f,0x13,0x75,0x62,0x6c,0x65, +1,0x61,0x30,0x62,0x13,0x65,0x6c,0x6f,0x77,0xa3,0xe9,0x13,0x62,0x6f,0x76,0x65, +0xa3,0xea,0xb,0x6e,0xc0,0xca,0x72,0x5f,0x72,0x46,0x73,0xa2,0x48,0x77,1,0x68, +0x24,0x73,0x33,0x17,0x69,0x74,0x65,0x73,0x70,0x61,0x63,0x65,0x33,0x22,1,0x69, +0x30,0x6c,2,0x65,0x3d,0x69,0x4b,0x6f,0x3f,0x18,0x67,0x68,0x74,0x74,0x6f,0x6c, +0x65,0x66,0x74,0x22,2,0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65,0x72,0x72,0x69, +0x64,0x65,0x3f,0x17,0x6d,0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x3d,0x15,0x73,0x6f, +0x6c,0x61,0x74,0x65,0x4b,0x30,0x1e,0x65,0x67,0x6d,0x65,0x6e,0x74,0x73,0x65,0x70, +0x61,0x72,0x61,0x74,0x6f,0x72,0x31,0x6e,0xa2,0x41,0x6f,0xa2,0x53,0x70,2,0x61, +0x66,0x64,0x86,0x6f,0x1b,0x70,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x6f,0x6e,0x61, +0x6c,1,0x66,0x32,0x69,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x4d,0x14,0x6f,0x72, +0x6d,0x61,0x74,0x41,0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61, +0x72,0x61,0x74,0x6f,0x72,0x2f,1,0x66,0x41,0x69,0x4d,1,0x6f,0x28,0x73,0x10, +0x6d,0x43,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x43, +1,0x6e,0x35,0x74,0x19,0x68,0x65,0x72,0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x35, +0x65,0x88,0x65,0x98,0x66,0xa2,0x6a,0x6c,0x20,1,0x65,0x30,0x72,2,0x65,0x37, +0x69,0x49,0x6f,0x39,0x18,0x66,0x74,0x74,0x6f,0x72,0x69,0x67,0x68,0x74,0x20,2, +0x65,0x38,0x69,0x48,0x6f,0x16,0x76,0x65,0x72,0x72,0x69,0x64,0x65,0x39,0x17,0x6d, +0x62,0x65,0x64,0x64,0x69,0x6e,0x67,0x37,0x15,0x73,0x6f,0x6c,0x61,0x74,0x65,0x49, +3,0x6e,0x25,0x73,0x27,0x74,0x29,0x75,0x15,0x72,0x6f,0x70,0x65,0x61,0x6e,2, +0x6e,0x3c,0x73,0x46,0x74,0x18,0x65,0x72,0x6d,0x69,0x6e,0x61,0x74,0x6f,0x72,0x29, +0x14,0x75,0x6d,0x62,0x65,0x72,0x25,0x17,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72, +0x27,1,0x69,0x28,0x73,0x10,0x69,0x47,0x1f,0x72,0x73,0x74,0x73,0x74,0x72,0x6f, +0x6e,0x67,0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0x47,0x61,0x4e,0x62,0x84,0x63,1, +0x6f,0x24,0x73,0x2d,0x1c,0x6d,0x6d,0x6f,0x6e,0x73,0x65,0x70,0x61,0x72,0x61,0x74, +0x6f,0x72,0x2d,2,0x6c,0x3b,0x6e,0x2b,0x72,0x13,0x61,0x62,0x69,0x63,1,0x6c, +0x30,0x6e,0x14,0x75,0x6d,0x62,0x65,0x72,0x2b,0x14,0x65,0x74,0x74,0x65,0x72,0x3b, +0x2e,1,0x6e,0x45,0x6f,0x1c,0x75,0x6e,0x64,0x61,0x72,0x79,0x6e,0x65,0x75,0x74, +0x72,0x61,0x6c,0x45,0,0x15,0x6d,0xc7,0x81,0x73,0xc3,0x8b,0x76,0x9c,0x76,0x92, +0x77,0xa2,0x8b,0x79,0x10,0x69,2,0x6a,0x3c,0x72,0x68,0x73,0x17,0x79,0x6c,0x6c, +0x61,0x62,0x6c,0x65,0x73,0xa3,0x48,0x12,0x69,0x6e,0x67,0xa2,0x74,0x1e,0x68,0x65, +0x78,0x61,0x67,0x72,0x61,0x6d,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x74,0x16, +0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0xa3,0x49,2,0x61,0x36,0x65,0x7a,0x73,0xa2, +0x6c,0x12,0x73,0x75,0x70,0xa3,0x7d,1,0x69,0xa3,0x9f,0x72,0x1e,0x69,0x61,0x74, +0x69,0x6f,0x6e,0x73,0x65,0x6c,0x65,0x63,0x74,0x6f,0x72,0x73,0xa2,0x6c,0x19,0x73, +0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x7d,1,0x64,0x3c,0x72,0x19, +0x74,0x69,0x63,0x61,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x91,0x14,0x69,0x63,0x65, +0x78,0x74,0xa2,0xaf,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0xaf,0x18,0x61, +0x72,0x61,0x6e,0x67,0x63,0x69,0x74,0x69,0xa3,0xfc,0x73,0xa2,0x4b,0x74,0xa6,0x2b, +0x75,2,0x63,0x82,0x67,0x92,0x6e,0x1f,0x69,0x66,0x69,0x65,0x64,0x63,0x61,0x6e, +0x61,0x64,0x69,0x61,0x6e,0x61,0x62,0x6f,0x1f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c, +0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73,0x62,0x17,0x65,0x78,0x74,0x65,0x6e, +0x64,0x65,0x64,0xa3,0xad,0x11,0x61,0x73,0x62,0x12,0x65,0x78,0x74,0xa3,0xad,0x15, +0x61,0x72,0x69,0x74,0x69,0x63,0xa3,0x78,7,0x6f,0xc1,0x5b,0x6f,0x54,0x70,0x68, +0x75,0xa2,0x43,0x79,1,0x6c,0x2c,0x72,0x12,0x69,0x61,0x63,0x3b,0x17,0x6f,0x74, +0x69,0x6e,0x61,0x67,0x72,0x69,0xa3,0x8f,0x18,0x72,0x61,0x73,0x6f,0x6d,0x70,0x65, +0x6e,0x67,0xa3,0xda,1,0x61,0x32,0x65,0x14,0x63,0x69,0x61,0x6c,0x73,0xa3,0x56, +0x12,0x63,0x69,0x6e,0x1f,0x67,0x6d,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x6c,0x65, +0x74,0x74,0x65,0x72,0x73,0x2d,2,0x6e,0x48,0x70,0x76,0x74,0x1d,0x74,0x6f,0x6e, +0x73,0x69,0x67,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa5,6,0x15,0x64,0x61, +0x6e,0x65,0x73,0x65,0xa2,0x9b,0x12,0x73,0x75,0x70,0xa2,0xdb,0x16,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa3,0xdb,4,0x61,0xa2,0xa8,0x65,0x5c,0x6d,0x9e,0x70,0xa2, +0x4b,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f,0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63, +0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa5,5,0x10,0x72,1,0x61,0x4e,0x73, +0x12,0x63,0x72,0x69,0x1f,0x70,0x74,0x73,0x61,0x6e,0x64,0x73,0x75,0x62,0x73,0x63, +0x72,0x69,0x70,0x74,0x73,0x73,0x14,0x6e,0x64,0x73,0x75,0x62,0x73,0x1b,0x61,0x74, +0x68,0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,1,0x6c,0x40,0x75, +1,0x61,0x6e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x15, +0x65,0x6d,0x65,0x6e,0x74,0x61,1,0x6c,0x50,0x72,0x1e,0x79,0x70,0x72,0x69,0x76, +0x61,0x74,0x65,0x75,0x73,0x65,0x61,0x72,0x65,0x61,1,0x61,0xa3,0x6d,0x62,0xa3, +0x6e,3,0x61,0x5c,0x6d,0x78,0x70,0xa2,0x41,0x73,0x13,0x79,0x6d,0x62,0x6f,0x1f, +0x6c,0x73,0x61,0x6e,0x64,0x70,0x69,0x63,0x74,0x6f,0x67,0x72,0x61,0x70,0x68,0x73, +0xa5,5,0x14,0x72,0x72,0x6f,0x77,0x73,2,0x61,0xa3,0x67,0x62,0xa3,0x68,0x63, +0xa3,0xfa,0x13,0x61,0x74,0x68,0x65,0x1f,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x6f, +0x70,0x65,0x72,0x61,0x74,0x6f,0x72,0x73,0xa3,0x6a,0x19,0x75,0x6e,0x63,0x74,0x75, +0x61,0x74,0x69,0x6f,0x6e,0xa3,0x8e,0x61,0x5a,0x68,0x84,0x69,0xa2,0x5b,0x6d,0x16, +0x61,0x6c,0x6c,0x66,0x6f,0x72,0x6d,1,0x73,0xa3,0x54,0x76,0x16,0x61,0x72,0x69, +0x61,0x6e,0x74,0x73,0xa3,0x54,1,0x6d,0x36,0x75,0x16,0x72,0x61,0x73,0x68,0x74, +0x72,0x61,0xa3,0xa1,0x15,0x61,0x72,0x69,0x74,0x61,0x6e,0xa3,0xac,1,0x61,0x52, +0x6f,0x13,0x72,0x74,0x68,0x61,0x1f,0x6e,0x64,0x66,0x6f,0x72,0x6d,0x61,0x74,0x63, +0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x73,0xa3,0xf7,1,0x72,0x2e,0x76,0x12,0x69,0x61, +0x6e,0xa3,0x79,0x12,0x61,0x64,0x61,0xa3,0xd9,1,0x64,0x50,0x6e,0x13,0x68,0x61, +0x6c,0x61,0x50,0x1d,0x61,0x72,0x63,0x68,0x61,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65, +0x72,0x73,0xa3,0xf9,0x13,0x64,0x68,0x61,0x6d,0xa3,0xf8,4,0x61,0x68,0x65,0xa2, +0x8a,0x68,0xa2,0x8d,0x69,0xa2,0x95,0x72,0x1c,0x61,0x6e,0x73,0x70,0x6f,0x72,0x74, +0x61,0x6e,0x64,0x6d,0x61,0x70,0xa2,0xcf,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73, +0xa3,0xcf,4,0x67,0x58,0x69,0x7e,0x6b,0xa2,0x58,0x6d,0xa2,0x5a,0x6e,0x12,0x67, +0x75,0x74,0xa4,0x10,0x19,0x63,0x6f,0x6d,0x70,0x6f,0x6e,0x65,0x6e,0x74,0x73,0xa5, +0x11,2,0x61,0x2a,0x62,0x32,0x73,0xa3,0x60,0x12,0x6c,0x6f,0x67,0xa3,0x62,0x13, +0x61,0x6e,0x77,0x61,0xa3,0x65,3,0x6c,0x52,0x74,0x56,0x76,0x5e,0x78,0x16,0x75, +0x61,0x6e,0x6a,0x69,0x6e,0x67,0xa2,0x7c,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73, +0xa3,0x7c,0x10,0x65,0xa3,0x70,0x12,0x68,0x61,0x6d,0xa3,0xae,0x12,0x69,0x65,0x74, +0xa3,0xb7,0x11,0x72,0x69,0xa3,0xdc,0x11,0x69,0x6c,0x49,0x13,0x6c,0x75,0x67,0x75, +0x4b,0x10,0x61,1,0x61,0x24,0x69,0x53,0x11,0x6e,0x61,0x3d,2,0x62,0x34,0x66, +0x3c,0x72,0x13,0x68,0x75,0x74,0x61,0xa3,0xfb,0x13,0x65,0x74,0x61,0x6e,0x57,0x14, +0x69,0x6e,0x61,0x67,0x68,0xa3,0x90,0x6d,0x84,0x6e,0xa6,0x34,0x6f,0xa6,0x6d,0x70, +0xa8,0x29,0x72,1,0x65,0x5c,0x75,1,0x6d,0x2a,0x6e,0x11,0x69,0x63,0x67,0x10, +0x69,0xa2,0xc0,0x1d,0x6e,0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f, +0x6c,0x73,0xa3,0xc0,0x13,0x6a,0x61,0x6e,0x67,0xa3,0xa3,6,0x6f,0x86,0x6f,0x6c, +0x72,0xa2,0x61,0x75,0xa2,0x62,0x79,0x14,0x61,0x6e,0x6d,0x61,0x72,0x58,0x12,0x65, +0x78,0x74,2,0x61,0xa3,0xb6,0x62,0xa3,0xee,0x65,0x13,0x6e,0x64,0x65,0x64,1, +0x61,0xa3,0xb6,0x62,0xa3,0xee,1,0x64,0x52,0x6e,0x15,0x67,0x6f,0x6c,0x69,0x61, +0x6e,0x6a,0x12,0x73,0x75,0x70,0xa4,0xd,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74, +0xa5,0xd,0x10,0x69,0xa2,0xec,0x13,0x66,0x69,0x65,0x72,1,0x6c,0x3c,0x74,0x19, +0x6f,0x6e,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0xa3,0x8a,0x15,0x65,0x74,0x74, +0x65,0x72,0x73,0x2d,0x10,0x6f,0xa3,0xed,1,0x6c,0x44,0x73,0x11,0x69,0x63,0xa2, +0x5c,0x18,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5c,0x13,0x74,0x61, +0x6e,0x69,0xa5,3,0x61,0xa2,0x9b,0x65,0xa4,0x29,0x69,1,0x61,0xa2,0x8f,0x73, +0x10,0x63,5,0x70,0x18,0x70,0xa2,0x71,0x73,0x36,0x74,0x17,0x65,0x63,0x68,0x6e, +0x69,0x63,0x61,0x6c,0x81,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x8f,0x61,0xa2,0x66, +0x65,0x46,0x6d,0x19,0x61,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,1,0x61, +0xa3,0x66,0x62,0xa3,0x69,0x17,0x6c,0x6c,0x61,0x6e,0x65,0x6f,0x75,0x73,2,0x6d, +0x3a,0x73,0x6c,0x74,0x17,0x65,0x63,0x68,0x6e,0x69,0x63,0x61,0x6c,0x81,0x11,0x61, +0x74,0x1f,0x68,0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f, +0x6c,0x73,1,0x61,0xa3,0x66,0x62,0xa3,0x69,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73, +0x8e,0x12,0x61,0x6e,0x64,1,0x61,0x3c,0x70,0x19,0x69,0x63,0x74,0x6f,0x67,0x72, +0x61,0x70,0x68,0x73,0xa3,0xcd,0x14,0x72,0x72,0x6f,0x77,0x73,0xa3,0x73,0x10,0x6f, +0xa3,0xd8,4,0x68,0xa2,0x52,0x6c,0xa2,0x68,0x6e,0xa2,0x6d,0x72,0xa2,0x7d,0x74, +0x10,0x68,2,0x61,0x3a,0x65,0x4a,0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72, +0x73,0x7f,0x16,0x6c,0x70,0x68,0x61,0x6e,0x75,0x6d,0xa3,0x5d,0x16,0x6d,0x61,0x74, +0x69,0x63,0x61,0x6c,1,0x61,0x36,0x6f,0x17,0x70,0x65,0x72,0x61,0x74,0x6f,0x72, +0x73,0x7f,0x11,0x6c,0x70,0x1f,0x68,0x61,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x73, +0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5d,1,0x61,0x3e,0x6a,0x12,0x6f,0x6e,0x67, +0xa2,0xaa,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3,0xaa,0x13,0x6a,0x61,0x6e,0x69,0xa3, +0xe9,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x4f,1,0x64,0x34,0x69,0x15,0x63,0x68, +0x61,0x65,0x61,0x6e,0xa3,0xea,0x12,0x61,0x69,0x63,0xa3,0xc6,0x13,0x63,0x68,0x65, +0x6e,0xa5,0xc,2,0x65,0x66,0x6e,0x98,0x72,0x14,0x6f,0x69,0x74,0x69,0x63,1, +0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xd7, +0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0xd6,0x17,0x74,0x65,0x69,0x6d,0x61,0x79, +0x65,0x6b,0xa2,0xb8,0x12,0x65,0x78,0x74,0xa2,0xd5,0x16,0x65,0x6e,0x73,0x69,0x6f, +0x6e,0x73,0xa3,0xd5,0x18,0x64,0x65,0x6b,0x69,0x6b,0x61,0x6b,0x75,0x69,0xa3,0xeb, +5,0x6b,0x1b,0x6b,0x3c,0x6f,0x40,0x75,0x18,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72, +0x6d,0x73,0x7b,0x10,0x6f,0xa3,0x92,0x14,0x62,0x6c,0x6f,0x63,0x6b,0x21,0x61,0x44, +0x62,0x21,0x65,0x10,0x77,1,0x61,0xa5,0xe,0x74,0x14,0x61,0x69,0x6c,0x75,0x65, +0xa3,0x8b,0x16,0x62,0x61,0x74,0x61,0x65,0x61,0x6e,0xa3,0xef,5,0x70,0x4b,0x70, +0x46,0x72,0x7a,0x73,1,0x61,0x30,0x6d,0x13,0x61,0x6e,0x79,0x61,0xa3,0x7a,0x11, +0x67,0x65,0xa5,0xf,0x18,0x74,0x69,0x63,0x61,0x6c,0x63,0x68,0x61,0x72,0x1f,0x61, +0x63,0x74,0x65,0x72,0x72,0x65,0x63,0x6f,0x67,0x6e,0x69,0x74,0x69,0x6f,0x6e,0x85, +1,0x69,0x46,0x6e,0x1e,0x61,0x6d,0x65,0x6e,0x74,0x61,0x6c,0x64,0x69,0x6e,0x67, +0x62,0x61,0x74,0x73,0xa3,0xf2,0x11,0x79,0x61,0x47,0x63,0xa2,0x66,0x67,0xa2,0x66, +0x6c,1,0x63,0xa2,0x57,0x64,5,0x70,0x2d,0x70,0x36,0x73,0x56,0x74,0x14,0x75, +0x72,0x6b,0x69,0x63,0xa3,0xbf,0x11,0x65,0x72,1,0x6d,0x2e,0x73,0x12,0x69,0x61, +0x6e,0xa3,0x8c,0x11,0x69,0x63,0xa3,0xf1,0x1a,0x6f,0x75,0x74,0x68,0x61,0x72,0x61, +0x62,0x69,0x61,0x6e,0xa3,0xbb,0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68, +0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0xf0,0x17,0x75,0x6e,0x67,0x61,0x72,0x69, +0x61,0x6e,0xa5,4,0x14,0x74,0x61,0x6c,0x69,0x63,0xa3,0x58,0x13,0x68,0x69,0x6b, +0x69,0xa3,0x9d,0x10,0x72,0x85,0x12,0x68,0x61,0x6d,0x65,5,0x72,0x35,0x72,0x44, +0x73,0x64,0x75,1,0x61,0xa3,0x4e,0x6e,0x17,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0x71,0x17,0x69,0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xa2,0x4e,0x13,0x61,0x72, +0x65,0x61,0xa3,0x4e,0x1b,0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76, +0x69,0xa3,0xf6,0x61,0x40,0x68,0x82,0x6c,0x19,0x61,0x79,0x69,0x6e,0x67,0x63,0x61, +0x72,0x64,0x73,0xa3,0xcc,2,0x68,0x38,0x6c,0x4a,0x75,0x15,0x63,0x69,0x6e,0x68, +0x61,0x75,0xa3,0xf5,0x17,0x61,0x77,0x68,0x68,0x6d,0x6f,0x6e,0x67,0xa3,0xf3,0x15, +0x6d,0x79,0x72,0x65,0x6e,0x65,0xa3,0xf4,1,0x61,0x8e,0x6f,1,0x65,0x74,0x6e, +0x16,0x65,0x74,0x69,0x63,0x65,0x78,0x74,0xa2,0x72,1,0x65,0x2c,0x73,0x11,0x75, +0x70,0xa3,0x8d,0x15,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa2,0x72,0x19,0x73,0x75,0x70, +0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x8d,0x15,0x6e,0x69,0x63,0x69,0x61,0x6e, +0xa3,0x97,1,0x67,0x3e,0x69,0x13,0x73,0x74,0x6f,0x73,0xa2,0xa6,0x13,0x64,0x69, +0x73,0x63,0xa3,0xa6,0x12,0x73,0x70,0x61,0xa3,0x96,0x67,0xc3,0xb9,0x6a,0xc1,0x81, +0x6a,0xa2,0xc5,0x6b,0xa2,0xde,0x6c,4,0x61,0x54,0x65,0xa2,0x61,0x69,0xa2,0x78, +0x6f,0xa2,0xa7,0x79,1,0x63,0x2e,0x64,0x12,0x69,0x61,0x6e,0xa3,0xa9,0x12,0x69, +0x61,0x6e,0xa3,0xa7,1,0x6f,0x55,0x74,0x11,0x69,0x6e,1,0x31,0x82,0x65,0x11, +0x78,0x74,4,0x61,0x5c,0x62,0x29,0x63,0xa3,0x94,0x64,0xa3,0x95,0x65,0xa2,0xe7, +0x13,0x6e,0x64,0x65,0x64,4,0x61,0x36,0x62,0x29,0x63,0xa3,0x94,0x64,0xa3,0x95, +0x65,0xa3,0xe7,0x26,0x18,0x64,0x64,0x69,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x6d,0x24, +0x12,0x73,0x75,0x70,0x24,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x25,1,0x70, +0x42,0x74,0x1d,0x74,0x65,0x72,0x6c,0x69,0x6b,0x65,0x73,0x79,0x6d,0x62,0x6f,0x6c, +0x73,0x79,0x12,0x63,0x68,0x61,0xa3,0x9c,2,0x6d,0x2e,0x6e,0x34,0x73,0x10,0x75, +0xa3,0xb0,0x11,0x62,0x75,0xa3,0x6f,0x12,0x65,0x61,0x72,1,0x61,0xa3,0xe8,0x62, +1,0x69,0x38,0x73,0x17,0x79,0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,0x75,0x17, +0x64,0x65,0x6f,0x67,0x72,0x61,0x6d,0x73,0xa3,0x76,0x1a,0x77,0x73,0x75,0x72,0x72, +0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4d,0x10,0x61,1,0x6d,0x32,0x76,0x14,0x61, +0x6e,0x65,0x73,0x65,0xa3,0xb5,0x10,0x6f,0x5c,0x12,0x65,0x78,0x74,1,0x61,0xa3, +0xb4,0x62,0xa3,0xb9,1,0x61,0x80,0x68,3,0x61,0x3c,0x6d,0x4c,0x6f,0x64,0x75, +0x15,0x64,0x61,0x77,0x61,0x64,0x69,0xa3,0xe6,0x16,0x72,0x6f,0x73,0x68,0x74,0x68, +0x69,0xa3,0x89,0x11,0x65,0x72,0x68,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3, +0x71,0x12,0x6a,0x6b,0x69,0xa3,0xe5,3,0x69,0x38,0x6e,0x40,0x74,0x9c,0x79,0x13, +0x61,0x68,0x6c,0x69,0xa3,0xa2,0x12,0x74,0x68,0x69,0xa3,0xc1,3,0x61,0x34,0x62, +0x50,0x67,0x56,0x6e,0x12,0x61,0x64,0x61,0x4d,0x12,0x73,0x75,0x70,0xa2,0xcb,0x16, +0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xcb,0x11,0x75,0x6e,0xa3,0x42,0x11,0x78, +0x69,0x96,0x17,0x72,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0x97,0x14,0x61,0x6b,0x61, +0x6e,0x61,0x9e,1,0x65,0x4c,0x70,0x10,0x68,0x1f,0x6f,0x6e,0x65,0x74,0x69,0x63, +0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73,0xa3,0x6b,0x11,0x78,0x74,0xa3, +0x6b,0x67,0xa2,0xa3,0x68,0xa4,0x53,0x69,3,0x64,0x4c,0x6d,0xa2,0x55,0x6e,0xa2, +0x62,0x70,0x13,0x61,0x65,0x78,0x74,0x2a,0x16,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x73, +0x2b,1,0x63,0x99,0x65,0x17,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,1,0x64, +0x56,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa4,0xb,0x1d,0x61,0x6e,0x64,0x70, +0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa5,0xb,0x13,0x65,0x73,0x63, +0x72,0x1f,0x69,0x70,0x74,0x69,0x6f,0x6e,0x63,0x68,0x61,0x72,0x61,0x63,0x74,0x65, +0x72,0x73,0x99,0x1c,0x70,0x65,0x72,0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69, +0x63,0xa3,0xba,1,0x64,0x62,0x73,0x1b,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e, +0x61,0x6c,0x70,0x61,1,0x68,0x32,0x72,0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0xbd, +0x13,0x6c,0x61,0x76,0x69,0xa3,0xbe,0x1c,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72, +0x66,0x6f,0x72,0x6d,0x73,0xa3,0xb2,4,0x65,0x58,0x6c,0xa2,0x63,0x6f,0xa2,0x7b, +0x72,0xa2,0x7f,0x75,1,0x6a,0x30,0x72,0x14,0x6d,0x75,0x6b,0x68,0x69,0x43,0x14, +0x61,0x72,0x61,0x74,0x69,0x45,1,0x6e,0x8c,0x6f,1,0x6d,0x4e,0x72,0x13,0x67, +0x69,0x61,0x6e,0x5a,0x12,0x73,0x75,0x70,0xa2,0x87,0x16,0x70,0x6c,0x65,0x6d,0x65, +0x6e,0x74,0xa3,0x87,0x1a,0x65,0x74,0x72,0x69,0x63,0x73,0x68,0x61,0x70,0x65,0x73, +0x8c,0x12,0x65,0x78,0x74,0xa2,0xe3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0xe3,0x1e, +0x65,0x72,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x71, +0x17,0x61,0x67,0x6f,0x6c,0x69,0x74,0x69,0x63,0xa2,0x88,0x12,0x73,0x75,0x70,0xa4, +0xa,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa5,0xa,0x13,0x74,0x68,0x69,0x63, +0xa3,0x59,1,0x61,0x5c,0x65,0x11,0x65,0x6b,0x30,1,0x61,0x38,0x65,0x11,0x78, +0x74,0x6e,0x14,0x65,0x6e,0x64,0x65,0x64,0x6f,0x17,0x6e,0x64,0x63,0x6f,0x70,0x74, +0x69,0x63,0x31,0x13,0x6e,0x74,0x68,0x61,0xa3,0xe4,2,0x61,0xa2,0x48,0x65,0xa2, +0xcf,0x69,1,0x67,0x30,0x72,0x14,0x61,0x67,0x61,0x6e,0x61,0x9d,0x10,0x68,1, +0x70,0x3a,0x73,0x18,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4b,1, +0x72,0x3c,0x75,0x19,0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x73,0xa3,0x4c, +0x11,0x69,0x76,0x1f,0x61,0x74,0x65,0x75,0x73,0x65,0x73,0x75,0x72,0x72,0x6f,0x67, +0x61,0x74,0x65,0x73,0xa3,0x4c,2,0x6c,0x32,0x6e,0x9a,0x74,0x12,0x72,0x61,0x6e, +0xa5,2,0x10,0x66,2,0x61,0x58,0x6d,0x70,0x77,0x14,0x69,0x64,0x74,0x68,0x61, +0x1f,0x6e,0x64,0x66,0x75,0x6c,0x6c,0x77,0x69,0x64,0x74,0x68,0x66,0x6f,0x72,0x6d, +0x73,0xa3,0x57,0x1a,0x6e,0x64,0x66,0x75,0x6c,0x6c,0x66,0x6f,0x72,0x6d,0x73,0xa3, +0x57,0x13,0x61,0x72,0x6b,0x73,0xa3,0x52,1,0x67,0x2e,0x75,0x12,0x6e,0x6f,0x6f, +0xa3,0x63,0x11,0x75,0x6c,0xa2,0x4a,2,0x63,0x3c,0x6a,0x5e,0x73,0x17,0x79,0x6c, +0x6c,0x61,0x62,0x6c,0x65,0x73,0xa3,0x4a,0x1f,0x6f,0x6d,0x70,0x61,0x74,0x69,0x62, +0x69,0x6c,0x69,0x74,0x79,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x12,0x61,0x6d,0x6f,0x5c, +0x17,0x65,0x78,0x74,0x65,0x6e,0x64,0x65,0x64,1,0x61,0xa3,0xb4,0x62,0xa3,0xb9, +0x13,0x62,0x72,0x65,0x77,0x37,0x61,0xa2,0xe9,0x62,0xa6,0x29,0x63,0xa6,0xfe,0x64, +0xac,0x7b,0x65,5,0x6d,0xa2,0x6d,0x86,0x6e,0x96,0x74,0x15,0x68,0x69,0x6f,0x70, +0x69,0x63,0x5e,1,0x65,0x40,0x73,0x11,0x75,0x70,0xa2,0x86,0x16,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa3,0x86,0x11,0x78,0x74,0xa2,0x85,1,0x61,0xa3,0xc8,0x65, +0x13,0x6e,0x64,0x65,0x64,0xa2,0x85,0x10,0x61,0xa3,0xc8,0x16,0x6f,0x74,0x69,0x63, +0x6f,0x6e,0x73,0xa3,0xce,0x15,0x63,0x6c,0x6f,0x73,0x65,0x64,2,0x61,0x5a,0x63, +0x9e,0x69,0x1c,0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x73,0x75,0x70, +0xa2,0xc4,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc4,0x16,0x6c,0x70,0x68, +0x61,0x6e,0x75,0x6d,0x86,1,0x65,0x2c,0x73,0x11,0x75,0x70,0xa3,0xc3,0x13,0x72, +0x69,0x63,0x73,0x86,0x18,0x75,0x70,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xc3, +0x11,0x6a,0x6b,0xa2,0x44,0x1f,0x6c,0x65,0x74,0x74,0x65,0x72,0x73,0x61,0x6e,0x64, +0x6d,0x6f,0x6e,0x74,0x68,0x73,0xa3,0x44,0x61,0x36,0x67,0x62,0x6c,0x14,0x62,0x61, +0x73,0x61,0x6e,0xa3,0xe2,0x13,0x72,0x6c,0x79,0x64,0x1f,0x79,0x6e,0x61,0x73,0x74, +0x69,0x63,0x63,0x75,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa5,1,0x10,0x79,0x1f, +0x70,0x74,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73, +0xa3,0xc2,7,0x6e,0xc0,0xe5,0x6e,0x3e,0x72,0xa2,0x5d,0x73,0xa2,0xd8,0x76,0x14, +0x65,0x73,0x74,0x61,0x6e,0xa3,0xbc,1,0x61,0x92,0x63,0x13,0x69,0x65,0x6e,0x74, +1,0x67,0x34,0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xa5,0x13,0x72,0x65, +0x65,0x6b,1,0x6d,0x34,0x6e,0x15,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x7f,0x13, +0x75,0x73,0x69,0x63,0xa2,0x7e,0x19,0x61,0x6c,0x6e,0x6f,0x74,0x61,0x74,0x69,0x6f, +0x6e,0xa3,0x7e,0x10,0x74,0x1f,0x6f,0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f, +0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0xfe,2,0x61,0x32,0x6d,0xa2,0x71,0x72,0x12, +0x6f,0x77,0x73,0x7d,0x12,0x62,0x69,0x63,0x38,3,0x65,0x4a,0x6d,0x66,0x70,0xa2, +0x43,0x73,0x11,0x75,0x70,0xa2,0x80,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3, +0x80,0x11,0x78,0x74,1,0x61,0xa3,0xd2,0x65,0x14,0x6e,0x64,0x65,0x64,0x61,0xa3, +0xd2,0x12,0x61,0x74,0x68,0xa2,0xd3,0x18,0x65,0x6d,0x61,0x74,0x69,0x63,0x61,0x6c, +0x61,0x1f,0x6c,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x73,0x79,0x6d,0x62,0x6f, +0x6c,0x73,0xa3,0xd3,1,0x66,0x42,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74, +0x69,0x6f,0x6e,0x66,0x6f,0x72,0x6d,0x73,1,0x61,0xa3,0x51,0x62,0xa3,0x55,0x14, +0x65,0x6e,0x69,0x61,0x6e,0x35,0x12,0x63,0x69,0x69,0x23,0x64,0x9e,0x65,0xa2,0x42, +0x68,0xa2,0x4d,0x6c,1,0x63,0x62,0x70,0x17,0x68,0x61,0x62,0x65,0x74,0x69,0x63, +0x70,1,0x66,0xa3,0x50,0x72,0x1e,0x65,0x73,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f, +0x6e,0x66,0x6f,0x72,0x6d,0x73,0xa3,0x50,0x16,0x68,0x65,0x6d,0x69,0x63,0x61,0x6c, +0xa2,0xd0,0x16,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0xd0,0x12,0x6c,0x61,0x6d, +0xa5,7,0x1a,0x67,0x65,0x61,0x6e,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa3,0x77, +0x11,0x6f,0x6d,0xa3,0xfd,7,0x6f,0x71,0x6f,0x64,0x72,0xa2,0x41,0x75,0xa2,0x58, +0x79,0x1b,0x7a,0x61,0x6e,0x74,0x69,0x6e,0x65,0x6d,0x75,0x73,0x69,0x63,0xa2,0x5b, +0x18,0x61,0x6c,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0xa3,0x5b,1,0x70,0x34,0x78, +0x16,0x64,0x72,0x61,0x77,0x69,0x6e,0x67,0x89,0x14,0x6f,0x6d,0x6f,0x66,0x6f,0xa0, +0x12,0x65,0x78,0x74,0xa2,0x43,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0x43,0x10,0x61, +1,0x68,0x40,0x69,0x12,0x6c,0x6c,0x65,0x92,0x17,0x70,0x61,0x74,0x74,0x65,0x72, +0x6e,0x73,0x93,0x11,0x6d,0x69,0xa3,0xc9,1,0x67,0x2c,0x68,0x11,0x69,0x64,0xa3, +0x64,0x14,0x69,0x6e,0x65,0x73,0x65,0xa3,0x81,0x61,0x48,0x65,0xa2,0x4e,0x68,0xa2, +0x52,0x6c,0x1a,0x6f,0x63,0x6b,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x8b,3, +0x6c,0x34,0x6d,0x40,0x73,0x66,0x74,0x11,0x61,0x6b,0xa3,0xc7,0x14,0x69,0x6e,0x65, +0x73,0x65,0xa3,0x93,0x11,0x75,0x6d,0xa2,0xb1,0x12,0x73,0x75,0x70,0xa2,0xca,0x16, +0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0xca,1,0x69,0x30,0x73,0x13,0x61,0x76, +0x61,0x68,0xa3,0xdd,0x15,0x63,0x6c,0x61,0x74,0x69,0x6e,0x23,0x14,0x6e,0x67,0x61, +0x6c,0x69,0x41,0x16,0x61,0x69,0x6b,0x73,0x75,0x6b,0x69,0xa5,8,5,0x6f,0xc1, +0x4c,0x6f,0xa2,0x55,0x75,0xa4,0x10,0x79,1,0x70,0x9c,0x72,0x14,0x69,0x6c,0x6c, +0x69,0x63,0x32,1,0x65,0x4c,0x73,0x11,0x75,0x70,0xa2,0x61,0x16,0x70,0x6c,0x65, +0x6d,0x65,0x6e,0x74,0xa2,0x61,0x12,0x61,0x72,0x79,0xa3,0x61,0x11,0x78,0x74,3, +0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,9,0x65,0x13,0x6e,0x64,0x65,0x64,2, +0x61,0xa3,0x9e,0x62,0xa3,0xa0,0x63,0xa5,9,0x1c,0x72,0x69,0x6f,0x74,0x73,0x79, +0x6c,0x6c,0x61,0x62,0x61,0x72,0x79,0xa3,0x7b,3,0x6d,0x5a,0x6e,0xa2,0x95,0x70, +0xa2,0xa0,0x75,0x17,0x6e,0x74,0x69,0x6e,0x67,0x72,0x6f,0x64,0xa2,0x9a,0x17,0x6e, +0x75,0x6d,0x65,0x72,0x61,0x6c,0x73,0xa3,0x9a,2,0x62,0x3a,0x6d,0xa2,0x5f,0x70, +0x15,0x61,0x74,0x6a,0x61,0x6d,0x6f,0xa3,0x41,0x14,0x69,0x6e,0x69,0x6e,0x67,2, +0x64,0x46,0x68,0x9e,0x6d,0x1d,0x61,0x72,0x6b,0x73,0x66,0x6f,0x72,0x73,0x79,0x6d, +0x62,0x6f,0x6c,0x73,0x77,0x1e,0x69,0x61,0x63,0x72,0x69,0x74,0x69,0x63,0x61,0x6c, +0x6d,0x61,0x72,0x6b,0x73,0x2e,2,0x65,0x40,0x66,0xa6,0x1b,0x73,0x18,0x75,0x70, +0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x83,0x16,0x78,0x74,0x65,0x6e,0x64,0x65, +0x64,0xa3,0xe0,0x17,0x61,0x6c,0x66,0x6d,0x61,0x72,0x6b,0x73,0xa3,0x52,0x11,0x6f, +0x6e,0x1f,0x69,0x6e,0x64,0x69,0x63,0x6e,0x75,0x6d,0x62,0x65,0x72,0x66,0x6f,0x72, +0x6d,0x73,0xa3,0xb2,0x1b,0x74,0x72,0x6f,0x6c,0x70,0x69,0x63,0x74,0x75,0x72,0x65, +0x73,0x83,0x12,0x74,0x69,0x63,0xa2,0x84,0x1b,0x65,0x70,0x61,0x63,0x74,0x6e,0x75, +0x6d,0x62,0x65,0x72,0x73,0xa3,0xdf,1,0x6e,0x3e,0x72,0x1b,0x72,0x65,0x6e,0x63, +0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x75,0x15,0x65,0x69,0x66,0x6f,0x72,0x6d, +0xa2,0x98,0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0xa2,0x99,0x1d,0x61,0x6e,0x64, +0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xa3,0x99,0x61,0xa2,0xda, +0x68,0xa4,4,0x6a,0x10,0x6b,0xa2,0x47,4,0x63,0x8e,0x65,0xa2,0x81,0x72,0xa2, +0x91,0x73,0xa2,0xa3,0x75,0x1f,0x6e,0x69,0x66,0x69,0x65,0x64,0x69,0x64,0x65,0x6f, +0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x47,0x18,0x65,0x78,0x74,0x65,0x6e,0x73,0x69, +0x6f,0x6e,4,0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1,0x65, +0xa5,0,0x14,0x6f,0x6d,0x70,0x61,0x74,0xa2,0x45,1,0x66,0x96,0x69,1,0x62, +0x44,0x64,0x17,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x12,0x73,0x75, +0x70,0xa3,0x5f,0x14,0x69,0x6c,0x69,0x74,0x79,0xa2,0x45,1,0x66,0x54,0x69,0x18, +0x64,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x73,0xa2,0x4f,0x19,0x73,0x75,0x70,0x70, +0x6c,0x65,0x6d,0x65,0x6e,0x74,0xa3,0x5f,0x13,0x6f,0x72,0x6d,0x73,0xa3,0x53,0x11, +0x78,0x74,4,0x61,0xa3,0x46,0x62,0xa3,0x5e,0x63,0xa3,0xc5,0x64,0xa3,0xd1,0x65, +0xa5,0,0x19,0x61,0x64,0x69,0x63,0x61,0x6c,0x73,0x73,0x75,0x70,0x94,0x16,0x70, +0x6c,0x65,0x6d,0x65,0x6e,0x74,0x95,1,0x74,0x50,0x79,0x14,0x6d,0x62,0x6f,0x6c, +0x73,0x9a,0x1d,0x61,0x6e,0x64,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0x9b,0x14,0x72,0x6f,0x6b,0x65,0x73,0xa3,0x82,2,0x6e,0x48,0x72,0x64,0x75, +0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61,0x6e,0xa3, +0xde,0x1d,0x61,0x64,0x69,0x61,0x6e,0x73,0x79,0x6c,0x6c,0x61,0x62,0x69,0x63,0x73, +0x63,0x12,0x69,0x61,0x6e,0xa3,0xa8,1,0x61,0x50,0x65,0x14,0x72,0x6f,0x6b,0x65, +0x65,0x60,0x12,0x73,0x75,0x70,0xa2,0xff,0x16,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74, +0xa3,0xff,1,0x6b,0x26,0x6d,0xa3,0xa4,0x11,0x6d,0x61,0xa3,0xd4,3,0x65,0x3e, +0x69,0x7e,0x6f,0xa2,0x5d,0x75,0x15,0x70,0x6c,0x6f,0x79,0x61,0x6e,0xa3,0xe1,1, +0x73,0x50,0x76,0x16,0x61,0x6e,0x61,0x67,0x61,0x72,0x69,0x3e,0x12,0x65,0x78,0x74, +0xa2,0xb3,0x14,0x65,0x6e,0x64,0x65,0x64,0xa3,0xb3,0x13,0x65,0x72,0x65,0x74,0xa3, +0x5a,1,0x61,0x30,0x6e,0x14,0x67,0x62,0x61,0x74,0x73,0x91,0x18,0x63,0x72,0x69, +0x74,0x69,0x63,0x61,0x6c,0x73,0x2e,2,0x65,0x30,0x66,0x36,0x73,0x11,0x75,0x70, +0xa3,0x83,0x11,0x78,0x74,0xa3,0xe0,0x18,0x6f,0x72,0x73,0x79,0x6d,0x62,0x6f,0x6c, +0x73,0x77,0x13,0x6d,0x69,0x6e,0x6f,0xa2,0xab,0x14,0x74,0x69,0x6c,0x65,0x73,0xa3, +0xab,8,0x6d,0x5f,0x6d,0x3a,0x6e,0x48,0x73,0x7a,0x76,0xa2,0x4b,0x77,0x12,0x69, +0x64,0x65,0x43,0x11,0x65,0x64,0x32,0x12,0x69,0x61,0x6c,0x33,2,0x61,0x40,0x62, +0x37,0x6f,1,0x62,0x28,0x6e,0x10,0x65,0x21,0x13,0x72,0x65,0x61,0x6b,0x37,0x10, +0x72,0x34,0x12,0x72,0x6f,0x77,0x35,2,0x6d,0x38,0x71,0x46,0x75,1,0x62,0x3d, +0x70,0x3e,0x11,0x65,0x72,0x3f,1,0x61,0x24,0x6c,0x39,0x11,0x6c,0x6c,0x39,1, +0x72,0x3b,0x75,0x12,0x61,0x72,0x65,0x3b,0x12,0x65,0x72,0x74,0x40,0x13,0x69,0x63, +0x61,0x6c,0x41,0x63,0x58,0x65,0x92,0x66,0x96,0x69,1,0x6e,0x36,0x73,0x10,0x6f, +0x30,0x14,0x6c,0x61,0x74,0x65,0x64,0x31,0x11,0x69,0x74,0x2e,0x12,0x69,0x61,0x6c, +0x2f,2,0x61,0x36,0x69,0x48,0x6f,0x10,0x6d,0x24,0x12,0x70,0x61,0x74,0x25,0x10, +0x6e,0x22,0x15,0x6f,0x6e,0x69,0x63,0x61,0x6c,0x23,0x13,0x72,0x63,0x6c,0x65,0x27, +0x11,0x6e,0x63,0x27,2,0x69,0x3a,0x6f,0x44,0x72,0x10,0x61,0x2c,0x14,0x63,0x74, +0x69,0x6f,0x6e,0x2d,0x10,0x6e,0x28,0x11,0x61,0x6c,0x29,0x11,0x6e,0x74,0x2b,4, +0x61,0x3a,0x66,0x4c,0x68,0x5e,0x6e,0x70,0x77,0x2a,0x12,0x69,0x64,0x65,0x2b,0x22, +0x17,0x6d,0x62,0x69,0x67,0x75,0x6f,0x75,0x73,0x23,0x26,0x17,0x75,0x6c,0x6c,0x77, +0x69,0x64,0x74,0x68,0x27,0x24,0x17,0x61,0x6c,0x66,0x77,0x69,0x64,0x74,0x68,0x25, +0x20,1,0x61,0x30,0x65,0x14,0x75,0x74,0x72,0x61,0x6c,0x21,0x28,0x13,0x72,0x72, +0x6f,0x77,0x29,0xd,0x6e,0xc0,0xfb,0x73,0x6d,0x73,0x3a,0x74,0x98,0x75,0xa2,0x49, +0x7a,2,0x6c,0x3b,0x70,0x3d,0x73,0x39,5,0x6f,0x28,0x6f,0x57,0x70,0x34,0x75, +0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0x45,0x11,0x61,0x63,1,0x65,0x32,0x69, +0x15,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x31,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74, +0x6f,0x72,0x39,0x63,0x53,0x6b,0x55,0x6d,0x51,0x1d,0x69,0x74,0x6c,0x65,0x63,0x61, +0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x27,1,0x6e,0x40,0x70,0x1c,0x70,0x65, +0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x17,0x61,0x73,0x73, +0x69,0x67,0x6e,0x65,0x64,0x21,0x6e,0x8a,0x6f,0xa2,0x47,0x70,8,0x66,0x14,0x66, +0x5b,0x69,0x59,0x6f,0x4f,0x72,0x24,0x73,0x49,0x17,0x69,0x76,0x61,0x74,0x65,0x75, +0x73,0x65,0x43,0x61,0x2c,0x63,0x4d,0x64,0x47,0x65,0x4b,0x1f,0x72,0x61,0x67,0x72, +0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x3d,2,0x64,0x33, +0x6c,0x35,0x6f,0x36,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72, +0x6b,0x2d,1,0x70,0x7c,0x74,0x12,0x68,0x65,0x72,3,0x6c,0x38,0x6e,0x42,0x70, +0x4c,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x57,0x14,0x65,0x74,0x74,0x65,0x72,0x2b, +0x14,0x75,0x6d,0x62,0x65,0x72,0x37,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69, +0x6f,0x6e,0x4f,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0x49,0x66,0x9e,0x66,0x88,0x69,0xa2,0x4b,0x6c,0xa2,0x5c,0x6d,4,0x61,0x60, +0x63,0x31,0x65,0x2f,0x6e,0x2d,0x6f,0x15,0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c, +0x30,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c,0x55,0x14,0x65,0x74,0x74,0x65,0x72,0x29, +0x17,0x74,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x51,1,0x69,0x2e,0x6f,0x13,0x72, +0x6d,0x61,0x74,0x41,0x1d,0x6e,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74, +0x69,0x6f,0x6e,0x5b,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63, +0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x59,6,0x6d,0x18,0x6d,0x29,0x6f,0x28,0x74, +0x27,0x75,0x23,0x2a,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74, +0x65,0x72,0x25,0x65,0x28,0x69,0x3c,0x6c,0x25,0x19,0x74,0x74,0x65,0x72,0x6e,0x75, +0x6d,0x62,0x65,0x72,0x35,0x1a,0x6e,0x65,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f, +0x72,0x3b,0x63,0x44,0x64,0xa2,0x60,0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e, +0x67,0x6d,0x61,0x72,0x6b,0x2f,6,0x6e,0x39,0x6e,0x46,0x6f,0x4e,0x73,0x45,0x75, +0x1b,0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0x53,0x20,0x12, +0x74,0x72,0x6c,0x3f,0x42,0x10,0x6e,1,0x6e,0x2c,0x74,0x12,0x72,0x6f,0x6c,0x3f, +0x1f,0x65,0x63,0x74,0x6f,0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0x4d,0x63,0x3f,0x66,0x41,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63,0x74, +0x75,0x61,0x74,0x69,0x6f,0x6e,0x4b,2,0x61,0x30,0x65,0x4a,0x69,0x12,0x67,0x69, +0x74,0x33,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e, +0x47,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0x33,0,0x12, +0x6d,0xc1,0xec,0x73,0xa1,0x73,0x4e,0x74,0xa2,0x56,0x77,0xa2,0x72,0x79,0xa2,0x73, +0x7a,1,0x61,0x2c,0x68,0x12,0x61,0x69,0x6e,0x8b,0x11,0x69,0x6e,0x85,5,0x74, +0x22,0x74,0x38,0x77,0x4c,0x79,0x16,0x72,0x69,0x61,0x63,0x77,0x61,0x77,0x6f,0x18, +0x72,0x61,0x69,0x67,0x68,0x74,0x77,0x61,0x77,0xa3,0x55,0x15,0x61,0x73,0x68,0x6b, +0x61,0x66,0x6d,0x61,0x2e,0x65,0x38,0x68,0x11,0x69,0x6e,0x6b,0x10,0x64,0x62,0x11, +0x68,0x65,0x65,1,0x65,0x2e,0x6d,0x13,0x6b,0x61,0x74,0x68,0x69,0x10,0x6e,0x67, +1,0x61,0x4e,0x65,1,0x68,0x28,0x74,0x10,0x68,0x77,0x16,0x6d,0x61,0x72,0x62, +0x75,0x74,0x61,0x74,0x13,0x67,0x6f,0x61,0x6c,0x3d,1,0x68,0x71,0x77,0x73,0x11, +0x61,0x77,0x79,1,0x65,0x32,0x75,0x11,0x64,0x68,0x80,0x11,0x68,0x65,0x83,0x10, +0x68,0x7a,1,0x62,0x34,0x77,0x16,0x69,0x74,0x68,0x74,0x61,0x69,0x6c,0x7f,0x14, +0x61,0x72,0x72,0x65,0x65,0x7d,0x6d,0x6c,0x6e,0xa4,0x18,0x70,0xa4,0x35,0x71,0xa4, +0x35,0x72,1,0x65,0x38,0x6f,0x18,0x68,0x69,0x6e,0x67,0x79,0x61,0x79,0x65,0x68, +0x93,1,0x68,0x5f,0x76,0x16,0x65,0x72,0x73,0x65,0x64,0x70,0x65,0x61,2,0x61, +0x2e,0x65,0xa2,0xeb,0x69,0x10,0x6d,0x53,0x17,0x6e,0x69,0x63,0x68,0x61,0x65,0x61, +0x6e,0,0x12,0x6e,0x76,0x73,0x51,0x73,0x3e,0x74,0x5c,0x77,0xa0,0x79,0xa2,0x42, +0x7a,0x13,0x61,0x79,0x69,0x6e,0xa3,0x54,0x10,0x61,1,0x64,0x2e,0x6d,0x12,0x65, +0x6b,0x68,0xa3,0x4c,0x11,0x68,0x65,0xa3,0x4b,3,0x61,0x38,0x65,0x3c,0x68,0x4a, +0x77,0x13,0x65,0x6e,0x74,0x79,0xa3,0x51,0x10,0x77,0xa3,0x4d,1,0x6e,0xa3,0x4e, +0x74,0x10,0x68,0xa3,0x4f,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x50,0x11,0x61,0x77, +0xa3,0x52,0x12,0x6f,0x64,0x68,0xa3,0x53,0x6e,0x3a,0x6f,0x40,0x70,0x46,0x71,0x4a, +0x72,0x12,0x65,0x73,0x68,0xa3,0x4a,0x11,0x75,0x6e,0xa3,0x46,0x11,0x6e,0x65,0xa3, +0x47,0x10,0x65,0xa3,0x48,0x12,0x6f,0x70,0x68,0xa3,0x49,0x67,0x33,0x67,0x38,0x68, +0x40,0x6b,0x5e,0x6c,0x66,0x6d,0x11,0x65,0x6d,0xa3,0x45,0x13,0x69,0x6d,0x65,0x6c, +0xa1,1,0x65,0x32,0x75,0x14,0x6e,0x64,0x72,0x65,0x64,0xa3,0x42,0x11,0x74,0x68, +0xa3,0x41,0x12,0x61,0x70,0x68,0xa3,0x43,0x14,0x61,0x6d,0x65,0x64,0x68,0xa3,0x44, +0x61,0x34,0x62,0x4a,0x64,0x50,0x66,0x12,0x69,0x76,0x65,0x9f,1,0x6c,0x2a,0x79, +0x11,0x69,0x6e,0x97,0x12,0x65,0x70,0x68,0x95,0x12,0x65,0x74,0x68,0x99,1,0x61, +0x30,0x68,0x14,0x61,0x6d,0x65,0x64,0x68,0x9d,0x13,0x6c,0x65,0x74,0x68,0x9b,0x11, +0x65,0x6d,0x51,2,0x6f,0x2c,0x75,0x50,0x79,0x10,0x61,0x91,1,0x6a,0x28,0x6f, +0x10,0x6e,0x55,0x1a,0x6f,0x69,0x6e,0x69,0x6e,0x67,0x67,0x72,0x6f,0x75,0x70,0x21, +0x10,0x6e,0x57,0x10,0x65,0x59,0x10,0x61,1,0x66,0x5b,0x70,0x10,0x68,0x5d,0x66, +0x7b,0x66,0x42,0x67,0x7a,0x68,0x8a,0x6b,0xa2,0x56,0x6c,0x11,0x61,0x6d,0x4c,0x12, +0x61,0x64,0x68,0x4f,2,0x61,0x3e,0x65,0x4a,0x69,0x19,0x6e,0x61,0x6c,0x73,0x65, +0x6d,0x6b,0x61,0x74,0x68,0x35,0x15,0x72,0x73,0x69,0x79,0x65,0x68,0x8f,0x86,0x10, +0x68,0x33,0x10,0x61,1,0x66,0x37,0x6d,0x11,0x61,0x6c,0x39,1,0x61,0x40,0x65, +0x3e,1,0x68,0x28,0x74,0x10,0x68,0x45,0x40,0x13,0x67,0x6f,0x61,0x6c,0x43,1, +0x68,0x3b,0x6d,0x1a,0x7a,0x61,0x6f,0x6e,0x68,0x65,0x68,0x67,0x6f,0x61,0x6c,0x3d, +2,0x61,0x3a,0x68,0x44,0x6e,0x17,0x6f,0x74,0x74,0x65,0x64,0x68,0x65,0x68,0x4b, +1,0x66,0x47,0x70,0x10,0x68,0x49,0x12,0x61,0x70,0x68,0x89,0x61,0x2e,0x62,0x8a, +0x64,0xa2,0x51,0x65,0x31,2,0x66,0x3c,0x69,0x70,0x6c,1,0x61,0x28,0x65,0x10, +0x66,0x27,0x11,0x70,0x68,0x25,0x14,0x72,0x69,0x63,0x61,0x6e,2,0x66,0x30,0x6e, +0x36,0x71,0x11,0x61,0x66,0xa3,0x58,0x11,0x65,0x68,0xa3,0x56,0x12,0x6f,0x6f,0x6e, +0xa3,0x57,0x10,0x6e,0x23,1,0x65,0x4a,0x75,0x10,0x72,0x1f,0x75,0x73,0x68,0x61, +0x73,0x6b,0x69,0x79,0x65,0x68,0x62,0x61,0x72,0x72,0x65,0x65,0x8d,1,0x68,0x29, +0x74,0x10,0x68,0x2b,0x11,0x61,0x6c,0x2c,0x16,0x61,0x74,0x68,0x72,0x69,0x73,0x68, +0x2f,7,0x6e,0x2e,0x6e,0x2c,0x72,0x3e,0x74,0x56,0x75,0x21,0x18,0x6f,0x6e,0x6a, +0x6f,0x69,0x6e,0x69,0x6e,0x67,0x21,0x28,0x1a,0x69,0x67,0x68,0x74,0x6a,0x6f,0x69, +0x6e,0x69,0x6e,0x67,0x29,0x2a,0x19,0x72,0x61,0x6e,0x73,0x70,0x61,0x72,0x65,0x6e, +0x74,0x2b,0x63,0x23,0x64,0x40,0x6a,0x56,0x6c,0x26,0x19,0x65,0x66,0x74,0x6a,0x6f, +0x69,0x6e,0x69,0x6e,0x67,0x27,0x24,0x19,0x75,0x61,0x6c,0x6a,0x6f,0x69,0x6e,0x69, +0x6e,0x67,0x25,0x19,0x6f,0x69,0x6e,0x63,0x61,0x75,0x73,0x69,0x6e,0x67,0x23,0, +0x13,0x6e,0xc0,0xd0,0x73,0x49,0x73,0x48,0x75,0x78,0x77,0x84,0x78,0x9c,0x7a,0x10, +0x77,0x58,1,0x6a,0x75,0x73,0x13,0x70,0x61,0x63,0x65,0x59,4,0x61,0x51,0x67, +0x53,0x70,0x28,0x75,0x30,0x79,0x57,0x54,0x12,0x61,0x63,0x65,0x55,0x16,0x72,0x72, +0x6f,0x67,0x61,0x74,0x65,0x53,0x15,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x21,1,0x6a, +0x5d,0x6f,0x17,0x72,0x64,0x6a,0x6f,0x69,0x6e,0x65,0x72,0x5d,0x10,0x78,0x21,0x6e, +0x60,0x6f,0xa2,0x41,0x70,0xa2,0x50,0x71,0xa2,0x6e,0x72,1,0x65,0x24,0x69,0x6f, +0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72, +0x6f,4,0x65,0x3e,0x6c,0x5b,0x6f,0x46,0x73,0x45,0x75,0x46,0x14,0x6d,0x65,0x72, +0x69,0x63,0x47,0x15,0x78,0x74,0x6c,0x69,0x6e,0x65,0x5b,0x17,0x6e,0x73,0x74,0x61, +0x72,0x74,0x65,0x72,0x45,0x10,0x70,0x48,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74, +0x75,0x61,0x74,0x69,0x6f,0x6e,0x49,1,0x6f,0x3e,0x72,0x4c,0x1a,0x65,0x66,0x69, +0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4d,0x4a,0x1b,0x73,0x74,0x66,0x69,0x78, +0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x4b,0x10,0x75,0x4e,0x16,0x6f,0x74,0x61,0x74, +0x69,0x6f,0x6e,0x4f,0x68,0x7b,0x68,0x50,0x69,0x86,0x6a,0xa2,0x61,0x6c,0xa2,0x65, +0x6d,0x1c,0x61,0x6e,0x64,0x61,0x74,0x6f,0x72,0x79,0x62,0x72,0x65,0x61,0x6b,0x2d, +4,0x32,0x5f,0x33,0x61,0x65,0x34,0x6c,0x6d,0x79,0x3a,0x13,0x70,0x68,0x65,0x6e, +0x3b,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72,0x6d,2,0x64,0x28, +0x6e,0x3c,0x73,0x41,0x3c,0x18,0x65,0x6f,0x67,0x72,0x61,0x70,0x68,0x69,0x63,0x3d, +0x3e,1,0x66,0x3e,0x73,0x11,0x65,0x70,1,0x61,0x22,0x65,0x14,0x72,0x61,0x62, +0x6c,0x65,0x3f,0x18,0x69,0x78,0x6e,0x75,0x6d,0x65,0x72,0x69,0x63,0x41,2,0x6c, +0x63,0x74,0x65,0x76,0x67,1,0x66,0x43,0x69,0x15,0x6e,0x65,0x66,0x65,0x65,0x64, +0x43,0x61,0x40,0x62,0x70,0x63,0xa2,0x55,0x65,0xa2,0xdb,0x67,0x10,0x6c,0x38,0x11, +0x75,0x65,0x39,2,0x69,0x23,0x6c,0x34,0x6d,0x16,0x62,0x69,0x67,0x75,0x6f,0x75, +0x73,0x23,0x24,0x17,0x70,0x68,0x61,0x62,0x65,0x74,0x69,0x63,0x25,4,0x32,0x27, +0x61,0x29,0x62,0x2b,0x6b,0x2d,0x72,0x12,0x65,0x61,0x6b,2,0x61,0x36,0x62,0x3e, +0x73,0x15,0x79,0x6d,0x62,0x6f,0x6c,0x73,0x57,0x13,0x66,0x74,0x65,0x72,0x29,1, +0x65,0x2a,0x6f,0x11,0x74,0x68,0x27,0x13,0x66,0x6f,0x72,0x65,0x2b,7,0x6d,0x51, +0x6d,0x33,0x6f,0x28,0x70,0x69,0x72,0x35,1,0x6d,0x76,0x6e,1,0x64,0x3c,0x74, +0x1a,0x69,0x6e,0x67,0x65,0x6e,0x74,0x62,0x72,0x65,0x61,0x6b,0x2f,0x15,0x69,0x74, +0x69,0x6f,0x6e,0x61,0x1f,0x6c,0x6a,0x61,0x70,0x61,0x6e,0x65,0x73,0x65,0x73,0x74, +0x61,0x72,0x74,0x65,0x72,0x6b,1,0x62,0x3a,0x70,0x19,0x6c,0x65,0x78,0x63,0x6f, +0x6e,0x74,0x65,0x78,0x74,0x51,0x18,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b, +0x33,0x61,0x6a,0x62,0x2f,0x6a,0x6b,0x6c,0x30,0x13,0x6f,0x73,0x65,0x70,1,0x61, +0x38,0x75,0x18,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0x31,0x18,0x72,0x65, +0x6e,0x74,0x68,0x65,0x73,0x69,0x73,0x69,0x1b,0x72,0x72,0x69,0x61,0x67,0x65,0x72, +0x65,0x74,0x75,0x72,0x6e,0x35,2,0x62,0x3e,0x6d,0x46,0x78,0x36,0x18,0x63,0x6c, +0x61,0x6d,0x61,0x74,0x69,0x6f,0x6e,0x37,0x70,0x12,0x61,0x73,0x65,0x71,0x72,0x16, +0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x73,1,0x64,0x42,0x6e,1,0x6f,0x32,0x75, +0x26,0x14,0x6d,0x65,0x72,0x69,0x63,0x27,0x11,0x6e,0x65,0x21,1,0x65,0x2e,0x69, +0x24,0x12,0x67,0x69,0x74,0x25,0x22,0x14,0x63,0x69,0x6d,0x61,0x6c,0x23,0,0x18, +0x6e,0xc3,0x95,0x74,0xc1,0x38,0x77,0x61,0x77,0x88,0x78,0xa2,0x48,0x79,0xa2,0x52, +0x7a,5,0x78,0x13,0x78,0x30,0x79,0x36,0x7a,0x11,0x7a,0x7a,0xa3,0x67,0x11,0x78, +0x78,0xa3,0x66,0x11,0x79,0x79,0x21,0x69,0x38,0x6d,0x3c,0x73,0x10,0x79,1,0x65, +0xa3,0xae,0x6d,0xa3,0x81,0x11,0x6e,0x68,0x23,0x11,0x74,0x68,0xa3,0x80,1,0x61, +0x2c,0x6f,0x11,0x6c,0x65,0xa3,0x9b,0x11,0x72,0x61,0xa2,0x92,0x15,0x6e,0x67,0x63, +0x69,0x74,0x69,0xa3,0x92,1,0x70,0x2c,0x73,0x11,0x75,0x78,0xa3,0x65,0x11,0x65, +0x6f,0x9b,0x10,0x69,0x72,0x11,0x69,0x69,0x73,0x74,0x4a,0x75,0xa2,0xba,0x76,1, +0x61,0x2c,0x69,0x11,0x73,0x70,0xa3,0x64,0x10,0x69,0xa2,0x63,0x10,0x69,0xa3,0x63, +5,0x67,0x36,0x67,0x68,0x68,0x6c,0x69,2,0x62,0x3a,0x66,0x4a,0x72,0x10,0x68, +0xa2,0x9e,0x12,0x75,0x74,0x61,0xa3,0x9e,1,0x65,0x24,0x74,0x6f,0x12,0x74,0x61, +0x6e,0x6f,0x14,0x69,0x6e,0x61,0x67,0x68,0x99,0x11,0x6c,0x67,0x75,0x10,0x61,1, +0x61,0x24,0x69,0x6d,0x6a,0x11,0x6e,0x61,0x6b,0x61,0x30,0x65,0xa2,0x5b,0x66,0x11, +0x6e,0x67,0x99,6,0x6c,0x21,0x6c,0x32,0x6d,0x38,0x6e,0x44,0x76,0x10,0x74,0xa3, +0x7f,1,0x65,0x89,0x75,0x97,1,0x69,0x24,0x6c,0x67,0x10,0x6c,0x67,0x10,0x67, +0xa2,0x9a,0x11,0x75,0x74,0xa3,0x9a,0x67,0x36,0x69,0x52,0x6b,0x10,0x72,0xa2,0x99, +0x10,0x69,0xa3,0x99,1,0x61,0x30,0x62,0x7a,0x13,0x61,0x6e,0x77,0x61,0x7b,0x12, +0x6c,0x6f,0x67,0x75,2,0x6c,0x32,0x74,0x34,0x76,0x12,0x69,0x65,0x74,0xa3,0x7f, +0x10,0x65,0x89,0x12,0x68,0x61,0x6d,0xa3,0x6a,1,0x6c,0x2a,0x6e,0x10,0x67,0xa3, +0x62,0x10,0x75,0x68,0x11,0x67,0x75,0x69,1,0x67,0x32,0x6e,0x14,0x6b,0x6e,0x6f, +0x77,0x6e,0xa3,0x67,0x11,0x61,0x72,0x8a,0x13,0x69,0x74,0x69,0x63,0x8b,0x71,0xc0, +0xef,0x71,0xa2,0xc1,0x72,0xa2,0xc6,0x73,6,0x69,0x6d,0x69,0x72,0x6f,0xa2,0x4c, +0x75,0xa2,0x58,0x79,1,0x6c,0x46,0x72,4,0x63,0x65,0x65,0xa3,0x5f,0x69,0x2c, +0x6a,0xa3,0x60,0x6e,0xa3,0x61,0x11,0x61,0x63,0x65,0x10,0x6f,0x94,0x16,0x74,0x69, +0x6e,0x61,0x67,0x72,0x69,0x95,2,0x64,0x3c,0x67,0x4c,0x6e,1,0x64,0xa3,0x91, +0x68,0x62,0x12,0x61,0x6c,0x61,0x63,0x10,0x64,0xa2,0xa6,0x12,0x68,0x61,0x6d,0xa3, +0xa6,0x17,0x6e,0x77,0x72,0x69,0x74,0x69,0x6e,0x67,0xa3,0x70,0x11,0x72,0x61,0xa2, +0x98,0x16,0x73,0x6f,0x6d,0x70,0x65,0x6e,0x67,0xa3,0x98,0x11,0x6e,0x64,0xa2,0x71, +0x14,0x61,0x6e,0x65,0x73,0x65,0xa3,0x71,0x61,0x5c,0x67,0xa2,0x43,0x68,1,0x61, +0x2a,0x72,0x10,0x64,0xa3,0x97,2,0x72,0x28,0x76,0x30,0x77,0x87,0x12,0x61,0x64, +0x61,0xa3,0x97,0x12,0x69,0x61,0x6e,0x87,2,0x6d,0x40,0x72,0x58,0x75,0x10,0x72, +0xa2,0x6f,0x15,0x61,0x73,0x68,0x74,0x72,0x61,0xa3,0x6f,1,0x61,0x26,0x72,0xa3, +0x7e,0x14,0x72,0x69,0x74,0x61,0x6e,0xa3,0x7e,1,0x61,0xa3,0x5e,0x62,0xa3,0x85, +0x11,0x6e,0x77,0xa3,0x70,0x11,0x61,0x61,1,0x63,0x2f,0x69,0x23,3,0x65,0x3e, +0x6a,0x48,0x6f,0x4e,0x75,0x10,0x6e,1,0x69,0x24,0x72,0x61,0x10,0x63,0x61,0x13, +0x6a,0x61,0x6e,0x67,0xa3,0x6e,0x11,0x6e,0x67,0xa3,0x6e,0x11,0x72,0x6f,0xa3,0x5d, +0x6e,0xa2,0x83,0x6f,0xa2,0xc1,0x70,5,0x6c,0x1e,0x6c,0x44,0x72,0x4a,0x73,0x1b, +0x61,0x6c,0x74,0x65,0x72,0x70,0x61,0x68,0x6c,0x61,0x76,0x69,0xa3,0x7b,0x11,0x72, +0x64,0xa3,0x5c,0x11,0x74,0x69,0xa3,0x7d,0x61,0x7c,0x65,0xa2,0x54,0x68,3,0x61, +0x3e,0x6c,0x4e,0x6e,0x5e,0x6f,0x16,0x65,0x6e,0x69,0x63,0x69,0x61,0x6e,0xa3,0x5b, +0x10,0x67,0xa2,0x5a,0x12,0x73,0x70,0x61,0xa3,0x5a,2,0x69,0xa3,0x7a,0x70,0xa3, +0x7b,0x76,0xa3,0x7c,0x10,0x78,0xa3,0x5b,2,0x68,0x3e,0x6c,0x50,0x75,0x10,0x63, +0xa2,0xa5,0x14,0x69,0x6e,0x68,0x61,0x75,0xa3,0xa5,0x17,0x61,0x77,0x68,0x68,0x6d, +0x6f,0x6e,0x67,0xa3,0x4b,0x10,0x6d,0xa2,0x90,0x14,0x79,0x72,0x65,0x6e,0x65,0xa3, +0x90,0x11,0x72,0x6d,0xa3,0x59,4,0x61,0x38,0x62,0x56,0x65,0x5c,0x6b,0x74,0x73, +0x11,0x68,0x75,0xa3,0x96,1,0x62,0x2a,0x72,0x10,0x62,0xa3,0x8e,0x15,0x61,0x74, +0x61,0x65,0x61,0x6e,0xa3,0x8f,0x11,0x61,0x74,0xa3,0x8f,0x10,0x77,1,0x61,0xa3, +0xaa,0x74,0x14,0x61,0x69,0x6c,0x75,0x65,0x97,1,0x67,0x2e,0x6f,0xa2,0x57,0x10, +0x6f,0xa3,0x57,0x10,0x62,0xa3,0x84,3,0x67,0x5a,0x6c,0x6c,0x72,0xa2,0x88,0x73, +2,0x61,0x36,0x67,0x3c,0x6d,0x10,0x61,0x84,0x12,0x6e,0x79,0x61,0x85,0x11,0x67, +0x65,0xa3,0xab,0x10,0x65,0xa3,0xab,1,0x61,0x2a,0x68,0x11,0x61,0x6d,0x5b,0x10, +0x6d,0x5b,1,0x63,0xa2,0x55,0x64,5,0x70,0x2c,0x70,0x36,0x73,0x54,0x74,0x14, +0x75,0x72,0x6b,0x69,0x63,0xa3,0x58,0x11,0x65,0x72,1,0x6d,0x2c,0x73,0x12,0x69, +0x61,0x6e,0x9b,0x11,0x69,0x63,0xa3,0x59,0x1a,0x6f,0x75,0x74,0x68,0x61,0x72,0x61, +0x62,0x69,0x61,0x6e,0xa3,0x85,0x68,0x42,0x69,0x54,0x6e,0x1a,0x6f,0x72,0x74,0x68, +0x61,0x72,0x61,0x62,0x69,0x61,0x6e,0xa3,0x8e,0x17,0x75,0x6e,0x67,0x61,0x72,0x69, +0x61,0x6e,0xa3,0x4c,0x14,0x74,0x61,0x6c,0x69,0x63,0x5d,1,0x68,0x26,0x6b,0xa3, +0x6d,0x12,0x69,0x6b,0x69,0xa3,0x6d,2,0x69,0x2c,0x6b,0x30,0x79,0x10,0x61,0x5f, +0x11,0x79,0x61,0x5f,0x10,0x68,0xa3,0x58,0x68,0xc2,0xb3,0x6b,0xc1,0xdc,0x6b,0xa2, +0xe9,0x6c,0xa4,0x6a,0x6d,8,0x6f,0x46,0x6f,0x48,0x72,0x74,0x74,0x80,0x75,0x86, +0x79,1,0x61,0x28,0x6d,0x10,0x72,0x59,0x13,0x6e,0x6d,0x61,0x72,0x59,2,0x64, +0x2e,0x6e,0x32,0x6f,0x10,0x6e,0xa3,0x72,0x10,0x69,0xa3,0xa3,0x10,0x67,0x56,0x14, +0x6f,0x6c,0x69,0x61,0x6e,0x57,0x10,0x6f,0xa2,0x95,0x10,0x6f,0xa3,0x95,0x11,0x65, +0x69,0xa3,0x73,0x11,0x6c,0x74,0xa2,0xa4,0x12,0x61,0x6e,0x69,0xa3,0xa4,0x61,0x36, +0x65,0xa2,0x4c,0x69,0xa2,0x8f,0x6c,0x11,0x79,0x6d,0x55,4,0x68,0x36,0x6c,0x4c, +0x6e,0x58,0x72,0x82,0x79,0x10,0x61,0xa3,0x55,1,0x61,0x26,0x6a,0xa3,0xa0,0x13, +0x6a,0x61,0x6e,0x69,0xa3,0xa0,0x15,0x61,0x79,0x61,0x6c,0x61,0x6d,0x55,1,0x64, +0x38,0x69,0xa2,0x79,0x15,0x63,0x68,0x61,0x65,0x61,0x6e,0xa3,0x79,0xa2,0x54,0x12, +0x61,0x69,0x63,0xa3,0x54,0x10,0x63,0xa2,0xa9,0x12,0x68,0x65,0x6e,0xa3,0xa9,2, +0x65,0x72,0x6e,0x84,0x72,1,0x63,0xa3,0x8d,0x6f,0xa2,0x56,0x13,0x69,0x74,0x69, +0x63,1,0x63,0x3c,0x68,0x19,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73, +0xa3,0x56,0x15,0x75,0x72,0x73,0x69,0x76,0x65,0xa3,0x8d,0x17,0x74,0x65,0x69,0x6d, +0x61,0x79,0x65,0x6b,0xa3,0x73,0x10,0x64,0xa2,0x8c,0x17,0x65,0x6b,0x69,0x6b,0x61, +0x6b,0x75,0x69,0xa3,0x8c,0x11,0x61,0x6f,0xa3,0x5c,5,0x6f,0x14,0x6f,0x30,0x70, +0x36,0x74,0x11,0x68,0x69,0xa3,0x78,0x11,0x72,0x65,0xa3,0x77,0x11,0x65,0x6c,0xa3, +0x8a,0x61,0x2e,0x68,0x98,0x6e,0x11,0x64,0x61,0x4b,4,0x69,0x3c,0x6c,0x44,0x6e, +0x48,0x74,0x56,0x79,0x13,0x61,0x68,0x6c,0x69,0xa3,0x4f,0x12,0x74,0x68,0x69,0xa3, +0x78,0x10,0x69,0xa3,0x4f,1,0x61,0x4d,0x6e,0x12,0x61,0x64,0x61,0x4b,0x14,0x61, +0x6b,0x61,0x6e,0x61,0x4c,0x19,0x6f,0x72,0x68,0x69,0x72,0x61,0x67,0x61,0x6e,0x61, +0x8d,3,0x61,0x3c,0x6d,0x4e,0x6f,0x5a,0x75,0x15,0x64,0x61,0x77,0x61,0x64,0x69, +0xa3,0x91,0x10,0x72,0x92,0x15,0x6f,0x73,0x68,0x74,0x68,0x69,0x93,1,0x65,0x24, +0x72,0x4f,0x10,0x72,0x4f,0x10,0x6a,0xa2,0x9d,0x11,0x6b,0x69,0xa3,0x9d,4,0x61, +0x5c,0x65,0x90,0x69,0xa0,0x6f,0xa2,0x5d,0x79,1,0x63,0x34,0x64,0x10,0x69,0xa2, +0x6c,0x11,0x61,0x6e,0xa3,0x6c,0x10,0x69,0xa2,0x6b,0x11,0x61,0x6e,0xa3,0x6b,2, +0x6e,0x42,0x6f,0x46,0x74,3,0x66,0xa3,0x50,0x67,0xa3,0x51,0x69,0x24,0x6e,0x53, +0x10,0x6e,0x53,0x10,0x61,0xa3,0x6a,0x50,0x10,0x6f,0x51,0x11,0x70,0x63,0xa2,0x52, +0x11,0x68,0x61,0xa3,0x52,2,0x6d,0x2e,0x6e,0x36,0x73,0x10,0x75,0xa3,0x83,0x10, +0x62,0x80,0x10,0x75,0x81,2,0x61,0xa3,0x53,0x62,0x83,0x65,0x11,0x61,0x72,1, +0x61,0xa3,0x53,0x62,0x83,0x11,0x6d,0x61,0xa3,0x8b,0x68,0x6e,0x69,0xa2,0x83,0x6a, +2,0x61,0x30,0x70,0x52,0x75,0x11,0x72,0x63,0xa3,0x94,1,0x6d,0x38,0x76,0x10, +0x61,0xa2,0x4e,0x13,0x6e,0x65,0x73,0x65,0xa3,0x4e,0x10,0x6f,0xa3,0xad,0x11,0x61, +0x6e,0xa3,0x69,6,0x6c,0x1a,0x6c,0x34,0x6d,0x3a,0x72,0x40,0x75,0x11,0x6e,0x67, +0xa3,0x4c,0x11,0x75,0x77,0xa3,0x9c,0x11,0x6e,0x67,0xa3,0x4b,0x11,0x6b,0x74,0x8d, +0x61,0x3a,0x65,0x8c,0x69,0x11,0x72,0x61,0x48,0x13,0x67,0x61,0x6e,0x61,0x49,1, +0x6e,0x34,0x74,0x10,0x72,0xa2,0xa2,0x11,0x61,0x6e,0xa3,0xa2,0x42,6,0x6f,0xe, +0x6f,0x77,0x73,0xa3,0x49,0x74,0xa3,0x4a,0x75,0x12,0x6e,0x6f,0x6f,0x77,0x62,0xa3, +0xac,0x67,0x24,0x69,0x43,0x44,0x11,0x75,0x6c,0x45,0x11,0x62,0x72,0x46,0x11,0x65, +0x77,0x47,2,0x6d,0x2e,0x6e,0x4a,0x74,0x11,0x61,0x6c,0x5d,0x1c,0x70,0x65,0x72, +0x69,0x61,0x6c,0x61,0x72,0x61,0x6d,0x61,0x69,0x63,0xa3,0x74,2,0x64,0x66,0x68, +0x6a,0x73,0x1b,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x61,0x6c,0x70,0x61,1, +0x68,0x32,0x72,0x14,0x74,0x68,0x69,0x61,0x6e,0xa3,0x7d,0x13,0x6c,0x61,0x76,0x69, +0xa3,0x7a,0x10,0x73,0xa3,0x4d,0x15,0x65,0x72,0x69,0x74,0x65,0x64,0x23,0x64,0xc0, +0xc7,0x64,0xa2,0x60,0x65,0xa2,0x88,0x67,4,0x65,0x62,0x6c,0x7a,0x6f,0x8e,0x72, +0x9a,0x75,1,0x6a,0x38,0x72,1,0x6d,0x24,0x75,0x41,0x13,0x75,0x6b,0x68,0x69, +0x41,1,0x61,0x24,0x72,0x3f,0x13,0x72,0x61,0x74,0x69,0x3f,0x10,0x6f,1,0x6b, +0xa3,0x48,0x72,0x38,0x13,0x67,0x69,0x61,0x6e,0x39,0x11,0x61,0x67,0x90,0x15,0x6f, +0x6c,0x69,0x74,0x69,0x63,0x91,0x11,0x74,0x68,0x3a,0x11,0x69,0x63,0x3b,1,0x61, +0x32,0x65,1,0x65,0x24,0x6b,0x3d,0x10,0x6b,0x3d,0x10,0x6e,0xa2,0x89,0x12,0x74, +0x68,0x61,0xa3,0x89,2,0x65,0x3e,0x73,0x64,0x75,0x11,0x70,0x6c,0xa2,0x87,0x13, +0x6f,0x79,0x61,0x6e,0xa3,0x87,1,0x73,0x38,0x76,0x10,0x61,0x34,0x15,0x6e,0x61, +0x67,0x61,0x72,0x69,0x35,0x13,0x65,0x72,0x65,0x74,0x33,0x11,0x72,0x74,0x33,2, +0x67,0x3a,0x6c,0x72,0x74,0x11,0x68,0x69,0x36,0x13,0x6f,0x70,0x69,0x63,0x37,0x10, +0x79,2,0x64,0xa3,0x45,0x68,0xa3,0x46,0x70,0xa2,0x47,0x1e,0x74,0x69,0x61,0x6e, +0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3,0x47,0x11,0x62,0x61, +0xa2,0x88,0x12,0x73,0x61,0x6e,0xa3,0x88,0x61,0xa2,0xa2,0x62,0xa4,7,0x63,6, +0x6f,0x3d,0x6f,0x5a,0x70,0x76,0x75,0x7a,0x79,1,0x70,0x3e,0x72,2,0x69,0x2a, +0x6c,0x31,0x73,0xa3,0x44,0x13,0x6c,0x6c,0x69,0x63,0x31,0x13,0x72,0x69,0x6f,0x74, +0x7f,1,0x6d,0x30,0x70,0x10,0x74,0x2e,0x11,0x69,0x63,0x2f,0x12,0x6d,0x6f,0x6e, +0x21,0x11,0x72,0x74,0x7f,0x16,0x6e,0x65,0x69,0x66,0x6f,0x72,0x6d,0xa3,0x65,0x61, +0x32,0x68,0xa2,0x41,0x69,0x11,0x72,0x74,0xa3,0x43,3,0x6b,0x4c,0x6e,0x50,0x72, +0x76,0x75,0x1d,0x63,0x61,0x73,0x69,0x61,0x6e,0x61,0x6c,0x62,0x61,0x6e,0x69,0x61, +0x6e,0xa3,0x9f,0x10,0x6d,0xa3,0x76,1,0x61,0x24,0x73,0x71,0x1d,0x64,0x69,0x61, +0x6e,0x61,0x62,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x71,0x10,0x69,0xa2,0x68, +0x11,0x61,0x6e,0xa3,0x68,1,0x61,0x34,0x65,0x10,0x72,0x2c,0x13,0x6f,0x6b,0x65, +0x65,0x2d,1,0x6b,0x26,0x6d,0xa3,0x42,0x11,0x6d,0x61,0xa3,0x76,6,0x68,0x4a, +0x68,0x48,0x6e,0x4e,0x72,0x76,0x76,1,0x65,0x2a,0x73,0x10,0x74,0xa3,0x75,0x13, +0x73,0x74,0x61,0x6e,0xa3,0x75,0x11,0x6f,0x6d,0xa3,0xa1,0x11,0x61,0x74,0x1f,0x6f, +0x6c,0x69,0x61,0x6e,0x68,0x69,0x65,0x72,0x6f,0x67,0x6c,0x79,0x70,0x68,0x73,0xa3, +0x9c,1,0x61,0x3e,0x6d,2,0x65,0x2a,0x69,0xa3,0x74,0x6e,0x27,0x13,0x6e,0x69, +0x61,0x6e,0x27,0x10,0x62,0x24,0x11,0x69,0x63,0x25,0x64,0x30,0x66,0x44,0x67,0x11, +0x68,0x62,0xa3,0x9f,0x10,0x6c,1,0x61,0x26,0x6d,0xa3,0xa7,0x10,0x6d,0xa3,0xa7, +0x11,0x61,0x6b,0xa3,0x93,6,0x6c,0x3c,0x6c,0x52,0x6f,0x56,0x72,0x66,0x75,1, +0x67,0x30,0x68,1,0x64,0x79,0x69,0x10,0x64,0x79,0x10,0x69,0x8e,0x13,0x6e,0x65, +0x73,0x65,0x8f,0x11,0x69,0x73,0xa1,0x11,0x70,0x6f,0x2a,0x13,0x6d,0x6f,0x66,0x6f, +0x2b,0x10,0x61,1,0x68,0x2e,0x69,0x7c,0x12,0x6c,0x6c,0x65,0x7d,0xa2,0x41,0x11, +0x6d,0x69,0xa3,0x41,0x61,0x48,0x65,0x9c,0x68,1,0x61,0x2a,0x6b,0x10,0x73,0xa3, +0xa8,0x15,0x69,0x6b,0x73,0x75,0x6b,0x69,0xa3,0xa8,3,0x6c,0x3a,0x6d,0x48,0x73, +0x54,0x74,1,0x61,0x24,0x6b,0x9f,0x10,0x6b,0x9f,0x10,0x69,0x9c,0x13,0x6e,0x65, +0x73,0x65,0x9d,0x10,0x75,0xa2,0x82,0x10,0x6d,0xa3,0x82,0x10,0x73,0xa2,0x86,0x13, +0x61,0x76,0x61,0x68,0xa3,0x86,0x11,0x6e,0x67,0x28,0x12,0x61,0x6c,0x69,0x29,3, +0x6c,0x42,0x6e,0x90,0x74,0xa2,0x46,0x76,0x24,0x17,0x6f,0x77,0x65,0x6c,0x6a,0x61, +0x6d,0x6f,0x25,0x22,1,0x65,0x54,0x76,0x28,1,0x73,0x38,0x74,0x2a,0x17,0x73, +0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65,0x2b,0x16,0x79,0x6c,0x6c,0x61,0x62,0x6c,0x65, +0x29,0x18,0x61,0x64,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x23,1,0x61,0x21,0x6f, +0x1a,0x74,0x61,0x70,0x70,0x6c,0x69,0x63,0x61,0x62,0x6c,0x65,0x21,0x26,0x1a,0x72, +0x61,0x69,0x6c,0x69,0x6e,0x67,0x6a,0x61,0x6d,0x6f,0x27,1,0x6e,0x2c,0x79,0x22, +0x11,0x65,0x73,0x23,0x20,0x10,0x6f,0x21,1,0x6e,0x2c,0x79,0x22,0x11,0x65,0x73, +0x23,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a,0x79,0x22,0x11,0x65,0x73,0x23, +0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f,0x21,2,0x6d,0x30,0x6e,0x3a, +0x79,0x22,0x11,0x65,0x73,0x23,0x24,0x13,0x61,0x79,0x62,0x65,0x25,0x20,0x10,0x6f, +0x21,0xb,0x72,0x39,0x76,0xc,0x76,0x33,0x78,0x2a,0x7a,0x11,0x77,0x6a,0x43,0x10, +0x78,0x21,0x72,0x28,0x73,0x50,0x74,0x31,1,0x65,0x24,0x69,0x39,0x1e,0x67,0x69, +0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x6f,0x72,0x39,1,0x6d, +0x35,0x70,0x18,0x61,0x63,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0x35,0x6c,0x1f,0x6c, +0x3c,0x6f,0x4a,0x70,1,0x70,0x37,0x72,0x14,0x65,0x70,0x65,0x6e,0x64,0x37,0x28, +1,0x66,0x2b,0x76,0x2c,0x10,0x74,0x2f,0x13,0x74,0x68,0x65,0x72,0x21,0x63,0x4c, +0x65,0x64,0x67,1,0x61,0x3a,0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a, +0x77,0x6a,0x41,0x10,0x7a,0x41,2,0x6e,0x23,0x6f,0x24,0x72,0x25,0x14,0x6e,0x74, +0x72,0x6f,0x6c,0x23,2,0x62,0x34,0x6d,0x4e,0x78,0x26,0x13,0x74,0x65,0x6e,0x64, +0x27,0x3a,1,0x61,0x24,0x67,0x3d,0x11,0x73,0x65,0x3a,0x12,0x67,0x61,0x7a,0x3d, +0x3e,0x16,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0x3f,9,0x6e,0x4a,0x6e,0x34,0x6f, +0x44,0x73,0x60,0x75,0x94,0x78,0x10,0x78,0x21,0x10,0x75,0x2a,0x14,0x6d,0x65,0x72, +0x69,0x63,0x2b,1,0x6c,0x2c,0x74,0x12,0x68,0x65,0x72,0x21,0x14,0x65,0x74,0x74, +0x65,0x72,0x2d,3,0x63,0x36,0x65,0x46,0x70,0x31,0x74,0x32,0x12,0x65,0x72,0x6d, +0x33,0x3c,0x16,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x65,0x3d,0x2e,0x10,0x70,0x2f,0x10, +0x70,0x34,0x12,0x70,0x65,0x72,0x35,0x61,0x46,0x63,0x52,0x65,0x64,0x66,0x72,0x6c, +2,0x65,0x2d,0x66,0x3b,0x6f,0x28,0x12,0x77,0x65,0x72,0x29,0x10,0x74,0x22,0x12, +0x65,0x72,0x6d,0x23,1,0x6c,0x24,0x72,0x37,0x24,0x12,0x6f,0x73,0x65,0x25,0x10, +0x78,0x38,0x13,0x74,0x65,0x6e,0x64,0x39,0x10,0x6f,0x26,0x13,0x72,0x6d,0x61,0x74, +0x27,0xf,0x6c,0x7c,0x72,0x34,0x72,0x32,0x73,0x5a,0x78,0x76,0x7a,0x11,0x77,0x6a, +0x4b,1,0x65,0x24,0x69,0x3b,0x1e,0x67,0x69,0x6f,0x6e,0x61,0x6c,0x69,0x6e,0x64, +0x69,0x63,0x61,0x74,0x6f,0x72,0x3b,1,0x69,0x24,0x71,0x3f,0x18,0x6e,0x67,0x6c, +0x65,0x71,0x75,0x6f,0x74,0x65,0x3f,0x10,0x78,0x21,0x6c,0x36,0x6d,0x3c,0x6e,0x76, +0x6f,0x13,0x74,0x68,0x65,0x72,0x21,1,0x65,0x23,0x66,0x35,3,0x62,0x37,0x69, +0x28,0x6c,0x29,0x6e,0x2b,0x10,0x64,1,0x6c,0x34,0x6e,0x11,0x75,0x6d,0x2a,0x12, +0x6c,0x65,0x74,0x37,0x14,0x65,0x74,0x74,0x65,0x72,0x29,2,0x65,0x36,0x6c,0x39, +0x75,0x2c,0x14,0x6d,0x65,0x72,0x69,0x63,0x2d,0x14,0x77,0x6c,0x69,0x6e,0x65,0x39, +0x66,0x3f,0x66,0x40,0x67,0x4e,0x68,0x70,0x6b,0x10,0x61,0x26,0x15,0x74,0x61,0x6b, +0x61,0x6e,0x61,0x27,0x10,0x6f,0x24,0x13,0x72,0x6d,0x61,0x74,0x25,1,0x61,0x3a, +0x6c,0x19,0x75,0x65,0x61,0x66,0x74,0x65,0x72,0x7a,0x77,0x6a,0x49,0x10,0x7a,0x49, +1,0x65,0x24,0x6c,0x3d,0x19,0x62,0x72,0x65,0x77,0x6c,0x65,0x74,0x74,0x65,0x72, +0x3d,0x61,0x86,0x63,0x92,0x64,0x94,0x65,2,0x62,0x44,0x6d,0x5e,0x78,0x2e,0x13, +0x74,0x65,0x6e,0x64,0x32,0x15,0x6e,0x75,0x6d,0x6c,0x65,0x74,0x2f,0x42,1,0x61, +0x24,0x67,0x45,0x11,0x73,0x65,0x42,0x12,0x67,0x61,0x7a,0x45,0x46,0x16,0x6f,0x64, +0x69,0x66,0x69,0x65,0x72,0x47,0x15,0x6c,0x65,0x74,0x74,0x65,0x72,0x23,0x10,0x72, +0x31,1,0x6f,0x24,0x71,0x41,0x18,0x75,0x62,0x6c,0x65,0x71,0x75,0x6f,0x74,0x65, +0x41,2,0x63,0x32,0x6e,0x3c,0x6f,0x22,0x12,0x70,0x65,0x6e,0x23,0x24,0x13,0x6c, +0x6f,0x73,0x65,0x25,0x20,0x12,0x6f,0x6e,0x65,0x21,0xd,0x6e,0xc1,0x86,0x73,0xa8, +0x73,0x4c,0x74,0xa2,0x76,0x75,0xa2,0x83,0x7a,0xd8,0x70,0,2,0x6c,0xd9,0x20, +0,0x70,0xd9,0x40,0,0x73,0xc3,0,0xfe,0xf,0,0,0,7,0x6f,0x3c, +0x6f,0xff,8,0,0,0,0x70,0x3a,0x75,0x6e,0x79,0x13,0x6d,0x62,0x6f,0x6c, +0xff,0xf,0,0,0,0x11,0x61,0x63,1,0x65,0x34,0x69,0x15,0x6e,0x67,0x6d, +0x61,0x72,0x6b,0xa5,0,0x18,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xc3, +0,0x16,0x72,0x72,0x6f,0x67,0x61,0x74,0x65,0xe1,0,0,0x63,0xff,2,0, +0,0,0x65,0x38,0x6b,0xff,4,0,0,0,0x6d,0xff,1,0,0,0, +0x16,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x70,0,0x1d,0x69,0x74,0x6c,0x65, +0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x31,1,0x6e,0x40,0x70,0x1c, +0x70,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65,0x74,0x74,0x65,0x72,0x25,0x17,0x61, +0x73,0x73,0x69,0x67,0x6e,0x65,0x64,0x23,0x6e,0xa2,0x69,0x6f,0xa2,0x89,0x70,0xfe, +0x30,0xf8,0,0,9,0x69,0x33,0x69,0xff,0x10,0,0,0,0x6f,0xfd,0x80, +0,0,0x72,0x54,0x73,0xf9,0,0,0x75,0x12,0x6e,0x63,0x74,0xfe,0x30,0xf8, +0,0,0x15,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x30,0xf8,0,0,0x17,0x69, +0x76,0x61,0x74,0x65,0x75,0x73,0x65,0xdd,0,0,0x61,0x48,0x63,0xfd,0x40,0, +0,0x64,0xe9,0,0,0x65,0xfd,0x20,0,0,0x66,0xff,0x20,0,0,0, +0x1f,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x6f, +0x72,0xd9,0x40,0,0xbe,0,3,0x64,0xa7,0,0x6c,0xab,0,0x6f,0x30,0x75, +0x13,0x6d,0x62,0x65,0x72,0xbf,0,0xb2,0,0x1b,0x6e,0x73,0x70,0x61,0x63,0x69, +0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa1,1,0x70,0x92,0x74,0x12,0x68,0x65,0x72,0xe6, +0x80,1,3,0x6c,0x40,0x6e,0x4a,0x70,0x56,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c, +0xff,8,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,0x61,0x14,0x75,0x6d,0x62, +0x65,0x72,0xb3,0,0x19,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd, +0x80,0,0,0x1c,0x65,0x6e,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f, +0x6e,0xf9,0,0,0x66,0xc0,0xc4,0x66,0xa2,0x47,0x69,0xa2,0x64,0x6c,0xa2,0x79, +0x6d,0xa4,0xc0,4,0x61,0x6c,0x63,0xa5,0,0x65,0xa3,0x80,0x6e,0xa1,0x6f,0x15, +0x64,0x69,0x66,0x69,0x65,0x72,1,0x6c,0x38,0x73,0x14,0x79,0x6d,0x62,0x6f,0x6c, +0xff,4,0,0,0,0x14,0x65,0x74,0x74,0x65,0x72,0x41,1,0x72,0x3c,0x74, +0x16,0x68,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,1,0,0,0,0x10,0x6b,0xa5, +0xc0,1,0x69,0x32,0x6f,0x13,0x72,0x6d,0x61,0x74,0xdb,0,0,0x1d,0x6e,0x61, +0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xff,0x20,0,0, +0,0x10,0x6e,0x1f,0x69,0x74,0x69,0x61,0x6c,0x70,0x75,0x6e,0x63,0x74,0x75,0x61, +0x74,0x69,0x6f,0x6e,0xff,0x10,0,0,0,0x9c,7,0x6d,0x18,0x6d,0x41,0x6f, +0x28,0x74,0x31,0x75,0x25,0x60,0x1c,0x77,0x65,0x72,0x63,0x61,0x73,0x65,0x6c,0x65, +0x74,0x74,0x65,0x72,0x29,0x63,0x3d,0x65,0x28,0x69,0x42,0x6c,0x29,0x13,0x74,0x74, +0x65,0x72,0x9c,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0xab,0,0x1a,0x6e,0x65,0x73, +0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0xd9,0x20,0,0x63,0x46,0x64,0xa2,0x96, +0x65,0x1b,0x6e,0x63,0x6c,0x6f,0x73,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa3,0x80, +0xe6,0x80,1,7,0x6e,0x57,0x6e,0x52,0x6f,0x5e,0x73,0xe1,0,0,0x75,0x1b, +0x72,0x72,0x65,0x6e,0x63,0x79,0x73,0x79,0x6d,0x62,0x6f,0x6c,0xff,2,0,0, +0,0x22,0x12,0x74,0x72,0x6c,0xd9,0x80,0,0xdc,0,0,1,0x6d,0x62,0x6e, +1,0x6e,0x30,0x74,0x12,0x72,0x6f,0x6c,0xd9,0x80,0,0x1f,0x65,0x63,0x74,0x6f, +0x72,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x40,0,0, +0x19,0x62,0x69,0x6e,0x69,0x6e,0x67,0x6d,0x61,0x72,0x6b,0xa5,0xc0,0x61,0x58,0x63, +0xd9,0x80,0,0x66,0xdb,0,0,0x6c,0x1d,0x6f,0x73,0x65,0x70,0x75,0x6e,0x63, +0x74,0x75,0x61,0x74,0x69,0x6f,0x6e,0xfd,0x20,0,0,0x18,0x73,0x65,0x64,0x6c, +0x65,0x74,0x74,0x65,0x72,0x3d,2,0x61,0x32,0x65,0x50,0x69,0x12,0x67,0x69,0x74, +0xa7,0,0x1c,0x73,0x68,0x70,0x75,0x6e,0x63,0x74,0x75,0x61,0x74,0x69,0x6f,0x6e, +0xe9,0,0,0x1a,0x63,0x69,0x6d,0x61,0x6c,0x6e,0x75,0x6d,0x62,0x65,0x72,0xa7, +0 }; -const char PropNameData::nameGroups[17897]={ +const char PropNameData::nameGroups[18440]={ 2,'A','l','p','h','a',0,'A','l','p','h','a','b','e','t','i','c',0, 4,'N',0,'N','o',0,'F',0,'F','a','l','s','e',0,4,'Y',0,'Y','e','s',0,'T',0,'T','r','u','e',0, 2,'N','R',0,'N','o','t','_','R','e','o','r','d','e','r','e','d',0, @@ -954,8 +984,9 @@ const char PropNameData::nameGroups[17897]={ 2,'X','I','D','C',0,'X','I','D','_','C','o','n','t','i','n','u','e',0, 2,'X','I','D','S',0,'X','I','D','_','S','t','a','r','t',0, 2,'S','e','n','s','i','t','i','v','e',0,'C','a','s','e','_','S','e','n','s','i','t','i','v','e',0, -2,'S','T','e','r','m',0,'S','T','e','r','m',0,2,'V','S',0,'V','a','r','i','a','t','i','o','n','_','S','e','l','e','c', -'t','o','r',0,2,'n','f','d','i','n','e','r','t',0,'N','F','D','_','I','n','e','r','t',0, +2,'S','T','e','r','m',0,'S','e','n','t','e','n','c','e','_','T','e','r','m','i','n','a','l',0, +2,'V','S',0,'V','a','r','i','a','t','i','o','n','_','S','e','l','e','c','t','o','r',0, +2,'n','f','d','i','n','e','r','t',0,'N','F','D','_','I','n','e','r','t',0, 2,'n','f','k','d','i','n','e','r','t',0,'N','F','K','D','_','I','n','e','r','t',0, 2,'n','f','c','i','n','e','r','t',0,'N','F','C','_','I','n','e','r','t',0, 2,'n','f','k','c','i','n','e','r','t',0,'N','F','K','C','_','I','n','e','r','t',0, @@ -1297,6 +1328,17 @@ const char PropNameData::nameGroups[17897]={ 's',0,'S','u','p','p','l','e','m','e','n','t','a','l','_','S','y','m','b','o','l','s','_','A','n','d','_','P','i','c','t','o', 'g','r','a','p','h','s',0,2,'S','u','t','t','o','n','_','S','i','g','n','W','r','i','t','i','n','g',0, 'S','u','t','t','o','n','_','S','i','g','n','W','r','i','t','i','n','g',0, +2,'A','d','l','a','m',0,'A','d','l','a','m',0,2,'B','h','a','i','k','s','u','k','i',0, +'B','h','a','i','k','s','u','k','i',0,2,'C','y','r','i','l','l','i','c','_','E','x','t','_','C',0, +'C','y','r','i','l','l','i','c','_','E','x','t','e','n','d','e','d','_','C',0, +2,'G','l','a','g','o','l','i','t','i','c','_','S','u','p',0,'G','l','a','g','o','l','i','t','i','c','_','S','u','p','p','l', +'e','m','e','n','t',0,2,'I','d','e','o','g','r','a','p','h','i','c','_','S','y','m','b','o','l','s',0, +'I','d','e','o','g','r','a','p','h','i','c','_','S','y','m','b','o','l','s','_','A','n','d','_','P','u','n','c','t','u','a','t', +'i','o','n',0,2,'M','a','r','c','h','e','n',0,'M','a','r','c','h','e','n',0, +2,'M','o','n','g','o','l','i','a','n','_','S','u','p',0,'M','o','n','g','o','l','i','a','n','_','S','u','p','p','l','e','m', +'e','n','t',0,2,'N','e','w','a',0,'N','e','w','a',0,2,'O','s','a','g','e',0,'O','s','a','g','e',0, +2,'T','a','n','g','u','t',0,'T','a','n','g','u','t',0,2,'T','a','n','g','u','t','_','C','o','m','p','o','n','e','n','t', +'s',0,'T','a','n','g','u','t','_','C','o','m','p','o','n','e','n','t','s',0, 2,'c','c','c',0,'C','a','n','o','n','i','c','a','l','_','C','o','m','b','i','n','i','n','g','_','C','l','a','s','s',0, 2,'d','t',0,'D','e','c','o','m','p','o','s','i','t','i','o','n','_','T','y','p','e',0, 3,'N','o','n','e',0,'N','o','n','e',0,'n','o','n','e',0, @@ -1415,6 +1457,9 @@ const char PropNameData::nameGroups[17897]={ 2,'M','a','n','i','c','h','a','e','a','n','_','Y','o','d','h',0,'M','a','n','i','c','h','a','e','a','n','_','Y','o','d','h', 0,2,'M','a','n','i','c','h','a','e','a','n','_','Z','a','y','i','n',0,'M','a','n','i','c','h','a','e','a','n','_','Z','a', 'y','i','n',0,2,'S','t','r','a','i','g','h','t','_','W','a','w',0,'S','t','r','a','i','g','h','t','_','W','a','w',0, +2,'A','f','r','i','c','a','n','_','F','e','h',0,'A','f','r','i','c','a','n','_','F','e','h',0, +2,'A','f','r','i','c','a','n','_','N','o','o','n',0,'A','f','r','i','c','a','n','_','N','o','o','n',0, +2,'A','f','r','i','c','a','n','_','Q','a','f',0,'A','f','r','i','c','a','n','_','Q','a','f',0, 2,'j','t',0,'J','o','i','n','i','n','g','_','T','y','p','e',0, 2,'U',0,'N','o','n','_','J','o','i','n','i','n','g',0,2,'C',0,'J','o','i','n','_','C','a','u','s','i','n','g',0, 2,'D',0,'D','u','a','l','_','J','o','i','n','i','n','g',0, @@ -1449,7 +1494,8 @@ const char PropNameData::nameGroups[17897]={ 's','i','s',0,2,'C','J',0,'C','o','n','d','i','t','i','o','n','a','l','_','J','a','p','a','n','e','s','e','_','S','t','a', 'r','t','e','r',0,2,'H','L',0,'H','e','b','r','e','w','_','L','e','t','t','e','r',0, 2,'R','I',0,'R','e','g','i','o','n','a','l','_','I','n','d','i','c','a','t','o','r',0, -2,'n','t',0,'N','u','m','e','r','i','c','_','T','y','p','e',0, +2,'E','B',0,'E','_','B','a','s','e',0,2,'E','M',0,'E','_','M','o','d','i','f','i','e','r',0, +2,'Z','W','J',0,'Z','W','J',0,2,'n','t',0,'N','u','m','e','r','i','c','_','T','y','p','e',0, 2,'N','o','n','e',0,'N','o','n','e',0,2,'D','e',0,'D','e','c','i','m','a','l',0, 2,'D','i',0,'D','i','g','i','t',0,2,'N','u',0,'N','u','m','e','r','i','c',0, 2,'s','c',0,'S','c','r','i','p','t',0,2,'Z','y','y','y',0,'C','o','m','m','o','n',0, @@ -1543,15 +1589,19 @@ const char PropNameData::nameGroups[17897]={ 2,'A','f','a','k',0,'A','f','a','k',0,2,'J','u','r','c',0,'J','u','r','c',0, 2,'M','r','o','o',0,'M','r','o',0,2,'N','s','h','u',0,'N','s','h','u',0, 2,'S','h','r','d',0,'S','h','a','r','a','d','a',0,2,'S','o','r','a',0,'S','o','r','a','_','S','o','m','p','e','n','g', -0,2,'T','a','k','r',0,'T','a','k','r','i',0,2,'T','a','n','g',0,'T','a','n','g',0, +0,2,'T','a','k','r',0,'T','a','k','r','i',0,2,'T','a','n','g',0,'T','a','n','g','u','t',0, 2,'W','o','l','e',0,'W','o','l','e',0,2,'H','l','u','w',0,'A','n','a','t','o','l','i','a','n','_','H','i','e','r','o', 'g','l','y','p','h','s',0,2,'K','h','o','j',0,'K','h','o','j','k','i',0, 2,'T','i','r','h',0,'T','i','r','h','u','t','a',0,2,'A','g','h','b',0,'C','a','u','c','a','s','i','a','n','_','A','l', 'b','a','n','i','a','n',0,2,'M','a','h','j',0,'M','a','h','a','j','a','n','i',0, 2,'H','a','t','r',0,'H','a','t','r','a','n',0,2,'M','u','l','t',0,'M','u','l','t','a','n','i',0, 2,'P','a','u','c',0,'P','a','u','_','C','i','n','_','H','a','u',0, -2,'S','i','d','d',0,'S','i','d','d','h','a','m',0,2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b', -'l','e','_','T','y','p','e',0,2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0, +2,'S','i','d','d',0,'S','i','d','d','h','a','m',0,2,'A','d','l','m',0,'A','d','l','a','m',0, +2,'B','h','k','s',0,'B','h','a','i','k','s','u','k','i',0, +2,'M','a','r','c',0,'M','a','r','c','h','e','n',0,2,'O','s','g','e',0,'O','s','a','g','e',0, +2,'H','a','n','b',0,'H','a','n','b',0,2,'J','a','m','o',0,'J','a','m','o',0, +2,'Z','s','y','e',0,'Z','s','y','e',0,2,'h','s','t',0,'H','a','n','g','u','l','_','S','y','l','l','a','b','l','e','_', +'T','y','p','e',0,2,'N','A',0,'N','o','t','_','A','p','p','l','i','c','a','b','l','e',0, 2,'L',0,'L','e','a','d','i','n','g','_','J','a','m','o',0, 2,'V',0,'V','o','w','e','l','_','J','a','m','o',0,2,'T',0,'T','r','a','i','l','i','n','g','_','J','a','m','o',0, 2,'L','V',0,'L','V','_','S','y','l','l','a','b','l','e',0, @@ -1568,7 +1618,9 @@ const char PropNameData::nameGroups[17897]={ 2,'E','X',0,'E','x','t','e','n','d',0,2,'L',0,'L',0, 2,'L','F',0,'L','F',0,2,'L','V',0,'L','V',0,2,'L','V','T',0,'L','V','T',0, 2,'T',0,'T',0,2,'V',0,'V',0,2,'S','M',0,'S','p','a','c','i','n','g','M','a','r','k',0, -2,'P','P',0,'P','r','e','p','e','n','d',0,2,'S','B',0,'S','e','n','t','e','n','c','e','_','B','r','e','a','k',0, +2,'P','P',0,'P','r','e','p','e','n','d',0,2,'E','B','G',0,'E','_','B','a','s','e','_','G','A','Z',0, +2,'G','A','Z',0,'G','l','u','e','_','A','f','t','e','r','_','Z','w','j',0, +2,'S','B',0,'S','e','n','t','e','n','c','e','_','B','r','e','a','k',0, 2,'A','T',0,'A','T','e','r','m',0,2,'C','L',0,'C','l','o','s','e',0, 2,'F','O',0,'F','o','r','m','a','t',0,2,'L','O',0,'L','o','w','e','r',0, 2,'L','E',0,'O','L','e','t','t','e','r',0,2,'S','E',0,'S','e','p',0, diff --git a/deps/icu-small/source/common/propsvec.c b/deps/icu-small/source/common/propsvec.c index f91a155cf8da0d..ed4d89954b872f 100644 --- a/deps/icu-small/source/common/propsvec.c +++ b/deps/icu-small/source/common/propsvec.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -218,7 +220,7 @@ upvec_setValue(UPropsVectors *pv, *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return; } - uprv_memcpy(newVectors, pv->v, rows*columns*4); + uprv_memcpy(newVectors, pv->v, (size_t)rows*columns*4); firstRow=newVectors+(firstRow-pv->v); lastRow=newVectors+(lastRow-pv->v); uprv_free(pv->v); @@ -240,7 +242,7 @@ upvec_setValue(UPropsVectors *pv, if(splitFirstRow) { /* copy all affected rows up one and move the lastRow pointer */ count = (int32_t)((lastRow-firstRow)+columns); - uprv_memmove(firstRow+columns, firstRow, count*4); + uprv_memmove(firstRow+columns, firstRow, (size_t)count*4); lastRow+=columns; /* split the range and move the firstRow pointer */ @@ -251,7 +253,7 @@ upvec_setValue(UPropsVectors *pv, /* split the last row */ if(splitLastRow) { /* copy the last row data */ - uprv_memcpy(lastRow+columns, lastRow, columns*4); + uprv_memcpy(lastRow+columns, lastRow, (size_t)columns*4); /* split the range and move the firstRow pointer */ lastRow[1]=lastRow[columns]=(uint32_t)limit; @@ -415,7 +417,7 @@ upvec_compact(UPropsVectors *pv, UPVecCompactHandler *handler, void *context, UE /* add a new values vector if it is different from the current one */ if(count<0 || 0!=uprv_memcmp(row+2, pv->v+count, valueColumns*4)) { count+=valueColumns; - uprv_memmove(pv->v+count, row+2, valueColumns*4); + uprv_memmove(pv->v+count, row+2, (size_t)valueColumns*4); } if(startd_name; if (uprv_strcmp(dirName, SKIP1) != 0 && uprv_strcmp(dirName, SKIP2) != 0) { /* Create a newpath with the new entry to test each entry in the directory. */ - char newpath[MAX_PATH_SIZE]; - uprv_strcpy(newpath, curpath); - uprv_strcat(newpath, dirName); + CharString newpath(curpath, status); + newpath.append(dirName, -1, status); + if (U_FAILURE(status)) { + return NULL; + } - if ((subDirp = opendir(newpath)) != NULL) { + if ((subDirp = opendir(newpath.data())) != NULL) { /* If this new path is a directory, make a recursive call with the newpath. */ closedir(subDirp); - uprv_strcat(newpath, "/"); - result = searchForTZFile(newpath, tzInfo); + newpath.append('/', status); + if (U_FAILURE(status)) { + return NULL; + } + result = searchForTZFile(newpath.data(), tzInfo); /* Have to get out here. Otherwise, we'd keep looking and return the first match in the top-level directory @@ -955,11 +976,19 @@ 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) { - if(compareBinaryFiles(TZDEFAULT, newpath, tzInfo)) { - const char* zoneid = newpath + (sizeof(TZZONEINFO)) - 1; + if(compareBinaryFiles(TZDEFAULT, newpath.data(), tzInfo)) { + int32_t amountToSkip = sizeof(TZZONEINFO) - 1; + if (amountToSkip > newpath.length()) { + amountToSkip = newpath.length(); + } + const char* zoneid = newpath.data() + amountToSkip; skipZoneIDPrefix(&zoneid); - uprv_strcpy(SEARCH_TZFILE_RESULT, zoneid); - result = SEARCH_TZFILE_RESULT; + gSearchTZFileResult->clear(); + gSearchTZFileResult->append(zoneid, -1, status); + if (U_FAILURE(status)) { + return NULL; + } + result = gSearchTZFileResult->data(); /* Get out after the first one found. */ break; } @@ -970,6 +999,15 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { return result; } #endif + +U_CAPI void U_EXPORT2 +uprv_tzname_clear_cache() +{ +#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK) + gTimeZoneBufferPtr = NULL; +#endif +} + U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { @@ -1019,7 +1057,7 @@ uprv_tzname(int n) because the tzfile contents is underspecified. This isn't guaranteed to work because it may not be a symlink. */ - int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)); + int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)-1); if (0 < ret) { int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); gTimeZoneBuffer[ret] = 0; @@ -1139,6 +1177,11 @@ static UBool U_CALLCONV putil_cleanup(void) gTimeZoneFilesDirectory = NULL; gTimeZoneFilesInitOnce.reset(); +#ifdef SEARCH_TZFILE + delete gSearchTZFileResult; + gSearchTZFileResult = NULL; +#endif + #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API if (gCorrectedPOSIXLocale) { uprv_free(gCorrectedPOSIXLocale); diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index b52a91c7ac0262..cb783508255dd6 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -1,7 +1,9 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * -* Copyright (C) 1997-2015, International Business Machines +* Copyright (C) 1997-2016, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -148,7 +150,7 @@ typedef size_t uintptr_t; #ifdef U_HAVE_MMAP /* Use the predefined value. */ -#elif U_PLATFORM_HAS_WIN32_API +#elif U_PLATFORM_USES_ONLY_WIN32_API # define U_HAVE_MMAP 0 #else # define U_HAVE_MMAP 1 @@ -171,7 +173,7 @@ typedef size_t uintptr_t; */ #ifdef U_HAVE_DIRENT_H /* Use the predefined value. */ -#elif U_PLATFORM_HAS_WIN32_API +#elif U_PLATFORM_USES_ONLY_WIN32_API # define U_HAVE_DIRENT_H 0 #else # define U_HAVE_DIRENT_H 1 @@ -478,6 +480,12 @@ U_INTERNAL int32_t U_EXPORT2 uprv_timezone(void); */ U_INTERNAL const char* U_EXPORT2 uprv_tzname(int n); +/** + * Reset the global tzname cache. + * @internal + */ +U_INTERNAL void uprv_tzname_clear_cache(); + /** * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970. * This function is affected by 'faketime' and should be the bottleneck for all user-visible ICU time functions. diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index 8b6f7c0cc6a9eb..daba40b741406d 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 1999-2016 International Business Machines Corporation @@ -72,21 +74,6 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode } } -/** - * Same as above but does not adopt memory - */ -RuleBasedBreakIterator::RuleBasedBreakIterator(const RBBIDataHeader* data, enum EDontAdopt, UErrorCode &status) -{ - init(); - fData = new RBBIDataWrapper(data, RBBIDataWrapper::kDontAdopt, status); // status checked in constructor - if (U_FAILURE(status)) {return;} - if(fData == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } -} - - // // Construct from precompiled binary rules (tables). This constructor is public API, // taking the rules as a (const uint8_t *) to match the type produced by getBinaryRules(). diff --git a/deps/icu-small/source/common/rbbicst.pl b/deps/icu-small/source/common/rbbicst.pl old mode 100644 new mode 100755 index 82f770615372b8..839b9501dda953 --- a/deps/icu-small/source/common/rbbicst.pl +++ b/deps/icu-small/source/common/rbbicst.pl @@ -1,4 +1,8 @@ #************************************************************************** +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html#License +#************************************************************************** +#************************************************************************** # Copyright (C) 2002-2016 International Business Machines Corporation # and others. All rights reserved. #************************************************************************** diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index 3f151b42bbf496..afa87eb6a83f6b 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 1999-2014 International Business Machines Corporation * diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index 3e53c44ad5b7ae..0d6cde2d942284 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/rbbinode.cpp b/deps/icu-small/source/common/rbbinode.cpp index 221f8f2661a72e..d0949a3f7f045a 100644 --- a/deps/icu-small/source/common/rbbinode.cpp +++ b/deps/icu-small/source/common/rbbinode.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 2002-2016 International Business Machines Corporation * @@ -23,6 +25,8 @@ #include "unicode/uniset.h" #include "unicode/uchar.h" #include "unicode/parsepos.h" + +#include "cstr.h" #include "uvector.h" #include "rbbirb.h" @@ -165,8 +169,6 @@ RBBINode *RBBINode::cloneTree() { } } } - n->fRuleRoot = this->fRuleRoot; - n->fChainIn = this->fChainIn; return n; } @@ -192,8 +194,12 @@ RBBINode *RBBINode::cloneTree() { //------------------------------------------------------------------------- RBBINode *RBBINode::flattenVariables() { if (fType == varRef) { - RBBINode *retNode = fLeftChild->cloneTree(); - delete this; + RBBINode *retNode = fLeftChild->cloneTree(); + if (retNode != NULL) { + retNode->fRuleRoot = this->fRuleRoot; + retNode->fChainIn = this->fChainIn; + } + delete this; // TODO: undefined behavior. Fix. return retNode; } @@ -284,7 +290,7 @@ static int32_t serial(const RBBINode *node) { } -void RBBINode::printNode() { +void RBBINode::printNode(const RBBINode *node) { static const char * const nodeTypeNames[] = { "setRef", "uset", @@ -304,15 +310,16 @@ void RBBINode::printNode() { "opLParen" }; - if (this==NULL) { - RBBIDebugPrintf("%10p", (void *)this); + if (node==NULL) { + RBBIDebugPrintf("%10p", (void *)node); } else { RBBIDebugPrintf("%10p %5d %12s %c%c %5d %5d %5d %6d %d ", - (void *)this, fSerialNum, nodeTypeNames[fType], fRuleRoot?'R':' ', fChainIn?'C':' ', - serial(fLeftChild), serial(fRightChild), serial(fParent), - fFirstPos, fVal); - if (fType == varRef) { - RBBI_DEBUG_printUnicodeString(fText); + (void *)node, node->fSerialNum, nodeTypeNames[node->fType], + node->fRuleRoot?'R':' ', node->fChainIn?'C':' ', + serial(node->fLeftChild), serial(node->fRightChild), serial(node->fParent), + node->fFirstPos, node->fVal); + if (node->fType == varRef) { + RBBI_DEBUG_printUnicodeString(node->fText); } } RBBIDebugPrintf("\n"); @@ -321,16 +328,8 @@ void RBBINode::printNode() { #ifdef RBBI_DEBUG -U_CFUNC void RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth) -{ - int i; - for (i=0; iprintNode(); - if (this != NULL) { + printNode(node); + if (node != NULL) { // Only dump the definition under a variable reference if asked to. // Unconditinally dump children of all other node types. - if (fType != varRef) { - if (fLeftChild != NULL) { - fLeftChild->printTree(FALSE); + if (node->fType != varRef) { + if (node->fLeftChild != NULL) { + printTree(node->fLeftChild, FALSE); } - if (fRightChild != NULL) { - fRightChild->printTree(FALSE); + if (node->fRightChild != NULL) { + printTree(node->fRightChild, FALSE); } } } diff --git a/deps/icu-small/source/common/rbbinode.h b/deps/icu-small/source/common/rbbinode.h index 4960e38f69cf41..ac26ceefaf449f 100644 --- a/deps/icu-small/source/common/rbbinode.h +++ b/deps/icu-small/source/common/rbbinode.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2001-2016, International Business Machines Corporation and @@ -100,8 +102,8 @@ class RBBINode : public UMemory { #ifdef RBBI_DEBUG static void printNodeHeader(); - void printNode(); - void printTree(UBool withHeading); + static void printNode(const RBBINode *n); + static void printTree(const RBBINode *n, UBool withHeading); #endif private: diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index c2dce683172e52..475fdd7f8369e7 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // file: rbbirb.cpp // diff --git a/deps/icu-small/source/common/rbbirb.h b/deps/icu-small/source/common/rbbirb.h index b454b609fd993d..1a9d3023254139 100644 --- a/deps/icu-small/source/common/rbbirb.h +++ b/deps/icu-small/source/common/rbbirb.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // rbbirb.h // diff --git a/deps/icu-small/source/common/rbbirpt.h b/deps/icu-small/source/common/rbbirpt.h index f628c938154022..542a396df089b7 100644 --- a/deps/icu-small/source/common/rbbirpt.h +++ b/deps/icu-small/source/common/rbbirpt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------------------------------- // // Generated Header File. Do not edit by hand. diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index e19a6479c31748..57432509454057 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // file: rbbiscan.cpp // @@ -1103,6 +1105,17 @@ void RBBIRuleScanner::parse() { } + if (U_FAILURE(*fRB->fStatus)) { + return; + } + + // If there are no forward rules set an error. + // + if (fRB->fForwardTree == NULL) { + error(U_BRK_RULE_SYNTAX); + return; + } + // // If there were NO user specified reverse rules, set up the equivalent of ".*;" // @@ -1126,16 +1139,15 @@ void RBBIRuleScanner::parse() { // #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "symbols")) {fSymbolTable->rbbiSymtablePrint();} - if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ptree")) - { + if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ptree")) { RBBIDebugPrintf("Completed Forward Rules Parse Tree...\n"); - fRB->fForwardTree->printTree(TRUE); + RBBINode::printTree(fRB->fForwardTree, TRUE); RBBIDebugPrintf("\nCompleted Reverse Rules Parse Tree...\n"); - fRB->fReverseTree->printTree(TRUE); + RBBINode::printTree(fRB->fReverseTree, TRUE); RBBIDebugPrintf("\nCompleted Safe Point Forward Rules Parse Tree...\n"); - fRB->fSafeFwdTree->printTree(TRUE); + RBBINode::printTree(fRB->fSafeFwdTree, TRUE); RBBIDebugPrintf("\nCompleted Safe Point Reverse Rules Parse Tree...\n"); - fRB->fSafeRevTree->printTree(TRUE); + RBBINode::printTree(fRB->fSafeRevTree, TRUE); } #endif } @@ -1150,7 +1162,7 @@ void RBBIRuleScanner::parse() { void RBBIRuleScanner::printNodeStack(const char *title) { int i; RBBIDebugPrintf("%s. Dumping node stack...\n", title); - for (i=fNodeStackPtr; i>0; i--) {fNodeStack[i]->printTree(TRUE);} + for (i=fNodeStackPtr; i>0; i--) {RBBINode::printTree(fNodeStack[i], TRUE);} } #endif diff --git a/deps/icu-small/source/common/rbbiscan.h b/deps/icu-small/source/common/rbbiscan.h index ede5aaa35e4049..6be2f9668ff6cf 100644 --- a/deps/icu-small/source/common/rbbiscan.h +++ b/deps/icu-small/source/common/rbbiscan.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // rbbiscan.h // diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index a419289bc752ea..22ec28c1350638 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.cpp // @@ -546,7 +548,7 @@ void RBBISetBuilder::printSets() { RBBI_DEBUG_printUnicodeString(usetNode->fText); RBBIDebugPrintf("\n"); if (usetNode->fLeftChild != NULL) { - usetNode->fLeftChild->printTree(TRUE); + RBBINode::printTree(usetNode->fLeftChild, TRUE); } } RBBIDebugPrintf("\n"); diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index c8bc1df7786c49..89bfb9865cda15 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.h /* diff --git a/deps/icu-small/source/common/rbbistbl.cpp b/deps/icu-small/source/common/rbbistbl.cpp index c35efc7eb90ce0..f48485868c81e0 100644 --- a/deps/icu-small/source/common/rbbistbl.cpp +++ b/deps/icu-small/source/common/rbbistbl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // file: rbbistbl.cpp Implementation of the ICU RBBISymbolTable class // @@ -17,10 +19,10 @@ #include "unicode/uchar.h" #include "unicode/parsepos.h" -#include "umutex.h" - -#include "rbbirb.h" +#include "cstr.h" #include "rbbinode.h" +#include "rbbirb.h" +#include "umutex.h" // @@ -226,9 +228,9 @@ RBBISymbolTableEntry::~RBBISymbolTableEntry() { // #ifdef RBBI_DEBUG void RBBISymbolTable::rbbiSymtablePrint() const { - RBBIDebugPrintf("Variable Definitions\n" - "Name Node Val String Val\n" - "----------------------------------------------------------------------\n"); + RBBIDebugPrintf("Variable Definitions Symbol Table\n" + "Name Node serial String Val\n" + "-------------------------------------------------------------------\n"); int32_t pos = UHASH_FIRST; const UHashElement *e = NULL; @@ -239,10 +241,8 @@ void RBBISymbolTable::rbbiSymtablePrint() const { } RBBISymbolTableEntry *s = (RBBISymbolTableEntry *)e->value.pointer; - RBBI_DEBUG_printUnicodeString(s->key, 15); - RBBIDebugPrintf(" %8p ", (void *)s->val); - RBBI_DEBUG_printUnicodeString(s->val->fLeftChild->fText); - RBBIDebugPrintf("\n"); + RBBIDebugPrintf("%-19s %8p %7d ", CStr(s->key)(), (void *)s->val, s->val->fSerialNum); + RBBIDebugPrintf(" %s\n", CStr(s->val->fLeftChild->fText)()); } RBBIDebugPrintf("\nParsed Variable Definitions\n"); @@ -253,8 +253,9 @@ void RBBISymbolTable::rbbiSymtablePrint() const { break; } RBBISymbolTableEntry *s = (RBBISymbolTableEntry *)e->value.pointer; - RBBI_DEBUG_printUnicodeString(s->key); - s->val->fLeftChild->printTree(TRUE); + RBBIDebugPrintf("%s\n", CStr(s->key)()); + RBBINode::printTree(s->val, TRUE); + RBBINode::printTree(s->val->fLeftChild, FALSE); RBBIDebugPrintf("\n"); } } diff --git a/deps/icu-small/source/common/rbbitblb.cpp b/deps/icu-small/source/common/rbbitblb.cpp index c2057e167a3d28..c765e610526552 100644 --- a/deps/icu-small/source/common/rbbitblb.cpp +++ b/deps/icu-small/source/common/rbbitblb.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2016, International Business Machines @@ -79,7 +81,7 @@ void RBBITableBuilder::build() { #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "ftree")) { RBBIDebugPuts("\nParse tree after flattening variable references."); - fTree->printTree(TRUE); + RBBINode::printTree(fTree, TRUE); } #endif @@ -137,7 +139,7 @@ void RBBITableBuilder::build() { #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) { RBBIDebugPuts("\nParse tree after flattening Unicode Set references."); - fTree->printTree(TRUE); + RBBINode::printTree(fTree, TRUE); } #endif @@ -1058,7 +1060,7 @@ void RBBITableBuilder::printPosSets(RBBINode *n) { } printf("\n"); RBBINode::printNodeHeader(); - n->printNode(); + RBBINode::printNode(n); RBBIDebugPrintf(" Nullable: %s\n", n->fNullable?"TRUE":"FALSE"); RBBIDebugPrintf(" firstpos: "); diff --git a/deps/icu-small/source/common/rbbitblb.h b/deps/icu-small/source/common/rbbitblb.h index 9e65bd93d01a22..d71a0245874b5d 100644 --- a/deps/icu-small/source/common/rbbitblb.h +++ b/deps/icu-small/source/common/rbbitblb.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // rbbitblb.h // diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 8d91184da53066..2976791761f88f 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2013, International Business Machines diff --git a/deps/icu-small/source/common/resbund_cnv.cpp b/deps/icu-small/source/common/resbund_cnv.cpp index ecb2e8ab5f07f0..80a4daa3b7f627 100644 --- a/deps/icu-small/source/common/resbund_cnv.cpp +++ b/deps/icu-small/source/common/resbund_cnv.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/resource.cpp b/deps/icu-small/source/common/resource.cpp index 7a4c4181bf834c..62b3aa46a5c083 100644 --- a/deps/icu-small/source/common/resource.cpp +++ b/deps/icu-small/source/common/resource.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 2015, International Business Machines +* Copyright (C) 2015-2016, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * resource.cpp @@ -11,50 +13,10 @@ #include "resource.h" -#include "unicode/utypes.h" -#include "unicode/uobject.h" -#include "unicode/ures.h" - U_NAMESPACE_BEGIN ResourceValue::~ResourceValue() {} - -ResourceArraySink::~ResourceArraySink() {} - -void ResourceArraySink::put( - int32_t /*index*/, const ResourceValue & /*value*/, UErrorCode & /*errorCode*/) {} - -ResourceArraySink *ResourceArraySink::getOrCreateArraySink( - int32_t /*index*/, int32_t /*size*/, UErrorCode & /*errorCode*/) { - return NULL; -} - -ResourceTableSink *ResourceArraySink::getOrCreateTableSink( - int32_t /*index*/, int32_t /*initialSize*/, UErrorCode & /*errorCode*/) { - return NULL; -} - -void ResourceArraySink::leave(UErrorCode & /*errorCode*/) {} - - -ResourceTableSink::~ResourceTableSink() {} - -void ResourceTableSink::put( - const char * /*key*/, const ResourceValue & /*value*/, UErrorCode & /*errorCode*/) {} - -void ResourceTableSink::putNoFallback(const char * /*key*/, UErrorCode & /*errorCode*/) {} - -ResourceArraySink *ResourceTableSink::getOrCreateArraySink( - const char * /*key*/, int32_t /*size*/, UErrorCode & /*errorCode*/) { - return NULL; -} - -ResourceTableSink *ResourceTableSink::getOrCreateTableSink( - const char * /*key*/, int32_t /*initialSize*/, UErrorCode & /*errorCode*/) { - return NULL; -} - -void ResourceTableSink::leave(UErrorCode & /*errorCode*/) {} +ResourceSink::~ResourceSink() {} U_NAMESPACE_END diff --git a/deps/icu-small/source/common/resource.h b/deps/icu-small/source/common/resource.h index 042e298b798242..43c3309b5e9917 100644 --- a/deps/icu-small/source/common/resource.h +++ b/deps/icu-small/source/common/resource.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 2015, International Business Machines +* Copyright (C) 2015-2016, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * resource.h @@ -27,13 +29,80 @@ #include "unicode/unistr.h" #include "unicode/ures.h" +struct ResourceData; + U_NAMESPACE_BEGIN -class ResourceTableSink; +class ResourceValue; // Note: In C++, we use const char * pointers for keys, // rather than an abstraction like Java UResource.Key. +/** + * Interface for iterating over a resource bundle array resource. + */ +class U_COMMON_API ResourceArray { +public: + /** Constructs an empty array object. */ + ResourceArray() : items16(NULL), items32(NULL), length(0) {} + + /** Only for implementation use. @internal */ + ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len) : + items16(i16), items32(i32), length(len) {} + + /** + * @return The number of items in the array resource. + */ + int32_t getSize() const { return length; } + /** + * @param i Array item index. + * @param value Output-only, receives the value of the i'th item. + * @return TRUE if i is non-negative and less than getSize(). + */ + UBool getValue(int32_t i, ResourceValue &value) const; + + /** Only for implementation use. @internal */ + uint32_t internalGetResource(const ResourceData *pResData, int32_t i) const; + +private: + const uint16_t *items16; + const uint32_t *items32; + int32_t length; +}; + +/** + * Interface for iterating over a resource bundle table resource. + */ +class U_COMMON_API ResourceTable { +public: + /** Constructs an empty table object. */ + ResourceTable() : keys16(NULL), keys32(NULL), items16(NULL), items32(NULL), length(0) {} + + /** Only for implementation use. @internal */ + ResourceTable(const uint16_t *k16, const int32_t *k32, + const uint16_t *i16, const uint32_t *i32, int32_t len) : + keys16(k16), keys32(k32), items16(i16), items32(i32), length(len) {} + + /** + * @return The number of items in the array resource. + */ + int32_t getSize() const { return length; } + /** + * @param i Array item index. + * @param key Output-only, receives the key of the i'th item. + * @param value Output-only, receives the value of the i'th item. + * @return TRUE if i is non-negative and less than getSize(). + */ + UBool getKeyAndValue(int32_t i, const char *&key, ResourceValue &value) const; + +private: + const uint16_t *keys16; + const int32_t *keys32; + const uint16_t *items16; + const uint32_t *items32; + int32_t length; +}; + /** * Represents a resource bundle item's value. * Avoids object creations as much as possible. @@ -100,147 +169,109 @@ class U_COMMON_API ResourceValue : public UObject { */ virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0; -protected: - ResourceValue() {} - -private: - ResourceValue(const ResourceValue &); // no copy constructor - ResourceValue &operator=(const ResourceValue &); // no assignment operator -}; + /** + * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource + */ + virtual ResourceArray getArray(UErrorCode &errorCode) const = 0; -/** - * Sink for ICU resource array contents. - * The base class does nothing. - * - * Nested arrays and tables are stored as nested sinks, - * never put() as ResourceValue items. - */ -class U_COMMON_API ResourceArraySink : public UObject { -public: - ResourceArraySink() {} - virtual ~ResourceArraySink(); + /** + * Sets U_RESOURCE_TYPE_MISMATCH if this is not a table resource + */ + virtual ResourceTable getTable(UErrorCode &errorCode) const = 0; /** - * Adds a value from a resource array. + * Is this a no-fallback/no-inheritance marker string? + * Such a marker is used for + * CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205} + * when enumerating tables with fallback from the specific resource bundle to root. * - * @param index of the resource array item - * @param value resource value + * @return TRUE if this is a no-inheritance marker string */ - virtual void put(int32_t index, const ResourceValue &value, UErrorCode &errorCode); + virtual UBool isNoInheritanceMarker() const = 0; /** - * Returns a nested resource array at the array index as another sink. - * Creates the sink if none exists for the key. - * Returns NULL if nested arrays are not supported. - * The default implementation always returns NULL. + * Sets the dest strings from the string values in this array resource. * - * This sink (not the caller) owns the nested sink. + * @return the number of strings in this array resource. + * If greater than capacity, then an overflow error is set. * - * @param index of the resource array item - * @param size number of array items - * @return nested-array sink, or NULL + * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource + * or if any of the array items is not a string */ - virtual ResourceArraySink *getOrCreateArraySink( - int32_t index, int32_t size, UErrorCode &errorCode); + virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const = 0; /** - * Returns a nested resource table at the array index as another sink. - * Creates the sink if none exists for the key. - * Returns NULL if nested tables are not supported. - * The default implementation always returns NULL. - * - * This sink (not the caller) owns the nested sink. + * Same as + *
+     * if (getType() == URES_STRING) {
+     *     return new String[] { getString(); }
+     * } else {
+     *     return getStringArray();
+     * }
+     * 
* - * @param index of the resource array item - * @param initialSize size hint for creating the sink if necessary - * @return nested-table sink, or NULL + * Sets U_RESOURCE_TYPE_MISMATCH if this is + * neither a string resource nor an array resource containing strings + * @see getString() + * @see getStringArray() */ - virtual ResourceTableSink *getOrCreateTableSink( - int32_t index, int32_t initialSize, UErrorCode &errorCode); + virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const = 0; /** - * "Leaves" the array. - * Indicates that all of the resources and sub-resources of the current array - * have been enumerated. + * Same as + *
+     * if (getType() == URES_STRING) {
+     *     return getString();
+     * } else {
+     *     return getStringArray()[0];
+     * }
+     * 
+ * + * Sets U_RESOURCE_TYPE_MISMATCH if this is + * neither a string resource nor an array resource containing strings + * @see getString() + * @see getStringArray() */ - virtual void leave(UErrorCode &errorCode); + virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const = 0; + +protected: + ResourceValue() {} private: - ResourceArraySink(const ResourceArraySink &); // no copy constructor - ResourceArraySink &operator=(const ResourceArraySink &); // no assignment operator + ResourceValue(const ResourceValue &); // no copy constructor + ResourceValue &operator=(const ResourceValue &); // no assignment operator }; /** - * Sink for ICU resource table contents. - * The base class does nothing. - * - * Nested arrays and tables are stored as nested sinks, - * never put() as ResourceValue items. + * Sink for ICU resource bundle contents. */ -class U_COMMON_API ResourceTableSink : public UObject { +class U_COMMON_API ResourceSink : public UObject { public: - ResourceTableSink() {} - virtual ~ResourceTableSink(); - - /** - * Adds a key-value pair from a resource table. - * - * @param key resource key string - * @param value resource value - */ - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode); + ResourceSink() {} + virtual ~ResourceSink(); /** - * Adds a no-fallback/no-inheritance marker for this key. - * Used for CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205} - * when enumerating tables with fallback from the specific resource bundle to root. - * - * The default implementation does nothing. - * - * @param key to be removed - */ - virtual void putNoFallback(const char *key, UErrorCode &errorCode); - - /** - * Returns a nested resource array for the key as another sink. - * Creates the sink if none exists for the key. - * Returns NULL if nested arrays are not supported. - * The default implementation always returns NULL. - * - * This sink (not the caller) owns the nested sink. + * Called once for each bundle (child-parent-...-root). + * The value is normally an array or table resource, + * and implementations of this method normally iterate over the + * tree of resource items stored there. * - * @param key resource key string - * @param size number of array items - * @return nested-array sink, or NULL - */ - virtual ResourceArraySink *getOrCreateArraySink( - const char *key, int32_t size, UErrorCode &errorCode); - - /** - * Returns a nested resource table for the key as another sink. - * Creates the sink if none exists for the key. - * Returns NULL if nested tables are not supported. - * The default implementation always returns NULL. - * - * This sink (not the caller) owns the nested sink. - * - * @param key resource key string - * @param initialSize size hint for creating the sink if necessary - * @return nested-table sink, or NULL - */ - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t initialSize, UErrorCode &errorCode); - - /** - * "Leaves" the table. - * Indicates that all of the resources and sub-resources of the current table - * have been enumerated. + * @param key The key string of the enumeration-start resource. + * Empty if the enumeration starts at the top level of the bundle. + * @param value Call getArray() or getTable() as appropriate. + * Then reuse for output values from Array and Table getters. + * @param noFallback true if the bundle has no parent; + * that is, its top-level table has the nofallback attribute, + * or it is the root bundle of a locale tree. */ - virtual void leave(UErrorCode &errorCode); + virtual void put(const char *key, ResourceValue &value, UBool noFallback, + UErrorCode &errorCode) = 0; private: - ResourceTableSink(const ResourceTableSink &); // no copy constructor - ResourceTableSink &operator=(const ResourceTableSink &); // no assignment operator + ResourceSink(const ResourceSink &); // no copy constructor + ResourceSink &operator=(const ResourceSink &); // no assignment operator }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/ruleiter.cpp b/deps/icu-small/source/common/ruleiter.cpp index 667795efabcf39..6e27b4dd8c609e 100644 --- a/deps/icu-small/source/common/ruleiter.cpp +++ b/deps/icu-small/source/common/ruleiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2011, International Business Machines diff --git a/deps/icu-small/source/common/ruleiter.h b/deps/icu-small/source/common/ruleiter.h index 2fad54f01c9b8d..b0b8e5435f49c6 100644 --- a/deps/icu-small/source/common/ruleiter.h +++ b/deps/icu-small/source/common/ruleiter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2011, International Business Machines diff --git a/deps/icu-small/source/common/schriter.cpp b/deps/icu-small/source/common/schriter.cpp index 17ce400186969a..cc413666f1a838 100644 --- a/deps/icu-small/source/common/schriter.cpp +++ b/deps/icu-small/source/common/schriter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1998-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/serv.cpp b/deps/icu-small/source/common/serv.cpp index b0add499832407..9f05c1943ae1b6 100644 --- a/deps/icu-small/source/common/serv.cpp +++ b/deps/icu-small/source/common/serv.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation. diff --git a/deps/icu-small/source/common/serv.h b/deps/icu-small/source/common/serv.h index 602c3d3b1342f1..c82c6d1dd8197f 100644 --- a/deps/icu-small/source/common/serv.h +++ b/deps/icu-small/source/common/serv.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2011, International Business Machines Corporation. * diff --git a/deps/icu-small/source/common/servlk.cpp b/deps/icu-small/source/common/servlk.cpp index 5636091fd962dc..cdd4e3f7f0c1ab 100644 --- a/deps/icu-small/source/common/servlk.cpp +++ b/deps/icu-small/source/common/servlk.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servlkf.cpp b/deps/icu-small/source/common/servlkf.cpp index b03d29befbae41..d8617cee489f21 100644 --- a/deps/icu-small/source/common/servlkf.cpp +++ b/deps/icu-small/source/common/servlkf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servloc.h b/deps/icu-small/source/common/servloc.h index ade941cc34a906..5a2b669d7f9d90 100644 --- a/deps/icu-small/source/common/servloc.h +++ b/deps/icu-small/source/common/servloc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2011, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index cc53ab5e92d8ae..10f3b88aa7ba4f 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servnotf.cpp b/deps/icu-small/source/common/servnotf.cpp index 33e7f177be871b..3d94c8690dcbf0 100644 --- a/deps/icu-small/source/common/servnotf.cpp +++ b/deps/icu-small/source/common/servnotf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2012, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servnotf.h b/deps/icu-small/source/common/servnotf.h index c8959f0c16d724..72ae93e6277000 100644 --- a/deps/icu-small/source/common/servnotf.h +++ b/deps/icu-small/source/common/servnotf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servrbf.cpp b/deps/icu-small/source/common/servrbf.cpp index 274016e94172c6..f67ed026ee76e2 100644 --- a/deps/icu-small/source/common/servrbf.cpp +++ b/deps/icu-small/source/common/servrbf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/servslkf.cpp b/deps/icu-small/source/common/servslkf.cpp index 0ee66b4cfe3c76..c01a2ad4c1c153 100644 --- a/deps/icu-small/source/common/servslkf.cpp +++ b/deps/icu-small/source/common/servslkf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/common/sharedobject.cpp b/deps/icu-small/source/common/sharedobject.cpp index bffd8a3fc8801f..8e5095e129255a 100644 --- a/deps/icu-small/source/common/sharedobject.cpp +++ b/deps/icu-small/source/common/sharedobject.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/common/sharedobject.h b/deps/icu-small/source/common/sharedobject.h index 7d3433b6b61059..6e205b14ba9798 100644 --- a/deps/icu-small/source/common/sharedobject.h +++ b/deps/icu-small/source/common/sharedobject.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015-2016, International Business Machines diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index 6dfa5b94ab4c80..eaeb60de143367 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014-2016, International Business Machines diff --git a/deps/icu-small/source/common/sprpimpl.h b/deps/icu-small/source/common/sprpimpl.h index 62973d39aeda6e..56c2f86eeff74f 100644 --- a/deps/icu-small/source/common/sprpimpl.h +++ b/deps/icu-small/source/common/sprpimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/stringpiece.cpp b/deps/icu-small/source/common/stringpiece.cpp index 0fb2b3e54cbff9..b032b474f65616 100644 --- a/deps/icu-small/source/common/stringpiece.cpp +++ b/deps/icu-small/source/common/stringpiece.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/common/stringtriebuilder.cpp b/deps/icu-small/source/common/stringtriebuilder.cpp index 109fcdc5f8a255..075d7c4324b0e5 100644 --- a/deps/icu-small/source/common/stringtriebuilder.cpp +++ b/deps/icu-small/source/common/stringtriebuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines diff --git a/deps/icu-small/source/common/uarrsort.c b/deps/icu-small/source/common/uarrsort.c index 22c769729e0036..bb1b5bdd785feb 100644 --- a/deps/icu-small/source/common/uarrsort.c +++ b/deps/icu-small/source/common/uarrsort.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -120,7 +122,7 @@ doInsertionSort(char *array, int32_t length, int32_t itemSize, if(insertionPointlength*sizeof(UBiDiLevel)); + uprv_memcpy(saveLevels, levels, (size_t)pBiDi->length*sizeof(UBiDiLevel)); saveTrailingWSStart=pBiDi->trailingWSStart; saveLength=pBiDi->length; saveDirection=pBiDi->direction; @@ -2512,7 +2514,7 @@ setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, if(saveLength>pBiDi->levelsSize) { saveLength=pBiDi->levelsSize; } - uprv_memcpy(pBiDi->levels, saveLevels, saveLength*sizeof(UBiDiLevel)); + uprv_memcpy(pBiDi->levels, saveLevels, (size_t)saveLength*sizeof(UBiDiLevel)); pBiDi->trailingWSStart=saveTrailingWSStart; if(pBiDi->runCount>1) { pBiDi->direction=UBIDI_MIXED; diff --git a/deps/icu-small/source/common/ubidi_props.c b/deps/icu-small/source/common/ubidi_props.c index 5c08885556095d..cba13ad6ea98b4 100644 --- a/deps/icu-small/source/common/ubidi_props.c +++ b/deps/icu-small/source/common/ubidi_props.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ubidi_props.h b/deps/icu-small/source/common/ubidi_props.h index 0533ed3b94ba63..4312230bc09b63 100644 --- a/deps/icu-small/source/common/ubidi_props.h +++ b/deps/icu-small/source/common/ubidi_props.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 2650a6651b23b0..685d2b1e844c61 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -1,484 +1,495 @@ -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: ubidi_props_data.h - * - * machine-generated by: icu/tools/unicode/c/genprops/bidipropsbuilder.cpp - */ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: ubidi_props_data.h +// +// machine-generated by: icu/tools/unicode/c/genprops/bidipropsbuilder.cpp + #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={8,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={9,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x5ae8,0x5778,0x1a,0x620,0x8b8,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5502b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x5df0,0x5a78,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; -static const uint16_t ubidi_props_trieIndex[11188]={ -0x34f,0x357,0x35f,0x367,0x37f,0x387,0x38f,0x397,0x36f,0x377,0x36f,0x377,0x36f,0x377,0x36f,0x377, -0x36f,0x377,0x36f,0x377,0x39d,0x3a5,0x3ad,0x3b5,0x3bd,0x3c5,0x3c1,0x3c9,0x3d1,0x3d9,0x3d4,0x3dc, -0x36f,0x377,0x36f,0x377,0x3e4,0x3ec,0x36f,0x377,0x36f,0x377,0x36f,0x377,0x3f2,0x3fa,0x402,0x40a, -0x412,0x41a,0x422,0x42a,0x430,0x438,0x440,0x448,0x450,0x458,0x45e,0x466,0x46e,0x476,0x47e,0x486, -0x492,0x48e,0x49a,0x404,0x404,0x4aa,0x46e,0x4a2,0x4b2,0x4b4,0x4bc,0x4c4,0x4cc,0x4cd,0x4d5,0x4dd, -0x4e5,0x4cd,0x4ed,0x4f2,0x4e5,0x4cd,0x4fa,0x502,0x4cc,0x507,0x50f,0x4c4,0x514,0x36f,0x51c,0x520, -0x528,0x529,0x531,0x539,0x4cc,0x541,0x549,0x4c4,0x4cc,0x36f,0x4d5,0x4c4,0x36f,0x36f,0x54f,0x36f, -0x36f,0x555,0x55d,0x36f,0x36f,0x561,0x569,0x36f,0x56d,0x574,0x36f,0x57c,0x584,0x58b,0x513,0x36f, -0x36f,0x593,0x59b,0x5a3,0x5ab,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x5b3,0x36f,0x5bb,0x36f,0x36f,0x36f, -0x5c3,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x5cb,0x36f,0x36f,0x36f,0x5d3,0x5d3,0x4d9,0x4d9,0x36f,0x5d9,0x5e1,0x5bb, -0x5f7,0x5e9,0x5e9,0x5ff,0x606,0x5ef,0x36f,0x36f,0x36f,0x60e,0x616,0x36f,0x36f,0x36f,0x618,0x620, -0x628,0x36f,0x62f,0x637,0x36f,0x63f,0x36f,0x36f,0x647,0x64a,0x514,0x652,0x3e6,0x65a,0x36f,0x661, -0x36f,0x666,0x36f,0x36f,0x36f,0x36f,0x66c,0x674,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x3bd,0x67c, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x684,0x68c,0x690, -0x6a8,0x6ae,0x698,0x6a0,0x6b6,0x6be,0x6c2,0x58e,0x6ca,0x6d2,0x6da,0x36f,0x6e2,0x620,0x620,0x620, -0x6f2,0x6fa,0x702,0x70a,0x70f,0x717,0x71f,0x6ea,0x727,0x72f,0x36f,0x735,0x73c,0x620,0x620,0x742, -0x620,0x53f,0x746,0x620,0x74e,0x36f,0x36f,0x61d,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620, -0x620,0x620,0x620,0x620,0x620,0x756,0x620,0x620,0x620,0x620,0x620,0x75c,0x620,0x620,0x764,0x76c, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x620,0x620,0x620,0x620,0x77c,0x783,0x78b,0x774, -0x79b,0x7a3,0x7ab,0x7b2,0x7ba,0x7c2,0x7c9,0x793,0x620,0x620,0x620,0x7d1,0x7d7,0x7dd,0x7e5,0x7ea, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x7f1,0x36f,0x36f,0x36f,0x7f9,0x36f,0x36f,0x36f,0x3bd, -0x801,0x809,0x540,0x36f,0x80c,0x620,0x620,0x623,0x620,0x620,0x620,0x620,0x620,0x620,0x813,0x819, -0x829,0x821,0x36f,0x36f,0x831,0x5c3,0x36f,0x396,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x620,0x7f8, -0x3a4,0x36f,0x839,0x841,0x36f,0x849,0x7ea,0x36f,0x36f,0x36f,0x36f,0x851,0x36f,0x36f,0x618,0x395, -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,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,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,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,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,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,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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x620,0x620, -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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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, -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,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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x839,0x620,0x53f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x858,0x36f,0x36f,0x85d,0x529,0x36f,0x36f,0x56f,0x620,0x617,0x36f,0x36f,0x865,0x36f,0x36f,0x36f, -0x86d,0x874,0x5e9,0x87c,0x36f,0x36f,0x527,0x884,0x36f,0x88b,0x892,0x36f,0x4b2,0x897,0x36f,0x4cb, -0x36f,0x89f,0x8a7,0x4cd,0x36f,0x8ab,0x4cc,0x8b3,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x8ba, -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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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, -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,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,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,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,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,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,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,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, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x8ce,0x8c2,0x8c6,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8d6,0x46e,0x46e,0x46e,0x46e,0x8de,0x8e2, -0x8ea,0x8f2,0x8f6,0x8fe,0x46e,0x46e,0x46e,0x902,0x90a,0x35f,0x912,0x91a,0x36f,0x36f,0x36f,0x922, -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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0xdbc,0xdbc,0xdfc,0xe3c,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xe74,0xeb4,0xef4,0xf04,0xf44,0xf50, -0xdbc,0xdbc,0xf90,0xdbc,0xdbc,0xdbc,0xfc8,0x1008,0x1048,0x1088,0x10c0,0x1100,0x1140,0x1178,0x11b8,0x11f8, -0xa40,0xa80,0xac0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xafa,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb37,0x1a0,0x1a0,0xb6c,0xbac,0x1a0,0xbec,0xc2c,0xc6c, +static const uint16_t ubidi_props_trieIndex[11572]={ +0x36a,0x372,0x37a,0x382,0x39a,0x3a2,0x3aa,0x3b2,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x38a,0x392, +0x38a,0x392,0x38a,0x392,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,0x3dc,0x3e4,0x3ec,0x3f4,0x3ef,0x3f7, +0x38a,0x392,0x38a,0x392,0x3ff,0x407,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x40d,0x415,0x41d,0x425, +0x42d,0x435,0x43d,0x445,0x44b,0x453,0x45b,0x463,0x46b,0x473,0x479,0x481,0x489,0x491,0x499,0x4a1, +0x4ad,0x4a9,0x4b5,0x41f,0x41f,0x4c5,0x4cd,0x4bd,0x4d5,0x4d7,0x4df,0x4e7,0x4ef,0x4f0,0x4f8,0x500, +0x508,0x4f0,0x510,0x515,0x508,0x4f0,0x51d,0x525,0x4ef,0x52a,0x532,0x4e7,0x537,0x38a,0x53f,0x543, +0x54b,0x54c,0x554,0x55c,0x4ef,0x564,0x56c,0x4e7,0x4ef,0x38a,0x4f8,0x4e7,0x38a,0x38a,0x572,0x38a, +0x38a,0x578,0x580,0x38a,0x38a,0x584,0x58c,0x38a,0x590,0x597,0x38a,0x59f,0x5a7,0x5ae,0x536,0x38a, +0x38a,0x5b6,0x5be,0x5c6,0x5ce,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5d6,0x38a,0x5de,0x38a,0x38a,0x38a, +0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x5ee,0x38a,0x38a,0x38a,0x5f6,0x5f6,0x4fc,0x4fc,0x38a,0x5fc,0x604,0x5de, +0x61a,0x60c,0x60c,0x622,0x629,0x612,0x38a,0x38a,0x38a,0x631,0x639,0x38a,0x38a,0x38a,0x63b,0x643, +0x64b,0x38a,0x652,0x65a,0x38a,0x662,0x38a,0x38a,0x66a,0x66d,0x537,0x675,0x401,0x67d,0x38a,0x684, +0x38a,0x689,0x38a,0x38a,0x38a,0x38a,0x68f,0x697,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x69f, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6a7,0x6af,0x6b3, +0x6cb,0x6d1,0x6bb,0x6c3,0x6d9,0x6e1,0x6e5,0x5b1,0x6ed,0x6f5,0x6fd,0x38a,0x705,0x643,0x643,0x643, +0x715,0x71d,0x725,0x72d,0x732,0x73a,0x742,0x70d,0x74a,0x752,0x38a,0x758,0x75f,0x643,0x643,0x765, +0x643,0x562,0x76a,0x643,0x772,0x38a,0x38a,0x640,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, +0x643,0x643,0x643,0x643,0x643,0x77a,0x643,0x643,0x643,0x643,0x643,0x780,0x643,0x643,0x788,0x790, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643,0x643,0x7a0,0x7a7,0x7af,0x798, +0x7bf,0x7c7,0x7cf,0x7d6,0x7de,0x7e6,0x7ed,0x7b7,0x643,0x643,0x643,0x7f5,0x7fb,0x801,0x809,0x80e, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x815,0x38a,0x38a,0x38a,0x81d,0x38a,0x38a,0x38a,0x3d8, +0x825,0x82d,0x834,0x38a,0x83c,0x643,0x643,0x646,0x643,0x643,0x643,0x643,0x643,0x643,0x843,0x849, +0x859,0x851,0x38a,0x38a,0x861,0x5e6,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x81c, +0x3bf,0x38a,0x838,0x869,0x38a,0x871,0x80e,0x38a,0x38a,0x38a,0x38a,0x879,0x38a,0x38a,0x63b,0x3b0, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x838,0x643,0x562,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x880,0x38a,0x38a,0x885,0x54c,0x38a,0x38a,0x592,0x643,0x63a,0x38a,0x38a,0x88d,0x38a,0x38a,0x38a, +0x895,0x89c,0x60c,0x8a4,0x38a,0x38a,0x8ab,0x8b3,0x38a,0x8ba,0x8c1,0x38a,0x4d5,0x8c6,0x38a,0x4ee, +0x38a,0x8ce,0x8d6,0x4f0,0x38a,0x8da,0x4ef,0x8e2,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e9, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fd,0x8f1,0x8f5,0x489,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x905,0x489,0x489,0x489,0x489,0x90d,0x911, +0x919,0x921,0x925,0x92d,0x489,0x489,0x489,0x931,0x939,0x37a,0x941,0x949,0x38a,0x38a,0x38a,0x951, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0xe28,0xe28,0xe68,0xea8,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xee0,0xf20,0xf60,0xf70,0xfb0,0xfbc, +0xe28,0xe28,0xffc,0xe28,0xe28,0xe28,0x1034,0x1074,0x10b4,0x10f4,0x112c,0x116c,0x11ac,0x11e4,0x1224,0x1264, +0xa40,0xa80,0xac0,0xafa,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb23,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb60,0x1a0,0x1a0,0xb95,0xbd5,0xc15,0xc55,0xc95,0xcd5, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, -0xcec,0xcfc,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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0xd55,0xd65,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,0xd15, 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,0xcac, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, 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,0xcac, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x92a,0x36f,0x620,0x620,0x932,0x5c3,0x36f,0x4c5, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x93a,0x36f,0x36f,0x36f,0x941,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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x949,0x404,0x404,0x404,0x404,0x404,0x404,0x404, -0x951,0x955,0x404,0x404,0x404,0x404,0x965,0x95d,0x404,0x96d,0x404,0x404,0x975,0x97b,0x404,0x404, -0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404, -0x404,0x404,0x404,0x983,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404, -0x4cc,0x98b,0x992,0x999,0x3e6,0x99c,0x36f,0x36f,0x4b2,0x9a4,0x36f,0x9aa,0x3e6,0x9af,0x5d5,0x36f, -0x36f,0x9b7,0x36f,0x36f,0x36f,0x36f,0x7f9,0x9bf,0x3e6,0x4cd,0x528,0x9c6,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x9cc,0x9d4,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x9d8,0x9e0,0x36f, -0x36f,0x9e8,0x528,0x36f,0x36f,0x9f0,0x36f,0x36f,0x5b3,0x9f8,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x9fc,0x36f,0xa02,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,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0xa08,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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x4e6,0xa10,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,0xa17,0xa1f,0xa25,0x36f,0x36f,0x620,0x620,0xa2d,0x36f, -0x36f,0x36f,0x36f,0x36f,0x620,0x620,0x743,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,0x36f,0xa2f,0x36f,0xa36,0x36f,0xa32,0x36f,0xa39,0x36f,0xa41,0xa45,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x3bd,0xa4d,0x3bd,0xa54, -0xa5b,0xa63,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,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x404,0x404,0x404,0x404, -0x404,0x404,0xa6b,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404, -0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404, -0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0xa73,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x404,0x620,0xa7b,0x620,0x620, -0x623,0xa80,0xa84,0x813,0xa8c,0x36f,0x36f,0xa92,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x620, -0x620,0x620,0x620,0x620,0x620,0x620,0x620,0x80c,0x620,0xa9a,0x620,0x620,0x620,0x620,0x620,0x620, -0x620,0x620,0xa9e,0xaa6,0x620,0x620,0x620,0x623,0x620,0x620,0xa9d,0x36f,0xa7b,0x620,0xaae,0x620, -0xab6,0x815,0x36f,0x36f,0xac6,0x36f,0x36f,0x36f,0xacb,0x36f,0x5c3,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,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0xabe,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,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, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0xabe,0xadb,0xad3,0xad3,0xad3, -0xadc,0xadc,0xadc,0xadc,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0xae4,0xadc,0xadc,0xadc,0xadc, -0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc, -0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc, -0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc, -0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,0xadc,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, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,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, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x959,0x38a,0x643,0x643,0x961,0x5e6,0x38a,0x4e8, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x969,0x38a,0x38a,0x38a,0x970,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x978,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x980,0x984,0x41f,0x41f,0x41f,0x41f,0x994,0x98c,0x41f,0x99c,0x41f,0x41f,0x9a4,0x9aa,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x41f,0x41f,0x41f,0x9b2,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x4ef,0x8ad,0x9ba,0x9c1,0x401,0x9c4,0x38a,0x38a,0x4d5,0x9cc,0x38a,0x9d2,0x401,0x9d7,0x5f8,0x38a, +0x38a,0x9df,0x38a,0x38a,0x38a,0x38a,0x81d,0x9e7,0x401,0x4f0,0x54b,0x9ee,0x38a,0x38a,0x38a,0x38a, +0x38a,0x8ad,0x9f6,0x38a,0x38a,0x9fa,0xa02,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa06,0xa0e,0x38a, +0x38a,0xa16,0x54b,0x832,0x38a,0xa1e,0x38a,0x38a,0x5d6,0xa26,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa2a,0x38a,0x38a,0xa32,0xa38, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa3e,0x38a,0xa44,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa4a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x509,0xa52,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0xa59,0xa61,0xa67,0x38a,0x38a,0x643,0x643,0xa6f,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x767, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa71,0x38a,0xa78,0x38a,0xa74, +0x38a,0xa7b,0x38a,0xa83,0xa87,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xa8f,0x3d8,0xa96,0xa9d,0xaa5,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0xaad,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xabd,0x41f,0xac5,0xac5,0xacc, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xad4,0x41f,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x643,0xadc,0x643,0x643,0x646,0xae1,0xae5,0x843,0xaed,0x38a,0x38a, +0xaf3,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643, +0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, +0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x768,0xafb,0x643,0x643,0x643, +0x646,0x643,0x643,0x830,0x38a,0xadc,0x643,0xb03,0x643,0xb0b,0x845,0x38a,0x38a,0xb1b,0xb23,0xb2b, +0x38a,0x844,0x38a,0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0xb13,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0xb13,0xb3b,0xb33,0xb33,0xb33,0xb3c,0xb3c,0xb3c,0xb3c,0x3d8,0x3d8,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0xb44,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, +0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, +0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, +0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, +0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0x369,0x369,0x369,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,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,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,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, +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,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0xa,0,0,0xa,0xa,4,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +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,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,1,0xb1,1,0xb1,0xb1,1,0xb1,0xb1,1,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,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,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, +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,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, +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,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,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,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,0xa,0xa, -0xa,0xa,0x21,1,1,1,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,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1, +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,1,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,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, -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,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0,0,0,0,0, +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,0xd,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,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,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,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,4,4,0,0,0,0,0,0,0,4,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, +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,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,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,0,4,4,0,0,0,0,0,0,0,4, -0,0,0,0,0,0xb1,0xb1,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,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,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,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,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, 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,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,0xa,0xa,0xa,0xa,0xa,0xa,4,0xa,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,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,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,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, -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,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,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,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,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,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,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,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,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,0xb1,0xb1,0xb1,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,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, +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,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,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, +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,0,0,0,0,0,0,0,0,9,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, -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,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, +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,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,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,0,0,0,0,0,0,0,0,0,0,0,0x40, +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, +0,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,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, +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,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,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, -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,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,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, +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,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,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,0xb1,0xb1,0xb1,0xb1,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,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, +0xb1,0xb1,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,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, -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,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,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,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,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,0x100a,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, +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,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,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,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,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, +0x100a,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,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,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,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, @@ -530,6 +541,9 @@ static const uint16_t ubidi_props_trieIndex[11188]={ 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,0,0,0,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,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,0,0,0,0, @@ -541,8 +555,6 @@ static const uint16_t ubidi_props_trieIndex[11188]={ 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,0xa,0xa,0xa,0xa, @@ -559,74 +571,74 @@ static const uint16_t ubidi_props_trieIndex[11188]={ 0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -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,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,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,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,0,0,0,0,0xb1,0,0xb1,0xb1, -0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0,0,0,0,0xb1,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,3,1,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,0,0,0,0,0,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,0xb1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +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,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,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,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,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,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0,0, +0,0xb1,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,3,1,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,0,0,0,0,0,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,0xb1,1,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,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa, -0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0, -0xa,4,4,0xa,0,0,0,0,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,0xd,0xd,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a, +0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0,0xa,4,4,0xa, +0,0,0,0,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,0xd,0xb2,0,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,0x310a,0xf20a,0xa,0x310a,0xf20a,0xa,0xa,0,0, +0xd,0xd,0xd,0xb2,0,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,0x310a,0xf20a,0xa,0x310a,0xf20a,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,4,4,0xa,0xa,0xa,4,4,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0, +0,0,0,0,4,4,0xa,0xa,0xa,4,4,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa, +0xa,0xa,0x12,0x12,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,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,0xa,0,0,0,0,0xb1,2,2,2,2,2,2,2, +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,0xa, +0,0,0,0,0xb1,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,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, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,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,0xa, +1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1,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,1,1,1,1,0xb1, +0x41,0x81,1,1,0x81,0xb1,0xb1,1,1,1,1,0x41,0x41,0x41,0x41,0x81, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x41,0x41,0x41,0x41,0x41,0x81,1,0x81,1,0x81,0x81,1,1,0x61,0x81,0x81, +0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1, -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,1, -1,1,1,0xb1,0x41,0x81,1,1,0x81,0xb1,0xb1,1,1,1,1,0x41, -0x41,0x41,0x41,0x81,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x81,1,0x81,1,0x81,0x81,1, -1,0x61,0x81,0x81,0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41, -0x41,0x81,0x41,0x41,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41,0x41,0x81,0x41,0x41, -0x81,0x41,0x81,0x81,0x41,0x81,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x81,0x81,0x81,0x81,0x41,0x41,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5, +1,1,1,1,1,1,1,1,1,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41,0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81, +0x41,0x81,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x81,0x81,0x81,0x81,0x41,0x41,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,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +5,5,5,5,5,5,5,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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, @@ -637,76 +649,90 @@ static const uint16_t ubidi_props_trieIndex[11188]={ 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,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,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,0,0,0,0,0,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,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,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,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,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,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,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0, -0,0,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, -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,0xb1,0xb1,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,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,0xb1, +0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0,0,0,0,0,0,0,0,0,0,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,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, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,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,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,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,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,0xa,0xa,0xb1,0xb1,0xb1,0xa,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,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,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,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, 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,2,2,2,2,2,2,2,2, +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, 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,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,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, +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, 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,0,0xa,0xa,0xa, +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, +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,0xa,0xa,0xa,0xa,0xa,0xa,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,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, -0,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2, +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,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0,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,0,0,0,0, +0,0,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,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,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,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,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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, @@ -721,7 +747,7 @@ static const uint32_t ubidi_props_mirrors[26]={ 0x16022fb,0x18022fc,0x1a022fd,0x1c022fe,0x8029b8,0x4029f5,0xa02ade,0xe02ae3,0xc02ae4,0x1002ae5 }; -static const uint8_t ubidi_props_jgArray[664]={ +static const uint8_t ubidi_props_jgArray[672]={ 0x2d,0,3,3,0x2c,3,0x2d,3,4,0x2a,4,4,0xd,0xd,0xd,6, 6,0x1f,0x1f,0x23,0x23,0x21,0x21,0x28,0x28,1,1,0xb,0xb,0x37,0x37,0x37, 0,9,0x1d,0x13,0x16,0x18,0x1a,0x10,0x2c,0x2d,0x2d,0,0,0,0,0, @@ -763,7 +789,7 @@ static const uint8_t ubidi_props_jgArray[664]={ 0,0,0,0,0,0,0,0,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,0xd,0x28,9,0x1d,0x16,0x18,0x2d,0x2d,0x1f,0x2c,0x39,0,6,0x21, -0xb,0x55,0x1f,1,0x13,0,0,0 +0xb,0x55,0x1f,1,0x13,0,4,4,4,0x1f,0x2d,0x56,0x58,0x57,0,0 }; static const uint8_t ubidi_props_jgArray2[48]={ @@ -780,16 +806,16 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_jgArray2, { ubidi_props_trieIndex, - ubidi_props_trieIndex+3388, + ubidi_props_trieIndex+3496, NULL, - 3388, - 7800, + 3496, + 8076, 0x1a0, - 0xdbc, + 0xe28, 0x0, 0x0, 0x110000, - 0x2bb0, + 0x2d30, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiimp.h b/deps/icu-small/source/common/ubidiimp.h index 9a23dc03a81275..a62d8b259ece03 100644 --- a/deps/icu-small/source/common/ubidiimp.h +++ b/deps/icu-small/source/common/ubidiimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ubidiln.c b/deps/icu-small/source/common/ubidiln.c index f03defe625b2e0..688ca4c31ed3a3 100644 --- a/deps/icu-small/source/common/ubidiln.c +++ b/deps/icu-small/source/common/ubidiln.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ubiditransform.c b/deps/icu-small/source/common/ubiditransform.c new file mode 100644 index 00000000000000..15e3c7cc941d16 --- /dev/null +++ b/deps/icu-small/source/common/ubiditransform.c @@ -0,0 +1,528 @@ +/* +****************************************************************************** +* +* Copyright (C) 2016 and later: Unicode, Inc. and others. +* License & terms of use: http://www.unicode.org/copyright.html +* +****************************************************************************** +* file name: ubiditransform.c +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2016jul24 +* created by: Lina Kemmel +* +*/ + +#include "cmemory.h" +#include "unicode/ubidi.h" +#include "unicode/ustring.h" +#include "unicode/ushape.h" +#include "unicode/utf16.h" +#include "ustr_imp.h" +#include "unicode/ubiditransform.h" + +/* Some convenience defines */ +#define LTR UBIDI_LTR +#define RTL UBIDI_RTL +#define LOGICAL UBIDI_LOGICAL +#define VISUAL UBIDI_VISUAL +#define SHAPE_LOGICAL U_SHAPE_TEXT_DIRECTION_LOGICAL +#define SHAPE_VISUAL U_SHAPE_TEXT_DIRECTION_VISUAL_LTR + +#define CHECK_LEN(STR, LEN, ERROR) { \ + if (LEN == 0) return 0; \ + if (LEN < -1) { *(ERROR) = U_ILLEGAL_ARGUMENT_ERROR; return 0; } \ + if (LEN == -1) LEN = u_strlen(STR); \ + } + +#define MAX_ACTIONS 7 + +/** + * Typedef for a pointer to a function, which performs some operation (such as + * reordering, setting "inverse" mode, character mirroring, etc.). Return value + * indicates whether the text was changed in the course of this operation or + * not. + */ +typedef UBool (*UBiDiAction)(UBiDiTransform *, UErrorCode *); + +/** + * Structure that holds a predefined reordering scheme, including the following + * information: + *
    + *
  • an input base direction,
  • + *
  • an input order,
  • + *
  • an output base direction,
  • + *
  • an output order,
  • + *
  • a digit shaping direction,
  • + *
  • a letter shaping direction,
  • + *
  • a base direction that should be applied when the reordering engine is + * invoked (which can not always be derived from the caller-defined + * options),
  • + *
  • an array of pointers to functions that accomplish the bidi layout + * transformation.
  • + *
+ */ +typedef struct { + UBiDiLevel inLevel; /* input level */ + UBiDiOrder inOrder; /* input order */ + UBiDiLevel outLevel; /* output level */ + UBiDiOrder outOrder; /* output order */ + uint32_t digitsDir; /* digit shaping direction */ + uint32_t lettersDir; /* letter shaping direction */ + UBiDiLevel baseLevel; /* paragraph level to be used with setPara */ + const UBiDiAction actions[MAX_ACTIONS]; /* array of pointers to functions carrying out the transformation */ +} ReorderingScheme; + +struct UBiDiTransform { + UBiDi *pBidi; /* pointer to a UBiDi object */ + const ReorderingScheme *pActiveScheme; /* effective reordering scheme */ + UChar *src; /* input text */ + UChar *dest; /* output text */ + uint32_t srcLength; /* input text length - not really needed as we are zero-terminated and can u_strlen */ + uint32_t srcSize; /* input text capacity excluding the trailing zero */ + uint32_t destSize; /* output text capacity */ + uint32_t *pDestLength; /* number of UChars written to dest */ + uint32_t reorderingOptions; /* reordering options - currently only suppot DO_MIRRORING */ + uint32_t digits; /* digit option for ArabicShaping */ + uint32_t letters; /* letter option for ArabicShaping */ +}; + +U_DRAFT UBiDiTransform* U_EXPORT2 +ubiditransform_open(UErrorCode *pErrorCode) +{ + UBiDiTransform *pBiDiTransform = NULL; + if (U_SUCCESS(*pErrorCode)) { + pBiDiTransform = (UBiDiTransform*) uprv_calloc(1, sizeof(UBiDiTransform)); + if (pBiDiTransform == NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + } + } + return pBiDiTransform; +} + +U_DRAFT void U_EXPORT2 +ubiditransform_close(UBiDiTransform *pBiDiTransform) +{ + if (pBiDiTransform != NULL) { + if (pBiDiTransform->pBidi != NULL) { + ubidi_close(pBiDiTransform->pBidi); + } + if (pBiDiTransform->src != NULL) { + uprv_free(pBiDiTransform->src); + } + uprv_free(pBiDiTransform); + } +} + +/** + * Performs Bidi resolution of text. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_resolve(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_setPara(pTransform->pBidi, pTransform->src, pTransform->srcLength, + pTransform->pActiveScheme->baseLevel, NULL, pErrorCode); + return FALSE; +} + +/** + * Performs basic reordering of text (Logical -> Visual LTR). + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_reorder(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_writeReordered(pTransform->pBidi, pTransform->dest, pTransform->destSize, + pTransform->reorderingOptions, pErrorCode); + + *pTransform->pDestLength = pTransform->srcLength; + pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; + return TRUE; +} + +/** + * Sets "inverse" mode on the UBiDi object. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_setInverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_setInverse(pTransform->pBidi, TRUE); + ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); + return FALSE; +} + +/** + * Sets "runs only" reordering mode indicating a Logical LTR <-> Logical RTL + * transformation. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_setRunsOnly(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_RUNS_ONLY); + return FALSE; +} + +/** + * Performs string reverse. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_reverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + ubidi_writeReverse(pTransform->src, pTransform->srcLength, + pTransform->dest, pTransform->destSize, + UBIDI_REORDER_DEFAULT, pErrorCode); + *pTransform->pDestLength = pTransform->srcLength; + return TRUE; +} + +/** + * Applies a new value to the text that serves as input at the current + * processing step. This value is identical to the original one when we begin + * the processing, but usually changes as the transformation progresses. + * + * @param pTransform A pointer to the UBiDiTransform structure. + * @param newSrc A pointer whose value is to be used as input text. + * @param newLength A length of the new text in UChars. + * @param newSize A new source capacity in UChars. + * @param pErrorCode Pointer to the error code value. + */ +static void +updateSrc(UBiDiTransform *pTransform, const UChar *newSrc, uint32_t newLength, + uint32_t newSize, UErrorCode *pErrorCode) +{ + if (newSize < newLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return; + } + if (newSize > pTransform->srcSize) { + newSize += 50; // allocate slightly more than needed right now + if (pTransform->src != NULL) { + uprv_free(pTransform->src); + pTransform->src = NULL; + } + pTransform->src = (UChar *)uprv_malloc(newSize * sizeof(UChar)); + if (pTransform->src == NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; + //pTransform->srcLength = pTransform->srcSize = 0; + return; + } + pTransform->srcSize = newSize; + } + u_strncpy(pTransform->src, newSrc, newLength); + pTransform->srcLength = u_terminateUChars(pTransform->src, + pTransform->srcSize, newLength, pErrorCode); +} + +/** + * Calls a lower level shaping function. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param options Shaping options. + * @param pErrorCode Pointer to the error code value. + */ +static void +doShape(UBiDiTransform *pTransform, uint32_t options, UErrorCode *pErrorCode) +{ + *pTransform->pDestLength = u_shapeArabic(pTransform->src, + pTransform->srcLength, pTransform->dest, pTransform->destSize, + options, pErrorCode); +} + +/** + * Performs digit and letter shaping. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_shapeArabic(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + if ((pTransform->letters | pTransform->digits) == 0) { + return FALSE; + } + if (pTransform->pActiveScheme->lettersDir == pTransform->pActiveScheme->digitsDir) { + doShape(pTransform, pTransform->letters | pTransform->digits | pTransform->pActiveScheme->lettersDir, + pErrorCode); + } else { + doShape(pTransform, pTransform->digits | pTransform->pActiveScheme->digitsDir, pErrorCode); + if (U_SUCCESS(*pErrorCode)) { + updateSrc(pTransform, pTransform->dest, *pTransform->pDestLength, + *pTransform->pDestLength, pErrorCode); + doShape(pTransform, pTransform->letters | pTransform->pActiveScheme->lettersDir, + pErrorCode); + } + } + return TRUE; +} + +/** + * Performs character mirroring. + * + * @param pTransform Pointer to the UBiDiTransform structure. + * @param pErrorCode Pointer to the error code value. + * + * @return Whether or not this function modifies the text. Besides the return + * value, the caller should also check U_SUCCESS(*pErrorCode). + */ +static UBool +action_mirror(UBiDiTransform *pTransform, UErrorCode *pErrorCode) +{ + UChar32 c; + uint32_t i = 0, j = 0; + if (0 == (pTransform->reorderingOptions & UBIDI_DO_MIRRORING)) { + return FALSE; + } + if (pTransform->destSize < pTransform->srcLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return FALSE; + } + do { + UBool isOdd = ubidi_getLevelAt(pTransform->pBidi, i) & 1; + U16_NEXT(pTransform->src, i, pTransform->srcLength, c); + U16_APPEND_UNSAFE(pTransform->dest, j, isOdd ? u_charMirror(c) : c); + } while (i < pTransform->srcLength); + + *pTransform->pDestLength = pTransform->srcLength; + pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; + return TRUE; +} + +/** + * All possible reordering schemes. + * + */ +static const ReorderingScheme Schemes[] = +{ + /* 0: Logical LTR => Visual LTR */ + {LTR, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_reorder, NULL}}, + /* 1: Logical RTL => Visual LTR */ + {RTL, LOGICAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 2: Logical LTR => Visual RTL */ + {LTR, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_reorder, action_reverse, NULL}}, + /* 3: Logical RTL => Visual RTL */ + {RTL, LOGICAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_resolve, action_reorder, action_shapeArabic, action_reverse, NULL}}, + /* 4: Visual LTR => Logical RTL */ + {LTR, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, + /* 5: Visual RTL => Logical RTL */ + {RTL, VISUAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_VISUAL, RTL, + {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_reorder, NULL}}, + /* 6: Visual LTR => Logical LTR */ + {LTR, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 7: Visual RTL => Logical LTR */ + {RTL, VISUAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_reverse, action_setInverse, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 8: Logical LTR => Logical RTL */ + {LTR, LOGICAL, RTL, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_shapeArabic, action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, NULL}}, + /* 9: Logical RTL => Logical LTR */ + {RTL, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, RTL, + {action_resolve, action_mirror, action_setRunsOnly, action_resolve, action_reorder, action_shapeArabic, NULL}}, + /* 10: Visual LTR => Visual RTL */ + {LTR, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_shapeArabic, action_setInverse, action_resolve, action_mirror, action_reverse, NULL}}, + /* 11: Visual RTL => Visual LTR */ + {RTL, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_reverse, action_shapeArabic, action_setInverse, action_resolve, action_mirror, NULL}}, + /* 12: Logical LTR => Logical LTR */ + {LTR, LOGICAL, LTR, LOGICAL, SHAPE_LOGICAL, SHAPE_LOGICAL, LTR, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 13: Logical RTL => Logical RTL */ + {RTL, LOGICAL, RTL, LOGICAL, SHAPE_VISUAL, SHAPE_LOGICAL, RTL, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 14: Visual LTR => Visual LTR */ + {LTR, VISUAL, LTR, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_resolve, action_mirror, action_shapeArabic, NULL}}, + /* 15: Visual RTL => Visual RTL */ + {RTL, VISUAL, RTL, VISUAL, SHAPE_LOGICAL, SHAPE_VISUAL, LTR, + {action_reverse, action_resolve, action_mirror, action_shapeArabic, action_reverse, NULL}} +}; + +static const uint32_t nSchemes = sizeof(Schemes) / sizeof(*Schemes); + +/** + * When the direction option is UBIDI_DEFAULT_LTR or + * UBIDI_DEFAULT_RTL, resolve the base direction according to that + * of the first strong bidi character. + */ +static void +resolveBaseDirection(const UChar *text, uint32_t length, + UBiDiLevel *pInLevel, UBiDiLevel *pOutLevel) +{ + switch (*pInLevel) { + case UBIDI_DEFAULT_LTR: + case UBIDI_DEFAULT_RTL: { + UBiDiLevel level = ubidi_getBaseDirection(text, length); + *pInLevel = level != UBIDI_NEUTRAL ? level + : *pInLevel == UBIDI_DEFAULT_RTL ? RTL : LTR; + break; + } + default: + *pInLevel &= 1; + break; + } + switch (*pOutLevel) { + case UBIDI_DEFAULT_LTR: + case UBIDI_DEFAULT_RTL: + *pOutLevel = *pInLevel; + break; + default: + *pOutLevel &= 1; + break; + } +} + +/** + * Finds a valid ReorderingScheme matching the + * caller-defined scheme. + * + * @return A valid ReorderingScheme object or NULL + */ +static const ReorderingScheme* +findMatchingScheme(UBiDiLevel inLevel, UBiDiLevel outLevel, + UBiDiOrder inOrder, UBiDiOrder outOrder) +{ + uint32_t i; + for (i = 0; i < nSchemes; i++) { + const ReorderingScheme *pScheme = Schemes + i; + if (inLevel == pScheme->inLevel && outLevel == pScheme->outLevel + && inOrder == pScheme->inOrder && outOrder == pScheme->outOrder) { + return pScheme; + } + } + return NULL; +} + +U_DRAFT uint32_t U_EXPORT2 +ubiditransform_transform(UBiDiTransform *pBiDiTransform, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destSize, + UBiDiLevel inParaLevel, UBiDiOrder inOrder, + UBiDiLevel outParaLevel, UBiDiOrder outOrder, + UBiDiMirroring doMirroring, uint32_t shapingOptions, + UErrorCode *pErrorCode) +{ + uint32_t destLength = 0; + UBool textChanged = FALSE; + const UBiDiTransform *pOrigTransform = pBiDiTransform; + const UBiDiAction *action = NULL; + + if (U_FAILURE(*pErrorCode)) { + return 0; + } + if (src == NULL || dest == NULL) { + *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + CHECK_LEN(src, srcLength, pErrorCode); + CHECK_LEN(dest, destSize, pErrorCode); + + if (pBiDiTransform == NULL) { + pBiDiTransform = ubiditransform_open(pErrorCode); + if (U_FAILURE(*pErrorCode)) { + return 0; + } + } + /* Current limitation: in multiple paragraphs will be resolved according + to the 1st paragraph */ + resolveBaseDirection(src, srcLength, &inParaLevel, &outParaLevel); + + pBiDiTransform->pActiveScheme = findMatchingScheme(inParaLevel, outParaLevel, + inOrder, outOrder); + if (pBiDiTransform->pActiveScheme == NULL) { + goto cleanup; + } + pBiDiTransform->reorderingOptions = doMirroring ? UBIDI_DO_MIRRORING + : UBIDI_REORDER_DEFAULT; + + /* Ignore TEXT_DIRECTION_* flags, as we apply our own depending on the text + scheme at the time shaping is invoked. */ + shapingOptions &= ~U_SHAPE_TEXT_DIRECTION_MASK; + pBiDiTransform->digits = shapingOptions & ~U_SHAPE_LETTERS_MASK; + pBiDiTransform->letters = shapingOptions & ~U_SHAPE_DIGITS_MASK; + + updateSrc(pBiDiTransform, src, srcLength, destSize > srcLength ? destSize : srcLength, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + goto cleanup; + } + if (pBiDiTransform->pBidi == NULL) { + pBiDiTransform->pBidi = ubidi_openSized(0, 0, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + goto cleanup; + } + } + pBiDiTransform->dest = dest; + pBiDiTransform->destSize = destSize; + pBiDiTransform->pDestLength = &destLength; + + /* Checking for U_SUCCESS() within the loop to bail out on first failure. */ + for (action = pBiDiTransform->pActiveScheme->actions; *action && U_SUCCESS(*pErrorCode); action++) { + if ((*action)(pBiDiTransform, pErrorCode)) { + if (action + 1) { + updateSrc(pBiDiTransform, pBiDiTransform->dest, *pBiDiTransform->pDestLength, + *pBiDiTransform->pDestLength, pErrorCode); + } + textChanged = TRUE; + } + } + ubidi_setInverse(pBiDiTransform->pBidi, FALSE); + + if (!textChanged && U_SUCCESS(*pErrorCode)) { + /* Text was not changed - just copy src to dest */ + if (destSize < srcLength) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } else { + u_strncpy(dest, src, srcLength); + destLength = srcLength; + } + } +cleanup: + if (pOrigTransform != pBiDiTransform) { + ubiditransform_close(pBiDiTransform); + } else { + pBiDiTransform->dest = NULL; + pBiDiTransform->pDestLength = NULL; + pBiDiTransform->srcLength = 0; + pBiDiTransform->destSize = 0; + } + return U_FAILURE(*pErrorCode) ? 0 : destLength; +} diff --git a/deps/icu-small/source/common/ubidiwrt.c b/deps/icu-small/source/common/ubidiwrt.c index 2c6495967ca9c2..1d0c36a5d2815b 100644 --- a/deps/icu-small/source/common/ubidiwrt.c +++ b/deps/icu-small/source/common/ubidiwrt.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ubrk.cpp b/deps/icu-small/source/common/ubrk.cpp index 161c0ac4d32aad..b02c966b107d7f 100644 --- a/deps/icu-small/source/common/ubrk.cpp +++ b/deps/icu-small/source/common/ubrk.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1996-2015, International Business Machines diff --git a/deps/icu-small/source/common/ubrkimpl.h b/deps/icu-small/source/common/ubrkimpl.h index e4909712566461..36ca6688593b6c 100644 --- a/deps/icu-small/source/common/ubrkimpl.h +++ b/deps/icu-small/source/common/ubrkimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2006, International Business Machines diff --git a/deps/icu-small/source/common/ucase.cpp b/deps/icu-small/source/common/ucase.cpp index 343d79feeccf36..5c9354e73b7da0 100644 --- a/deps/icu-small/source/common/ucase.cpp +++ b/deps/icu-small/source/common/ucase.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -619,6 +621,18 @@ ucase_getCaseLocale(const char *locale, int32_t *locCache) { result=UCASE_LOC_LITHUANIAN; } } + } else if(is_e(c)) { + /* el or ell? */ + c=*locale++; + if(is_l(c)) { + c=*locale++; + if(is_l(c)) { + c=*locale; + } + if(is_sep(c)) { + result=UCASE_LOC_GREEK; + } + } } else if(is_n(c)) { /* nl or nld? */ c=*locale++; @@ -801,8 +815,9 @@ U_CAPI int32_t U_EXPORT2 ucase_toFullLower(const UCaseProps *csp, UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) -{ + const char *locale, int32_t *locCache) { + // The sign of the result has meaning, input must be non-negative so that it can be returned as is. + U_ASSERT(c >= 0); UChar32 result=c; uint16_t props=UTRIE2_GET16(&csp->trie, c); if(!PROPS_HAS_EXCEPTION(props)) { @@ -947,6 +962,8 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, const UChar **pString, const char *locale, int32_t *locCache, UBool upperNotTitle) { + // The sign of the result has meaning, input must be non-negative so that it can be returned as is. + U_ASSERT(c >= 0); UChar32 result=c; uint16_t props=UTRIE2_GET16(&csp->trie, c); if(!PROPS_HAS_EXCEPTION(props)) { @@ -1155,8 +1172,9 @@ ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) { U_CAPI int32_t U_EXPORT2 ucase_toFullFolding(const UCaseProps *csp, UChar32 c, const UChar **pString, - uint32_t options) -{ + uint32_t options) { + // The sign of the result has meaning, input must be non-negative so that it can be returned as is. + U_ASSERT(c >= 0); UChar32 result=c; uint16_t props=UTRIE2_GET16(&csp->trie, c); if(!PROPS_HAS_EXCEPTION(props)) { diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index 8f24769de388a8..29ea71a533d8c5 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -62,6 +64,7 @@ enum { UCASE_LOC_ROOT, UCASE_LOC_TURKISH, UCASE_LOC_LITHUANIAN, + UCASE_LOC_GREEK, UCASE_LOC_DUTCH }; @@ -156,7 +159,7 @@ U_NAMESPACE_END U_CAPI int32_t U_EXPORT2 ucase_getType(const UCaseProps *csp, UChar32 c); -/** @return same as ucase_getType(), or <0 if c is case-ignorable */ +/** @return like ucase_getType() but also sets UCASE_IGNORABLE if c is case-ignorable */ U_CAPI int32_t U_EXPORT2 ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c); diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index 5b3a3ff9878a24..aa51bac691c9da 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -1,153 +1,155 @@ -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: ucase_props_data.h - * - * machine-generated by: icu/tools/unicode/c/genprops/casepropsbuilder.cpp - */ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: ucase_props_data.h +// +// machine-generated by: icu/tools/unicode/c/genprops/casepropsbuilder.cpp + #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={8,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={9,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x67ea,0x5658,0x737,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6c6c,0x5a10,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[11044]={ -0x316,0x31e,0x326,0x32e,0x33c,0x344,0x34c,0x354,0x35c,0x364,0x36b,0x373,0x37b,0x383,0x38b,0x393, -0x399,0x3a1,0x3a9,0x3b1,0x3b9,0x3c1,0x3c9,0x3d1,0x3d9,0x3e1,0x3e9,0x3f1,0x3f9,0x401,0x409,0x411, -0x419,0x421,0x425,0x42d,0x435,0x43d,0x445,0x44d,0x449,0x451,0x456,0x45e,0x465,0x46d,0x475,0x47d, -0x485,0x48d,0x495,0x49d,0x335,0x33d,0x4a2,0x4aa,0x4af,0x4b7,0x4bf,0x4c7,0x4c6,0x4ce,0x4d3,0x4db, -0x4e2,0x4e9,0x4ed,0x335,0x335,0x316,0x335,0x4f5,0x4fd,0x4ff,0x507,0x50f,0x513,0x514,0x51c,0x524, -0x52c,0x514,0x534,0x539,0x52c,0x514,0x541,0x524,0x513,0x545,0x54d,0x524,0x552,0x335,0x55a,0x335, -0x48c,0x4c8,0x562,0x524,0x513,0x545,0x569,0x524,0x513,0x335,0x51c,0x524,0x335,0x335,0x56f,0x335, -0x335,0x575,0x57c,0x335,0x335,0x580,0x588,0x335,0x58c,0x593,0x335,0x59a,0x5a2,0x5a9,0x5b1,0x335, -0x335,0x5b6,0x5be,0x5c6,0x5ce,0x5d6,0x5de,0x47b,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x5e2,0x335,0x335,0x5f2,0x5fa,0x5ea, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x602,0x602,0x520,0x520,0x335,0x608,0x610,0x335, -0x618,0x335,0x620,0x335,0x335,0x626,0x335,0x335,0x335,0x62e,0x335,0x335,0x335,0x335,0x335,0x335, -0x635,0x335,0x63c,0x644,0x335,0x64c,0x335,0x335,0x654,0x657,0x65f,0x665,0x66d,0x675,0x335,0x67c, -0x335,0x681,0x335,0x687,0x335,0x335,0x68f,0x697,0x69f,0x6a4,0x6a7,0x6af,0x6bf,0x6b7,0x6cf,0x6c7, -0x35c,0x6d7,0x35c,0x6df,0x6e2,0x35c,0x6ea,0x35c,0x6f2,0x6fa,0x702,0x70a,0x712,0x71a,0x722,0x72a, -0x732,0x739,0x335,0x741,0x749,0x335,0x751,0x759,0x761,0x769,0x771,0x779,0x781,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x784,0x78a,0x790,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x798,0x79d,0x7a1,0x7a9,0x35c,0x35c,0x35c,0x7b1,0x7b9,0x7c1,0x335,0x7c6,0x335,0x335,0x335,0x7ce, -0x335,0x61d,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x512,0x7d6,0x335,0x335,0x7dd,0x335,0x335,0x7e5,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x7ed,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x687,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x7f3,0x335,0x35c,0x7fb,0x803,0x335,0x335,0x80b,0x813,0x81b,0x35c,0x820,0x828,0x82e,0x335,0x834, -0x83c,0x52b,0x335,0x335,0x335,0x335,0x843,0x84b,0x335,0x852,0x859,0x335,0x4fd,0x85e,0x866,0x52b, -0x335,0x86c,0x874,0x878,0x335,0x880,0x888,0x890,0x335,0x896,0x89a,0x8a2,0x8b2,0x8aa,0x335,0x8ba, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x8c2,0x335,0x335,0x335,0x335,0x8ca,0x66d,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x8cf,0x8d7,0x8db,0x335,0x335,0x335,0x335,0x318,0x31e,0x8e3,0x8eb,0x8f2,0x4c8,0x335,0x335,0x8fa, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0xcd8,0xcd8,0xcf0,0xd30,0xd70,0xdac,0xdec,0xe2c,0xe64,0xea4,0xee4,0xf24,0xf64,0xfa4,0xfe4,0x1024, -0x1064,0x1094,0x10d4,0x1114,0x1124,0x1158,0x1194,0x11d4,0x1214,0x1254,0xcd4,0x1288,0x12bc,0x12fc,0x1318,0x134c, +static const uint16_t ucase_props_trieIndex[11520]={ +0x327,0x32f,0x337,0x33f,0x34d,0x355,0x35d,0x365,0x36d,0x375,0x37c,0x384,0x38c,0x394,0x39c,0x3a4, +0x3aa,0x3b2,0x3ba,0x3c2,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x41a,0x422, +0x42a,0x432,0x43a,0x442,0x44a,0x452,0x45a,0x462,0x45e,0x466,0x46b,0x473,0x47a,0x482,0x48a,0x492, +0x49a,0x4a2,0x4aa,0x4b2,0x346,0x34e,0x4b7,0x4bf,0x4c4,0x4cc,0x4d4,0x4dc,0x4db,0x4e3,0x4e8,0x4f0, +0x4f7,0x4fe,0x502,0x346,0x346,0x327,0x512,0x50a,0x51a,0x51c,0x524,0x52c,0x530,0x531,0x539,0x541, +0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x541,0x530,0x562,0x56a,0x541,0x56f,0x346,0x577,0x346, +0x4a1,0x4dd,0x57f,0x541,0x530,0x562,0x586,0x541,0x530,0x346,0x539,0x541,0x346,0x346,0x58c,0x346, +0x346,0x592,0x599,0x346,0x346,0x59d,0x5a5,0x346,0x5a9,0x5b0,0x346,0x5b7,0x5bf,0x5c6,0x5ce,0x346, +0x346,0x5d3,0x5db,0x5e3,0x5eb,0x5f3,0x5fb,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x5ff,0x346,0x346,0x60f,0x617,0x607, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x61f,0x61f,0x53d,0x53d,0x346,0x625,0x62d,0x346, +0x635,0x346,0x63d,0x346,0x548,0x643,0x346,0x346,0x346,0x64b,0x346,0x346,0x346,0x346,0x346,0x346, +0x652,0x346,0x659,0x661,0x346,0x669,0x346,0x346,0x671,0x674,0x67c,0x682,0x68a,0x692,0x346,0x699, +0x346,0x69e,0x346,0x6a4,0x6ac,0x346,0x6b0,0x6b8,0x6c0,0x6c5,0x6c8,0x6d0,0x6e0,0x6d8,0x6f0,0x6e8, +0x36d,0x6f8,0x36d,0x700,0x703,0x36d,0x70b,0x36d,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b, +0x753,0x75a,0x346,0x762,0x76a,0x346,0x772,0x77a,0x782,0x78a,0x792,0x79a,0x7a2,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x7a5,0x7ab,0x7b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x7b9,0x7be,0x7c2,0x7ca,0x36d,0x36d,0x36d,0x7d2,0x7da,0x7e2,0x346,0x7e7,0x346,0x346,0x346,0x7ef, +0x346,0x63a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x52f,0x7f7,0x346,0x346,0x7fe,0x346,0x346,0x806,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x80e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6a4,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x814,0x346,0x81c,0x821,0x829,0x346,0x346,0x831,0x839,0x841,0x36d,0x846,0x84e,0x854,0x346,0x85a, +0x862,0x548,0x346,0x346,0x346,0x346,0x869,0x871,0x346,0x878,0x87f,0x346,0x51a,0x884,0x88c,0x548, +0x346,0x892,0x89a,0x89e,0x346,0x8a6,0x8ae,0x8b6,0x346,0x8bc,0x8c0,0x8c8,0x8d8,0x8d0,0x346,0x8e0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8e8,0x346,0x346,0x346,0x346,0x8f0,0x68a,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x8f5,0x8fd,0x901,0x346,0x346,0x346,0x346,0x329,0x32f,0x909,0x911,0x918,0x4dd,0x346,0x346,0x920, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0xd1c,0xd1c,0xd34,0xd74,0xdb4,0xdf0,0xe30,0xe70,0xea8,0xee8,0xf28,0xf68,0xfa8,0xfe8,0x1028,0x1068, +0x10a8,0x10e8,0x1128,0x1168,0x1178,0x11ac,0x11e8,0x1228,0x1268,0x12a8,0xd18,0x12dc,0x1310,0x1350,0x136c,0x13a0, 0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab5,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf2,0x188,0x188,0xb27,0xb66,0x188,0xba0,0xbd7,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf5,0x188,0x188,0xb2a,0xb69,0xba9,0xbe3,0xc1a,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, @@ -172,432 +174,445 @@ static const uint16_t ucase_props_trieIndex[11044]={ 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, -0xc17,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x621,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x902,0x335,0x335,0x335,0x905,0x335,0x335,0x335, -0x335,0x90d,0x913,0x917,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x91f,0x923,0x335,0x335,0x335,0x335,0x335,0x92b,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x933,0x937,0x93f,0x943,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x513,0x948,0x94f,0x951,0x66d,0x959,0x335,0x335,0x961,0x968,0x335,0x954,0x66d,0x96e,0x976, -0x335,0x335,0x97b,0x335,0x335,0x335,0x335,0x318,0x983,0x66d,0x514,0x98b,0x992,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x998,0x9a0,0x335,0x335,0x335,0x335,0x335,0x335,0x9a4,0x9ac, -0x335,0x335,0x9b4,0x48c,0x335,0x335,0x9bc,0x335,0x335,0x9c2,0x9ca,0x335,0x335,0x335,0x335,0x335, -0x335,0x41d,0x9d2,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x9da,0x335,0x9e0,0x654, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x9e6,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x9ee,0x654,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x9f6,0x9fe,0xa04,0x335,0x335,0x335,0x335,0xa0c,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0xa14,0xa1c,0xa21,0xa27,0xa2f,0xa37,0xa3f,0xa18,0xa47, -0xa4f,0xa57,0xa5e,0xa19,0xa14,0xa1c,0xa17,0xa27,0xa1a,0xa15,0xa66,0xa18,0xa6e,0xa76,0xa7e,0xa85, -0xa71,0xa79,0xa81,0xa88,0xa74,0xa90,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x813,0xa98,0x813,0xa9f,0xaa6,0xaae,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0xab2,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0xa10,0xaba,0xaba,0xac0,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x963,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x513,0x813,0x813,0x813,0x335,0x335,0x335,0x335,0x813, -0x813,0x813,0x813,0x813,0x813,0x813,0x9ea,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x335, -0x335,0x335,0x335,0x335,0x335,0x335,0x335,0x315,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,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,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x1a,0xba,0xfa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x17a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0x1f9,0xf029,0x299,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0x319,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc5a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x63e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x928,0x346,0x346,0x346,0x92b,0x346,0x346,0x346, +0x346,0x933,0x939,0x93d,0x346,0x346,0x941,0x945,0x94b,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x953,0x957,0x346,0x346,0x346,0x346,0x346,0x95f,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x967,0x96b,0x973,0x977,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x530,0x97c,0x983,0x985,0x68a,0x98d,0x346,0x346,0x995,0x99c,0x346,0x988,0x68a,0x9a2,0x9aa, +0x346,0x346,0x9af,0x346,0x346,0x346,0x346,0x329,0x9b7,0x68a,0x531,0x9bf,0x9c6,0x346,0x346,0x346, +0x346,0x346,0x97c,0x9ce,0x346,0x346,0x9d2,0x9da,0x346,0x346,0x346,0x346,0x346,0x346,0x9de,0x9e6, +0x346,0x346,0x9ee,0x4a1,0x346,0x346,0x9f6,0x346,0x346,0x9fc,0xa04,0x346,0x346,0x346,0x346,0x346, +0x346,0xa0c,0xa14,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa1c,0x346,0x346, +0x8f0,0xa24,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa2a,0x346,0xa30,0x671, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0xa36,0x346,0x346,0x4a1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa3e,0x671,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0xa46,0xa4e,0xa54,0x346,0x346,0x346,0x346,0xa5c,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa64,0xa6c,0xa71,0xa77,0xa7f,0xa87, +0xa8f,0xa68,0xa97,0xa9f,0xaa7,0xaae,0xa69,0xa64,0xa6c,0xa67,0xa77,0xa6a,0xa65,0xab6,0xa68,0xabe, +0xac6,0xace,0xad5,0xac1,0xac9,0xad1,0xad8,0xac4,0xae0,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x839,0xae8,0x839,0xaef,0xaf6,0xafe,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb06,0xb0e,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb12,0x346,0xb1a,0xb22,0xb29,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0xa60,0xb31,0xb31,0xb37,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x997,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x839,0x839,0x839,0x346,0x346, +0x346,0x346,0x839,0x839,0x839,0x839,0x839,0x839,0x839,0xa3a,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x326,0x326,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,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,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x1a,0xba,0xfa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x17a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0x1f9,0xf029,0x299,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0x319, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 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,0x399,0,4,4,0,1,0,0,0,0,0, -0x100a,0x100a,0x100a,0x100a,0x100a,0x3fa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x47a,0x4ba,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x4f9, -0xf009,0xf009,0xf009,0xf009,0xf009,0x639,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0x3c89, +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,0x399,0,4,4,0,1,0, +0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x3fa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x47a,0x4ba,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x4f9,0xf009,0xf009,0xf009,0xf009,0xf009,0x639,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0x3c89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6ba,0xff89,0x8a,0xff89, +0x8a,0xff89,0x6fa,0xffa9,0x73a,0x7f9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,0x8a,0xff89,0x8a, +0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x899,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6ba,0xff89,0x8a,0xff89,0x8a,0xff89,0x6fa,0xffa9, -0x73a,0x7f9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a, -0xff89,0x8a,0xff89,0x8a,0xff89,0x899,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc38a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x999, +0x6189,0x690a,0x8a,0xff89,0x8a,0xff89,0x670a,0x8a,0xff89,0x668a,0x668a,0x8a,0xff89,1,0x278a,0x650a, +0x658a,0x8a,0xff89,0x668a,0x678a,0x3089,0x698a,0x688a,0x8a,0xff89,0x5189,1,0x698a,0x6a8a,0x4109,0x6b0a, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6d0a,0x8a,0xff89,0x6d0a,1,1,0x8a,0xff89,0x6d0a,0x8a, +0xff89,0x6c8a,0x6c8a,0x8a,0xff89,0x8a,0xff89,0x6d8a,0x8a,0xff89,1,0,0x8a,0xff89,1,0x1c09, +0,0,0,0,0x9fa,0xa5b,0xad9,0xb3a,0xb9b,0xc19,0xc7a,0xcdb,0xd59,0x8a,0xff89,0x8a, +0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xd889,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0xc38a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x999,0x6189,0x690a,0x8a,0xff89, -0x8a,0xff89,0x670a,0x8a,0xff89,0x668a,0x668a,0x8a,0xff89,1,0x278a,0x650a,0x658a,0x8a,0xff89,0x668a, -0x678a,0x3089,0x698a,0x688a,0x8a,0xff89,0x5189,1,0x698a,0x6a8a,0x4109,0x6b0a,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x6d0a,0x8a,0xff89,0x6d0a,1,1,0x8a,0xff89,0x6d0a,0x8a,0xff89,0x6c8a,0x6c8a,0x8a, -0xff89,0x8a,0xff89,0x6d8a,0x8a,0xff89,1,0,0x8a,0xff89,1,0x1c09,0,0,0,0, -0x9fa,0xa5b,0xad9,0xb3a,0xb9b,0xc19,0xc7a,0xcdb,0xd59,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a, -0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xd889,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xdb9,0xeba,0xf1b,0xf99, -0x8a,0xff89,0xcf8a,0xe40a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0xdb9,0xeba,0xf1b,0xf99,0x8a,0xff89,0xcf8a,0xe40a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0xbf0a,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,1,1,1,1,0xffa,0x8a, -0xff89,0xae8a,0x103a,0x1079,0x10b9,0x8a,0xff89,0x9e8a,0x228a,0x238a,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x10f9,0x1139,0x1179,0x9709,0x9909,1,0x9989,0x9989,1,0x9b09,1,0x9a89, -0x11b9,1,1,1,0x9989,0x11f9,1,0x9889,1,0x1239,0x1279,1,0x97a9,0x9689,1,0x12b9, -0x12f9,1,1,0x9689,1,0x1339,0x9589,1,1,0x9509,1,1,1,1,1,1, -1,0x1379,1,1,0x9309,1,1,0x9309,1,1,1,0x13b9,0x9309,0xdd89,0x9389,0x9389, -0xdc89,1,1,1,1,1,0x9289,1,0,1,1,1,1,1,1,1, -1,0x13f9,0x1439,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, -0xc,4,0xc,4,5,5,4,4,4,4,4,4,4,4,4,4, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xbf0a,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,1,1, +1,1,0xffa,0x8a,0xff89,0xae8a,0x103a,0x1079,0x10b9,0x8a,0xff89,0x9e8a,0x228a,0x238a,0x8a,0xff89, +0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x10f9,0x1139,0x1179,0x9709,0x9909,1,0x9989,0x9989, +1,0x9b09,1,0x9a89,0x11b9,1,1,1,0x9989,0x11f9,1,0x9889,1,0x1239,0x1279,1, +0x97a9,0x9689,0x12b9,0x12f9,0x1339,1,1,0x9689,1,0x1379,0x9589,1,1,0x9509,1,1, +1,1,1,1,1,0x13b9,1,1,0x9309,1,1,0x9309,1,1,1,0x13f9, +0x9309,0xdd89,0x9389,0x9389,0xdc89,1,1,1,1,1,0x9289,1,0,1,1,1, +1,1,1,1,1,0x1439,0x1479,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,0xc,4,0xc,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,5,5,5,5,5,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,0x4c,0x4c,0x44,0x44,0x44,0x44,0x44,0x147c,0x4c,0x44,0x4c,0x44, -0x4c,0x44,0x44,0x44,0x44,0x44,0x44,0x4c,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +4,4,4,4,4,4,4,4,0x4c,0x4c,0x44,0x44,0x44,0x44,0x44,0x14bc, +0x4c,0x44,0x4c,0x44,0x4c,0x44,0x44,0x44,0x44,0x44,0x44,0x4c,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,0x6c,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x4c,0x44,0x44,0x149d,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,0x8a,0xff89,0x8a,0xff89,4,4,0x8a,0xff89,0,0,5,0x4109, -0x4109,0x4109,0,0x3a0a,0,0,0,0,4,4,0x130a,4,0x128a,0x128a,0x128a,0, -0x200a,0,0x1f8a,0x1f8a,0x1539,0x100a,0x16da,0x100a,0x100a,0x175a,0x100a,0x100a,0x17da,0x187a,0x191a,0x100a, -0x199a,0x100a,0x100a,0x100a,0x1a1a,0x1a9a,0,0x1b1a,0x100a,0x100a,0x1b9a,0x100a,0x100a,0x1c1a,0x100a,0x100a, -0xed09,0xed89,0xed89,0xed89,0x1c99,0xf009,0x1e39,0xf009,0xf009,0x1eb9,0xf009,0xf009,0x1f39,0x1fd9,0x2079,0xf009, -0x20f9,0xf009,0xf009,0xf009,0x2179,0x21f9,0x2279,0x22d9,0xf009,0xf009,0x2359,0xf009,0xf009,0x23d9,0xf009,0xf009, -0xe009,0xe089,0xe089,0x40a,0x2459,0x24b9,2,2,2,0x2559,0x25b9,0xfc09,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x2619,0x2679,0x389,0xc629,0x26da,0x2779,0,0x8a,0xff89,0xfc8a,0x8a,0xff89, -1,0xbf0a,0xbf0a,0xbf0a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a, -0x280a,0x280a,0x280a,0x280a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xd809,0xd809,0xd809,0xd809,0xd809,0xd809,0xd829,0xd809,0xd829,0xd809,0xd809,0xd809, -0xd809,0xd809,0xd809,0xd809,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x6c,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x4c,0x44,0x44,0x14dd,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,0x8a,0xff89,0x8a,0xff89,4,4,0x8a,0xff89, +0,0,5,0x4109,0x4109,0x4109,0,0x3a0a,0,0,0,0,4,4,0x130a,4, +0x128a,0x128a,0x128a,0,0x200a,0,0x1f8a,0x1f8a,0x1579,0x100a,0x171a,0x100a,0x100a,0x179a,0x100a,0x100a, +0x181a,0x18ba,0x195a,0x100a,0x19da,0x100a,0x100a,0x100a,0x1a5a,0x1ada,0,0x1b5a,0x100a,0x100a,0x1bda,0x100a, +0x100a,0x1c5a,0x100a,0x100a,0xed09,0xed89,0xed89,0xed89,0x1cd9,0xf009,0x1e79,0xf009,0xf009,0x1ef9,0xf009,0xf009, +0x1f79,0x2019,0x20b9,0xf009,0x2139,0xf009,0xf009,0xf009,0x21b9,0x2239,0x22b9,0x2319,0xf009,0xf009,0x2399,0xf009, +0xf009,0x2419,0xf009,0xf009,0xe009,0xe089,0xe089,0x40a,0x2499,0x24f9,2,2,2,0x2599,0x25f9,0xfc09, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,0x44,0x44,0x44,0x44,4,4,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x2659,0x26b9,0x389,0xc629,0x271a,0x27b9,0,0x8a, +0xff89,0xfc8a,0x8a,0xff89,1,0xbf0a,0xbf0a,0xbf0a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a, +0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x280a,0x100a,0x100a,0x281a,0x100a,0x289a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x291a,0x100a,0x100a,0x299a,0x2a1a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x2aba,0x100a,0x100a,0x100a,0x100a,0x100a,0xf009,0xf009,0x2b39,0xf009,0x2bb9,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0x2c39,0xf009,0xf009,0x2cb9,0x2d39,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0x2dd9,0xf009,0xf009,0xf009,0xf009,0xf009,0xd809,0xd809,0xd809,0xd809,0xd809,0xd809,0xd829,0xd809, +0xd829,0xd809,0xd809,0xd809,0xd809,0xd809,0xd809,0xd809,0x8a,0xff89,0x2e5a,0x2ed9,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,0x44,0x44,0x44,0x44, +4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x78a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a, -0xff89,0x8a,0xff89,0xf889,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x78a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a, +0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xf889,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, -0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0, -0,4,0,0,0,0,0,0,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x180a,0x180a,0x180a,0,0,4,0,0,0,0,0,0,0,0xe809,0xe809,0xe809, 0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, -0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0x27d9,0,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, +0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0x2f59, +0,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,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,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,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,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,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,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, +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,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,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, -4,4,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,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,0x64,0x64,0x64, -0,0,0,0,0,0,0,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,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,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,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,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x64,0x44,4,4,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,4,4,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,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,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,0,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,4,4,0,0,0,0,4,4,0,0,4,4,0x64,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,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,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,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,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,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,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,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,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,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,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,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,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,0x28da,0x291a,0x295a,0x299a,0x29da,0x2a1a,0x2a5a,0x2a9a, -0x2ada,0x2b1a,0x2b5a,0x2b9a,0x2bda,0x2c1a,0x2c5a,0x2c9a,0x2cda,0x2d1a,0x2d5a,0x2d9a,0x2dda,0x2e1a,0x2e5a,0x2e9a, -0x2eda,0x2f1a,0x2f5a,0x2f9a,0x2fda,0x301a,0x305a,0x309a,0x30da,0x311a,0x315a,0x319a,0x31da,0x321a,0,0x325a, -0,0,0,0,0,0x329a,0,0,0,0,0,0,0,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,0x4ada,0x4b3a,0x4b9a,0x4bfa,0x4c5a,0x4cba,0x4d1a,0x4d7a, -0x4dda,0x4e3a,0x4e9a,0x4efa,0x4f5a,0x4fba,0x501a,0x507a,0x50da,0x513a,0x519a,0x51fa,0x525a,0x52ba,0,0, -0x5319,0x5379,0x53d9,0x5439,0x5499,0x54f9,0,0,0x32da,0x333a,0x339a,0x33fa,0x345a,0x34ba,0x351a,0x357a, -0x35da,0x363a,0x369a,0x36fa,0x375a,0x37ba,0x381a,0x387a,0x38da,0x393a,0x399a,0x39fa,0x3a5a,0x3aba,0x3b1a,0x3b7a, -0x3bda,0x3c3a,0x3c9a,0x3cfa,0x3d5a,0x3dba,0x3e1a,0x3e7a,0x3eda,0x3f3a,0x3f9a,0x3ffa,0x405a,0x40ba,0x411a,0x417a, -0x41da,0x423a,0x429a,0x42fa,0x435a,0x43ba,0x441a,0x447a,0x44da,0x453a,0x459a,0x45fa,0x465a,0x46ba,0x471a,0x477a, -0x47da,0x483a,0x489a,0x48fa,0x495a,0x49ba,0x4a1a,0x4a7a,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,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, +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,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,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,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,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,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,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,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,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,0x305a,0x309a,0x30da,0x311a, +0x315a,0x319a,0x31da,0x321a,0x325a,0x329a,0x32da,0x331a,0x335a,0x339a,0x33da,0x341a,0x345a,0x349a,0x34da,0x351a, +0x355a,0x359a,0x35da,0x361a,0x365a,0x369a,0x36da,0x371a,0x375a,0x379a,0x37da,0x381a,0x385a,0x389a,0x38da,0x391a, +0x395a,0x399a,0,0x39da,0,0,0,0,0,0x3a1a,0,0,0,0,0,0, +0,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,0x525a,0x52ba,0x531a,0x537a, +0x53da,0x543a,0x549a,0x54fa,0x555a,0x55ba,0x561a,0x567a,0x56da,0x573a,0x579a,0x57fa,0x585a,0x58ba,0x591a,0x597a, +0x59da,0x5a3a,0,0,0x5a99,0x5af9,0x5b59,0x5bb9,0x5c19,0x5c79,0,0,0x3a5a,0x3aba,0x3b1a,0x3b7a, +0x3bda,0x3c3a,0x3c9a,0x3cfa,0x3d5a,0x3dba,0x3e1a,0x3e7a,0x3eda,0x3f3a,0x3f9a,0x3ffa,0x405a,0x40ba,0x411a,0x417a, +0x41da,0x423a,0x429a,0x42fa,0x435a,0x43ba,0x441a,0x447a,0x44da,0x453a,0x459a,0x45fa,0x465a,0x46ba,0x471a,0x477a, +0x47da,0x483a,0x489a,0x48fa,0x495a,0x49ba,0x4a1a,0x4a7a,0x4ada,0x4b3a,0x4b9a,0x4bfa,0x4c5a,0x4cba,0x4d1a,0x4d7a, +0x4dda,0x4e3a,0x4e9a,0x4efa,0x4f5a,0x4fba,0x501a,0x507a,0x50da,0x513a,0x519a,0x51fa,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, -0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,4,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,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,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,0x44,0x44,0x44,0x44,0x44,0x44,0x44,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,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,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, +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,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,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,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,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, +0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,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,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, -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,0x25,5, -5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1, -1,1,1,1,5,0x5559,1,1,1,0x5599,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, +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,0x60b9,1,1,1,0x60f9,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,0x21,1,1,1,1,5,5,5,5,5,0x44,0x44,0x44,0x44, +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,0,0,0,0,0,0,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,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x55da,0x5659,0x8a,0xff89, +0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,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, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x56d9,0x57d9, -0x58d9,0x59d9,0x5ad9,0x5bd9,1,1,0x5c3a,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409,0x409,0x409,0,0, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409,0x409,0x409,0,0, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x5cd9,0x409,0x5dd9,0x409,0x5f39,0x409,0x6099,0x409, -0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409, -0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x2509,0x2509,0x2b09,0x2b09,0x2b09,0x2b09,0x3209,0x3209, -0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0,0x61f9,0x62d9,0x63b9,0x6499,0x6579,0x6659,0x6739,0x6819, -0x68fb,0x69db,0x6abb,0x6b9b,0x6c7b,0x6d5b,0x6e3b,0x6f1b,0x6ff9,0x70d9,0x71b9,0x7299,0x7379,0x7459,0x7539,0x7619, -0x76fb,0x77db,0x78bb,0x799b,0x7a7b,0x7b5b,0x7c3b,0x7d1b,0x7df9,0x7ed9,0x7fb9,0x8099,0x8179,0x8259,0x8339,0x8419, -0x84fb,0x85db,0x86bb,0x879b,0x887b,0x895b,0x8a3b,0x8b1b,0x409,0x409,0x8bf9,0x8cf9,0x8dd9,0,0x8ed9,0x8fd9, -0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x913b,4,0x9219,4,4,4,0x92b9,0x93b9,0x9499,0,0x9599,0x9699, -0xd50a,0xd50a,0xd50a,0xd50a,0x97fb,4,4,4,0x409,0x409,0x98d9,0x9a39,0,0,0x9bd9,0x9cd9, -0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4,0x409,0x409,0x9e39,0x9f99,0xa139,0x389,0xa239,0xa339, -0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4,0,0,0xa499,0xa599,0xa679,0,0xa779,0xa879, -0xc00a,0xc00a,0xc10a,0xc10a,0xa9db,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,0xaaba,0,2,0,0xab3a,0xabba, -2,2,0,1,2,2,0xe0a,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,0xf209,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, -0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809, -0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a,0xff89,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, -0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309, -0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x409,0x409,0x409,0x409, +0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, +0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x409,0x409,0x409,0x409, +0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, +0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, +0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x6839,0x409,0x6939,0x409, +0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a,0x409,0x409,0x409,0x409, +0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x2509,0x2509,0x2b09,0x2b09, +0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0,0x6d59,0x6e39,0x6f19,0x6ff9, +0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b,0x7b59,0x7c39,0x7d19,0x7df9, +0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b,0x8959,0x8a39,0x8b19,0x8bf9, +0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b,0x409,0x409,0x9759,0x9859, +0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4,4,4,0x9e19,0x9f19, +0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4,0x409,0x409,0xa439,0xa599, +0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4,0x409,0x409,0xa999,0xaaf9, +0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4,0,0,0xaff9,0xb0f9, +0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,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,0xb61a,0, +2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,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,0xf209,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809, +0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a,0xff89,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, +0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xf309,0xf309,0xf309,0xf309, +0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, 0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, -0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, +0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, 0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, -0xe809,0xe809,0xe809,0,0x8a,0xff89,0xac3a,0xac7a,0xacba,0xacf9,0xad39,0x8a,0xff89,0x8a,0xff89,0x8a, -0xff89,0xad7a,0xadba,0xadfa,0xae3a,1,0x8a,0xff89,1,0x8a,0xff89,1,1,1,1,1, -0x25,5,0xae7a,0xaeba,0x8a,0xff89,0x8a,0xff89,1,0,0,0,0,0,0,0x8a, -0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89,0,0,0,0,0,0,0,0, -0,0,0,0,0xaef9,0xaf39,0xaf79,0xafb9,0xaff9,0xb039,0xb079,0xb0b9,0xb0f9,0xb139,0xb179,0xb1b9, -0xb1f9,0xb239,0xb279,0xb2b9,0xb2f9,0xb339,0xb379,0xb3b9,0xb3f9,0xb439,0xb479,0xb4b9,0xb4f9,0xb539,0xb579,0xb5b9, -0xb5f9,0xb639,0xb679,0xb6b9,0xb6f9,0xb739,0xb779,0xb7b9,0xb7f9,0xb839,0,0xb879,0,0,0,0, -0,0xb8b9,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, +0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da,0xb81a,0xb859,0xb899,0x8a, +0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89,1,0x8a,0xff89,1, +1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89,1,0,0,0, +0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89,0,0,0,0, +0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19,0xbb59,0xbb99,0xbbd9,0xbc19, +0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19,0xbf59,0xbf99,0xbfd9,0xc019, +0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319,0xc359,0xc399,0,0xc3d9, +0,0,0,0,0,0xc419,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,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, +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, -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,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,4,4,4,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89, +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, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,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,4,4,4,4,4,4,4,4,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89, +0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -5,1,1,1,1,1,1,1,1,0x8a,0xff89,0x8a,0xff89,0xb8fa,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,4,4,4,0x8a,0xff89,0xb93a,1,0, +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,4,4, +4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0xb97a,0xb9ba,0xb9fa,0xba3a,0,0,0xba7a,0xbaba,0xbafa,0xbb3a,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1,1,1,1,1, +1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a,0xc65a,0xc69a,0xc6da,0, +0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,0,0,0,0,0,0,0,0, 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, +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, -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,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,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,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,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, -4,0,0,0,0,0,0,0,0,0,0,0,4,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, -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,0xbb79,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,0xbbb9,0xbc19,0xbc79,0xbcd9,0xbd39,0xbd99,0xbdf9,0xbe59, -0xbeb9,0xbf19,0xbf79,0xbfd9,0xc039,0xc099,0xc0f9,0xc159,0xcdb9,0xce19,0xce79,0xced9,0xcf39,0xcf99,0xcff9,0xd059, -0xd0b9,0xd119,0xd179,0xd1d9,0xd239,0xd299,0xd2f9,0xd359,0xd3b9,0xd419,0xd479,0xd4d9,0xd539,0xd599,0xd5f9,0xd659, -0xd6b9,0xd719,0xd779,0xd7d9,0xd839,0xd899,0xd8f9,0xd959,0xc1b9,0xc219,0xc279,0xc2d9,0xc339,0xc399,0xc3f9,0xc459, -0xc4b9,0xc519,0xc579,0xc5d9,0xc639,0xc699,0xc6f9,0xc759,0xc7b9,0xc819,0xc879,0xc8d9,0xc939,0xc999,0xc9f9,0xca59, -0xcab9,0xcb19,0xcb79,0xcbd9,0xcc39,0xcc99,0xccf9,0xcd59,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,0xd9b9,0xdab9,0xdbb9,0xdcb9,0xde19,0xdf79,0xe0b9,0, -0,0,0,0,0,0,0,0,0,0,0,0xe1f9,0xe2f9,0xe3f9,0xe4f9,0xe5f9, -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,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,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,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,4,4,4,0,0,0,0,0x64,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, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0, -0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xc819,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, +0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79,0xccd9,0xcd39,0xcd99,0xcdf9, +0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79,0xded9,0xdf39,0xdf99,0xdff9, +0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479,0xe4d9,0xe539,0xe599,0xe5f9, +0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279,0xd2d9,0xd339,0xd399,0xd3f9, +0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879,0xd8d9,0xd939,0xd999,0xd9f9, +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, +0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0,0,0,0,0, +0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,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,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0, +0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,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,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,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a, 0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,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, 0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, @@ -622,29 +637,36 @@ static const uint16_t ucase_props_trieIndex[11044]={ 4,4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0, 0,0,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,0,0,0,0,0,4, +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,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,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,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,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,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,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,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,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,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,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,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,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,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,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, @@ -699,15 +721,24 @@ static const uint16_t ucase_props_trieIndex[11044]={ 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,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 +0,0,0,0,0,0,0,0,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,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, +0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, +0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0x44,0x44,0x44,0x44,0x44,0x44,0x64,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 }; -static const uint16_t ucase_props_exceptions[1847]={ +static const uint16_t ucase_props_exceptions[1948]={ 0xc041,0x69,2,0x130,0x131,0x4001,0x6a,0x41,0x6b,1,0x212a,0x41,0x73,1,0x17f,0x5044, 0x49,2,0x130,0x131,0x44,0x4b,1,0x212a,0x44,0x53,1,0x17f,6,0x3bc,0x39c,0x41, 0xe5,1,0x212b,0x4001,0xec,0x4001,0xed,0xc0,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73, @@ -717,113 +748,119 @@ static const uint16_t ucase_props_exceptions[1847]={ 0xc,0x1c7,0x1c8,9,0x1cc,0x1cb,0xd,0x1cc,0x1ca,0x1cb,0xc,0x1ca,0x1cb,0x80,0x2220,0x6a, 0x30c,0x4a,0x30c,0x4a,0x30c,9,0x1f3,0x1f2,0xd,0x1f3,0x1f1,0x1f2,0xc,0x1f1,0x1f2,1, 0x2c65,1,0x2c66,4,0x2c7e,4,0x2c7f,4,0x2c6f,4,0x2c6d,4,0x2c70,4,0xa7ab,4, -0xa7ac,4,0xa78d,4,0xa7aa,4,0x2c62,4,0xa7ad,4,0x2c6e,4,0x2c64,4,0xa7b1,0x1004, -0xa7b2,4,0xa7b0,0x6000,0x3046,0x3b9,0x399,1,0x1fbe,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399, -0x308,0x301,0x399,0x308,0x301,0x1fd3,0x41,0x3b2,1,0x3d0,0x41,0x3b5,1,0x3f5,0x41,0x3b8, -2,0x3d1,0x3f4,0x41,0x3b9,2,0x345,0x1fbe,0x41,0x3ba,1,0x3f0,0x41,0x3bc,1,0xb5, -0x41,0x3c0,1,0x3d6,0x41,0x3c1,1,0x3f1,0x4041,0x3c3,1,0x3c2,0x41,0x3c6,1,0x3d5, -0x41,0x3c9,1,0x2126,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301, -0x1fe3,0x44,0x392,1,0x3d0,0x44,0x395,1,0x3f5,0x44,0x398,2,0x3d1,0x3f4,0x44,0x399, -2,0x345,0x1fbe,0x44,0x39a,1,0x3f0,0x44,0x39c,1,0xb5,0x44,0x3a0,1,0x3d6,0x44, -0x3a1,1,0x3f1,6,0x3c3,0x3a3,0x44,0x3a3,1,0x3c2,0x44,0x3a6,1,0x3d5,0x44,0x3a9, -1,0x2126,6,0x3b2,0x392,0x46,0x3b8,0x398,1,0x3f4,6,0x3c6,0x3a6,6,0x3c0,0x3a0, -6,0x3ba,0x39a,6,0x3c1,0x3a1,0x41,0x3b8,2,0x398,0x3d1,6,0x3b5,0x395,0x80,0x2220, -0x565,0x582,0x535,0x552,0x535,0x582,1,0x2d00,1,0x2d01,1,0x2d02,1,0x2d03,1,0x2d04, -1,0x2d05,1,0x2d06,1,0x2d07,1,0x2d08,1,0x2d09,1,0x2d0a,1,0x2d0b,1,0x2d0c, -1,0x2d0d,1,0x2d0e,1,0x2d0f,1,0x2d10,1,0x2d11,1,0x2d12,1,0x2d13,1,0x2d14, -1,0x2d15,1,0x2d16,1,0x2d17,1,0x2d18,1,0x2d19,1,0x2d1a,1,0x2d1b,1,0x2d1c, -1,0x2d1d,1,0x2d1e,1,0x2d1f,1,0x2d20,1,0x2d21,1,0x2d22,1,0x2d23,1,0x2d24, -1,0x2d25,1,0x2d27,1,0x2d2d,3,0xab70,0x13a0,3,0xab71,0x13a1,3,0xab72,0x13a2,3, -0xab73,0x13a3,3,0xab74,0x13a4,3,0xab75,0x13a5,3,0xab76,0x13a6,3,0xab77,0x13a7,3,0xab78, -0x13a8,3,0xab79,0x13a9,3,0xab7a,0x13aa,3,0xab7b,0x13ab,3,0xab7c,0x13ac,3,0xab7d,0x13ad, -3,0xab7e,0x13ae,3,0xab7f,0x13af,3,0xab80,0x13b0,3,0xab81,0x13b1,3,0xab82,0x13b2,3, -0xab83,0x13b3,3,0xab84,0x13b4,3,0xab85,0x13b5,3,0xab86,0x13b6,3,0xab87,0x13b7,3,0xab88, -0x13b8,3,0xab89,0x13b9,3,0xab8a,0x13ba,3,0xab8b,0x13bb,3,0xab8c,0x13bc,3,0xab8d,0x13bd, -3,0xab8e,0x13be,3,0xab8f,0x13bf,3,0xab90,0x13c0,3,0xab91,0x13c1,3,0xab92,0x13c2,3, -0xab93,0x13c3,3,0xab94,0x13c4,3,0xab95,0x13c5,3,0xab96,0x13c6,3,0xab97,0x13c7,3,0xab98, -0x13c8,3,0xab99,0x13c9,3,0xab9a,0x13ca,3,0xab9b,0x13cb,3,0xab9c,0x13cc,3,0xab9d,0x13cd, -3,0xab9e,0x13ce,3,0xab9f,0x13cf,3,0xaba0,0x13d0,3,0xaba1,0x13d1,3,0xaba2,0x13d2,3, -0xaba3,0x13d3,3,0xaba4,0x13d4,3,0xaba5,0x13d5,3,0xaba6,0x13d6,3,0xaba7,0x13d7,3,0xaba8, -0x13d8,3,0xaba9,0x13d9,3,0xabaa,0x13da,3,0xabab,0x13db,3,0xabac,0x13dc,3,0xabad,0x13dd, -3,0xabae,0x13de,3,0xabaf,0x13df,3,0xabb0,0x13e0,3,0xabb1,0x13e1,3,0xabb2,0x13e2,3, -0xabb3,0x13e3,3,0xabb4,0x13e4,3,0xabb5,0x13e5,3,0xabb6,0x13e6,3,0xabb7,0x13e7,3,0xabb8, -0x13e8,3,0xabb9,0x13e9,3,0xabba,0x13ea,3,0xabbb,0x13eb,3,0xabbc,0x13ec,3,0xabbd,0x13ed, -3,0xabbe,0x13ee,3,0xabbf,0x13ef,3,0x13f8,0x13f0,3,0x13f9,0x13f1,3,0x13fa,0x13f2,3, -0x13fb,0x13f3,3,0x13fc,0x13f4,3,0x13fd,0x13f5,6,0x13f0,0x13f0,6,0x13f1,0x13f1,6,0x13f2, -0x13f2,6,0x13f3,0x13f3,6,0x13f4,0x13f4,6,0x13f5,0x13f5,4,0xa77d,4,0x2c63,0x41,0x1e61, -1,0x1e9b,0x44,0x1e60,1,0x1e9b,0x80,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x80,0x2220, -0x74,0x308,0x54,0x308,0x54,0x308,0x80,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x80,0x2220, -0x79,0x30a,0x59,0x30a,0x59,0x30a,0x80,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,6,0x1e61, -0x1e60,0x81,0xdf,0x20,0x73,0x73,0x80,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x80,0x3330, -0x3c5,0x313,0x300,0x3a5,0x313,0x300,0x3a5,0x313,0x300,0x80,0x3330,0x3c5,0x313,0x301,0x3a5,0x313, -0x301,0x3a5,0x313,0x301,0x80,0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x84, -0x1f88,0x220,0x1f00,0x3b9,0x1f08,0x399,0x84,0x1f89,0x220,0x1f01,0x3b9,0x1f09,0x399,0x84,0x1f8a,0x220, -0x1f02,0x3b9,0x1f0a,0x399,0x84,0x1f8b,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x84,0x1f8c,0x220,0x1f04,0x3b9, -0x1f0c,0x399,0x84,0x1f8d,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x84,0x1f8e,0x220,0x1f06,0x3b9,0x1f0e,0x399, -0x84,0x1f8f,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x81,0x1f80,0x220,0x1f00,0x3b9,0x1f08,0x399,0x81,0x1f81, -0x220,0x1f01,0x3b9,0x1f09,0x399,0x81,0x1f82,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x81,0x1f83,0x220,0x1f03, -0x3b9,0x1f0b,0x399,0x81,0x1f84,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x81,0x1f85,0x220,0x1f05,0x3b9,0x1f0d, -0x399,0x81,0x1f86,0x220,0x1f06,0x3b9,0x1f0e,0x399,0x81,0x1f87,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x84, -0x1f98,0x220,0x1f20,0x3b9,0x1f28,0x399,0x84,0x1f99,0x220,0x1f21,0x3b9,0x1f29,0x399,0x84,0x1f9a,0x220, -0x1f22,0x3b9,0x1f2a,0x399,0x84,0x1f9b,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x84,0x1f9c,0x220,0x1f24,0x3b9, -0x1f2c,0x399,0x84,0x1f9d,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x84,0x1f9e,0x220,0x1f26,0x3b9,0x1f2e,0x399, -0x84,0x1f9f,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x81,0x1f90,0x220,0x1f20,0x3b9,0x1f28,0x399,0x81,0x1f91, -0x220,0x1f21,0x3b9,0x1f29,0x399,0x81,0x1f92,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x81,0x1f93,0x220,0x1f23, -0x3b9,0x1f2b,0x399,0x81,0x1f94,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x81,0x1f95,0x220,0x1f25,0x3b9,0x1f2d, -0x399,0x81,0x1f96,0x220,0x1f26,0x3b9,0x1f2e,0x399,0x81,0x1f97,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x84, -0x1fa8,0x220,0x1f60,0x3b9,0x1f68,0x399,0x84,0x1fa9,0x220,0x1f61,0x3b9,0x1f69,0x399,0x84,0x1faa,0x220, -0x1f62,0x3b9,0x1f6a,0x399,0x84,0x1fab,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x84,0x1fac,0x220,0x1f64,0x3b9, -0x1f6c,0x399,0x84,0x1fad,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x84,0x1fae,0x220,0x1f66,0x3b9,0x1f6e,0x399, -0x84,0x1faf,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x81,0x1fa0,0x220,0x1f60,0x3b9,0x1f68,0x399,0x81,0x1fa1, -0x220,0x1f61,0x3b9,0x1f69,0x399,0x81,0x1fa2,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x81,0x1fa3,0x220,0x1f63, -0x3b9,0x1f6b,0x399,0x81,0x1fa4,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x81,0x1fa5,0x220,0x1f65,0x3b9,0x1f6d, -0x399,0x81,0x1fa6,0x220,0x1f66,0x3b9,0x1f6e,0x399,0x81,0x1fa7,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x80, -0x2220,0x1f70,0x3b9,0x1fba,0x399,0x1fba,0x345,0x84,0x1fbc,0x220,0x3b1,0x3b9,0x391,0x399,0x80,0x2220, -0x3ac,0x3b9,0x386,0x399,0x386,0x345,0x80,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x80,0x3330, -0x3b1,0x342,0x3b9,0x391,0x342,0x399,0x391,0x342,0x345,0x81,0x1fb3,0x220,0x3b1,0x3b9,0x391,0x399, -0x46,0x3b9,0x399,1,0x345,0x80,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x84,0x1fcc,0x220, -0x3b7,0x3b9,0x397,0x399,0x80,0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x80,0x2220,0x3b7,0x342, -0x397,0x342,0x397,0x342,0x80,0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0x81, -0x1fc3,0x220,0x3b7,0x3b9,0x397,0x399,0x80,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308, -0x300,0xc0,1,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,0x80,0x2220, -0x3b9,0x342,0x399,0x342,0x399,0x342,0x80,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308, -0x342,0x80,0x3330,0x3c5,0x308,0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0xc0,1,0x3330,0x3c5, -0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,0x3b0,0x80,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1, -0x313,0x80,0x2220,0x3c5,0x342,0x3a5,0x342,0x3a5,0x342,0x80,0x3330,0x3c5,0x308,0x342,0x3a5,0x308, -0x342,0x3a5,0x308,0x342,0x80,0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x84,0x1ffc,0x220,0x3c9, -0x3b9,0x3a9,0x399,0x80,0x2220,0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x80,0x2220,0x3c9,0x342,0x3a9, -0x342,0x3a9,0x342,0x80,0x3330,0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0x81,0x1ff3, -0x220,0x3c9,0x3b9,0x3a9,0x399,0x41,0x3c9,1,0x3a9,0x41,0x6b,1,0x4b,0x41,0xe5,1, -0xc5,1,0x26b,1,0x1d7d,1,0x27d,4,0x23a,4,0x23e,1,0x251,1,0x271,1, -0x250,1,0x252,1,0x23f,1,0x240,4,0x10a0,4,0x10a1,4,0x10a2,4,0x10a3,4, -0x10a4,4,0x10a5,4,0x10a6,4,0x10a7,4,0x10a8,4,0x10a9,4,0x10aa,4,0x10ab,4, -0x10ac,4,0x10ad,4,0x10ae,4,0x10af,4,0x10b0,4,0x10b1,4,0x10b2,4,0x10b3,4, -0x10b4,4,0x10b5,4,0x10b6,4,0x10b7,4,0x10b8,4,0x10b9,4,0x10ba,4,0x10bb,4, -0x10bc,4,0x10bd,4,0x10be,4,0x10bf,4,0x10c0,4,0x10c1,4,0x10c2,4,0x10c3,4, -0x10c4,4,0x10c5,4,0x10c7,4,0x10cd,1,0x1d79,1,0x265,1,0x266,1,0x25c,1, -0x261,1,0x26c,1,0x29e,1,0x287,1,0x29d,1,0xab53,4,0xa7b3,6,0x13a0,0x13a0, -6,0x13a1,0x13a1,6,0x13a2,0x13a2,6,0x13a3,0x13a3,6,0x13a4,0x13a4,6,0x13a5,0x13a5,6, -0x13a6,0x13a6,6,0x13a7,0x13a7,6,0x13a8,0x13a8,6,0x13a9,0x13a9,6,0x13aa,0x13aa,6,0x13ab, -0x13ab,6,0x13ac,0x13ac,6,0x13ad,0x13ad,6,0x13ae,0x13ae,6,0x13af,0x13af,6,0x13b0,0x13b0, -6,0x13b1,0x13b1,6,0x13b2,0x13b2,6,0x13b3,0x13b3,6,0x13b4,0x13b4,6,0x13b5,0x13b5,6, -0x13b6,0x13b6,6,0x13b7,0x13b7,6,0x13b8,0x13b8,6,0x13b9,0x13b9,6,0x13ba,0x13ba,6,0x13bb, -0x13bb,6,0x13bc,0x13bc,6,0x13bd,0x13bd,6,0x13be,0x13be,6,0x13bf,0x13bf,6,0x13c0,0x13c0, -6,0x13c1,0x13c1,6,0x13c2,0x13c2,6,0x13c3,0x13c3,6,0x13c4,0x13c4,6,0x13c5,0x13c5,6, -0x13c6,0x13c6,6,0x13c7,0x13c7,6,0x13c8,0x13c8,6,0x13c9,0x13c9,6,0x13ca,0x13ca,6,0x13cb, -0x13cb,6,0x13cc,0x13cc,6,0x13cd,0x13cd,6,0x13ce,0x13ce,6,0x13cf,0x13cf,6,0x13d0,0x13d0, -6,0x13d1,0x13d1,6,0x13d2,0x13d2,6,0x13d3,0x13d3,6,0x13d4,0x13d4,6,0x13d5,0x13d5,6, -0x13d6,0x13d6,6,0x13d7,0x13d7,6,0x13d8,0x13d8,6,0x13d9,0x13d9,6,0x13da,0x13da,6,0x13db, -0x13db,6,0x13dc,0x13dc,6,0x13dd,0x13dd,6,0x13de,0x13de,6,0x13df,0x13df,6,0x13e0,0x13e0, -6,0x13e1,0x13e1,6,0x13e2,0x13e2,6,0x13e3,0x13e3,6,0x13e4,0x13e4,6,0x13e5,0x13e5,6, -0x13e6,0x13e6,6,0x13e7,0x13e7,6,0x13e8,0x13e8,6,0x13e9,0x13e9,6,0x13ea,0x13ea,6,0x13eb, -0x13eb,6,0x13ec,0x13ec,6,0x13ed,0x13ed,6,0x13ee,0x13ee,6,0x13ef,0x13ef,0x80,0x2220,0x66, -0x66,0x46,0x46,0x46,0x66,0x80,0x2220,0x66,0x69,0x46,0x49,0x46,0x69,0x80,0x2220,0x66, -0x6c,0x46,0x4c,0x46,0x6c,0x80,0x3330,0x66,0x66,0x69,0x46,0x46,0x49,0x46,0x66,0x69, -0x80,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c,0xc0,1,0x2220,0x73,0x74, -0x53,0x54,0x53,0x74,0xfb06,0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb05,0x80, -0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x80,0x2220,0x574,0x565,0x544,0x535,0x544,0x565,0x80, -0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x80,0x2220,0x57e,0x576,0x54e,0x546,0x54e,0x576,0x80, -0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d +0xa7ac,4,0xa78d,4,0xa7aa,4,0xa7ae,4,0x2c62,4,0xa7ad,4,0x2c6e,4,0x2c64,4, +0xa7b1,0x1004,0xa7b2,4,0xa7b0,0x6000,0x3046,0x3b9,0x399,1,0x1fbe,0xc0,1,0x3330,0x3b9,0x308, +0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x1fd3,0x41,0x3b2,1,0x3d0,0x41,0x3b5,1,0x3f5, +0x41,0x3b8,2,0x3d1,0x3f4,0x41,0x3b9,2,0x345,0x1fbe,0x41,0x3ba,1,0x3f0,0x41,0x3bc, +1,0xb5,0x41,0x3c0,1,0x3d6,0x41,0x3c1,1,0x3f1,0x4041,0x3c3,1,0x3c2,0x41,0x3c6, +1,0x3d5,0x41,0x3c9,1,0x2126,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5, +0x308,0x301,0x1fe3,0x44,0x392,1,0x3d0,0x44,0x395,1,0x3f5,0x44,0x398,2,0x3d1,0x3f4, +0x44,0x399,2,0x345,0x1fbe,0x44,0x39a,1,0x3f0,0x44,0x39c,1,0xb5,0x44,0x3a0,1, +0x3d6,0x44,0x3a1,1,0x3f1,6,0x3c3,0x3a3,0x44,0x3a3,1,0x3c2,0x44,0x3a6,1,0x3d5, +0x44,0x3a9,1,0x2126,6,0x3b2,0x392,0x46,0x3b8,0x398,1,0x3f4,6,0x3c6,0x3a6,6, +0x3c0,0x3a0,6,0x3ba,0x39a,6,0x3c1,0x3a1,0x41,0x3b8,2,0x398,0x3d1,6,0x3b5,0x395, +0x41,0x432,1,0x1c80,0x41,0x434,1,0x1c81,0x41,0x43e,1,0x1c82,0x41,0x441,1,0x1c83, +0x41,0x442,2,0x1c84,0x1c85,0x41,0x44a,1,0x1c86,0x44,0x412,1,0x1c80,0x44,0x414,1, +0x1c81,0x44,0x41e,1,0x1c82,0x44,0x421,1,0x1c83,0x44,0x422,2,0x1c84,0x1c85,0x44,0x42a, +1,0x1c86,0x41,0x463,1,0x1c87,0x44,0x462,1,0x1c87,0x80,0x2220,0x565,0x582,0x535,0x552, +0x535,0x582,1,0x2d00,1,0x2d01,1,0x2d02,1,0x2d03,1,0x2d04,1,0x2d05,1,0x2d06, +1,0x2d07,1,0x2d08,1,0x2d09,1,0x2d0a,1,0x2d0b,1,0x2d0c,1,0x2d0d,1,0x2d0e, +1,0x2d0f,1,0x2d10,1,0x2d11,1,0x2d12,1,0x2d13,1,0x2d14,1,0x2d15,1,0x2d16, +1,0x2d17,1,0x2d18,1,0x2d19,1,0x2d1a,1,0x2d1b,1,0x2d1c,1,0x2d1d,1,0x2d1e, +1,0x2d1f,1,0x2d20,1,0x2d21,1,0x2d22,1,0x2d23,1,0x2d24,1,0x2d25,1,0x2d27, +1,0x2d2d,3,0xab70,0x13a0,3,0xab71,0x13a1,3,0xab72,0x13a2,3,0xab73,0x13a3,3,0xab74, +0x13a4,3,0xab75,0x13a5,3,0xab76,0x13a6,3,0xab77,0x13a7,3,0xab78,0x13a8,3,0xab79,0x13a9, +3,0xab7a,0x13aa,3,0xab7b,0x13ab,3,0xab7c,0x13ac,3,0xab7d,0x13ad,3,0xab7e,0x13ae,3, +0xab7f,0x13af,3,0xab80,0x13b0,3,0xab81,0x13b1,3,0xab82,0x13b2,3,0xab83,0x13b3,3,0xab84, +0x13b4,3,0xab85,0x13b5,3,0xab86,0x13b6,3,0xab87,0x13b7,3,0xab88,0x13b8,3,0xab89,0x13b9, +3,0xab8a,0x13ba,3,0xab8b,0x13bb,3,0xab8c,0x13bc,3,0xab8d,0x13bd,3,0xab8e,0x13be,3, +0xab8f,0x13bf,3,0xab90,0x13c0,3,0xab91,0x13c1,3,0xab92,0x13c2,3,0xab93,0x13c3,3,0xab94, +0x13c4,3,0xab95,0x13c5,3,0xab96,0x13c6,3,0xab97,0x13c7,3,0xab98,0x13c8,3,0xab99,0x13c9, +3,0xab9a,0x13ca,3,0xab9b,0x13cb,3,0xab9c,0x13cc,3,0xab9d,0x13cd,3,0xab9e,0x13ce,3, +0xab9f,0x13cf,3,0xaba0,0x13d0,3,0xaba1,0x13d1,3,0xaba2,0x13d2,3,0xaba3,0x13d3,3,0xaba4, +0x13d4,3,0xaba5,0x13d5,3,0xaba6,0x13d6,3,0xaba7,0x13d7,3,0xaba8,0x13d8,3,0xaba9,0x13d9, +3,0xabaa,0x13da,3,0xabab,0x13db,3,0xabac,0x13dc,3,0xabad,0x13dd,3,0xabae,0x13de,3, +0xabaf,0x13df,3,0xabb0,0x13e0,3,0xabb1,0x13e1,3,0xabb2,0x13e2,3,0xabb3,0x13e3,3,0xabb4, +0x13e4,3,0xabb5,0x13e5,3,0xabb6,0x13e6,3,0xabb7,0x13e7,3,0xabb8,0x13e8,3,0xabb9,0x13e9, +3,0xabba,0x13ea,3,0xabbb,0x13eb,3,0xabbc,0x13ec,3,0xabbd,0x13ed,3,0xabbe,0x13ee,3, +0xabbf,0x13ef,3,0x13f8,0x13f0,3,0x13f9,0x13f1,3,0x13fa,0x13f2,3,0x13fb,0x13f3,3,0x13fc, +0x13f4,3,0x13fd,0x13f5,6,0x13f0,0x13f0,6,0x13f1,0x13f1,6,0x13f2,0x13f2,6,0x13f3,0x13f3, +6,0x13f4,0x13f4,6,0x13f5,0x13f5,6,0x432,0x412,6,0x434,0x414,6,0x43e,0x41e,6, +0x441,0x421,0x46,0x442,0x422,1,0x1c85,0x46,0x442,0x422,1,0x1c84,6,0x44a,0x42a,6, +0x463,0x462,6,0xa64b,0xa64a,4,0xa77d,4,0x2c63,0x41,0x1e61,1,0x1e9b,0x44,0x1e60,1, +0x1e9b,0x80,0x2220,0x68,0x331,0x48,0x331,0x48,0x331,0x80,0x2220,0x74,0x308,0x54,0x308,0x54, +0x308,0x80,0x2220,0x77,0x30a,0x57,0x30a,0x57,0x30a,0x80,0x2220,0x79,0x30a,0x59,0x30a,0x59, +0x30a,0x80,0x2220,0x61,0x2be,0x41,0x2be,0x41,0x2be,6,0x1e61,0x1e60,0x81,0xdf,0x20,0x73, +0x73,0x80,0x2220,0x3c5,0x313,0x3a5,0x313,0x3a5,0x313,0x80,0x3330,0x3c5,0x313,0x300,0x3a5,0x313, +0x300,0x3a5,0x313,0x300,0x80,0x3330,0x3c5,0x313,0x301,0x3a5,0x313,0x301,0x3a5,0x313,0x301,0x80, +0x3330,0x3c5,0x313,0x342,0x3a5,0x313,0x342,0x3a5,0x313,0x342,0x84,0x1f88,0x220,0x1f00,0x3b9,0x1f08, +0x399,0x84,0x1f89,0x220,0x1f01,0x3b9,0x1f09,0x399,0x84,0x1f8a,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x84, +0x1f8b,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x84,0x1f8c,0x220,0x1f04,0x3b9,0x1f0c,0x399,0x84,0x1f8d,0x220, +0x1f05,0x3b9,0x1f0d,0x399,0x84,0x1f8e,0x220,0x1f06,0x3b9,0x1f0e,0x399,0x84,0x1f8f,0x220,0x1f07,0x3b9, +0x1f0f,0x399,0x81,0x1f80,0x220,0x1f00,0x3b9,0x1f08,0x399,0x81,0x1f81,0x220,0x1f01,0x3b9,0x1f09,0x399, +0x81,0x1f82,0x220,0x1f02,0x3b9,0x1f0a,0x399,0x81,0x1f83,0x220,0x1f03,0x3b9,0x1f0b,0x399,0x81,0x1f84, +0x220,0x1f04,0x3b9,0x1f0c,0x399,0x81,0x1f85,0x220,0x1f05,0x3b9,0x1f0d,0x399,0x81,0x1f86,0x220,0x1f06, +0x3b9,0x1f0e,0x399,0x81,0x1f87,0x220,0x1f07,0x3b9,0x1f0f,0x399,0x84,0x1f98,0x220,0x1f20,0x3b9,0x1f28, +0x399,0x84,0x1f99,0x220,0x1f21,0x3b9,0x1f29,0x399,0x84,0x1f9a,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x84, +0x1f9b,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x84,0x1f9c,0x220,0x1f24,0x3b9,0x1f2c,0x399,0x84,0x1f9d,0x220, +0x1f25,0x3b9,0x1f2d,0x399,0x84,0x1f9e,0x220,0x1f26,0x3b9,0x1f2e,0x399,0x84,0x1f9f,0x220,0x1f27,0x3b9, +0x1f2f,0x399,0x81,0x1f90,0x220,0x1f20,0x3b9,0x1f28,0x399,0x81,0x1f91,0x220,0x1f21,0x3b9,0x1f29,0x399, +0x81,0x1f92,0x220,0x1f22,0x3b9,0x1f2a,0x399,0x81,0x1f93,0x220,0x1f23,0x3b9,0x1f2b,0x399,0x81,0x1f94, +0x220,0x1f24,0x3b9,0x1f2c,0x399,0x81,0x1f95,0x220,0x1f25,0x3b9,0x1f2d,0x399,0x81,0x1f96,0x220,0x1f26, +0x3b9,0x1f2e,0x399,0x81,0x1f97,0x220,0x1f27,0x3b9,0x1f2f,0x399,0x84,0x1fa8,0x220,0x1f60,0x3b9,0x1f68, +0x399,0x84,0x1fa9,0x220,0x1f61,0x3b9,0x1f69,0x399,0x84,0x1faa,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x84, +0x1fab,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x84,0x1fac,0x220,0x1f64,0x3b9,0x1f6c,0x399,0x84,0x1fad,0x220, +0x1f65,0x3b9,0x1f6d,0x399,0x84,0x1fae,0x220,0x1f66,0x3b9,0x1f6e,0x399,0x84,0x1faf,0x220,0x1f67,0x3b9, +0x1f6f,0x399,0x81,0x1fa0,0x220,0x1f60,0x3b9,0x1f68,0x399,0x81,0x1fa1,0x220,0x1f61,0x3b9,0x1f69,0x399, +0x81,0x1fa2,0x220,0x1f62,0x3b9,0x1f6a,0x399,0x81,0x1fa3,0x220,0x1f63,0x3b9,0x1f6b,0x399,0x81,0x1fa4, +0x220,0x1f64,0x3b9,0x1f6c,0x399,0x81,0x1fa5,0x220,0x1f65,0x3b9,0x1f6d,0x399,0x81,0x1fa6,0x220,0x1f66, +0x3b9,0x1f6e,0x399,0x81,0x1fa7,0x220,0x1f67,0x3b9,0x1f6f,0x399,0x80,0x2220,0x1f70,0x3b9,0x1fba,0x399, +0x1fba,0x345,0x84,0x1fbc,0x220,0x3b1,0x3b9,0x391,0x399,0x80,0x2220,0x3ac,0x3b9,0x386,0x399,0x386, +0x345,0x80,0x2220,0x3b1,0x342,0x391,0x342,0x391,0x342,0x80,0x3330,0x3b1,0x342,0x3b9,0x391,0x342, +0x399,0x391,0x342,0x345,0x81,0x1fb3,0x220,0x3b1,0x3b9,0x391,0x399,0x46,0x3b9,0x399,1,0x345, +0x80,0x2220,0x1f74,0x3b9,0x1fca,0x399,0x1fca,0x345,0x84,0x1fcc,0x220,0x3b7,0x3b9,0x397,0x399,0x80, +0x2220,0x3ae,0x3b9,0x389,0x399,0x389,0x345,0x80,0x2220,0x3b7,0x342,0x397,0x342,0x397,0x342,0x80, +0x3330,0x3b7,0x342,0x3b9,0x397,0x342,0x399,0x397,0x342,0x345,0x81,0x1fc3,0x220,0x3b7,0x3b9,0x397, +0x399,0x80,0x3330,0x3b9,0x308,0x300,0x399,0x308,0x300,0x399,0x308,0x300,0xc0,1,0x3330,0x3b9, +0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,0x390,0x80,0x2220,0x3b9,0x342,0x399,0x342,0x399, +0x342,0x80,0x3330,0x3b9,0x308,0x342,0x399,0x308,0x342,0x399,0x308,0x342,0x80,0x3330,0x3c5,0x308, +0x300,0x3a5,0x308,0x300,0x3a5,0x308,0x300,0xc0,1,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301, +0x3a5,0x308,0x301,0x3b0,0x80,0x2220,0x3c1,0x313,0x3a1,0x313,0x3a1,0x313,0x80,0x2220,0x3c5,0x342, +0x3a5,0x342,0x3a5,0x342,0x80,0x3330,0x3c5,0x308,0x342,0x3a5,0x308,0x342,0x3a5,0x308,0x342,0x80, +0x2220,0x1f7c,0x3b9,0x1ffa,0x399,0x1ffa,0x345,0x84,0x1ffc,0x220,0x3c9,0x3b9,0x3a9,0x399,0x80,0x2220, +0x3ce,0x3b9,0x38f,0x399,0x38f,0x345,0x80,0x2220,0x3c9,0x342,0x3a9,0x342,0x3a9,0x342,0x80,0x3330, +0x3c9,0x342,0x3b9,0x3a9,0x342,0x399,0x3a9,0x342,0x345,0x81,0x1ff3,0x220,0x3c9,0x3b9,0x3a9,0x399, +0x41,0x3c9,1,0x3a9,0x41,0x6b,1,0x4b,0x41,0xe5,1,0xc5,1,0x26b,1,0x1d7d, +1,0x27d,4,0x23a,4,0x23e,1,0x251,1,0x271,1,0x250,1,0x252,1,0x23f, +1,0x240,4,0x10a0,4,0x10a1,4,0x10a2,4,0x10a3,4,0x10a4,4,0x10a5,4,0x10a6, +4,0x10a7,4,0x10a8,4,0x10a9,4,0x10aa,4,0x10ab,4,0x10ac,4,0x10ad,4,0x10ae, +4,0x10af,4,0x10b0,4,0x10b1,4,0x10b2,4,0x10b3,4,0x10b4,4,0x10b5,4,0x10b6, +4,0x10b7,4,0x10b8,4,0x10b9,4,0x10ba,4,0x10bb,4,0x10bc,4,0x10bd,4,0x10be, +4,0x10bf,4,0x10c0,4,0x10c1,4,0x10c2,4,0x10c3,4,0x10c4,4,0x10c5,4,0x10c7, +4,0x10cd,0x41,0xa64b,1,0x1c88,0x44,0xa64a,1,0x1c88,1,0x1d79,1,0x265,1,0x266, +1,0x25c,1,0x261,1,0x26c,1,0x26a,1,0x29e,1,0x287,1,0x29d,1,0xab53, +4,0xa7b3,6,0x13a0,0x13a0,6,0x13a1,0x13a1,6,0x13a2,0x13a2,6,0x13a3,0x13a3,6,0x13a4, +0x13a4,6,0x13a5,0x13a5,6,0x13a6,0x13a6,6,0x13a7,0x13a7,6,0x13a8,0x13a8,6,0x13a9,0x13a9, +6,0x13aa,0x13aa,6,0x13ab,0x13ab,6,0x13ac,0x13ac,6,0x13ad,0x13ad,6,0x13ae,0x13ae,6, +0x13af,0x13af,6,0x13b0,0x13b0,6,0x13b1,0x13b1,6,0x13b2,0x13b2,6,0x13b3,0x13b3,6,0x13b4, +0x13b4,6,0x13b5,0x13b5,6,0x13b6,0x13b6,6,0x13b7,0x13b7,6,0x13b8,0x13b8,6,0x13b9,0x13b9, +6,0x13ba,0x13ba,6,0x13bb,0x13bb,6,0x13bc,0x13bc,6,0x13bd,0x13bd,6,0x13be,0x13be,6, +0x13bf,0x13bf,6,0x13c0,0x13c0,6,0x13c1,0x13c1,6,0x13c2,0x13c2,6,0x13c3,0x13c3,6,0x13c4, +0x13c4,6,0x13c5,0x13c5,6,0x13c6,0x13c6,6,0x13c7,0x13c7,6,0x13c8,0x13c8,6,0x13c9,0x13c9, +6,0x13ca,0x13ca,6,0x13cb,0x13cb,6,0x13cc,0x13cc,6,0x13cd,0x13cd,6,0x13ce,0x13ce,6, +0x13cf,0x13cf,6,0x13d0,0x13d0,6,0x13d1,0x13d1,6,0x13d2,0x13d2,6,0x13d3,0x13d3,6,0x13d4, +0x13d4,6,0x13d5,0x13d5,6,0x13d6,0x13d6,6,0x13d7,0x13d7,6,0x13d8,0x13d8,6,0x13d9,0x13d9, +6,0x13da,0x13da,6,0x13db,0x13db,6,0x13dc,0x13dc,6,0x13dd,0x13dd,6,0x13de,0x13de,6, +0x13df,0x13df,6,0x13e0,0x13e0,6,0x13e1,0x13e1,6,0x13e2,0x13e2,6,0x13e3,0x13e3,6,0x13e4, +0x13e4,6,0x13e5,0x13e5,6,0x13e6,0x13e6,6,0x13e7,0x13e7,6,0x13e8,0x13e8,6,0x13e9,0x13e9, +6,0x13ea,0x13ea,6,0x13eb,0x13eb,6,0x13ec,0x13ec,6,0x13ed,0x13ed,6,0x13ee,0x13ee,6, +0x13ef,0x13ef,0x80,0x2220,0x66,0x66,0x46,0x46,0x46,0x66,0x80,0x2220,0x66,0x69,0x46,0x49, +0x46,0x69,0x80,0x2220,0x66,0x6c,0x46,0x4c,0x46,0x6c,0x80,0x3330,0x66,0x66,0x69,0x46, +0x46,0x49,0x46,0x66,0x69,0x80,0x3330,0x66,0x66,0x6c,0x46,0x46,0x4c,0x46,0x66,0x6c, +0xc0,1,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,0xfb06,0xc0,1,0x2220,0x73,0x74,0x53, +0x54,0x53,0x74,0xfb05,0x80,0x2220,0x574,0x576,0x544,0x546,0x544,0x576,0x80,0x2220,0x574,0x565, +0x544,0x535,0x544,0x565,0x80,0x2220,0x574,0x56b,0x544,0x53b,0x544,0x56b,0x80,0x2220,0x57e,0x576, +0x54e,0x546,0x54e,0x576,0x80,0x2220,0x574,0x56d,0x544,0x53d,0x544,0x56d }; static const uint16_t ucase_props_unfold[370]={ @@ -860,16 +897,16 @@ static const UCaseProps ucase_props_singleton={ ucase_props_unfold, { ucase_props_trieIndex, - ucase_props_trieIndex+3160, + ucase_props_trieIndex+3228, NULL, - 3160, - 7884, + 3228, + 8292, 0x188, - 0xcd4, + 0xd18, 0x0, 0x0, 0xe0800, - 0x2b20, + 0x2cfc, NULL, 0, FALSE, FALSE, 0, NULL }, { 3,0,0,0 } diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index f3ab31fa76610b..c0d56c28731d1f 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -122,58 +124,103 @@ static inline int32_t appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, int32_t result, const UChar *s) { UChar32 c; - int32_t length, destLength; + int32_t length; UErrorCode errorCode; /* decode the result */ if(result<0) { /* (not) original code point */ c=~result; - length=-1; + length=U8_LENGTH(c); } else if(result<=UCASE_MAX_STRING_LENGTH) { c=U_SENTINEL; length=result; } else { c=result; - length=-1; + length=U8_LENGTH(c); + } + if(length>(INT32_MAX-destIndex)) { + return -1; // integer overflow } if(destIndex=0) { /* code point */ UBool isError=FALSE; U8_APPEND(dest, destIndex, destCapacity, c, isError); if(isError) { /* overflow, nothing written */ - destIndex+=U8_LENGTH(c); + destIndex+=length; } } else { /* string */ + int32_t destLength; errorCode=U_ZERO_ERROR; u_strToUTF8( (char *)(dest+destIndex), destCapacity-destIndex, &destLength, s, length, &errorCode); + if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { + return -1; + } + if(destLength>(INT32_MAX-destIndex)) { + return -1; // integer overflow + } destIndex+=destLength; /* we might have an overflow, but we know the actual length */ } } else { /* preflight */ - if(length<0) { - destIndex+=U8_LENGTH(c); + if(c>=0) { + destIndex+=length; } else { + int32_t destLength; errorCode=U_ZERO_ERROR; u_strToUTF8( NULL, 0, &destLength, s, length, &errorCode); + if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { + return -1; + } + if(destLength>(INT32_MAX-destIndex)) { + return -1; // integer overflow + } destIndex+=destLength; } } return destIndex; } +static inline int32_t +appendUChar(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar c) { + int32_t length=U8_LENGTH(c); + if(length>(INT32_MAX-destIndex)) { + return -1; // integer overflow + } + int32_t limit=destIndex+length; + if(limit0) { + if(length>(INT32_MAX-destIndex)) { + return -1; // integer overflow + } + if((destIndex+length)<=destCapacity) { + uprv_memcpy(dest+destIndex, s, length); + } + destIndex+=length; + } + return destIndex; +} + static UChar32 U_CALLCONV utf8_caseContextIterator(void *context, int8_t dir) { UCaseContext *csc=(UCaseContext *)context; @@ -231,9 +278,11 @@ _caseMap(const UCaseMap *csm, UCaseMapFull *map, U8_NEXT(src, srcIndex, srcLimit, c); csc->cpLimit=srcIndex; if(c<0) { - int32_t i=csc->cpStart; - while(destIndexcpStart, srcIndex-csc->cpStart); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } continue; } @@ -243,6 +292,10 @@ _caseMap(const UCaseMap *csm, UCaseMapFull *map, dest[destIndex++]=(uint8_t)c2; } else { destIndex=appendResult(dest, destIndex, destCapacity, c, s); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } } @@ -261,7 +314,7 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, UErrorCode *pErrorCode) { const UChar *s; UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex, length; + int32_t prev, titleStart, titleLimit, idx, destIndex; UBool isFirstIndex; if(U_FAILURE(*pErrorCode)) { @@ -327,30 +380,36 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, break; /* cased letter at [titleStart..titleLimit[ */ } } - length=titleStart-prev; - if(length>0) { - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, src+prev, length); - } - destIndex+=length; + destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } } if(titleStartcsp, c, utf8_caseContextIterator, &csc, &s, csm->locale, &locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); + if(c>=0) { + csc.cpStart=titleStart; + csc.cpLimit=titleLimit; + c=ucase_toFullTitle(csm->csp, c, utf8_caseContextIterator, &csc, &s, csm->locale, &locCache); + destIndex=appendResult(dest, destIndex, destCapacity, c, s); + } else { + // Malformed UTF-8. + destIndex=appendString(dest, destIndex, destCapacity, src+titleStart, titleLimit-titleStart); + } + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } /* Special case Dutch IJ titlecasing */ - if ( titleStart+1 < idx && - ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_DUTCH && - ( src[titleStart] == 0x0049 || src[titleStart] == 0x0069 ) && - ( src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A )) { - c=0x004A; - destIndex=appendResult(dest, destIndex, destCapacity, c, s); - titleLimit++; + if (titleStart+1 < idx && + ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && + (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); + titleLimit++; } /* lowercase [titleLimit..index[ */ if(titleLimitcsp, c); + if ((type & UCASE_IGNORABLE) != 0) { + // c is case-ignorable + nextState |= (state & AFTER_CASED); + } else if (type != UCASE_NONE) { + // c is cased + nextState |= AFTER_CASED; + } + uint32_t data = getLetterData(c); + if (data > 0) { + uint32_t upper = data & UPPER_MASK; + // Add a dialytika to this iota or ypsilon vowel + // if we removed a tonos from the previous vowel, + // and that previous vowel did not also have (or gain) a dialytika. + // Adding one only to the final vowel in a longer sequence + // (which does not occur in normal writing) would require lookahead. + // Set the same flag as for preserving an existing dialytika. + if ((data & HAS_VOWEL) != 0 && (state & AFTER_VOWEL_WITH_ACCENT) != 0 && + (upper == 0x399 || upper == 0x3A5)) { + data |= HAS_DIALYTIKA; + } + int32_t numYpogegrammeni = 0; // Map each one to a trailing, spacing, capital iota. + if ((data & HAS_YPOGEGRAMMENI) != 0) { + numYpogegrammeni = 1; + } + // Skip combining diacritics after this Greek letter. + int32_t nextNextIndex = nextIndex; + while (nextIndex < srcLength) { + UChar32 c2; + U8_NEXT(src, nextNextIndex, srcLength, c2); + uint32_t diacriticData = getDiacriticData(c2); + if (diacriticData != 0) { + data |= diacriticData; + if ((diacriticData & HAS_YPOGEGRAMMENI) != 0) { + ++numYpogegrammeni; + } + nextIndex = nextNextIndex; + } else { + break; // not a Greek diacritic + } + } + if ((data & HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA) == HAS_VOWEL_AND_ACCENT) { + nextState |= AFTER_VOWEL_WITH_ACCENT; + } + // Map according to Greek rules. + UBool addTonos = FALSE; + if (upper == 0x397 && + (data & HAS_ACCENT) != 0 && + numYpogegrammeni == 0 && + (state & AFTER_CASED) == 0 && + !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + // Keep disjunctive "or" with (only) a tonos. + // We use the same "word boundary" conditions as for the Final_Sigma test. + if (i == nextIndex) { + upper = 0x389; // Preserve the precomposed form. + } else { + addTonos = TRUE; + } + } else if ((data & HAS_DIALYTIKA) != 0) { + // Preserve a vowel with dialytika in precomposed form if it exists. + if (upper == 0x399) { + upper = 0x3AA; + data &= ~HAS_EITHER_DIALYTIKA; + } else if (upper == 0x3A5) { + upper = 0x3AB; + data &= ~HAS_EITHER_DIALYTIKA; + } + } + destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); + if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika + } + if (destIndex >= 0 && addTonos) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); + } + while (destIndex >= 0 && numYpogegrammeni > 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); + --numYpogegrammeni; + } + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } else if(c>=0) { + const UChar *s; + UChar32 c2 = 0; + c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); + if((destIndexdestCapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + return destIndex; +} + +} // namespace GreekUpper +U_NAMESPACE_END + static int32_t U_CALLCONV ucasemap_internalUTF8ToLower(const UCaseMap *csm, uint8_t *dest, int32_t destCapacity, @@ -406,6 +618,10 @@ ucasemap_internalUTF8ToUpper(const UCaseMap *csm, uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, UErrorCode *pErrorCode) { + int32_t locCache = csm->locCache; + if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { + return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + } UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; @@ -434,8 +650,11 @@ utf8_foldCase(const UCaseProps *csp, start=srcIndex; U8_NEXT(src, srcIndex, srcLength, c); if(c<0) { - while(destIndex>2)-0xbf; int32_t exp=(ntv&3)+1; @@ -458,6 +460,12 @@ u_getNumericValue(UChar32 c) { } return numValue; + } 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 f898e3f0a567f8..79ba55eb75d570 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -1,153 +1,155 @@ -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: uchar_props_data.h - * - * machine-generated by: icu/tools/unicode/c/genprops/corepropsbuilder.cpp - */ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: uchar_props_data.h +// +// machine-generated by: icu/tools/unicode/c/genprops/corepropsbuilder.cpp + #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={8,0,0,0}; +static const UVersionInfo dataVersion={9,0,0,0}; -static const uint16_t propsTrie_index[19820]={ -0x41e,0x426,0x42e,0x436,0x44e,0x456,0x45e,0x466,0x46e,0x476,0x47c,0x484,0x48c,0x494,0x49c,0x4a4, -0x4aa,0x4b2,0x4ba,0x4c2,0x4c5,0x4cd,0x4d5,0x4dd,0x4e5,0x4ed,0x4e9,0x4f1,0x4f9,0x501,0x506,0x50e, -0x516,0x51e,0x522,0x52a,0x532,0x53a,0x542,0x54a,0x546,0x54e,0x553,0x55b,0x561,0x569,0x571,0x579, -0x581,0x589,0x591,0x599,0x59e,0x5a6,0x5a9,0x5b1,0x5b9,0x5c1,0x5c7,0x5cf,0x5ce,0x5d6,0x5de,0x5e6, -0x5f6,0x5ee,0x5fe,0x43e,0x43e,0x60e,0x43e,0x606,0x61e,0x620,0x628,0x616,0x638,0x63e,0x646,0x630, -0x656,0x65c,0x664,0x64e,0x674,0x67a,0x682,0x66c,0x692,0x698,0x6a0,0x68a,0x6b0,0x6b8,0x6c0,0x6a8, -0x6d0,0x6d6,0x6de,0x6c8,0x6ee,0x6f4,0x6fc,0x6e6,0x6ee,0x70b,0x713,0x704,0x723,0x72a,0x732,0x71b, -0x5ca,0x73a,0x742,0x43e,0x74a,0x752,0x75a,0x43e,0x762,0x76a,0x772,0x777,0x77f,0x786,0x78e,0x43e, -0x589,0x796,0x79e,0x7a6,0x7ae,0x516,0x7be,0x7b6,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x7c4,0x589,0x7cc,0x7c2,0x7d4,0x589,0x7d0,0x589,0x7da,0x7e2,0x7ea,0x516,0x516,0x7f2, -0x7fa,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x7ff,0x807,0x589,0x589,0x80f,0x817,0x81f,0x827,0x82f,0x589,0x837,0x83f,0x847, -0x857,0x589,0x85f,0x861,0x589,0x84f,0x589,0x869,0x87d,0x871,0x879,0x885,0x589,0x88d,0x893,0x89b, -0x8a3,0x589,0x8b3,0x8bb,0x8c3,0x8ab,0x43e,0x43e,0x8d3,0x8d6,0x8de,0x8cb,0x8ee,0x8e6,0x589,0x8f5, -0x589,0x904,0x8fd,0x90c,0x43e,0x43e,0x914,0x91c,0x4be,0x924,0x927,0x92d,0x934,0x927,0x4e5,0x93c, -0x46e,0x46e,0x46e,0x46e,0x944,0x46e,0x46e,0x46e,0x954,0x95c,0x964,0x96c,0x974,0x978,0x980,0x94c, -0x998,0x9a0,0x988,0x990,0x9a8,0x9b0,0x9b8,0x9c0,0x9d8,0x9c8,0x9d0,0x9e0,0x9e8,0x9f7,0x9fc,0x9ef, -0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0xa0c,0xa14,0x89b,0xa17,0xa1f,0xa26,0xa2b,0xa33, -0x89b,0xa38,0xa37,0xa48,0xa4b,0x89b,0x89b,0xa40,0x89b,0x89b,0x89b,0x89b,0x89b,0xa5a,0xa62,0xa52, -0x89b,0x89b,0x89b,0xa67,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0xa6d,0xa75,0x89b,0xa7d,0xa84, -0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0xa04,0xa04,0xa04,0xa04,0xa8c,0xa04,0xa93,0xa9a, -0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0xa04,0x89b,0xaa2,0xaa9,0xaad,0xab3,0xab9,0xac1,0xac6, -0x516,0xad6,0xace,0xade,0x46e,0x46e,0x46e,0xae6,0x4be,0xaee,0x589,0xaf4,0xb04,0xafc,0xafc,0x4e5, -0xb0c,0xb14,0xb1c,0x43e,0xb24,0x89b,0x89b,0xb2b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0xb33,0xb39, -0xb49,0xb41,0x5ca,0x589,0xb51,0x7fa,0x589,0xb59,0xb61,0xb66,0x589,0x589,0xb6b,0x575,0x89b,0xb72, -0xb7a,0xb82,0xb88,0x89b,0xb82,0xb90,0x89b,0xb7a,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b, -0xb98,0x589,0x589,0x589,0xba0,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0xba6,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xbab,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x869,0x89b,0x89b, -0xbb3,0x589,0xbb6,0x589,0xbbe,0xbc4,0xbcc,0xbd4,0xbd9,0x589,0x589,0xbdd,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xbe4,0x589,0xbeb,0xbf1,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xbf9,0x589,0x589,0x589,0xc01,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0xc03,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc0a,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0xc11,0x589,0x589,0x589,0xc18,0xc20,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc25,0x589,0x589,0xc2d,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc31,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc34,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc37,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0xc3d,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0xc45,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0xc4a,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0xc4f,0x589,0x589,0x589,0xc54,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0xc5c,0xc63,0xc67,0x589,0x589,0x589,0xc6e,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x869,0x43e, -0xc7c,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0xc74,0x89b,0xc84,0x90c,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0xc89,0xc91,0x46e,0xca1,0xc99,0x589,0x589,0xca9,0xcb1,0xcc1,0x46e,0xcc6,0xcce,0xcd4,0x43e,0xcb9, -0xcdc,0xce4,0x589,0xcec,0xcfc,0xcff,0xcf4,0xd07,0x5de,0xd0f,0xd16,0xd1e,0x61e,0xd2e,0xd26,0xd36, -0x589,0xd3e,0xd46,0xd4e,0x589,0xd56,0xd5e,0xd66,0xd6e,0xd76,0xd7a,0xd82,0x4be,0x4be,0x589,0xd8a, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xd92,0xd99,0x860, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0x589,0x589,0x589,0xdb1,0x589,0xc6f,0xdb8,0xdbd, -0x589,0x589,0x589,0xdc5,0x589,0x589,0xdc9,0x43e,0xde1,0xdd1,0xdd9,0x589,0x589,0xde9,0xdf1,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xdf6,0xdfe,0x589,0xe02,0x589,0xe08,0xe0c, -0xe14,0xe1c,0xe23,0xe2b,0x589,0x589,0x589,0xe31,0xe49,0x42e,0xe51,0xe59,0xe5e,0x87d,0xe39,0xe41, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0x10f8,0x10f8,0x1138,0x1178,0x11b8,0x11f0,0x1230,0x1270,0x12a8,0x12e8,0x1314,0x1354,0x1394,0x13a4,0x13e4,0x1418, -0x1458,0x1488,0x14c8,0x1508,0x1518,0x154c,0x1584,0x15c4,0x1604,0x1644,0x1678,0x16a4,0x16e4,0x171c,0x1738,0x1778, -0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xbdd,0xa40,0xa40,0xa40,0xa40,0xc1d,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xc5d,0xc7d,0xa40,0xa40,0xcbd,0xcfd,0xa40,0xd3d,0xd7d,0xdbd, -0xdfd,0xe34,0x1db,0x1db,0xe58,0xe8c,0x1db,0xeb4,0x1db,0x1db,0x1db,0x1db,0xee1,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0xef5,0x1db,0xf2d,0xf6d,0x1db,0xf78,0xa40,0xa40,0xa40,0xa40,0xa40,0xfb8, +static const uint16_t propsTrie_index[20780]={ +0x44e,0x456,0x45e,0x466,0x47e,0x486,0x48e,0x496,0x49e,0x4a6,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc,0x4d4, +0x4da,0x4e2,0x4ea,0x4f2,0x4f5,0x4fd,0x505,0x50d,0x515,0x51d,0x519,0x521,0x529,0x531,0x536,0x53e, +0x546,0x54e,0x552,0x55a,0x562,0x56a,0x572,0x57a,0x576,0x57e,0x583,0x58b,0x591,0x599,0x5a1,0x5a9, +0x5b1,0x5b9,0x5c1,0x5c9,0x5ce,0x5d6,0x5d9,0x5e1,0x5e9,0x5f1,0x5f7,0x5ff,0x5fe,0x606,0x60e,0x616, +0x626,0x61e,0x62e,0x46e,0x46e,0x63e,0x646,0x636,0x656,0x658,0x660,0x64e,0x670,0x676,0x67e,0x668, +0x68e,0x694,0x69c,0x686,0x6ac,0x6b2,0x6ba,0x6a4,0x6ca,0x6d0,0x6d8,0x6c2,0x6e8,0x6f0,0x6f8,0x6e0, +0x708,0x70e,0x716,0x700,0x726,0x72c,0x734,0x71e,0x744,0x749,0x751,0x73c,0x761,0x768,0x770,0x759, +0x5fa,0x778,0x780,0x46e,0x788,0x790,0x798,0x46e,0x7a0,0x7a8,0x7b0,0x7b5,0x7bd,0x7c4,0x7cc,0x46e, +0x5b9,0x7d4,0x7dc,0x7e4,0x7ec,0x546,0x7fc,0x7f4,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x802,0x5b9,0x80a,0x800,0x812,0x5b9,0x80e,0x5b9,0x818,0x820,0x828,0x546,0x546,0x830, +0x838,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x83d,0x845,0x5b9,0x5b9,0x84d,0x855,0x85d,0x865,0x86d,0x5b9,0x875,0x87d,0x885, +0x895,0x5b9,0x89d,0x89f,0x8a7,0x88d,0x5b9,0x8aa,0x8be,0x8b2,0x8ba,0x8c6,0x5b9,0x8ce,0x8d4,0x8dc, +0x8e4,0x5b9,0x8f4,0x8fc,0x904,0x8ec,0x46e,0x46e,0x914,0x917,0x91f,0x90c,0x92f,0x927,0x5b9,0x936, +0x5b9,0x945,0x93e,0x94d,0x955,0x46e,0x95d,0x965,0x4ee,0x96d,0x970,0x976,0x97d,0x970,0x515,0x985, +0x49e,0x49e,0x49e,0x49e,0x98d,0x49e,0x49e,0x49e,0x99d,0x9a5,0x9ad,0x9b5,0x9bd,0x9c1,0x9c9,0x995, +0x9e1,0x9e9,0x9d1,0x9d9,0x9f1,0x9f9,0xa01,0xa09,0xa21,0xa11,0xa19,0xa29,0xa31,0xa40,0xa45,0xa38, +0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa55,0xa5d,0x8dc,0xa60,0xa68,0xa6f,0xa74,0xa7c, +0x8dc,0xa82,0xa81,0xa92,0xa95,0x8dc,0x8dc,0xa8a,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xaa4,0xaac,0xa9c, +0x8dc,0x8dc,0x8dc,0xab1,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xab7,0xabf,0x8dc,0xac7,0xace, +0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xa4d,0xa4d,0xa4d,0xa4d,0xad6,0xa4d,0xadd,0xae4, +0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0x8dc,0xaec,0xaf3,0xaf7,0xafd,0xb03,0xb0b,0xb10, +0x546,0xb20,0xb18,0xb28,0x49e,0x49e,0x49e,0xb30,0x4ee,0xb38,0x5b9,0xb3e,0xb4e,0xb46,0xb46,0x515, +0xb56,0xb5e,0xb66,0x46e,0xb6e,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0xb83, +0xb93,0xb8b,0x5fa,0x5b9,0xb9b,0x838,0x5b9,0xba3,0xbab,0xbb0,0x5b9,0x5b9,0xbb5,0x5a5,0x8dc,0xbbc, +0xbc4,0xbcc,0xbd2,0x8dc,0xbcc,0xbda,0x8dc,0xbc4,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, +0xbe2,0x5b9,0x5b9,0x5b9,0xbea,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0xbf0,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xbf5,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x8dc,0x8dc, +0xbfd,0x5b9,0xc00,0x5b9,0xc08,0xc0e,0xc16,0xc1e,0xc23,0x5b9,0x5b9,0xc27,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc2e,0x5b9,0xc35,0xc3b,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc43,0x5b9,0x5b9,0x5b9,0xc4b,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc4d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc54,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0xc5b,0x5b9,0x5b9,0x5b9,0xc62,0xc6a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc6f,0x5b9,0x5b9,0xc77,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7b,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc81,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0xc87,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0xc8f,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0xc94,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc99,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0xca6,0xcad,0xcb1,0x5b9,0x5b9,0x5b9,0xcb8,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x46e, +0xcc6,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0xcbe,0x8dc,0xcce,0x94d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0xcd3,0xcdb,0x49e,0xceb,0xce3,0x5b9,0x5b9,0xcf3,0xcfb,0xd0b,0x49e,0xd10,0xd18,0xd1e,0x46e,0xd03, +0xd26,0xd2e,0x5b9,0xd36,0xd46,0xd49,0xd3e,0xd51,0x60e,0xd59,0xd60,0xd68,0x656,0xd78,0xd70,0xd80, +0x5b9,0xd88,0xd90,0xd98,0x5b9,0xda0,0xda8,0xdb0,0xdb8,0xdc0,0xdc4,0xdcc,0x4ee,0x4ee,0x5b9,0xdd4, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xddc,0xde3,0x89e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, +0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x5b9,0x5b9,0x5b9,0xdfb,0x5b9,0xcb9,0xe02,0xe07, +0x5b9,0x5b9,0x5b9,0xe0f,0x5b9,0x5b9,0x8a9,0x46e,0xe25,0xe15,0xe1d,0x5b9,0x5b9,0xe2d,0xe35,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xe3a,0xe42,0x5b9,0xe46,0x5b9,0xe4c,0xe50, +0xe58,0xe60,0xe67,0xe6f,0x5b9,0x5b9,0x5b9,0xe75,0xe8d,0x45e,0xe95,0xe9d,0xea2,0x8be,0xe7d,0xe85, +0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, +0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, +0x11b8,0x11b8,0x11f8,0x1238,0x1278,0x12b0,0x12f0,0x1330,0x1368,0x13a8,0x13d4,0x1414,0x1454,0x1464,0x14a4,0x14d8, +0x1518,0x1548,0x1588,0x15c8,0x15d8,0x160c,0x1644,0x1684,0x16c4,0x1704,0x1738,0x1764,0x17a4,0x17dc,0x17f8,0x1838, +0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xbdd,0xa40,0xa40,0xa40,0xa40,0xc1d,0x1db,0x1db, +0xc5d,0xc9d,0xa40,0xa40,0xa40,0xa40,0xcdd,0xcfd,0xa40,0xa40,0xd3d,0xd7d,0xdbd,0xdfd,0xe3d,0xe7d, +0xebd,0xef4,0x1db,0x1db,0xf18,0xf4c,0x1db,0xf74,0x1db,0x1db,0x1db,0x1db,0xfa1,0x1db,0x1db,0x1db, +0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0xa40,0xa40,0xa40,0xa40,0xa40,0x1078, 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,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -170,112 +172,124 @@ static const uint16_t propsTrie_index[19820]={ 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,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xff8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x10b8,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, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1038, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1038, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0xe66,0xe6d,0xe75,0x43e,0x589,0x589,0x589,0x575,0xe85,0xe7d,0xe9c,0xe8d,0xe94,0xea4,0xb20,0xeac, -0x43e,0x43e,0x43e,0x43e,0xd1e,0x589,0xeb4,0xebc,0x589,0xec4,0xecc,0xed0,0xed8,0x589,0xee0,0x43e, -0x516,0x520,0xee8,0x589,0xeec,0xef4,0x43e,0x43e,0x589,0x865,0x589,0xefc,0x43e,0x43e,0x43e,0x43e, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xb04,0x869,0xe08,0x43e,0x43e,0x43e,0x43e, -0xf0c,0xf04,0xf0f,0xf17,0x87d,0xf1f,0x43e,0xf27,0xf2f,0xf37,0x43e,0x43e,0x589,0xf47,0xf4f,0xf3f, -0xf5f,0xf66,0xf57,0xf6e,0xf76,0x43e,0xf86,0xf7e,0x589,0xf89,0xf91,0xf99,0xfa1,0xfa9,0x43e,0x43e, -0x589,0x589,0xfb1,0x43e,0x516,0xfb9,0x4be,0xfc1,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0xfc9,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0xfd9,0x5bf,0xfe1,0xfd1,0x8ee,0xfe9,0xff1,0xff7,0x100f,0xfff,0x1007,0x1013,0x8ee,0x1023,0x101b,0x102b, -0x103b,0x1033,0x43e,0x43e,0x1042,0x104a,0x5e1,0x1052,0x1062,0x67a,0x106a,0x105a,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x589,0x1072,0x107a,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x1082,0x108a,0x43e, -0x589,0x1092,0x109a,0x43e,0x589,0x10a2,0xef4,0x43e,0x10b2,0x10aa,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x516,0x4be,0x10ba,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x589,0x10c2,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xdc9,0x43e,0x43e,0x43e,0x10d2,0x10da,0x10e2,0x10ca,0x589, -0x589,0x589,0x589,0x589,0x589,0x10ea,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x10f2,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x10f4, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x10c2,0x87d, -0x10fc,0x43e,0x43e,0xdfe,0x1104,0x589,0x1114,0x111c,0x1124,0x110c,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x112c,0x1131,0x1139,0x43e,0x43e,0x43e,0x1141,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589, -0x1149,0x114e,0x1156,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x89b,0x89b,0x89b, -0x89b,0x89b,0x89b,0x89b,0xb33,0x89b,0x115e,0x89b,0x1165,0x116d,0x1173,0x89b,0x1179,0x89b,0x89b,0x1181, -0x43e,0x43e,0x43e,0x43e,0x43e,0x89b,0x89b,0xa34,0x1189,0x43e,0x43e,0x43e,0x43e,0x1199,0x11a0,0x11a5, -0x11ab,0x11b3,0x11bb,0x11c3,0x119d,0x11cb,0x11d3,0x11db,0x11e0,0x11b2,0x1199,0x11a0,0x119c,0x11ab,0x11e8,0x119a, -0x11eb,0x119d,0x11f3,0x11fb,0x1203,0x120a,0x11f6,0x11fe,0x1206,0x120d,0x11f9,0x1215,0x1191,0x89b,0x89b,0x89b, -0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x4e5,0x1225,0x4e5, -0x122c,0x1233,0x121d,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589, -0x589,0x589,0x589,0x123b,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x1249,0x1251,0x1259, -0x1261,0x1269,0x1271,0x43e,0x1241,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x89b,0x1279,0x89b, -0x89b,0xb2b,0x127e,0x1282,0xb33,0x128a,0x128f,0x89b,0x1279,0x1293,0x43e,0x43e,0x129a,0x12a2,0x1293,0x12a8, -0x43e,0x43e,0x43e,0x43e,0x43e,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x12b0,0x89b,0x89b,0x89b, -0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0x89b,0xb24,0x89b,0x12b8,0x89b,0x89b,0x89b,0x89b,0x89b, -0x89b,0x89b,0x89b,0x1177,0x12bd,0x89b,0x89b,0x89b,0xb2b,0x89b,0x89b,0x12c5,0x43e,0x1279,0x89b,0x12cd, -0x89b,0x12d5,0xb35,0x43e,0x43e,0x12dd,0x43e,0x43e,0x43e,0x12e2,0x43e,0xea4,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x12ea,0x589,0x589, -0x12f1,0x589,0x589,0x589,0x12f9,0x589,0x1301,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xc15,0x589,0x589, -0x1309,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x1311,0x1319,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0xc54,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x1320,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x1327,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x132e,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xb04,0x43e,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x60e,0x589,0x589,0x589,0x589,0x589,0x589,0xeec,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x1141,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x589,0x589,0x589,0x589,0x1332,0x589,0x589,0x589, -0x589,0x589,0x589,0x589,0x589,0x589,0x589,0x589,0xeec,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x1342,0x133a,0x133a,0x133a,0x43e,0x43e,0x43e,0x43e, -0x4e5,0x4e5,0x4e5,0x4e5,0x4e5,0x4e5,0x4e5,0x134a,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9, -0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0xda9,0x1352,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0xeaa,0xeb1,0xeb9,0x46e,0x5b9,0x5b9,0x5b9,0x5a5,0xec9,0xec1,0xee0,0xed1,0xed8,0xee8,0xb6a,0xef0, +0x46e,0x46e,0x46e,0x46e,0xd68,0x5b9,0xef8,0xf00,0x5b9,0xf08,0xf10,0xf14,0xf1c,0x5b9,0xf24,0x46e, +0x546,0x550,0xf2c,0x5b9,0xf30,0xf38,0xf48,0xf40,0x5b9,0xf50,0x5b9,0xf57,0x46e,0x46e,0x46e,0x46e, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x8aa,0xe4c,0x46e,0x46e,0x46e,0x46e, +0xf67,0xf5f,0xf6a,0xf72,0x8be,0xf7a,0x46e,0xf82,0xf8a,0xf92,0x46e,0x46e,0x5b9,0xfa2,0xfaa,0xf9a, +0xfba,0xfc1,0xfb2,0xfc9,0xfd1,0x46e,0xfe1,0xfd9,0x5b9,0xfe4,0xfec,0xff4,0xffc,0x1004,0x46e,0x46e, +0x5b9,0x5b9,0x100c,0x46e,0x546,0x1014,0x4ee,0x101c,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x1024,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x1034,0x5ef,0x103c,0x102c,0x92f,0x1044,0x104c,0x1052,0x106a,0x105a,0x1062,0x106e,0x92f,0x107e,0x1076,0x1086, +0x1096,0x108e,0x46e,0x46e,0x109d,0x10a5,0x611,0x10ad,0x10bd,0x6b2,0x10c5,0x10b5,0x46e,0x46e,0x46e,0x46e, +0x5b9,0x10cd,0x10d5,0x46e,0x5b9,0x10dd,0x10e5,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x10ed,0x10f5,0x46e, +0x5b9,0x10fd,0x1105,0x110d,0x5b9,0x111d,0x1115,0x46e,0x112d,0x1125,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x546,0x4ee,0x1135,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x5b9,0x113d,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1153,0x1158,0x1145,0x114d,0x1168, +0x1160,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8a9,0x46e,0x46e,0x46e,0x1178,0x1180,0x1188,0x1170,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1190,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1198,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x119a, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x113d,0x8be, +0x11a2,0x46e,0x46e,0xe42,0x11aa,0x5b9,0x11ba,0x11c2,0x11ca,0x11b2,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x11d2,0x11d7,0x11df,0x46e,0x46e,0x11e7,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ef,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x11f7,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x11ff,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, +0x1207,0x120c,0x1214,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc, +0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0x8dc,0x121c,0x8dc,0x1223,0x122b,0x1231,0x8dc,0x1237,0x8dc,0x8dc,0x123f, +0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0xa7e,0x1247,0x46e,0x46e,0x46e,0x46e,0x1257,0x125e,0x1263, +0x1269,0x1271,0x1279,0x1281,0x125b,0x1289,0x1291,0x1299,0x129e,0x1270,0x1257,0x125e,0x125a,0x1269,0x12a6,0x1258, +0x12a9,0x125b,0x12b1,0x12b9,0x12c1,0x12c8,0x12b4,0x12bc,0x12c4,0x12cb,0x12b7,0x12d3,0x124f,0x8dc,0x8dc,0x8dc, +0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x515,0x12e3,0x515, +0x12ea,0x12f1,0x12db,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x12f8,0x1300,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x1308,0x46e,0x546,0x1318,0x1310,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1328,0x1330,0x1338, +0x1340,0x1348,0x1350,0x46e,0x1320,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x1358,0x8dc, +0x8dc,0xb75,0x135d,0x1361,0xb7d,0x1369,0x136e,0x8dc,0x1358,0x8dc,0x1236,0x46e,0x1376,0x137e,0x1382,0x138a, +0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x1392,0x8dc,0x8dc,0x8dc, +0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, +0x8dc,0x8dc,0x8dc,0xa7f,0x139a,0x8dc,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x13a2,0x46e,0x1358,0x8dc,0x13aa, +0x8dc,0x13b2,0xb7f,0x46e,0x46e,0x13ba,0x13c2,0x13ca,0x46e,0xb7e,0x46e,0xee8,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x13d2,0x5b9,0x5b9, +0x13d9,0x5b9,0x5b9,0x5b9,0x13e1,0x5b9,0x13e9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc5f,0x5b9,0x5b9, +0x13f1,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x13f9,0x1401,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1408,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x140f,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x1416,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x46e,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x141a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ff,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x1422,0x5b9,0x5b9,0x5b9, +0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1432,0x142a,0x142a,0x142a,0x46e,0x46e,0x46e,0x46e, +0x515,0x515,0x515,0x515,0x515,0x515,0x515,0x143a,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, +0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x1442,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, @@ -397,11 +411,13 @@ static const uint16_t propsTrie_index[19820]={ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, 6,6,4,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,5,5,5, -5,6,6,6,0,0,0x17,0,0,0,0,6,6,6,6,6, +5,6,6,6,0,0,0x17,0,6,6,0x10,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,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,0,5,5,6,6,0x17,0x17,0x49,0x89, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,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,6,6,6,6, +6,6,6,6,6,6,6,6,5,5,6,6,0x17,0x17,0x49,0x89, 0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,4,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,6,6,6,8,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -455,448 +471,451 @@ static const uint16_t propsTrie_index[19820]={ 6,0,6,6,6,6,0,0,0,0,0,0,0,6,6,0, 5,5,5,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, 0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,6,8,8,0,5,5,5, +0,0,0,0,0,0,0,0,5,6,8,8,0,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,0,5,5,5,5,5,0,0,6,5,8,6, 8,8,8,8,8,0,6,8,8,0,8,8,6,6,0,0, 0,0,0,0,0,8,8,0,0,0,0,0,0,0,5,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0,0,0,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,5,5,5,5,0,0,5,8,8,8,6,6,6, -6,0,8,8,8,0,8,8,8,6,5,0,0,0,0,0, -0,0,0,8,0,0,0,0,0,0,0,5,0,0,0,0, -0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8, -0,5,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,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,6,0,0,0,0,8,8,8,6,6,6,0,6,0, -8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,6,5,5,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,6,6,6,6, +0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5,5,5,5,5, +0,6,8,8,0,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,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,5,8,8,8,6,6,6,6,0,8,8,8,0,8,8, +8,6,5,0x1b,0,0,0,0,5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b, +0x364b,0xc94b,0x350b,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,0,0,8,8,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0,8,8,0,5,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,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,6,0,0,0,0,8, +8,8,6,6,6,0,6,0,8,8,8,8,8,8,8,8, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,6,5,5,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,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,5,5,5,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,5,5,5,1,1,1,1,1,1,0,1, -0,0,0,0,0,1,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,0,5,5,5,5,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,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, +5,5,5,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,5,5,5, +1,1,1,1,1,1,0,1,0,0,0,0,0,1,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,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,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,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,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, -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,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, -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,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,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,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, +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,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,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,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,5,5,5,0,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,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,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,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, -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,0,6,6,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4, +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,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,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,0,6,6,0,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,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,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,0,0,0,0,0,0,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,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, +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,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,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,0,0,0,0,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,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,0x19,0x19,0x19,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,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, +0x19,0x19,0x19,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,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, -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,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,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, -0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,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,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,0x1b,0x1b,0x1b,0x1b,0x18,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,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,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,0x18,0x18,0x18,0x18,0x18,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,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, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,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,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,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, -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,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,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,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, +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,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,0x14,0x15,0x14,0x15,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,0x1b, 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,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, +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, -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,0x1b,0x1b,0,0, -0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2, +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,0x1b,0x1b,0x1b,0x1b,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,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +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,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, +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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0, 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,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, +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, -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,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,5,5,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,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,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,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,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,5,5,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,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,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, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,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,0, +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, -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, +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, -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,0x5c5,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,5,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,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,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,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,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, -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,0x785,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,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,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,0x545,5, -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,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,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,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, -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, +5,5,5,5,5,5,0x545,5,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,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,0,1,2,1,2,1,2,1,2,1,2,1,2, +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,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, +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,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,0,0, -1,1,1,1,1,2,1,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,0,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,0,0,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,5,5,5,5,5,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,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,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, +1,2,1,1,1,1,1,0,1,1,1,1,1,2,1,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,0,0,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, +5,5,5,5,5,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, +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,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,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, +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,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,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,5, +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,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, +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,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +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,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,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,0x18,5,5, +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, @@ -945,7 +964,7 @@ static const uint16_t propsTrie_index[19820]={ 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,0,0,0, +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, @@ -970,259 +989,300 @@ static const uint16_t propsTrie_index[19820]={ 5,5,5,5,5,5,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, -0,0,0,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,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,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, +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, -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,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,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,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, +0,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,0,0,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,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,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,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,0,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,0,0,0,0, -6,6,6,0,0,0,0,6,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,0x58b,0x11cb,0x17,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,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,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,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,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,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, -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,6,6,6,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,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,0x17,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,0,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,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,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,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,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,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,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,6,6,6,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,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,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, +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, -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,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, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, +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, +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, +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,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,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,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,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,0x17,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, +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,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,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,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,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,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, 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, +0,6,6,6,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,5,5,5,5,5,5,0,0,0, +0,0,0,0,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,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, +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,0,0,0,0, +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,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,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,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, -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, -5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, -5,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, +0,0,0,0,0,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,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,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,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,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, +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,0,0,0, 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,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,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,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,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,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,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,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,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,2,2, +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,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,0x58b,0x5cb,0x60b,0x64b, +0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0, +0,0,0,0,0,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,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,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,2,2,2,2,2,2,2,0,2,2,2,2,2,2, +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,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,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,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, +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,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, +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,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,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,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,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,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, +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,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,0x1b,0x1b,0x1b,0x1b, +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,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,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,0,0,0,0,0,0,0,0x1b,0x1b,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,0,0,0,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,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,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,0,0,0, -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,0x705,5,5,5,5,5,5, +0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,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,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,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0,0,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,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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, 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, @@ -1241,6 +1301,8 @@ static const uint16_t propsTrie_index[19820]={ 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,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, @@ -1255,2141 +1317,2228 @@ static const uint16_t propsTrie_index[19820]={ static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4216, + propsTrie_index+4408, NULL, - 4216, - 15604, + 4408, + 16372, 0xa40, - 0x10f8, + 0x11b8, 0x0, 0x0, 0x110000, - 0x4d68, + 0x5128, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[27452]={ -0x488,0x490,0x498,0x4a0,0x4b8,0x4c0,0x4c8,0x4d0,0x4d8,0x4e0,0x4e8,0x4f0,0x4f8,0x500,0x508,0x510, -0x517,0x51f,0x527,0x52f,0x532,0x53a,0x542,0x54a,0x552,0x55a,0x562,0x56a,0x572,0x57a,0x582,0x58a, -0x592,0x59a,0x5a1,0x5a9,0x5b1,0x5b9,0x5c1,0x5c9,0x5d1,0x5d9,0x5de,0x5e6,0x5ed,0x5f5,0x5fd,0x605, -0x60d,0x615,0x61d,0x625,0x62c,0x634,0x63c,0x644,0x64c,0x654,0x65c,0x664,0x66c,0x674,0x67c,0x684, -0x180c,0xce8,0xdd3,0x4a8,0x4a8,0xe52,0xe58,0xe60,0x10fc,0x1114,0x1104,0x110c,0x71c,0x722,0x72a,0x732, -0x73a,0x740,0x748,0x750,0x758,0x75e,0x766,0x76e,0x776,0x77c,0x784,0x78c,0x794,0x79c,0x7a4,0x7ab, -0x7b3,0x7b9,0x7c1,0x7c9,0x7d1,0x7d7,0x7df,0x7e7,0x7ef,0x7f5,0x7fd,0x805,0x80d,0x814,0x81c,0x824, -0x82c,0x830,0x838,0x83f,0x847,0x84f,0x857,0x85f,0x141c,0x1424,0x867,0x86f,0x877,0x87f,0x887,0x88e, -0x1482,0x1472,0x147a,0x174f,0x1757,0x1124,0x896,0x111c,0x1366,0x1366,0x1368,0x1138,0x1139,0x112c,0x112e,0x1130, -0x148a,0x148c,0x89e,0x148c,0x8a6,0x8ab,0x8b3,0x1491,0x8b9,0x148c,0x8bf,0x8c7,0xbc1,0x1499,0x1499,0x8cf, -0x14a9,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa,0x14aa, -0x14aa,0x14aa,0x14aa,0x14a1,0x8d7,0x14b2,0x14b2,0x8df,0xad6,0xade,0xae6,0xaee,0x14c2,0x14ba,0x8e7,0x8ef, -0x8f7,0x14ca,0x14d2,0x8ff,0x14ca,0x907,0x1814,0xcf0,0xaf6,0xafe,0xb06,0xb0b,0x16c5,0xbf4,0xbfb,0x162d, -0xb91,0x181c,0xcf8,0xd00,0xd08,0xd10,0xf10,0xf10,0x1715,0x171a,0xc2c,0xc34,0x178b,0x1793,0x18b5,0xddb, -0x179b,0xc7c,0xc84,0x17a3,0x4a8,0x4a8,0xef0,0xd18,0x164d,0x1635,0x1645,0x163d,0x16dd,0x16d5,0x169d,0xba1, -0x1141,0x1141,0x1141,0x1141,0x1144,0x1141,0x1141,0x114c,0x90f,0x1154,0x913,0x91b,0x1154,0x923,0x92b,0x933, -0x1164,0x115c,0x116c,0x93b,0x943,0x94b,0x953,0x95b,0x1174,0x117c,0x1184,0x118c,0x963,0x1194,0x119b,0x11a3, -0x11ab,0x11b3,0x11bb,0x11c3,0x11cb,0x11d2,0x11da,0x11e2,0x11ea,0x11f2,0x11f5,0x11f7,0x14da,0x15c0,0x15c6,0x96b, -0x11ff,0x973,0x97b,0x1319,0x131e,0x1321,0x1329,0x1207,0x1331,0x1331,0x1217,0x120f,0x121f,0x1227,0x122f,0x1237, -0x123f,0x1247,0x124f,0x1257,0x15ce,0x1625,0x175f,0x189d,0x1267,0x126e,0x1276,0x127e,0x125f,0x1286,0x15d6,0x15dd, -0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x15e5,0x15e8,0x15e5,0x15e5,0x15f0,0x15f7,0x15f9,0x1600, -0x1608,0x160c,0x160c,0x160f,0x160c,0x160c,0x1615,0x160c,0x1655,0x170d,0x1767,0xb13,0xb19,0xb1f,0xb27,0xb2c, -0x16b5,0xbd1,0xbd5,0x1722,0x16a5,0x16a5,0x16a5,0xba9,0x16ad,0xbc9,0x16f5,0xc1c,0xbb1,0xbb9,0xbb9,0x17ab, -0x16e5,0x176f,0xc0b,0xc0c,0x983,0x14ea,0x14ea,0x98b,0x14f2,0x14f2,0x14f2,0x14f2,0x14f2,0x14f2,0x993,0x68c, -0x134e,0x1370,0x99b,0x1378,0x9a3,0x1380,0x1388,0x1390,0x9ab,0x9b0,0x1398,0x139f,0x9b5,0x9bd,0x1705,0xb99, -0x9c5,0x13f6,0x13fd,0x13a7,0x1405,0x140c,0x13af,0x9cd,0x13c8,0x13c8,0x13ca,0x13b7,0x13bf,0x13bf,0x13c0,0x1414, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, -0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x10b3,0x165d,0x165d, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2, -0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d2,0x13d9,0x10bb,0x10c1, -0x1502,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508, -0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508,0x1508, -0x1508,0x1508,0x1508,0x1508,0x9d5,0x1510,0x9dd,0x1824,0x17b7,0x17b7,0x17b7,0x17b7,0x17b7,0x17b7,0x17b7,0x17b7, -0x17b3,0xc8c,0x17c7,0x17bf,0x17c9,0x182c,0x182c,0xd20,0x16bd,0x172a,0x177f,0x1783,0x1777,0xc3c,0xc42,0xc45, -0x16ed,0xc14,0x1732,0xc4d,0x17d1,0x17d4,0xc94,0xd28,0x17e4,0x17dc,0xc9c,0xd30,0x1834,0x1838,0xd38,0xfb6, -0x17ec,0xca4,0xcac,0x1840,0x1850,0x1848,0xd40,0xeb3,0xde3,0xdeb,0x19e9,0xf6e,0x1a8e,0x1a8e,0x1858,0xd48, -0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465, -0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467, -0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469, -0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464, -0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466, -0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468, -0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a, -0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465, -0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467, -0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469, -0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464, -0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466, -0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468, -0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a, -0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465, -0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467, -0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469, -0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464, -0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466, -0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468, -0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a, -0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x146a,0x1464,0x1465,0x1466,0x1467,0x1468,0x1469,0x9e5,0xd50,0xd53, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c, -0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c,0x143c, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339, -0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x1339,0x13e1,0x13e1,0x13e1,0x13e1,0x13e1,0x13e1,0x13e1,0x13e1, -0x13e6,0x13ee,0x161d,0x10c9,0x16fd,0x16fd,0x10cd,0x10d4,0x9ed,0x9f5,0x9fd,0x12a6,0x12ad,0x12b5,0xa05,0x12bd, -0x12ee,0x12ee,0x1296,0x129e,0x12c5,0x12e5,0x12e6,0x12f6,0x12cd,0x128e,0xa0d,0x12d5,0xa15,0x12dd,0xa1d,0xa21, -0xc24,0x12fe,0xa29,0xa31,0x1306,0x130c,0x1311,0xa39,0xa49,0x1356,0x135e,0x1341,0x1346,0xa51,0xa59,0xa41, -0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c, -0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x142c,0x1434,0x1434,0x1434,0x1434, -0x12a0,0x12a0,0x12e0,0x1320,0x1360,0x13a0,0x13e0,0x1420,0x145c,0x149c,0x14c8,0x1508,0x1548,0x1588,0x15c8,0x1608, -0x1648,0x1684,0x16c4,0x1704,0x1744,0x1778,0x17b4,0x17f4,0x1834,0x1874,0x18b0,0x18f0,0x1930,0x1970,0x19b0,0x19f0, -0xa80,0xac0,0xb00,0xe48,0xb40,0xa40,0xb80,0xa40,0xe68,0xa40,0xa40,0xa40,0xa40,0xbc0,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xdcd,0xbfd,0xa40,0xa40,0xc3d,0xc7d,0xa40,0xe0d,0xd8d,0xcbd, -0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e, -0x115e,0x115e,0x115e,0x115e,0xea8,0x119e,0xfde,0x101e,0x11de,0xee8,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf5e, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf9e, +static const uint16_t propsVectorsTrie_index[28540]={ +0x4bb,0x4c3,0x4cb,0x4d3,0x4eb,0x4f3,0x4fb,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x533,0x53b,0x543, +0x54a,0x552,0x55a,0x562,0x565,0x56d,0x575,0x57d,0x585,0x58d,0x595,0x59d,0x5a5,0x5ad,0x5b5,0x5bd, +0x5c5,0x5cd,0x5d4,0x5dc,0x5e4,0x5ec,0x5f4,0x5fc,0x604,0x60c,0x611,0x619,0x620,0x628,0x630,0x638, +0x640,0x648,0x650,0x658,0x65f,0x667,0x66f,0x677,0x67f,0x687,0x68f,0x697,0x69f,0x6a7,0x6af,0x6b7, +0x18ce,0xd31,0xe19,0x4db,0x4db,0xe89,0xe91,0x1a56,0x11bd,0x11d5,0x11c5,0x11cd,0x75c,0x762,0x76a,0x772, +0x77a,0x780,0x788,0x790,0x798,0x79e,0x7a6,0x7ae,0x7b6,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x7eb, +0x7f3,0x7f9,0x801,0x809,0x811,0x817,0x81f,0x827,0x82f,0x835,0x83d,0x845,0x84d,0x854,0x85c,0x864, +0x86c,0x870,0x878,0x87f,0x887,0x88f,0x897,0x89f,0x14dd,0x14e5,0x8a7,0x8af,0x8b7,0x8bf,0x8c7,0x8ce, +0x1543,0x1533,0x153b,0x1811,0x1819,0x11e5,0x8d6,0x11dd,0x1427,0x1427,0x1429,0x11f9,0x11fa,0x11ed,0x11ef,0x11f1, +0x154b,0x154d,0x8de,0x154d,0x8e6,0x8eb,0x8f3,0x1552,0x8f9,0x154d,0x8ff,0x907,0xc09,0x155a,0x155a,0x90f, +0x156a,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b, +0x156b,0x156b,0x156b,0x1562,0x917,0x1573,0x1573,0x91f,0xb16,0xb1e,0xb26,0xb2e,0x1583,0x157b,0x927,0x92f, +0x937,0x158d,0x1595,0x93f,0x158b,0x947,0x18d6,0xd39,0xb36,0xb3e,0xb46,0xb4b,0x1787,0xc3c,0xc43,0x16ef, +0xbd9,0x18de,0xd41,0xd49,0xd51,0xd59,0xf41,0xf41,0x17d7,0x17dc,0xc75,0xc7d,0x184d,0x1855,0x197f,0xe21, +0x185d,0xcc5,0xccd,0x1865,0x6bf,0x4db,0xf21,0xd61,0x170f,0x16f7,0x1707,0x16ff,0x179f,0x1797,0x175f,0xbe9, +0x1202,0x1202,0x1202,0x1202,0x1205,0x1202,0x1202,0x120d,0x94f,0x1215,0x953,0x95b,0x1215,0x963,0x96b,0x973, +0x1225,0x121d,0x122d,0x97b,0x983,0x98b,0x993,0x99b,0x1235,0x123d,0x1245,0x124d,0x9a3,0x1255,0x125c,0x1264, +0x126c,0x1274,0x127c,0x1284,0x128c,0x1293,0x129b,0x12a3,0x12ab,0x12b3,0x12b6,0x12b8,0x159d,0x1682,0x1688,0x9ab, +0x12c0,0x9b3,0x9bb,0x13da,0x13df,0x13e2,0x13ea,0x12c8,0x13f2,0x13f2,0x12d8,0x12d0,0x12e0,0x12e8,0x12f0,0x12f8, +0x1300,0x1308,0x1310,0x1318,0x1690,0x16e7,0x1821,0x195f,0x1328,0x132f,0x1337,0x133f,0x1320,0x1347,0x1698,0x169f, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x16a7,0x16aa,0x16a7,0x16a7,0x16b2,0x16b9,0x16bb,0x16c2, +0x16ca,0x16ce,0x16ce,0x16d1,0x16ce,0x16ce,0x16d7,0x16ce,0x1717,0x17cf,0x1829,0xb53,0xb59,0xb5f,0xb67,0xb6c, +0x1777,0xc19,0xc1d,0x17e4,0x1767,0x1767,0x1767,0xbf1,0x176f,0xc11,0x17b7,0xc65,0xbf9,0xc01,0xc01,0x186d, +0x17a7,0x1831,0xc53,0xc55,0x9c3,0x15ad,0x15ad,0x9cb,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x9d3,0x6c3, +0x140f,0x1431,0x9db,0x1439,0x9e3,0x1441,0x1449,0x1451,0x9eb,0x9f0,0x1459,0x1460,0x9f5,0x9fd,0x17c7,0xbe1, +0xa05,0x14b7,0x14be,0x1468,0x14c6,0x14cd,0x1470,0xa0d,0x1489,0x1489,0x148b,0x1478,0x1480,0x1480,0x1481,0x14d5, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x1174,0x171f,0x171f, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, +0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x149a,0x117c,0x1182, +0x15c5,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, +0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, +0x15cb,0x15cb,0x15cb,0x15cb,0xa15,0x15d3,0xa1d,0x18e6,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879, +0x1875,0xcd5,0x1889,0x1881,0x188b,0x18ee,0x18ee,0xd69,0x177f,0x17ec,0x1841,0x1845,0x1839,0xc85,0xc8b,0xc8e, +0x17af,0xc5d,0x17f4,0xc96,0x1893,0x1896,0xcdd,0xd71,0x18a6,0x189e,0xce5,0xd79,0x18f6,0x18fa,0xd81,0xfe7, +0x18ae,0xced,0xcf5,0x1902,0x1912,0x190a,0xd89,0xee4,0xe29,0xe31,0x1ac9,0xf9f,0x1b6e,0x1b6e,0x191a,0xd91, +0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, +0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, +0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, +0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, +0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, +0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, +0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, +0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, +0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, +0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, +0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, +0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, +0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, +0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, +0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, +0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, +0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, +0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, +0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, +0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, +0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, +0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0xa25,0xd99,0xd9c, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, +0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, +0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2, +0x14a7,0x14af,0x16df,0x118a,0x17bf,0x17bf,0x118e,0x1195,0xa2d,0xa35,0xa3d,0x1367,0x136e,0x1376,0xa45,0x137e, +0x13af,0x13af,0x1357,0x135f,0x1386,0x13a6,0x13a7,0x13b7,0x138e,0x134f,0xa4d,0x1396,0xa55,0x139e,0xa5d,0xa61, +0xc6d,0x13bf,0xa69,0xa71,0x13c7,0x13cd,0x13d2,0xa79,0xa89,0x1417,0x141f,0x1402,0x1407,0xa91,0xa99,0xa81, +0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed, +0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14f5,0x14f5,0x14f5,0x14f5, +0x136c,0x136c,0x13ac,0x13ec,0x142c,0x146c,0x14ac,0x14ec,0x1528,0x1568,0x1594,0x15d4,0x1614,0x1654,0x1694,0x16d4, +0x1714,0x1750,0x1790,0x17d0,0x1810,0x1844,0x1880,0x18c0,0x1900,0x1940,0x197c,0x19bc,0x19fc,0x1a3c,0x1a7c,0x1abc, +0xa80,0xac0,0xb00,0xe4d,0xb40,0xa40,0xb80,0xa40,0xe73,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12a9,0x12a9, +0xeb3,0xef3,0xa40,0xa40,0xa40,0xa40,0xdd2,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xe12,0xd92,0xd02, +0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9, +0x11e9,0x11e9,0x11e9,0x11e9,0xf33,0x1229,0x1069,0x10a9,0x1269,0xf73,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfe9, +0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9, +0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0x1029, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, 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,0xcfd, -0xd3d,0xd4d,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,0xcfd, -0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de, -0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x10de,0x105e, -0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e, -0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x111e,0x109e, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0xb34,0xb3b,0xb43,0xb4b,0x1665,0x1665,0x1665,0xb53,0xb5b,0xb5e,0x1695,0x168d,0xb89,0xcb4,0xcb8,0xcbc, -0x4a8,0x4a8,0x4a8,0x4a8,0xcc4,0x17f4,0xccc,0xf08,0x1518,0xa61,0xa67,0xfc6,0xb66,0x16cd,0xc03,0x4a8, -0x152d,0x1520,0x1525,0x166d,0xb6e,0x694,0x4a8,0x4a8,0x19d1,0xf25,0x19c1,0x69c,0x4a8,0x4a8,0x4a8,0x4a8, -0x19f1,0x19f1,0x19f1,0x19f1,0x19f1,0x19f1,0x19f1,0x19f1,0x19f1,0xf76,0xf7e,0xf86,0x4a8,0x4a8,0x4a8,0x4a8, -0xb76,0xb79,0xd5b,0x1a39,0xfbe,0x6a4,0x4a8,0x1057,0xc55,0xcd4,0x4a8,0x4a8,0x198d,0xebb,0xec3,0x1a79, -0xbdd,0xbe4,0xbec,0x1860,0x1a19,0x4a8,0x19f9,0xf96,0x1868,0xd63,0xd6b,0xd73,0xfe6,0x6ac,0x4a8,0x4a8, -0x1870,0x1870,0x6b4,0x4a8,0x1aa6,0x106f,0x1a9e,0x1077,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0xd7b,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x18bd,0x18bf,0xdf3,0xdfa,0x1880,0x1878,0xd83,0xee8,0x1985,0xea3,0xeab,0xf8e,0x199d,0x19a1,0xee0,0x1006, -0xf59,0xf5e,0x6bc,0x4a8,0x105f,0x1067,0x19e1,0xf66,0xf3b,0xf41,0xf49,0xf51,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x1a61,0x1a59,0x102d,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1a49,0xfee,0xff6,0xffe, -0x1a11,0x1a09,0xfa6,0x4a8,0x19a9,0xef8,0x6c4,0x4a8,0x103d,0x1045,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -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,0x173f,0xc5d,0xc64,0xc64,0xc64, -0x1747,0x1747,0x1747,0xc6c,0x1a96,0x1a96,0x1a96,0x1a96,0x1a96,0x1a96,0x6cc,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888, -0x1888,0x1888,0x188a,0x1888,0x1892,0x1888,0x1888,0x1888,0x1888,0x1888,0x1888,0x1895,0x1888,0x1888,0x1888,0x1888, -0x1888,0x6d4,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7,0x18c7, -0x18c7,0xe02,0xfae,0x6dc,0x4a8,0x4a8,0x6e0,0xf00,0x1a31,0x1a29,0xfce,0xfd6,0x6e8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1995,0x1995,0xecb,0xed0,0xed8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x19c9,0x19c9,0x19c9, -0xf18,0xf1d,0x6f0,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1535,0x1535,0x1535, -0x1535,0x1535,0x1535,0x1535,0xa6f,0x1545,0xa77,0x1546,0x153d,0x154e,0x1554,0x155c,0xa7f,0x1685,0x1685,0x6f8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1675,0x1675,0xb81,0xc74,0x4a8,0x4a8,0x4a8,0x4a8,0x158d,0x1594,0xa87, -0x1597,0xa8f,0xa97,0xa9f,0x1591,0xaa7,0xaaf,0xab7,0x1596,0x159e,0x158d,0x1594,0x1590,0x1597,0x159f,0x158e, -0x1595,0x1591,0xabe,0x1564,0x156c,0x1573,0x157a,0x1567,0x156f,0x1576,0x157d,0xac6,0x1585,0x1abe,0x1abe,0x1abe, -0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1aae,0x1ab1,0x1aae, -0x1ab8,0x1097,0x700,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x100e,0x1a51,0x1014, -0x1a51,0x101c,0x1021,0x1025,0x1025,0x107f,0x1086,0x1086,0x1086,0x108e,0x1086,0x108f,0x1086,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x704,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x704,0xace,0x15a7,0x15a7, -0x15a8,0x70c,0x70c,0x70c,0x70c,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x714,0x70c,0x70c,0x70c, -0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c, -0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c, -0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c, -0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x70c,0x17fc,0xcdc,0x1804, -0x1804,0xce0,0xe13,0xe1b,0xe23,0xd8b,0xd91,0x18a5,0xd99,0xda1,0xda8,0xda8,0xdaf,0xdb7,0xdbe,0xdc6, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0x18ee,0x18f6,0x18ee,0x18fc,0x1904,0x18cf,0x190c,0x1914,0x18ee,0x191c,0x1924, -0x192b,0x1933,0x18d7,0x18ee,0x1935,0x18df,0x18e6,0x193d,0xe2b,0x19b9,0xe32,0x19b1,0x1945,0x194d,0x1955,0x195d, -0x1a21,0x1965,0x196d,0xe3a,0xe42,0x1975,0x1975,0x1975,0xe4a,0x19d9,0x19d9,0xf2d,0xf33,0xe0a,0xe0b,0xe0b, -0xe0b,0xe0b,0xe0b,0xe0b,0xe0b,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1a01,0x1a01,0x1a01, -0x1a01,0x1a01,0x1a01,0xf9e,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0xe68,0xe70,0xe78, -0xe80,0xe88,0xe90,0xe97,0xe9b,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1a71,0x1a69,0x1035, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1a41,0xfde, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x1a81,0x1a81,0x1a81,0x1a81,0x1a81,0x1a81,0x1a81,0x1a81, -0x1a81,0x1a81,0x1a81,0x1a81,0x1a81,0x1a81,0x1a86,0x1a81,0x1a81,0x1a81,0x104d,0x104f,0x4a8,0x4a8,0x4a8,0x4a8, -0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x4a8,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x10dc,0x109f, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x10a7,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x15b8,0x15b8, -0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x15b8,0x10e4,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x10ab,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f, -0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x109f,0x10ab,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x10ec,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x10f4,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1444,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x144c,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454, -0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x1454,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c, -0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x145c,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0, -0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x15b0,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad, -0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x18ad,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6, -0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x1ac6,0x487,0x487, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x255,0x25e,0x258,0x258,0x25b,0x252,0x252, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x786,0x780,0x765,0x75c,0x753,0x750,0x747,0x762,0x74d,0x759,0x75c,0x777,0x76e,0x75f,0x783,0x756, -0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x744,0x76b,0x768,0x771,0x771,0x771,0x780, -0x747,0x792,0x792,0x792,0x792,0x792,0x792,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c, -0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x78c,0x74d,0x753,0x759,0x77d,0x741, -0x77a,0x78f,0x78f,0x78f,0x78f,0x78f,0x78f,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789, -0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x74d,0x774,0x74a,0x771,0x252, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x261,0x261,0x261,0x261,0x261,0x270,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, -0x264,0x5df,0x79b,0x79e,0x5e5,0x79e,0x798,0x5dc,0x5d3,0x26a,0x5f1,0x26d,0x7a1,0x5ca,0x5e8,0x795, -0x5e2,0x5ee,0x5d0,0x5d0,0x5d6,0x267,0x5dc,0x5d9,0x5d3,0x5d0,0x5f1,0x26d,0x5cd,0x5cd,0x5cd,0x5df, -0x276,0x276,0x276,0x276,0x276,0x276,0x5fa,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x5fa,0x276,0x276,0x276,0x276,0x276,0x276,0x5eb,0x5fa,0x276,0x276,0x276,0x276,0x276,0x5fa,0x5f4, -0x5f7,0x5f7,0x273,0x273,0x273,0x273,0x5f4,0x273,0x5f7,0x5f7,0x5f7,0x273,0x5f7,0x5f7,0x273,0x273, -0x5f4,0x273,0x5f7,0x5f7,0x273,0x273,0x273,0x5eb,0x5f4,0x5f7,0x5f7,0x273,0x5f7,0x273,0x5f4,0x273, -0x282,0x600,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279, -0x27f,0x5fd,0x282,0x600,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x600,0x282,0x279,0x282,0x279, -0x282,0x279,0x282,0x279,0x282,0x279,0x606,0x5fd,0x282,0x279,0x282,0x600,0x282,0x279,0x282,0x279, -0x282,0x5fd,0x609,0x603,0x282,0x279,0x282,0x279,0x5fd,0x282,0x279,0x282,0x279,0x282,0x279,0x609, -0x603,0x606,0x5fd,0x282,0x600,0x282,0x279,0x282,0x600,0x60c,0x606,0x5fd,0x282,0x600,0x282,0x279, -0x282,0x279,0x606,0x5fd,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279, -0x282,0x279,0x282,0x279,0x282,0x279,0x606,0x5fd,0x282,0x279,0x282,0x600,0x282,0x279,0x282,0x279, -0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x279,0x282,0x282,0x279,0x282,0x279,0x282,0x279,0x27c, -0x285,0x291,0x291,0x285,0x291,0x285,0x291,0x291,0x285,0x291,0x291,0x291,0x285,0x285,0x291,0x291, -0x291,0x291,0x285,0x291,0x291,0x285,0x291,0x291,0x291,0x285,0x285,0x285,0x291,0x291,0x285,0x291, -0x294,0x288,0x291,0x285,0x291,0x285,0x291,0x291,0x285,0x291,0x285,0x285,0x291,0x285,0x291,0x294, -0x288,0x291,0x291,0x291,0x285,0x291,0x285,0x291,0x291,0x285,0x285,0x28e,0x291,0x285,0x285,0x285, -0x28e,0x28e,0x28e,0x28e,0x297,0x297,0x28b,0x297,0x297,0x28b,0x297,0x297,0x28b,0x294,0x60f,0x294, -0x60f,0x294,0x60f,0x294,0x60f,0x294,0x60f,0x294,0x60f,0x294,0x60f,0x294,0x60f,0x285,0x294,0x288, -0x294,0x288,0x294,0x288,0x291,0x285,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288, -0x288,0x297,0x297,0x28b,0x294,0x288,0x969,0x969,0x96c,0x966,0x294,0x288,0x294,0x288,0x294,0x288, -0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288,0x294,0x288, -0x294,0x288,0x294,0x288,0x96c,0x966,0x96c,0x966,0x969,0x963,0x96c,0x966,0xb25,0xc27,0x969,0x963, -0x969,0x963,0x96c,0x966,0x96c,0x966,0x96c,0x966,0x96c,0x966,0x96c,0x966,0x96c,0x966,0x96c,0x966, -0xc27,0xc27,0xc27,0xd1d,0xd1d,0xd1d,0xd20,0xd20,0xd1d,0xd20,0xd20,0xd1d,0xd1d,0xd20,0xe61,0xe64, -0xe64,0xe64,0xe64,0xe61,0xe64,0xe61,0xe64,0xe61,0xe64,0xe61,0xe64,0xe61,0x29a,0x612,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x612,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29d,0x29a,0x29a,0x29a, -0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a, -0x29a,0x96f,0x96f,0x96f,0x96f,0x96f,0xc2a,0xc2a,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, -0x2b5,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2a9,0x2a9,0x2a0,0x2a0,0x618,0x2a0,0x2ac,0x61b, -0x2af,0x61b,0x61b,0x61b,0x2af,0x61b,0x2ac,0x2ac,0x61e,0x2b2,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a6, -0x615,0x615,0x615,0x615,0x2a3,0x615,0x2a0,0xa9e,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2a0,0x2a0,0x2a0, -0x2a0,0x2a0,0x978,0x978,0x975,0x972,0x975,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d, -0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0xc2d,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621, -0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621, -0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621, -0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621, -0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x621,0x624,0x624,0x8d0,0x624,0x624,0x8d3,0xaa1,0xaa1, -0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xbe2,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, -0xe2e,0xe2e,0xe2e,0xe2e,0xe31,0xcf6,0xcf6,0xcf6,0x627,0x627,0xaa4,0xc24,0xc24,0xc24,0xc24,0xc24, -0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xc24,0xf0f,0xf0c,0xf0f,0xf0c,0x2c1,0x2ca,0xf0f,0xf0c, -6,6,0x2d0,0xe67,0xe67,0xe67,0x2b8,0x1452,6,6,6,6,0x2cd,0x2bb,0x2df,0x2be, -0x2df,0x2df,0x2df,6,0x2df,6,0x2df,0x2df,0x2d6,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d, -0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,0x62d,6,0x62d,0x62d,0x62d,0x62d,0x62d, -0x62d,0x62d,0x2df,0x2df,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a, -0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x62a,0x2d3,0x62a,0x62a,0x62a,0x62a,0x62a, -0x62a,0x62a,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0xf0f,0x2e2,0x2e2,0x2e5,0x2df,0x2df,0x2e2,0x2d9,0x97b, -0xb2e,0xb2b,0x2dc,0x97b,0x2dc,0x97b,0x2dc,0x97b,0x2dc,0x97b,0x2c7,0x2c4,0x2c7,0x2c4,0x2c7,0x2c4, -0x2c7,0x2c4,0x2c7,0x2c4,0x2c7,0x2c4,0x2c7,0x2c4,0x2e2,0x2e2,0x2d9,0x2d3,0xadd,0xada,0xb28,0xc33, -0xc30,0xc36,0xc33,0xc30,0xd23,0xd26,0xd26,0xd26,0x98a,0x639,0x2f4,0x2f7,0x2f4,0x2f4,0x2f4,0x2f7, -0x2f4,0x2f4,0x2f4,0x2f4,0x2f7,0x98a,0x2f7,0x2f4,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636, -0x636,0x639,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636, -0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x636,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630, -0x630,0x633,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630,0x630, -0x630,0x630,0x630,0x630,0x984,0x633,0x2ee,0x2f1,0x2ee,0x2ee,0x2ee,0x2f1,0x2ee,0x2ee,0x2ee,0x2ee, -0x2f1,0x984,0x2f1,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee, -0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f7,0x2f1,0x2f4,0x2ee,0x2f4,0x2ee, -0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2eb,0x8dc,0x2e8,0x8c1,0x8c1,0x10b9,0x97e,0x97e,0xb34,0xb31, -0x987,0x981,0x987,0x981,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee, -0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee, -0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2ee, -0x2f4,0x2ee,0x2f4,0x2ee,0x2f4,0x2f7,0x2f1,0x2f4,0x2ee,0xb34,0xb31,0x2f4,0x2ee,0xb34,0xb31,0x2f4, -0x2ee,0xb34,0xb31,0xe6a,0x2f7,0x2f1,0x2f7,0x2f1,0x2f4,0x2ee,0x2f7,0x2f1,0x2f4,0x2ee,0x2f7,0x2f1, -0x2f7,0x2f1,0x2f7,0x2f1,0x2f4,0x2ee,0x2f7,0x2f1,0x2f7,0x2f1,0x2f7,0x2f1,0x2f4,0x2ee,0x2f7,0x2f1, -0x98a,0x984,0x2f7,0x2f1,0x2f7,0x2f1,0x2f7,0x2f1,0x2f7,0x2f1,0xd2c,0xd29,0x2f7,0x2f1,0xe6d,0xe6a, -0xe6d,0xe6a,0xe6d,0xe6a,0xba3,0xba0,0xba3,0xba0,0xba3,0xba0,0xba3,0xba0,0xba3,0xba0,0xba3,0xba0, -0xba3,0xba0,0xba3,0xba0,0xe9a,0xe97,0xe9a,0xe97,0xf8d,0xf8a,0xf8d,0xf8a,0xf8d,0xf8a,0xf8d,0xf8a, -0xf8d,0xf8a,0xf8d,0xf8a,0xf8d,0xf8a,0xf8d,0xf8a,0x10f5,0x10f2,0x12d5,0x12d2,0x148b,0x1488,0x148b,0x1488, -0x148b,0x1488,0x148b,0x1488,9,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306, -0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,0x306,9, -9,0x309,0x2fa,0x2fa,0x2fa,0x2fd,0x2fa,0x2fa,9,0x300,0x300,0x300,0x300,0x300,0x300,0x300, -0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300, -0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x300,0x303,9,0x849,0x98d,9, -9,0x1455,0x1455,0x1371,0xc,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd, -0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0xd2f,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd, -0x8fd,0x8fd,0x8fd,0x8fd,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0xe70,0x30c, -0x30c,0x30c,0x318,0x30c,0x30f,0x30c,0x30c,0x31b,0x900,0xd32,0xd35,0xd32,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0xc, -0xc,0xc,0xc,0xc,0x31e,0x31e,0x31e,0x315,0x312,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc39,0xc39,0xc39,0xc39,0x1374,0x1458,0xf18,0xf18,0xf18,0xf15,0xf15,0xd3e, -0x84f,0xc48,0xc45,0xc45,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xf12,0xf12,0xf12,0xf12,0xf12,0x84c, -0x144c,0xf,0xd3b,0x852,0x1290,0x339,0x33c,0x33c,0x33c,0x33c,0x33c,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0x855,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x8c7, -0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0x8c7,0xad4,0xad4,0xad4,0xc3c,0xc42,0xc3f,0xd38,0xd38,0xd38, -0xd38,0xd38,0xd38,0x128d,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x333,0x330, -0x32d,0x32a,0xb37,0xb37,0x8c4,0x339,0x339,0x345,0x339,0x33f,0x33f,0x33f,0x33f,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x993,0x993,0x339,0x339,0x339,0x339,0x339,0x993, -0x33c,0x339,0x33c,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x993, -0x339,0x339,0x339,0x33c,0x348,0x339,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x321,0x32a,0x327, -0x327,0x324,0x324,0x324,0x324,0x342,0x342,0x324,0x324,0x32a,0x327,0x327,0x327,0x324,0xc4b,0xc4b, -0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x993,0x993,0x993,0x990,0x990,0xc4b, -0x9ab,0x9ab,0x9ab,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a5,0x9a2,0x9a5,0x9a2,0x12,0x996, -0x9a8,0x999,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0xc4e,0xc4e,0xc4e, -0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f,0x99f, -0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x99c,0x12,0x12,0xc4e,0xc4e,0xc4e, -0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4, -0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0xfa2,0xfa2, -0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2, -0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae,0x9ae, -0x9ae,0xb3a,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15, -0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5, -0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5, -0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xeb5,0xea9,0xea9,0xea9,0xea9,0xea9, -0xea9,0xea9,0xea9,0xea9,0xeb8,0xeb8,0xeac,0xeac,0xeaf,0xebe,0xebb,0x10e,0x10e,0x10e,0x10e,0x10e, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xab0,0xab0,0xab3,0xab3,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0x72,0x72,0x72,0x72, -0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xce7,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1518,0x1518,0x1518,0x1518,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1515, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xd42,0xd52,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,0xcc2, +0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169, +0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x10e9, +0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9, +0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x1129, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0xb74,0xb7b,0xb83,0xb8b,0x1727,0x1727,0x1727,0xb93,0xb9b,0xb9e,0x1757,0x174f,0xbd1,0xcfd,0xd01,0xd05, +0x4db,0x4db,0x4db,0x4db,0xd0d,0x18b6,0xd15,0xf39,0x15db,0xaa1,0xaa7,0xff7,0xba6,0x178f,0xc4b,0x4db, +0x15f0,0x15e3,0x15e8,0x172f,0xbae,0xbb6,0x1142,0x1148,0x1ab1,0xf56,0x1aa1,0x6cb,0x4db,0x4db,0x4db,0x4db, +0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0xfa7,0xfaf,0xfb7,0x4db,0x4db,0x4db,0x4db, +0xbbe,0xbc1,0xda4,0x1b19,0xfef,0x6d3,0x4db,0x1088,0xc9e,0xd1d,0x4db,0x4db,0x1a66,0xeec,0xef4,0x1b59, +0xc25,0xc2c,0xc34,0x1922,0x1af9,0x4db,0x1ad9,0xfc7,0x192a,0xdac,0xdb4,0xdbc,0x1017,0x6db,0x4db,0x4db, +0x1932,0x1932,0x6e3,0x4db,0x1b86,0x10a0,0x1b7e,0x10a8,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0xdc4,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x1987,0x1989,0xe39,0xe40,0x1942,0x193a,0xdcc,0xf19,0x1a5e,0xed4,0xedc,0xfbf,0x1a76,0x1a7a,0xf11,0x1037, +0xf8a,0xf8f,0x6eb,0x4db,0x1090,0x1098,0x1ac1,0xf97,0xf6c,0xf72,0xf7a,0xf82,0x4db,0x4db,0x4db,0x4db, +0x1bc6,0x1bbe,0x1132,0x113a,0x1b41,0x1b39,0x105e,0x4db,0x4db,0x4db,0x4db,0x4db,0x1b29,0x101f,0x1027,0x102f, +0x1af1,0x1ae9,0xfd7,0x112a,0x1a82,0xf29,0x6f3,0x4db,0x106e,0x1076,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc, +0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x1801,0xca6,0xcad,0xcad,0xcad, +0x1809,0x1809,0x1809,0xcb5,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x6fb,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, +0x194a,0x194a,0x194c,0x194a,0x1954,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x1957,0x194a,0x194a,0x194a,0x194a, +0x194a,0x703,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991, +0x1991,0xe48,0xfdf,0x70b,0x4db,0x4db,0x70f,0xf31,0x1b11,0x1b09,0xfff,0x1007,0x717,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x1a6e,0x1a6e,0xefc,0xf01,0xf09,0x4db,0x4db,0x1114, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x1aa9,0x1aa9,0x1aa9,0xf49,0xf4e,0x71f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0xaaf,0x1608,0xab7,0x1609,0x1600,0x1611,0x1617,0x161f,0xabf, +0x1747,0x1747,0x727,0x4db,0x4db,0x4db,0x4db,0x4db,0x1737,0x1737,0xbc9,0xcbd,0x4db,0x4db,0x4db,0x4db, +0x1650,0x1657,0xac7,0x165a,0xacf,0xad7,0xadf,0x1654,0xae7,0xaef,0xaf7,0x1659,0x1661,0x1650,0x1657,0x1653, +0x165a,0x1662,0x1651,0x1658,0x1654,0xafe,0x1627,0x162f,0x1636,0x163d,0x162a,0x1632,0x1639,0x1640,0xb06,0x1648, +0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e, +0x1b8e,0x1b91,0x1b8e,0x1b98,0x10e0,0x72f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x110c,0x737,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x73b,0x103f,0x1b31,0x1045,0x1b31,0x104d,0x1052,0x1056,0x1056,0x10b0,0x10b8,0x10c0,0x10c8,0x10d0,0x10c8, +0x10d8,0x10c8,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, +0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, +0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, +0x743,0x744,0xb0e,0x166a,0x166a,0x166a,0x74c,0x74c,0x74c,0x74c,0x173f,0x173f,0x173f,0x173f,0x173f,0x173f, +0x173f,0x754,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, +0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, +0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, +0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, +0x74c,0x74c,0x18be,0xd25,0x18c6,0x18c6,0xd29,0xe59,0xe61,0xe69,0xdd4,0xdda,0x196f,0xde2,0x1967,0xdea, +0xdee,0xdf5,0xdfd,0xe04,0xe0c,0xe11,0xe11,0xe11,0xe11,0xe11,0x19c0,0x19c8,0x19c0,0x19ce,0x19d6,0x19a1, +0x19de,0x19e6,0x19c0,0x19ee,0x19f6,0x19fd,0x1a05,0x19a9,0x19c0,0x1a08,0x19b1,0x19b8,0x1a10,0x1a16,0x1a92,0x1a99, +0x1a8a,0x1a1e,0x1a26,0x1a2e,0x1a36,0x1b01,0x1a3e,0x1a46,0xe71,0xe79,0x1999,0x1999,0x1999,0xe81,0x1ab9,0x1ab9, +0xf5e,0xf64,0xe50,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0xfcf,0x4db,0x1bb6,0x1bae,0x10e8,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0xe99,0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec8,0xecc,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x1b51,0x1b49,0x1066,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x1b21,0x100f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x10f0,0x10f5,0x10fd, +0x1104,0x111c,0x1122,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61, +0x1b61,0x1b66,0x1b61,0x1b61,0x1b61,0x107e,0x1080,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1150,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6, +0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1158,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, +0x4db,0x4db,0x4db,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x119d,0x1160,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1168,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x11a5,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, +0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x11ad,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x11b5,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,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,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,0x1515,0x1515,0x1515, +0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1505,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x150d,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,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,0x1515,0x1515,0x1515, +0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, +0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, +0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, +0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, +0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, +0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x4ba,0x4ba,0x4ba,0x273,0x273,0x273,0x273, +0x273,0x273,0x273,0x273,0x273,0x276,0x27f,0x279,0x279,0x27c,0x273,0x273,0x273,0x273,0x273,0x273, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x7a1,0x79b,0x780,0x777, +0x76e,0x76b,0x762,0x77d,0x768,0x774,0x777,0x792,0x789,0x77a,0x79e,0x771,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x786,0x783,0x78c,0x78c,0x78c,0x79b,0x762,0x7ad,0x7ad,0x7ad, +0x7ad,0x7ad,0x7ad,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, +0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x768,0x76e,0x774,0x798,0x75c,0x795,0x7aa,0x7aa,0x7aa, +0x7aa,0x7aa,0x7aa,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, +0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x768,0x78f,0x765,0x78c,0x273,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0, +0,0,0,0,0,0,0,0,0,0,0,0,0x282,0x282,0x282,0x282, +0x282,0x291,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,0x285,0x5fa,0x7b6,0x7b9, +0x600,0x7b9,0x7b3,0x5f7,0x5ee,0x28b,0x60c,0x28e,0x7bc,0x5e5,0x603,0x7b0,0x5fd,0x609,0x5eb,0x5eb, +0x5f1,0x288,0x5f7,0x5f4,0x5ee,0x5eb,0x60c,0x28e,0x5e8,0x5e8,0x5e8,0x5fa,0x297,0x297,0x297,0x297, +0x297,0x297,0x615,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x615,0x297,0x297,0x297, +0x297,0x297,0x297,0x606,0x615,0x297,0x297,0x297,0x297,0x297,0x615,0x60f,0x612,0x612,0x294,0x294, +0x294,0x294,0x60f,0x294,0x612,0x612,0x612,0x294,0x612,0x612,0x294,0x294,0x60f,0x294,0x612,0x612, +0x294,0x294,0x294,0x606,0x60f,0x612,0x612,0x294,0x612,0x294,0x60f,0x294,0x2a3,0x61b,0x2a3,0x29a, +0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a0,0x618,0x2a3,0x61b, +0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, +0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x618,0x624,0x61e, +0x2a3,0x29a,0x2a3,0x29a,0x618,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x624,0x61e,0x621,0x618,0x2a3, +0x61b,0x2a3,0x29a,0x2a3,0x61b,0x627,0x621,0x618,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x621,0x618, +0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, +0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, +0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x29d,0x2a6,0x2b2,0x2b2,0x2a6, +0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2b2,0x2b2,0x2b2,0x2b2,0x2a6,0x2b2, +0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2a6, +0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2a6,0x2a6,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2b2,0x2b2, +0x2a6,0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2a6,0x2af,0x2b2,0x2a6,0x2a6,0x2a6,0x2af,0x2af,0x2af,0x2af, +0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5, +0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, +0x2b2,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2a9,0x2b8,0x2b8,0x2ac, +0x2b5,0x2a9,0x990,0x990,0x993,0x98d,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, +0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, +0x993,0x98d,0x993,0x98d,0x990,0x98a,0x993,0x98d,0xb4f,0xc51,0x990,0x98a,0x990,0x98a,0x993,0x98d, +0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0xc51,0xc51,0xc51,0xd4a, +0xd4a,0xd4a,0xd4d,0xd4d,0xd4a,0xd4d,0xd4d,0xd4a,0xd4a,0xd4d,0xe8e,0xe91,0xe91,0xe91,0xe91,0xe8e, +0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2be,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x996,0x996,0x996, +0x996,0x996,0xc54,0xc54,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2cd,0x2cd,0x2cd, +0x2cd,0x2cd,0x2cd,0x2cd,0x2ca,0x2ca,0x2c1,0x2c1,0x633,0x2c1,0x2cd,0x636,0x2d0,0x636,0x636,0x636, +0x2d0,0x636,0x2cd,0x2cd,0x639,0x2d3,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c7,0x630,0x630,0x630,0x630, +0x2c4,0x630,0x2c1,0xac8,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x99f,0x99f, +0x99c,0x999,0x99c,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57, +0xc57,0xc57,0xc57,0xc57,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, +0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, +0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, +0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, +0x63c,0x63c,0x63c,0x63c,0x63f,0x63f,0x8f4,0x63f,0x63f,0x8f7,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, +0xacb,0xacb,0xacb,0xc09,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xe55,0xe55,0xe55,0xe55, +0xe58,0xd1d,0xd1d,0xd1d,0x642,0x642,0xace,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, +0xc4e,0xc4e,0xc4e,0xc4e,0xf3c,0xf39,0xf3c,0xf39,0x2e2,0x2eb,0xf3c,0xf39,9,9,0x2f1,0xe94, +0xe94,0xe94,0x2d9,0x1491,9,9,9,9,0x2ee,0x2dc,0x300,0x2df,0x300,0x300,0x300,9, +0x300,9,0x300,0x300,0x2f7,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648, +0x648,0x648,0x648,0x648,0x648,0x648,9,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x300,0x300, +0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645, +0x645,0x645,0x645,0x645,0x645,0x645,0x2f4,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x2f7,0x2f7, +0x2f7,0x2f7,0x2f7,0xf3c,0x303,0x303,0x306,0x300,0x300,0x303,0x2fa,0x9a2,0xb58,0xb55,0x2fd,0x9a2, +0x2fd,0x9a2,0x2fd,0x9a2,0x2fd,0x9a2,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5, +0x2e8,0x2e5,0x2e8,0x2e5,0x303,0x303,0x2fa,0x2f4,0xb07,0xb04,0xb52,0xc5d,0xc5a,0xc60,0xc5d,0xc5a, +0xd50,0xd53,0xd53,0xd53,0x9b1,0x654,0x312,0x315,0x312,0x312,0x312,0x315,0x312,0x312,0x312,0x312, +0x315,0x9b1,0x315,0x312,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x654,0x651,0x651, +0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651, +0x651,0x651,0x651,0x651,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x9ab,0x64e,0x30c,0x30f,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30f,0x9ab,0x30f,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x309,0x900,0x903,0x8e5,0x8e5,0x10e6,0x9a5,0x9a5,0xb5e,0xb5b,0x9ae,0x9a8,0x9ae,0x9a8, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, +0x312,0x315,0x30f,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0xe97, +0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f, +0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x9b1,0x9ab,0x315,0x30f, +0x315,0x30f,0x315,0x30f,0x315,0x30f,0xd59,0xd56,0x315,0x30f,0xe9a,0xe97,0xe9a,0xe97,0xe9a,0xe97, +0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7, +0xec7,0xec4,0xec7,0xec4,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7, +0xfba,0xfb7,0xfba,0xfb7,0x111f,0x111c,0x12f9,0x12f6,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7, +0xc,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324, +0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0xc,0xc,0x327,0x318,0x318, +0x318,0x31b,0x318,0x318,0xc,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, +0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, +0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x321,0xc,0x86a,0x9b4,0xc,0xc,0x1494,0x1494,0x13ad, +0xf,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0xd5c,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0xe9d,0x32a,0x32a,0x32a,0x336,0x32a, +0x32d,0x32a,0x32a,0x339,0x927,0xd5f,0xd62,0xd5f,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, +0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0xf,0xf,0xf,0xf,0xf, +0x33c,0x33c,0x33c,0x333,0x330,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc63,0xc63,0xc63,0xc63,0x13b0,0x1497,0xf45,0xf45,0xf45,0xf42,0xf42,0xd6b,0x870,0xc72,0xc6f,0xc6f, +0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0x86d,0x148b,0x12,0xd68,0x873, +0x12c0,0x357,0x35a,0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0xf48,0xf48,0xf48,0xf48,0xf48, +0x876,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0xafe,0xafe,0xafe,0xc66,0xc6c,0xc69,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x12bd, +0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x351,0x34e,0x34b,0x348,0xb61,0xb61, +0x8e8,0x357,0x357,0x363,0x357,0x35d,0x35d,0x35d,0x35d,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x9ba,0x9ba,0x357,0x357,0x357,0x357,0x357,0x9ba,0x35a,0x357,0x35a,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x9ba,0x357,0x357,0x357,0x35a, +0x366,0x357,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x33f,0x348,0x345,0x345,0x342,0x342,0x342, +0x342,0x360,0x360,0x342,0x342,0x348,0x345,0x345,0x345,0x342,0xc75,0xc75,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x9ba,0x9ba,0x9ba,0x9b7,0x9b7,0xc75,0x9d2,0x9d2,0x9d2,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c9,0x9cc,0x9c9,0x15,0x9bd,0x9cf,0x9c0,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xc78,0xc78,0xc78,0x9c6,0x9c6,0x9c6,0x9c6, +0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c3,0x9c3,0x9c3,0x9c3, +0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x15,0x15,0xc78,0xc78,0xc78,0xdcb,0xdcb,0xdcb,0xdcb, +0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb, +0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, +0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x9d8,0x9d8,0x9d8,0x9d8, +0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, +0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, +0x9d8,0x9d8,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xb64,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xedf,0xedf,0xedf,0xedf, +0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, +0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, +0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, +0xee5,0xee5,0xed9,0xed9,0xedc,0xeeb,0xee8,0x111,0x111,0x111,0x111,0x111,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xada,0xada,0xadd,0xadd, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x75,0x75,0x75,0x75,0x1551,0x1551,0x1551,0x1551, +0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x154e,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1fe,0x1fe,0x1fe,0x1fe, +0x1fe,0x1fe,0x1fe,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x120f,0x120f,0x120f,0x120f, +0x120f,0x120f,0x120f,0x120f,0x120f,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1e0,0x1e0,0x1e0,0x1e0, +0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1467,0x1467,0x1467,0x1467, +0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x173d,0x173d,0x173d,0x173d, +0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1233,0x1233,0x1233,0x1233, +0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x186,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x15f6,0x15f6,0x15f6,0x15f6, +0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1f8,0x1f8,0x1f8,0x1f8,0x15fc,0x15fc,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1548,0x1548,0x1548,0x1548, +0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1632,0x1632,0x1632,0x1632, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x16aa,0x16aa,0x16aa,0x16aa, +0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xdc2,0xdc2,0xdbf,0xdbf, +0xdbf,0xdc2,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x234,0x1755,0x1755,0x1755, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x17d6,0x17d6,0x240,0x17d6, +0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x240,0x240,0x240,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x16fb,0x16fb,0x16fb,0x16fb,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x183, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x1f8,0x1f8,0x1f8,0x1f8,0x15c3,0x15c3, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1662,0x1662,0x1662,0x1662,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xd9b,0xd9b,0xd98,0xd98,0xd98,0xd9b,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, -0x234,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x8fa,0x8fa, +0,0,0,0,0,0,0,0,0,0,0x921,0x921,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,3,3,3,3,3,3, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -0x145e,0x360,0x36f,0x36f,0x18,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x18,0x18,0x375, -0x375,0x18,0x18,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, -0x375,0x18,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x18,0x375,0x18,0x18,0x18,0x375,0x375, -0x375,0x375,0x18,0x18,0x363,0xc54,0x360,0x36f,0x36f,0x360,0x360,0x360,0x360,0x18,0x18,0x36f, -0x36f,0x18,0x18,0x372,0x372,0x366,0xd44,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x360, -0x18,0x18,0x18,0x18,0x378,0x378,0x18,0x378,0x375,0x375,0x360,0x360,0x18,0x18,0x8e5,0x8e5, -0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x375,0x375,0x36c,0x36c,0x369,0x369,0x369,0x369, -0x369,0x36c,0x369,0x10c8,0x18,0x18,0x18,0x18,0x1b,0xc57,0x37b,0xc5a,0x1b,0x387,0x387,0x387, -0x387,0x387,0x387,0x1b,0x1b,0x1b,0x1b,0x387,0x387,0x1b,0x1b,0x387,0x387,0x387,0x387,0x387, -0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x1b,0x387,0x387,0x387,0x387,0x387,0x387, -0x387,0x1b,0x387,0x38a,0x1b,0x387,0x38a,0x1b,0x387,0x387,0x1b,0x1b,0x37e,0x1b,0x384,0x384, -0x384,0x37b,0x37b,0x1b,0x1b,0x1b,0x1b,0x37b,0x37b,0x1b,0x1b,0x37b,0x37b,0x381,0x1b,0x1b, -0x1b,0xf24,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x38a,0x38a,0x38a,0x387,0x1b,0x38a,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, -0x37b,0x37b,0x387,0x387,0x387,0xf24,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1e,0x38d,0x38d,0x396,0x1e,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0xc63,0x399,0x1e,0x399, -0x399,0x399,0x1e,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x399, -0x399,0x1e,0x399,0x399,0x399,0x399,0x399,0x399,0x399,0x1e,0x399,0x399,0x1e,0x399,0x399,0x399, -0x399,0x399,0x1e,0x1e,0x390,0x399,0x396,0x396,0x396,0x38d,0x38d,0x38d,0x38d,0x38d,0x1e,0x38d, -0x38d,0x396,0x1e,0x396,0x396,0x393,0x1e,0x1e,0x399,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x399,0xc63,0xc5d,0xc5d,0x1e,0x1e,0x8eb,0x8eb, -0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x1377,0xc60,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x166b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x21,0x39c,0x3ab,0x3ab,0x21,0x3b1,0x3b1,0x3b1, -0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x21,0x21,0x3b1,0x3b1,0x21,0x21,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, -0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x21,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, -0x3b1,0x21,0x3b1,0x3b1,0x21,0xc66,0x3b1,0x3b1,0x3b1,0x3b1,0x21,0x21,0x39f,0x3b1,0x39c,0x39c, -0x3ab,0x39c,0x39c,0x39c,0xf27,0x21,0x21,0x3ab,0x3ae,0x21,0x21,0x3ae,0x3ae,0x3a2,0x21,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x39c,0x39c,0x21,0x21,0x21,0x21,0x3b4,0x3b4,0x21,0x3b1, -0x3b1,0x3b1,0xf27,0xf27,0x21,0x21,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a5,0xc66,0x129c,0x129c,0x129c,0x129c,0x129c,0x129c,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x24,0x24,0x3b7,0x3c3,0x24,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x24,0x24,0x24,0x3c3,0x3c3, -0x3c3,0x24,0x3c3,0x3c3,0x3c6,0x3c3,0x24,0x24,0x24,0x3c3,0x3c3,0x24,0x3c3,0x24,0x3c3,0x3c3, -0x24,0x24,0x24,0x3c3,0x3c3,0x24,0x24,0x24,0x3c3,0x3c3,0x8f4,0x24,0x24,0x24,0x3c3,0x3c3, -0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x8f4,0xd47,0x3c3,0x3c3,0x3c3,0x24,0x24,0x24,0x24,0x3b7,0x3bd, -0x3b7,0x3bd,0x3bd,0x24,0x24,0x24,0x3bd,0x3bd,0x3bd,0x24,0x3c0,0x3c0,0x3c0,0x3ba,0x24,0x24, -0xf2a,0x24,0x24,0x24,0x24,0x24,0x24,0x3b7,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x24,0x24,0xe5e,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8ee,0x8ee,0x8ee,0xc69, -0xc69,0xc69,0xc69,0xc69,0xc69,0xc6c,0xc69,0x24,0x24,0x24,0x24,0x24,0x1461,0x3d5,0x3d5,0x3d5, -0x27,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x27,0x3d8,0x3d8,0x3d8,0x27,0x3d8,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x27,0x3d8,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x1464,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x27,0x27, -0x27,0xf33,0x3c9,0x3c9,0x3c9,0x3d5,0x3d5,0x3d5,0x3d5,0x27,0x3c9,0x3c9,0x3cc,0x27,0x3c9,0x3c9, -0x3c9,0x3cf,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x3c9,0x3c9,0x27,0xf33,0xf33,0x166e,0x27, -0x27,0x27,0x27,0x27,0x3d8,0x3d8,0xf2d,0xf2d,0x27,0x27,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2, -0x3d2,0x3d2,0x3d2,0x3d2,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0xf30,0xf30,0xf30,0xf30, -0xf30,0xf30,0xf30,0xf30,0x2a,0x1467,0x3e4,0x3e4,0x2a,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x2a,0x3ea,0x3ea,0x3ea,0x2a,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x2a,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea, -0x2a,0x3ea,0x3ea,0x3ea,0x3ea,0x3ea,0x2a,0x2a,0xc6f,0xc72,0x3e4,0x3db,0x3e7,0x3e4,0x3db,0x3e4, -0x3e4,0x2a,0x3db,0x3e7,0x3e7,0x2a,0x3e7,0x3e7,0x3db,0x3de,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, -0x2a,0x3db,0x3db,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3ea,0x2a,0x3ea,0x3ea,0xe76,0xe76, -0x2a,0x2a,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x2a,0xe79,0xe79,0x2a, -0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2d,0x146a,0x3f6,0x3f6, -0x2d,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x2d,0x3fc,0x3fc,0x3fc,0x2d,0x3fc,0x3fc, -0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x129f,0x3fc,0x3fc, -0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x129f,0x2d, -0x2d,0xf3f,0x3ed,0x3f6,0x3f6,0x3ed,0x3ed,0x3ed,0xf36,0x2d,0x3f6,0x3f6,0x3f6,0x2d,0x3f9,0x3f9, -0x3f9,0x3f0,0x129f,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x3ed,0x2d,0x2d,0x2d,0x2d, -0x2d,0x2d,0x2d,0x1671,0x3fc,0x3fc,0xf36,0xf36,0x2d,0x2d,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3,0x3f3, -0x3f3,0x3f3,0x3f3,0x3f3,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0x2d,0x2d,0x2d,0xf3c,0xf3f,0xf3f, -0xf3f,0xf3f,0xf3f,0xf3f,0x30,0x30,0x9bd,0x9bd,0x30,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x30,0x30,0x30,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x30,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x30,0x9c3,0x30,0x30, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x30,0x30,0x30,0x9b7,0x30,0x30,0x30,0x30,0x9b4, -0x9bd,0x9bd,0x9b4,0x9b4,0x9b4,0x30,0x9b4,0x30,0x9bd,0x9bd,0x9c0,0x9bd,0x9c0,0x9c0,0x9c0,0x9b4, -0x30,0x30,0x30,0x30,0x30,0x30,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d, -0x30,0x30,0x9bd,0x9bd,0x9ba,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, -0x33,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417, -0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417, -0x417,0x402,0x417,0x414,0x402,0x402,0x402,0x402,0x402,0x402,0x408,0x33,0x33,0x33,0x33,0x3ff, -0x41d,0x41d,0x41d,0x41d,0x41d,0x417,0x41a,0x405,0x405,0x405,0x405,0x405,0x405,0x402,0x405,0x40b, -0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x411,0x40e,0x40e,0x33,0x33,0x33,0x33, -0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x42c,0x42c,0x36, -0x42c,0x36,0x36,0x42c,0x42c,0x36,0x42c,0x36,0x36,0x42c,0x36,0x36,0x36,0x36,0x36,0x36, -0x42c,0x42c,0x42c,0x42c,0x36,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x42c,0x36,0x42c,0x42c,0x42c, -0x36,0x42c,0x36,0x42c,0x36,0x36,0x42c,0x42c,0x36,0x42c,0x42c,0x42c,0x42c,0x420,0x42c,0x429, -0x420,0x420,0x420,0x420,0x420,0x420,0x36,0x420,0x420,0x42c,0x36,0x36,0x435,0x435,0x435,0x435, -0x435,0x36,0x432,0x36,0x423,0x423,0x423,0x423,0x423,0x420,0x36,0x36,0x426,0x426,0x426,0x426, -0x426,0x426,0x426,0x426,0x426,0x426,0x36,0x36,0x42f,0x42f,0x137a,0x137a,0x36,0x36,0x36,0x36, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x921,0x921, +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, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0x149d,0x37e,0x38d,0x38d,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x1b,0x393, +0x393,0x1b,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, +0x393,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x393,0x1b,0x1b,0x1b,0x393,0x393, +0x393,0x393,0x1b,0x1b,0x381,0xc7e,0x37e,0x38d,0x38d,0x37e,0x37e,0x37e,0x37e,0x1b,0x1b,0x38d, +0x38d,0x1b,0x1b,0x390,0x390,0x384,0xd71,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x37e, +0x1b,0x1b,0x1b,0x1b,0x396,0x396,0x1b,0x396,0x393,0x393,0x37e,0x37e,0x1b,0x1b,0x90c,0x90c, +0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x393,0x393,0x38a,0x38a,0x387,0x387,0x387,0x387, +0x387,0x38a,0x387,0x10f5,0x1b,0x1b,0x1b,0x1b,0x1e,0xc81,0x399,0xc84,0x1e,0x3a5,0x3a5,0x3a5, +0x3a5,0x3a5,0x3a5,0x1e,0x1e,0x1e,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, +0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, +0x3a5,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x39c,0x1e,0x3a2,0x3a2, +0x3a2,0x399,0x399,0x1e,0x1e,0x1e,0x1e,0x399,0x399,0x1e,0x1e,0x399,0x399,0x39f,0x1e,0x1e, +0x1e,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x3a8,0x3a5,0x1e,0x3a8,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, +0x399,0x399,0x3a5,0x3a5,0x3a5,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x21,0x3ab,0x3ab,0x3b4,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0xc8d,0x3b7,0x21,0x3b7, +0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7, +0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7, +0x3b7,0x3b7,0x21,0x21,0x3ae,0x3b7,0x3b4,0x3b4,0x3b4,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x21,0x3ab, +0x3ab,0x3b4,0x21,0x3b4,0x3b4,0x3b1,0x21,0x21,0x3b7,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3b7,0xc8d,0xc87,0xc87,0x21,0x21,0x912,0x912, +0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x13b3,0xc8a,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x16b9,0x21,0x21,0x21,0x21,0x21,0x21,0x24,0x3ba,0x3c9,0x3c9,0x24,0x3cf,0x3cf,0x3cf, +0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, +0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, +0x3cf,0x24,0x3cf,0x3cf,0x24,0xc90,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3bd,0x3cf,0x3ba,0x3ba, +0x3c9,0x3ba,0x3ba,0x3ba,0xf54,0x24,0x24,0x3c9,0x3cc,0x24,0x24,0x3cc,0x3cc,0x3c0,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x3ba,0x3ba,0x24,0x24,0x24,0x24,0x3d2,0x3d2,0x24,0x3cf, +0x3cf,0x3cf,0xf54,0xf54,0x24,0x24,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0x3c3,0xc90,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x27,0x27,0x3d5,0x3e1,0x27,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1, +0x3e1,0x27,0x3e1,0x3e1,0x3e4,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x3e1,0x27,0x3e1,0x3e1, +0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x91b,0x27,0x27,0x27,0x3e1,0x3e1, +0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x91b,0xd74,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x27,0x3d5,0x3db, +0x3d5,0x3db,0x3db,0x27,0x27,0x27,0x3db,0x3db,0x3db,0x27,0x3de,0x3de,0x3de,0x3d8,0x27,0x27, +0xf57,0x27,0x27,0x27,0x27,0x27,0x27,0x3d5,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, +0x27,0x27,0xe8b,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x915,0x915,0x915,0xc93, +0xc93,0xc93,0xc93,0xc93,0xc93,0xc96,0xc93,0x27,0x27,0x27,0x27,0x27,0x14a0,0x3f3,0x3f3,0x3f3, +0x2a,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x14a3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x2a, +0x2a,0xf60,0x3e7,0x3e7,0x3e7,0x3f3,0x3f3,0x3f3,0x3f3,0x2a,0x3e7,0x3e7,0x3ea,0x2a,0x3e7,0x3e7, +0x3e7,0x3ed,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3e7,0x3e7,0x2a,0xf60,0xf60,0x16bc,0x2a, +0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0xf5a,0xf5a,0x2a,0x2a,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0, +0x3f0,0x3f0,0x3f0,0x3f0,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0xf5d,0xf5d,0xf5d,0xf5d, +0xf5d,0xf5d,0xf5d,0xf5d,0x1779,0x14a6,0x402,0x402,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408, +0x408,0x2d,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, +0x408,0x408,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, +0x2d,0x408,0x408,0x408,0x408,0x408,0x2d,0x2d,0xc99,0xc9c,0x402,0x3f9,0x405,0x402,0x3f9,0x402, +0x402,0x2d,0x3f9,0x405,0x405,0x2d,0x405,0x405,0x3f9,0x3fc,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x2d,0x3f9,0x3f9,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x2d,0x408,0x408,0xea3,0xea3, +0x2d,0x2d,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2d,0xea6,0xea6,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x30,0x14a9,0x414,0x414, +0x30,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x30,0x41a,0x41a,0x41a,0x30,0x41a,0x41a, +0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x41a,0x41a, +0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x30, +0x30,0xf6c,0x40b,0x414,0x414,0x40b,0x40b,0x40b,0xf63,0x30,0x414,0x414,0x414,0x30,0x417,0x417, +0x417,0x40e,0x12d2,0x177c,0x30,0x30,0x30,0x30,0x177f,0x177f,0x177f,0x40b,0x177c,0x177c,0x177c,0x177c, +0x177c,0x177c,0x177c,0x16bf,0x41a,0x41a,0xf63,0xf63,0x30,0x30,0x411,0x411,0x411,0x411,0x411,0x411, +0x411,0x411,0x411,0x411,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0x177c,0x177c,0x177c,0xf69,0xf6c,0xf6c, +0xf6c,0xf6c,0xf6c,0xf6c,0x33,0x33,0x9e4,0x9e4,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x9ea,0x33,0x33, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9de,0x33,0x33,0x33,0x33,0x9db, +0x9e4,0x9e4,0x9db,0x9db,0x9db,0x33,0x9db,0x33,0x9e4,0x9e4,0x9e7,0x9e4,0x9e7,0x9e7,0x9e7,0x9db, +0x33,0x33,0x33,0x33,0x33,0x33,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, +0x33,0x33,0x9e4,0x9e4,0x9e1,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, +0x36,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, +0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, +0x435,0x420,0x435,0x432,0x420,0x420,0x420,0x420,0x420,0x420,0x426,0x36,0x36,0x36,0x36,0x41d, +0x43b,0x43b,0x43b,0x43b,0x43b,0x435,0x438,0x423,0x423,0x423,0x423,0x423,0x423,0x420,0x423,0x429, +0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42c,0x42c,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,0x36,0x36,0x36,0x36,0x936,0x936,0x936,0x939, -0x936,0x936,0x936,0x936,0x39,0x936,0x936,0x936,0x936,0x939,0x936,0x936,0x936,0x936,0x939,0x936, -0x936,0x936,0x936,0x939,0x936,0x936,0x936,0x936,0x939,0x936,0x936,0x936,0x936,0x936,0x936,0x936, -0x936,0x936,0x936,0x936,0x936,0x939,0x9d2,0xf4b,0xf4b,0x39,0x39,0x39,0x39,0x903,0x903,0x906, -0x903,0x906,0x906,0x90f,0x906,0x90f,0x903,0x903,0x903,0x903,0x903,0x930,0x903,0x906,0x909,0x909, -0x90c,0x915,0x909,0x909,0x936,0x936,0x936,0x936,0x12a8,0x12a2,0x12a2,0x12a2,0x903,0x903,0x903,0x906, -0x903,0x903,0x9c6,0x903,0x39,0x903,0x903,0x903,0x903,0x906,0x903,0x903,0x903,0x903,0x906,0x903, -0x903,0x903,0x903,0x906,0x903,0x903,0x903,0x903,0x906,0x903,0x9c6,0x9c6,0x9c6,0x903,0x903,0x903, -0x903,0x903,0x903,0x903,0x9c6,0x906,0x9c6,0x9c6,0x9c6,0x39,0x9cf,0x9cf,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9c9,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x39,0xf42,0x9cc,0xd4a,0xd4a,0xf45,0xf48, -0xf42,0x10cb,0x10cb,0x10cb,0x10cb,0x12a5,0x12a5,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x44a,0x44a,0x39, +0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x39,0x39,0x39,0x39,0x39,0x39, +0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a, +0x39,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x43e,0x44a,0x447, +0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x39,0x43e,0x43e,0x44a,0x39,0x39,0x453,0x453,0x453,0x453, +0x453,0x39,0x450,0x39,0x441,0x441,0x441,0x441,0x441,0x43e,0x39,0x39,0x444,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x39,0x39,0x44d,0x44d,0x13b6,0x13b6,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,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x3c,0x1380, -0x3c,0x3c,0x3c,0x3c,0x3c,0x1380,0x3c,0x3c,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b, -0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0xd59, -0x9fc,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x3f, -0x9fc,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0xd59, -0x9fc,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0xd59,0x9fc,0x3f,0x9fc,0x9fc, -0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x9fc,0x3f,0x9fc,0x9fc, -0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0xd59,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0xd59,0x9fc,0x3f,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x3f,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0xd59,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x3f,0x3f,0x12ab,0x12ab,0xd53,0xd56,0x9f6,0x9ff,0x9f3, -0x9f3,0x9f3,0x9f3,0x9ff,0x9ff,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f9,0x9f0,0x9f0, -0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x3f,0x3f,0x3f,0xa02,0xa02,0xa02,0xa02, -0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02, -0xa02,0x1677,0x42,0x42,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x42,0x42,0xa14,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa11,0xa0e,0x45,0x45,0x45,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1a,0xa1a,0xa1a,0xa1d,0xa1d,0xa1d,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xa3e,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa20,0xa3e,0xa3e,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa26,0xa23, -0xa35,0xa35,0xa38,0xa41,0xa2f,0xa2c,0xa35,0xa32,0xa41,0xc75,0x4b,0x4b,0xa3b,0xa3b,0xa3b,0xa3b, -0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xc78,0xc78,0xc78,0xc78, -0xc78,0xc78,0xc78,0xc78,0xc78,0xc78,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa4d,0xa4d,0xacb,0xace, -0xa53,0xac8,0xa50,0xa4d,0xa56,0xa65,0xa59,0xa68,0xa68,0xa68,0xa47,0x4e,0xa5c,0xa5c,0xa5c,0xa5c, -0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa5f,0xa5f,0xa5f,0xa5f, -0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f, -0xa5f,0xa5f,0xa5f,0xa5f,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa5f,0xa5f,0xa5f,0xa5f, -0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa4a,0xf6c,0x4e,0x4e,0x4e,0x4e,0x4e,0x1122,0x1122,0x1122,0x1122, -0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x51,0x51,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x51,0x51,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x51,0x45f,0x51,0x45f,0x51,0x45f,0x51,0x45f,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x51,0x51,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45c,0x45c,0x45c,0x45c, -0x45c,0x51,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x456,0x45c,0x456,0x456,0x453,0x45c,0x45c, -0x45c,0x51,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x453,0x453,0x453,0x45c,0x45c,0x45c,0x45c, -0x51,0x51,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x51,0x453,0x453,0x453,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x453,0x453,0x453,0x51,0x51,0x45c,0x45c, -0x45c,0x51,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x459,0x456,0x51,0xb40,0xb43,0xb43,0xb43, -0xf75,0x54,0x144f,0x144f,0x144f,0x144f,0x468,0x468,0x468,0x468,0x468,0x468,0x4b0,0xb55,0x57,0x57, -0x66f,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b6,0x4c8,0x4b6,0x4c2,0x4bc,0x672,0x4ad,0x66c,0x66c,0x66c, -0x66c,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4b3,0x4c5,0x4b3,0x4bf,0x4b9,0x57,0xd62,0xd62,0xd62,0xd62, -0xd62,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x57,0x57,0x57,0x4ce,0x4ce,0x4ce,0x4ce, -0x4ce,0x4ce,0x4ce,0x4cb,0x4d1,0x6e7,0x4ce,0x93f,0x960,0xa77,0xa77,0xa77,0xb58,0xb58,0xd65,0xd65, -0xd65,0xd65,0x10e3,0x10e6,0x10e6,0x12b1,0x1449,0x1473,0x1476,0x1476,0x167a,0x5a,0x5a,0x5a,0x5a,0x5a, -0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x5a,0x4d7,0x4d7,0x4d7,0x4d7, -0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d7,0x4d4,0x4d4,0x4d4,0x4d4,0x4d7,0xa7a,0xa7a, -0xb5b,0xb61,0xb61,0xb5e,0xb5e,0xb5e,0xb5e,0xd68,0xe7c,0xe7c,0xe7c,0xe7c,0x10b6,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x507,0x507,0x507,0xa83, -0xe85,0xf7b,0xf7b,0xf7b,0xf7b,0x1215,0x167d,0x167d,0x60,0x60,0x60,0x60,0x699,0x699,0x699,0x699, -0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x513,0x513,0x510,0x510,0x510,0x510,0xe8b,0xe8b,0xe8b,0xe88, -0xe88,0xe88,0xe88,0xe88,0x10ec,0x12ba,0x12ba,0x12ba,0x12ba,0x12b4,0x12b4,0x12b4,0x12bd,0x12b7,0x12b7,0x12bd, -0x1479,0x1479,0x1479,0x1479,0x147c,0x147c,0x147c,0x63,0x63,0x63,0x63,0x63,0x53d,0x53d,0x53d,0x53d, -0x53d,0xa8c,0xa8c,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,0x540,0x540,0x540,0x540, -0x540,0x540,0x540,0x540,0x540,0x540,0x540,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0x6c,0xaa7,0xaa7,0xaa7,0xaa7,0xaaa,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaaa, -0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xaad,0xaad,0xaad,0xaad, -0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad, -0xaad,0xaad,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x7c8,0x7c2,0x7c8, -0x7c2,0x7c8,0x7c2,0x7c8,0x7c2,0x7c8,0x7c2,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2, -0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c2,0x7c2,0x7c2,0x7c8, -0x7c2,0x7c8,0x7c2,0x7c8,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c8,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2, -0x7c5,0xc03,0xc03,0x75,0x75,0x8d9,0x8d9,0x8a3,0x8a3,0x7cb,0x7ce,0xc00,0x78,0x78,0x78,0x78, -0x78,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0, -0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x10aa,0x78,0x78, -0x7b,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e3,0x7e3,0x7e3,0x7b,0x8ac,0x8ac,0x8af,0x8af,0x8af,0x8af,0x8af,0x8af,0x8af,0x8af,0x8af,0x8af, -0x8af,0x8af,0x8af,0x8af,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0x135c,0x135c,0x135c,0x7e, -0x7e,0x7e,0x7e,0x7e,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec, -0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec,0x7ec, -0x7ec,0xd05,0xd05,0x81,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,0x81,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0x84,0x84,0x84,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, -0xac5,0xac5,0xac5,0xac5,0xac5,0xc0c,0xac5,0xac5,0xac5,0xc0c,0xac5,0x87,0x87,0x87,0x87,0x87, -0x87,0x87,0x87,0x87,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149, -0x1149,0x1149,0x1149,0x1149,0x95a,0x95a,0x95a,0x95a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, -0x8a,0x8a,0x8a,0x8a,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x588,0x588,0x588,0x588,0x588,0x8d,0x8d,0x8d,0x8d, -0x8d,0xa98,0x58b,0x591,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x58e,0x591,0x591, -0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x8d,0x591,0x591,0x591,0x591, -0x591,0x8d,0x591,0x8d,0x591,0x591,0x8d,0x591,0x591,0x8d,0x591,0x591,0x591,0x591,0x591,0x591, -0x591,0x591,0x591,0x594,0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6, -0x5a9,0x5af,0x5ac,0x5a6,0x12cf,0x12cf,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac, -0x5a6,0x5ac,0x5ac,0x5a6,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x5a9,0x5a6,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a6,0x5a9,0x5a6,0x5a6, -0x5a9,0x5a9,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a6,0x5a6,0x5a9,0x5a6,0x5a9,0x5a9,0x5a9,0x5a6, -0x5a9,0x5a9,0x5a9,0x5a9,0x90,0x90,0x5a9,0x5a9,0x5a9,0x5a9,0x5a6,0x5a6,0x5a9,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a9,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a9,0x5a6,0x5a6,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0,0xae0, -0xae0,0xae0,0xae0,0xae0,0x5ac,0x5ac,0x8f7,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5a3,0x5a3, -0xb9a,0xd1a,0x90,0x90,0x804,0x816,0x813,0x816,0x813,0xc21,0xc21,0xd11,0xd0e,0x807,0x807,0x807, -0x807,0x819,0x819,0x819,0x831,0x834,0x843,0x93,0x837,0x83a,0x846,0x846,0x82e,0x825,0x81f,0x825, -0x81f,0x825,0x81f,0x822,0x822,0x83d,0x83d,0x840,0x83d,0x83d,0x83d,0x93,0x83d,0x82b,0x828,0x822, -0x93,0x93,0x93,0x93,0x5b8,0x5c4,0x5b8,0xb9d,0x5b8,0x96,0x5b8,0x5c4,0x5b8,0x5c4,0x5b8,0x5c4, -0x5b8,0x5c4,0x5b8,0x5c4,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be, -0x5c4,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1, -0x5bb,0x96,0x96,0x5b5,0x708,0x70b,0x720,0x723,0x702,0x70b,0x70b,0x9c,0x6ea,0x6ed,0x6ed,0x6ed, -0x6ed,0x6ea,0x6ea,0x9c,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xa9b,0xa9b,0xa9b, -0x95d,0x6e4,0x5c7,0x5c7,0x9c,0x732,0x711,0x702,0x70b,0x708,0x702,0x714,0x705,0x6ff,0x702,0x720, -0x717,0x70e,0x72f,0x702,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x71d,0x71a, -0x720,0x720,0x720,0x732,0x6f3,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0, -0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0, -0x6f0,0x6f0,0x6f0,0x9c,0x9c,0x9c,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x9c,0x9c,0x6f0,0x6f0, -0x6f0,0x6f0,0x6f0,0x6f0,0x9c,0x9c,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x6f0,0x9c,0x9c,0x6f0,0x6f0, -0x6f0,0x9c,0x9c,0x9c,0xae3,0xae3,0xae3,0xae3,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f, -0x9f,0x9f,0x9f,0x9f,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xa2,0xa2,0xa2,0xa2,0xa2,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0xaf2,0xaf2,0xaf2,0xaf2, -0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, -0xaf2,0xaf2,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xa8,0xa8,0xf87,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0x1683,0x1683,0x1683,0x1683, -0x1683,0x1683,0x1683,0x1683,0x1683,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, -0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xab,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb16,0xb16,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,0xb16,0xab,0xb16,0xb16,0xab,0xab,0xb16,0xab, -0xab,0xb16,0xb16,0xab,0xab,0xb16,0xb16,0xb16,0xb16,0xab,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb13,0xb13,0xb13,0xb13,0xab,0xb13,0xab,0xb13,0xb13,0xb13,0xb13,0xc99,0xb13,0xb13, -0xab,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb13,0xb13,0xb13,0xb13, -0xb16,0xb16,0xab,0xb16,0xb16,0xb16,0xb16,0xab,0xab,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xab,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xab,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,0xb16,0xb16,0xab,0xb16,0xb16,0xb16,0xb16,0xab,0xb16,0xb16,0xb16,0xb16, -0xb16,0xab,0xb16,0xab,0xab,0xab,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xab,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xd83,0xd83,0xab,0xab, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb13,0xb13,0xb13,0xb0d,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xe94,0xe91,0xab,0xab,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xae,0xb1c,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,0xae,0xae,0xae,0xae,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac, -0xbac,0xbac,0xbac,0xbac,0xbac,0xb1,0xbac,0xbac,0xbac,0xbac,0xba6,0xba6,0xba9,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbaf,0xbaf,0xbb2,0xc15,0xc15,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, -0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbb8,0xbb8,0xb7,0xb7,0xb7,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1, -0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xba,0xbc1,0xbc1,0xbc1,0xba,0xbbe,0xbbe,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0xcab,0x148e,0x148e,0xbd,0xc9c,0xc9c,0xc9c,0xca8,0xca8,0xca8,0xca8,0xc9c, -0xc9c,0xca8,0xca8,0xca8,0xbd,0xbd,0xbd,0xbd,0xca8,0xca8,0xc9c,0xca8,0xca8,0xca8,0xca8,0xca8, -0xca8,0xc9f,0xc9f,0xc9f,0xbd,0xbd,0xbd,0xbd,0xca2,0xbd,0xbd,0xbd,0xcae,0xcae,0xca5,0xca5, -0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1, -0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xcb1,0xc0,0xc0,0xcb1,0xcb1,0xcb1,0xcb1, -0xcb1,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x1491,0x1491,0x1491,0x1491, -0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, -0xc3,0xc3,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, -0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0xc3,0xc3,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,0xc3,0xc3,0xc3,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491, -0x1491,0x1491,0x1491,0x1491,0x1491,0xc3,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0xc3,0xc3, -0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x1686,0x1686,0x1686,0x1686, -0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc6,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xc6,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc6,0xcd8,0xcd8,0xc6,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc6,0xc6,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x95d,0x95d,0x95d,0x960, +0x95d,0x95d,0x95d,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d, +0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x95d,0x95d,0x95d,0x95d,0x95d,0x960,0x9f9,0xf78,0xf78,0x3c,0x3c,0x3c,0x3c,0x92a,0x92a,0x92d, +0x92a,0x92d,0x92d,0x936,0x92d,0x936,0x92a,0x92a,0x92a,0x92a,0x92a,0x957,0x92a,0x92d,0x930,0x930, +0x933,0x93c,0x930,0x930,0x95d,0x95d,0x95d,0x95d,0x12db,0x12d5,0x12d5,0x12d5,0x92a,0x92a,0x92a,0x92d, +0x92a,0x92a,0x9ed,0x92a,0x3c,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a, +0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x9ed,0x9ed,0x9ed,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x9ed,0x92d,0x9ed,0x9ed,0x9ed,0x3c,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3, +0x9f3,0x9f3,0x9f0,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x3c,0xf6f,0x9f3,0xd77,0xd77,0xf72,0xf75, +0xf6f,0x10f8,0x10f8,0x10f8,0x10f8,0x12d8,0x12d8,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,0x3c,0x3c,0x3c,0x3c,0x459,0x459,0x459,0x459,0x459,0x459,0x3f,0x13bc, +0x3f,0x3f,0x3f,0x3f,0x3f,0x13bc,0x3f,0x3f,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, +0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, +0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42, +0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, +0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23, +0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0xa23,0x42,0xa23,0xa23, +0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0x12de,0x12de,0xd80,0xd83,0xa1d,0xa26,0xa1a, +0xa1a,0xa1a,0xa1a,0xa26,0xa26,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x42,0x42,0x42,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0x16c5,0x45,0x45,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x45,0x45,0xa3b,0xa3e,0xa3e,0xa3e, +0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, +0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa38,0xa35,0x48,0x48,0x48,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa41,0xa41,0xa44,0xa44,0xa44,0x14af,0x14af,0x14af, +0x14af,0x14af,0x14af,0x14af,0x14af,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa65,0xa65,0xa65,0xa65, +0xa65,0xa65,0xa47,0xa65,0xa65,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4d,0xa4a, +0xa5c,0xa5c,0xa5f,0xa68,0xa56,0xa53,0xa5c,0xa59,0xa68,0xc9f,0x4e,0x4e,0xa62,0xa62,0xa62,0xa62, +0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xca2,0xca2,0xca2,0xca2, +0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa77,0xa77,0xaf5,0xaf8, +0xa7d,0xaf2,0xa7a,0xa77,0xa80,0xa8f,0xa83,0xa92,0xa92,0xa92,0xa6e,0x51,0xa86,0xa86,0xa86,0xa86, +0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa71,0xf99,0x51,0x51,0x51,0x51,0x51,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, +0x477,0x477,0x54,0x54,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x54,0x54,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x54,0x54,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, +0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x471,0x477,0x471,0x471,0x46e,0x477,0x477, +0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, +0x54,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x54,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, +0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x54,0x54,0x477,0x477, +0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x474,0x471,0x54,0xb6a,0xb6d,0xb6d,0xb6d, +0xfa2,0x57,0x148e,0x148e,0x148e,0x148e,0x483,0x483,0x483,0x483,0x483,0x483,0x4ce,0xb7f,0x5a,0x5a, +0x68a,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4d4,0x4e6,0x4d4,0x4e0,0x4da,0x68d,0x4cb,0x687,0x687,0x687, +0x687,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4d1,0x4e3,0x4d1,0x4dd,0x4d7,0x5a,0xd8f,0xd8f,0xd8f,0xd8f, +0xd8f,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x5a,0x5a,0x5a,0x4ec,0x4ec,0x4ec,0x4ec, +0x4ec,0x4ec,0x4ec,0x4e9,0x4ef,0x702,0x4ec,0x966,0x987,0xaa1,0xaa1,0xaa1,0xb82,0xb82,0xd92,0xd92, +0xd92,0xd92,0x1110,0x1113,0x1113,0x12e4,0x1488,0x14b2,0x14b5,0x14b5,0x16c8,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x4f5,0x4f5,0x4f5,0x4f5, +0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f2,0x4f2,0x4f2,0x4f2,0x4f5,0xaa4,0xaa4, +0xb85,0xb8b,0xb8b,0xb88,0xb88,0xb88,0xb88,0xd95,0xea9,0xea9,0xea9,0xea9,0x10e3,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x525,0x525,0x525,0xaad, +0xeb2,0xfa8,0xfa8,0xfa8,0xfa8,0x123f,0x16cb,0x16cb,0x63,0x63,0x63,0x63,0x6b4,0x6b4,0x6b4,0x6b4, +0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x531,0x531,0x52e,0x52e,0x52e,0x52e,0xeb8,0xeb8,0xeb8,0xeb5, +0xeb5,0xeb5,0xeb5,0xeb5,0x1119,0x1365,0x1365,0x1365,0x1365,0x12e7,0x12e7,0x12e7,0x1368,0x12ea,0x12ea,0x1368, +0x14b8,0x14b8,0x14b8,0x14b8,0x14bb,0x14bb,0x14bb,0x1782,0x1782,0x1782,0x1782,0x66,0x558,0x558,0x558,0x558, +0x558,0xab6,0xab6,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x55b,0x55b,0x55b,0x55b, +0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0x6f,0xad1,0xad1,0xad1,0xad1,0xad4,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad4, +0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0xad7,0xad7,0xad7,0xad7, +0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, +0xad7,0xad7,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x78,0x7e9,0x7e3,0x7e9, +0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3, +0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9, +0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, +0x7e6,0xc2d,0xc2d,0x78,0x78,0x8fd,0x8fd,0x8c7,0x8c7,0x7ec,0x7ef,0xc2a,0x7b,0x7b,0x7b,0x7b, +0x7b,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x10d1,0x7b,0x7b, +0x7e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x7e,0x8d0,0x8d0,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3, +0x8d3,0x8d3,0x8d3,0x8d3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0x1374,0x1374,0x1374,0x81, +0x81,0x81,0x81,0x81,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,0xd2f,0xd2f,0x84,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, +0x813,0x813,0x813,0x84,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0x87,0x87,0x87,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xaef,0xaef,0xaef,0xaef,0xaef,0xc36,0xaef,0xaef,0xaef,0xc36,0xaef,0x8a,0x8a,0x8a,0x8a,0x8a, +0x8a,0x8a,0x8a,0x8a,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, +0x1173,0x1173,0x1173,0x1173,0x981,0x981,0x981,0x981,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, +0x11e8,0x11e8,0x11e8,0x11e8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x90,0x90,0x90,0x90, +0x90,0xac2,0x5a6,0x5ac,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5a9,0x5ac,0x5ac, +0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac, +0x5ac,0x90,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, +0x5ac,0x5ac,0x5ac,0x5af,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, +0x5c4,0x5ca,0x5c7,0x5c1,0x12f3,0x12f3,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, +0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7, +0x5c1,0x5c7,0x5c7,0x5c1,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, +0x93,0x93,0x93,0x93,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, +0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1, +0x5c4,0x5c4,0x5c4,0x5c4,0x93,0x93,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x93,0x93,0x93,0x93, +0x93,0x93,0x93,0x93,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, +0xb0a,0xb0a,0xb0a,0xb0a,0x5c7,0x5c7,0x91e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be, +0xbc1,0xd47,0x93,0x93,0x825,0x837,0x834,0x837,0x834,0xc4b,0xc4b,0xd3b,0xd38,0x828,0x828,0x828, +0x828,0x83a,0x83a,0x83a,0x852,0x855,0x864,0x96,0x858,0x85b,0x867,0x867,0x84f,0x846,0x840,0x846, +0x840,0x846,0x840,0x843,0x843,0x85e,0x85e,0x861,0x85e,0x85e,0x85e,0x96,0x85e,0x84c,0x849,0x843, +0x96,0x96,0x96,0x96,0x5d3,0x5df,0x5d3,0xbc4,0x5d3,0x99,0x5d3,0x5df,0x5d3,0x5df,0x5d3,0x5df, +0x5d3,0x5df,0x5d3,0x5df,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, +0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc, +0x5d6,0x99,0x99,0x5d0,0x723,0x726,0x73b,0x73e,0x71d,0x726,0x726,0x9f,0x705,0x708,0x708,0x708, +0x708,0x705,0x705,0x9f,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0xac5,0xac5,0xac5, +0x984,0x6ff,0x5e2,0x5e2,0x9f,0x74d,0x72c,0x71d,0x726,0x723,0x71d,0x72f,0x720,0x71a,0x71d,0x73b, +0x732,0x729,0x74a,0x71d,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x738,0x735, +0x73b,0x73b,0x73b,0x74d,0x70e,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, +0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, +0x70b,0x70b,0x70b,0x9f,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, +0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, +0x70b,0x9f,0x9f,0x9f,0xb0d,0xb0d,0xb0d,0xb0d,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2, +0xa2,0xa2,0xa2,0xa2,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa5,0xa5,0xa5,0xa5,0xa5,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0xb1c,0xb1c,0xb1c,0xb1c, +0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, +0xb1c,0xb1c,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xab,0xab,0xfb4,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, +0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,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,0xb40,0xae,0xb40,0xb40,0xae,0xae,0xb40,0xae, +0xae,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xae,0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xcc0,0xb3d,0xb3d, +0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d, +0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,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,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40, +0xb40,0xae,0xb40,0xae,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xdaa,0xdaa,0xae,0xae, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xec1,0xebe,0xae,0xae,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb1,0xb46,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,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, +0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xb4,0xbd3,0xbd3,0xbd3,0xbd3,0xbcd,0xbcd,0xbd0,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, +0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbd6,0xbd6,0xbd9,0xc3f,0xc3f,0xb7, +0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, +0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbdf,0xbdf,0xba,0xba,0xba,0xba, +0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, +0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbd,0xbe8,0xbe8,0xbe8,0xbd,0xbe5,0xbe5,0xbd,0xbd,0xbd,0xbd, +0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, +0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, +0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0x14cd,0x14cd,0xc0,0xcc3,0xcc3,0xcc3,0xccf,0xccf,0xccf,0xccf,0xcc3, +0xcc3,0xccf,0xccf,0xccf,0xc0,0xc0,0xc0,0xc0,0xccf,0xccf,0xcc3,0xccf,0xccf,0xccf,0xccf,0xccf, +0xccf,0xcc6,0xcc6,0xcc6,0xc0,0xc0,0xc0,0xc0,0xcc9,0xc0,0xc0,0xc0,0xcd5,0xcd5,0xccc,0xccc, +0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, +0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc3,0xc3,0xcd8,0xcd8,0xcd8,0xcd8, +0xcd8,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, +0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x16d4,0x16d4,0x16d4,0x16d4, 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,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xc9,0xc9,0xc9,0xc9,0xc9,0xd17,0xd17,0xd17,0xcc, -0xcc,0xcc,0xcc,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,0xcc,0xcc,0xcc,0xd14, -0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1, -0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1, -0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xcf,0xcde,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xd2,0xd2,0xced,0xced,0xced,0xced,0xced,0xced,0xd5,0xd5, -0xced,0xd5,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, -0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xd5,0xced,0xced,0xd5,0xd5,0xd5, -0xced,0xd5,0xd5,0xced,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, -0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0x1494, -0x1494,0xde,0xde,0xde,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086, -0x135,0x135,0x135,0x135,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0, -0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xda7,0xda7,0xdad,0xdad,0xda7, -0xe1,0xe1,0xdaa,0xdaa,0x10b3,0x10b3,0x10b3,0x10b3,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, -0xe4,0xe4,0xe4,0xe4,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, -0xc12,0xc12,0xc12,0xc12,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0x1497,0x1497,0x1497,0x1497,0x1497, -0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x1497,0x149a,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, -0x12db,0x10f8,0xea3,0xea3,0xdc2,0xdbf,0xdc2,0xdbf,0xdbf,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0x1101, -0x10fe,0x1101,0x10fe,0x10fb,0x10fb,0x10fb,0x1389,0x1386,0xea,0xea,0xea,0xea,0xea,0xdbc,0xdb9,0xdb9, -0xdb9,0xdb6,0xdbc,0xdb9,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5, -0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xed,0xed,0xed,0xed,0xed, -0xed,0xed,0xed,0xed,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xed,0xdc5,0xdc5,0xdc5,0xdc5, -0xdc5,0xdc5,0xdc5,0xed,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xed,0xdc5,0xdc5,0xdc5,0xdc5, -0xdc5,0xdc5,0xdc5,0xed,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb, -0xdcb,0xdcb,0xdcb,0xdcb,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xf3,0x138c,0xf3,0xf3,0xf3,0xf3, -0xf3,0x138c,0xf3,0xf3,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0xdd4,0xdd4,0xf6,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1, -0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1, -0xdd1,0xdd1,0xdd1,0xf6,0xde6,0xdda,0xdda,0xdda,0xf9,0xdda,0xdda,0xf9,0xf9,0xf9,0xf9,0xf9, -0xdda,0xdda,0xdda,0xdda,0xde6,0xde6,0xde6,0xde6,0xf9,0xde6,0xde6,0xde6,0xf9,0xde6,0xde6,0xde6, -0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6, -0xde6,0xde6,0xde6,0xde6,0xf9,0xf9,0xf9,0xf9,0xdd7,0xdd7,0xdd7,0xf9,0xf9,0xf9,0xf9,0xddd, -0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xde3,0xde3,0xde3,0xde3,0xde3,0xde3,0xde9,0xde9,0xde0,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0x1107,0x1107,0xfc,0xfc,0xfc,0xfc, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf8,0xdf8,0xdf8,0xdf5,0xdf5,0xdf8,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xdf2,0xdf2,0xdf2,0xdf2, -0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x1104,0xfc,0xfc,0xfc,0xdef,0xdef,0xdfe,0xdfe,0xdfe,0xdfe, -0xff,0xff,0xff,0xff,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfb,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14a3,0x14a9,0x14a6,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, -0xe25,0xe25,0xe25,0xe22,0xe22,0xe19,0xe19,0xe22,0xe1f,0xe1f,0xe1f,0xe1f,0x105,0x105,0x105,0x105, -0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1278,0x1275,0x159,0x159,0x159,0x159,0x159,0x159, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0x1398,0x1398,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0xe2b, -0x12e1,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x12de, -0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, -0xe52,0xe43,0xe3d,0xe4f,0xe4c,0xe46,0xe46,0xe55,0xe40,0xe49,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b, -0xed6,0xed6,0xec1,0xed6,0xed9,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0x111,0x111,0x111,0x111, -0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xee2,0xee2,0xec7,0xecd,0xee2,0xee2, -0xeca,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec4,0xec4,0xec4,0xec4,0xec4, -0xec4,0xec4,0xec4,0xec4,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0xec7,0x111,0x111,0x111, -0x12e7,0x12e4,0x12e7,0x12e4,0x12e7,0x12e4,0x12e7,0x12e4,0x12e7,0x12e4,0x139e,0x14b5,0x14b5,0x14b5,0x114,0x114, -0x14b5,0x14b5,0x168f,0x168f,0x168f,0x1689,0x168f,0x1689,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,0x114,0x114,0x114,0x14b2,0x13a1,0x13a1,0x12e4,0xfe1, -0xfe1,0xfe1,0xfe1,0xfe1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1, -0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xeee,0xeee,0xef4,0xef4,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd, -0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xef7,0xef7,0xef7,0xef7,0x1110,0x1110, -0x11a,0x11a,0x11a,0xefa,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,0x1692,0x11d,0x11d, -0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, -0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, -0xf06,0xf06,0xf06,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x120, -0xf03,0xf03,0xf03,0xf03,0x14bb,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, -0xf09,0xf09,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123, -0x1008,0x1008,0x1008,0x1008,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0xff6,0xff6,0xff6,0xff6, -0xff6,0xff6,0xff6,0xff6,0x1005,0x1005,0xffc,0xff9,0x126,0x126,0x126,0x100b,0x100b,0xfff,0xfff,0xfff, -0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x126,0x126,0x126,0x1008,0x1008,0x1008, -0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, -0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1026,0x1026,0x129,0x129,0x129,0x129, -0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, -0x104d,0x104d,0x104d,0x104d,0x1047,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x1053,0x1053, -0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x104a,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, -0x1065,0x1065,0x106b,0x106e,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x1068, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x107d, -0x107d,0x1074,0x1074,0x107d,0x107d,0x1074,0x1074,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x1080,0x1080,0x1080,0x1074,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1074,0x107d,0x132,0x132, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x132,0x132,0x1077,0x1083,0x1083,0x1083, -0x14ca,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, -0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x108c,0x138,0x138, -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,0x13b,0x13b,0x13b, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, -0x1092,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, -0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098, -0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x1098,0x141,0x141,0x141,0x141,0x141,0x1095, -0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x144,0x144,0x144,0x144, -0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, -0x10a1,0x10a1,0x10a1,0x10a1,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, -0x1116,0x1116,0x1116,0x1116,0x111f,0x1116,0x1116,0x1116,0x111f,0x1116,0x1116,0x1116,0x1116,0x1113,0x14a,0x14a, -0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x14a, -0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122, -0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, -0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d, -0x113d,0x113d,0x113d,0x113d,0x113d,0x113a,0x1125,0x113a,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x150, -0x112e,0x1137,0x1125,0x1137,0x1137,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x113a,0x113a,0x113a, -0x113a,0x113a,0x113a,0x1125,0x1125,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x150,0x150,0x1128, -0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x150,0x150,0x150,0x150,0x150,0x150, -0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x150,0x150,0x150,0x150,0x150,0x150, -0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1140,0x1143,0x1143,0x1143,0x1143,0x1131,0x1131,0x150,0x150, -0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151e,0x151b,0x1d1, -0x1284,0x1269,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x126c,0x126c,0x126c,0x126c,0x127e,0x126c,0x126c, -0x126c,0x126c,0x1272,0x1440,0x1446,0x1443,0x143d,0x153,0x1665,0x1665,0x153,0x153,0x153,0x153,0x153,0x153, -0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158, -0x114f,0x114f,0x1152,0x115b,0x1155,0x1155,0x1155,0x115b,0x156,0x156,0x156,0x156,0x156,0x156,0x156,0x156, -0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e, -0x115e,0x115e,0x1164,0x128a,0x1164,0x1164,0x1164,0x1164,0x1161,0x1161,0x1161,0x1164,0x1698,0x169b,0x15c,0x15c, -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,0x15f,0x15f,0x15f, -0x1179,0x116d,0x116d,0x116d,0x116d,0x116d,0x116d,0x1170,0x117f,0x117f,0x116d,0x116d,0x116d,0x116d,0x162,0x127b, -0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x162,0x162,0x162,0x162,0x116d,0x116d, -0x119d,0x1191,0x119d,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, -0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x119a,0x119a,0x11a0,0x1194,0x1197, -0x11b5,0x11b5,0x11b5,0x11af,0x11af,0x11a6,0x11af,0x11af,0x11a6,0x11af,0x11af,0x11b8,0x11b2,0x11a9,0x168,0x168, -0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x168,0x168,0x168,0x168,0x168,0x168, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x16b,0x16b,0x16b,0x16b,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,0x16b,0x16b,0x16b,0x16b,0x11c7,0x11c7,0x11c7,0x11c7, -0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, -0x11c7,0x11c7,0x16e,0x11c4,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11d6,0x11d6,0x11d6,0x11d6, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6, -0x11d6,0x11d6,0x171,0x171,0x171,0x11d0,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x11dc,0x11dc,0x11dc,0x11dc, -0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc, -0x11dc,0x11dc,0x174,0x174,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11e2,0x11e2,0x11e2,0x11e2, -0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x11e2,0x177, -0x177,0x177,0x177,0x177,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11e8,0x11e8,0x11e8,0x11e8, -0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, -0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x17d,0x1206,0x1206,0x180,0x180, -0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x141f,0x141f,0x141f,0x141f, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x14d6,0x14d6,0x186,0x186,0x186,0x1239,0x1239,0x1239,0x1239, -0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x1239,0x123c, -0x123c,0x123c,0x1212,0x186,0x1356,0x1245,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, -0x1356,0x1245,0x1356,0x1245,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x13b0,0x13b0, -0x186,0x186,0x186,0x186,0x1359,0x1359,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1242,0x1353,0x1242, -0x1242,0x1353,0x1359,0x1248,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1236,0x1236, -0x1236,0x1236,0x1350,0x134a,0x123f,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,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,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0, -0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x1263,0x1365,0x135f,0x189, -0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1260,0x125d,0x125d,0x1365,0x1365,0x1365,0x1365,0x1365,0x135f, -0x1365,0x1365,0x1365,0x189,0x189,0x189,0x189,0x189,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, -0x125a,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1362,0x1362,0x189,0x189,0x189,0x189,0x189,0x189, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, +0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xcff,0xcff,0xcff,0xcff, +0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, +0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, +0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xcc,0xcc,0xcc,0xcc,0xcc,0xd44,0xd44,0xd44,0xcf, +0xcf,0xcf,0xcf,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,0xcf,0xcf,0xcf,0xd41, +0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, +0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, +0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd2,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd5,0xd5,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, +0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd8, +0xd14,0xd8,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd14,0xd14,0xd8,0xd8,0xd8, +0xd14,0xd8,0xd8,0xd14,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, +0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xdb,0xdb,0xdb,0xdb,0xdb, +0xdb,0xdb,0xdb,0xdb,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0x14d3, +0x14d3,0x1785,0x1785,0xe1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, +0x138,0x138,0x138,0x138,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdce,0xdce,0xdd4,0xdd4,0xdce, +0xe4,0xe4,0xdd1,0xdd1,0x10e0,0x10e0,0x10e0,0x10e0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, +0xe7,0xe7,0xe7,0xe7,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, +0xc3c,0xc3c,0xc3c,0xc3c,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6, +0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d9,0xea,0xea,0xea,0xea,0xea,0x1788, +0x12ff,0x1122,0xed0,0xed0,0xde9,0xde6,0xde9,0xde6,0xde6,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0x112b, +0x1128,0x112b,0x1128,0x1125,0x1125,0x1125,0x13c5,0x13c2,0xed,0xed,0xed,0xed,0xed,0xde3,0xde0,0xde0, +0xde0,0xddd,0xde3,0xde0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xf0,0xf0,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xf0,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2, +0xdf2,0xdf2,0xdf2,0xdf2,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xf3,0xf3, +0xf3,0xf3,0xf3,0xf3,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xf6,0x13c8,0xf6,0xf6,0xf6,0xf6, +0xf6,0x13c8,0xf6,0xf6,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, +0xdfb,0xdfb,0xdfb,0xf9,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xdf8,0xdf8,0xdf8,0xf9,0xe0d,0xe01,0xe01,0xe01,0xfc,0xe01,0xe01,0xfc,0xfc,0xfc,0xfc,0xfc, +0xe01,0xe01,0xe01,0xe01,0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, +0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xfc,0xfc,0xfc,0xdfe,0xdfe,0xdfe,0xfc,0xfc,0xfc,0xfc,0xe04, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0x1131,0x1131,0xff,0xff,0xff,0xff, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1f,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xff,0xff,0xff,0xff,0xff,0xff,0xe19,0xe19,0xe19,0xe19, +0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0x112e,0xff,0xff,0xff,0xe16,0xe16,0xe25,0xe25,0xe25,0xe25, +0x102,0x102,0x102,0x102,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe22,0xe25,0xe25,0xe25, +0xe25,0xe25,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x14e2,0x14e8,0x14e5,0x1830, +0x178b,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, +0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, +0x105,0x105,0x105,0x105,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe40,0xe40,0xe49,0xe46,0xe46,0xe46,0xe46, +0x108,0x108,0x108,0x108,0x129c,0x129c,0x129c,0x129c,0x129c,0x129c,0x129f,0x129f,0x12a2,0x129f,0x15c,0x15c, +0x15c,0x15c,0x15c,0x15c,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x13d4,0x13d4,0x10b,0x10b,0x10b,0x10b, +0x10b,0x10b,0x10b,0xe52,0x1305,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b, +0x10b,0x10b,0x10b,0x1302,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc0f,0xe7f,0xe70,0xe6a,0xe7c,0xe79,0xe73,0xe73,0xe82,0xe6d,0xe76,0x10e,0x10e, +0x10e,0x10e,0x10e,0x10e,0xf03,0xf03,0xeee,0xf03,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0x114,0x114,0x114,0x114,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xf0f,0xf0f, +0xef4,0xefa,0xf0f,0xf0f,0xef7,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef1, +0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, +0xef4,0x114,0x114,0x114,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x13da,0x14f4, +0x14f4,0x14f4,0x178e,0x117,0x14f4,0x14f4,0x16dd,0x16dd,0x16dd,0x16d7,0x16dd,0x16d7,0x117,0x117,0x117,0x117, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x14f1, +0x13dd,0x13dd,0x1308,0x100b,0x100b,0x100b,0x100b,0x100b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1b,0xf1b,0xf21,0xf21, +0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a, +0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf24,0xf24, +0xf24,0xf24,0x113a,0x113a,0x11d,0x11d,0x11d,0xf27,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x16e0,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, +0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, +0x120,0x120,0x120,0x120,0xf33,0xf33,0xf33,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, +0x14fd,0x14fd,0x14fd,0x123,0xf30,0xf30,0xf30,0xf30,0x14fa,0x123,0x123,0x123,0x123,0x123,0x123,0x123, +0x123,0x123,0x123,0x123,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, +0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, +0x126,0x126,0x126,0x126,0x1032,0x1032,0x1032,0x1032,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, +0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x102f,0x102f,0x1026,0x1023,0x129,0x129,0x129,0x1035, +0x1035,0x1029,0x1029,0x1029,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x129,0x129, +0x129,0x1032,0x1032,0x1032,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x103b,0x103b, +0x103b,0x103b,0x103b,0x103b,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x1077,0x1077,0x1077,0x1077,0x1071,0x1791,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x107d,0x107d,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x12f,0x12f, +0x12f,0x12f,0x12f,0x12f,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x108f,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1095,0x1098,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x1092,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x109e,0x109e,0x109e, +0x109e,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x10aa,0x10aa,0x10aa,0x109e,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, +0x109e,0x10a7,0x135,0x135,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x135,0x135, +0x10a1,0x10ad,0x10ad,0x10ad,0x1509,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b6,0x13b,0x13b,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, +0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, +0x10b9,0x13e,0x13e,0x13e,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, +0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141, +0x141,0x141,0x141,0x141,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2, +0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x144,0x144, +0x144,0x144,0x144,0x10bf,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, +0x147,0x147,0x147,0x147,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a, +0x14a,0x14a,0x14a,0x14a,0x1140,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140, +0x1140,0x113d,0x14d,0x14d,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146, +0x1146,0x1146,0x1146,0x14d,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x150,0x150,0x150,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, +0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1164,0x114f,0x1164,0x114f,0x114f,0x114f,0x114f, +0x114f,0x114f,0x114f,0x153,0x1158,0x1161,0x114f,0x1161,0x1161,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f, +0x114f,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x114f,0x114f,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155, +0x1155,0x153,0x153,0x1152,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, +0x153,0x153,0x153,0x153,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, +0x153,0x153,0x153,0x153,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x116a,0x116d,0x116d,0x116d,0x116d, +0x115b,0x115b,0x153,0x153,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, +0x1557,0x1557,0x1554,0x1d1,0x12b1,0x1290,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x1293,0x1293,0x1293, +0x1293,0x12ab,0x1293,0x1293,0x1293,0x1293,0x1299,0x147f,0x1485,0x1482,0x147c,0x156,0x16ad,0x16ad,0x156,0x156, +0x156,0x156,0x156,0x156,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, +0x1182,0x1182,0x1182,0x1182,0x1179,0x1179,0x117c,0x1185,0x117f,0x117f,0x117f,0x1185,0x159,0x159,0x159,0x159, +0x159,0x159,0x159,0x159,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x12b7,0x118e,0x12ba,0x118e,0x118e,0x118e,0x118e,0x118b,0x118b,0x118b,0x118e, +0x16e6,0x16e9,0x15f,0x15f,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x162,0x162,0x162,0x11a3,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x119a,0x11a9,0x11a9,0x1197,0x1197, +0x1197,0x1197,0x165,0x12a5,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x165,0x165, +0x165,0x165,0x1197,0x1197,0x11c7,0x11bb,0x11c7,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168, +0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x11c4, +0x11c4,0x11ca,0x11be,0x11c1,0x11df,0x11df,0x11df,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11e2, +0x11dc,0x11d3,0x16b,0x16b,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x16b,0x16b, +0x16b,0x16b,0x16b,0x16b,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x16e,0x16e,0x16e,0x16e,0x11e5, +0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, +0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x16e,0x16e,0x16e,0x16e, +0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1, +0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x171,0x11ee,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb, +0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x174,0x174,0x174,0x11fa,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x177,0x177,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203, +0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x17a,0x17a,0x17a,0x17a,0x17a,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, +0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x180, +0x1230,0x1230,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, +0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, +0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1515,0x1515,0x189,0x189,0x189, +0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, +0x125a,0x125a,0x125a,0x125d,0x125d,0x125d,0x123c,0x189,0x135f,0x1266,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, +0x135f,0x135f,0x135f,0x135f,0x135f,0x1266,0x135f,0x1266,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x13ec,0x13ec,0x189,0x189,0x189,0x189,0x1362,0x1362,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x1263,0x135c,0x1263,0x1263,0x135c,0x1362,0x1269,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, +0x180f,0x180f,0x180f,0x180f,0x180f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, 0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, -0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x12f9,0x12f9,0x12f9,0x12f9, -0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9, -0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f3,0x12f3,0x12f3,0x18c,0x18c,0x12f6,0x18c,0x130b,0x130b,0x130b,0x130b, -0x130b,0x130b,0x12fc,0x1305,0x12ff,0x12ff,0x1305,0x1305,0x1305,0x12ff,0x1305,0x12ff,0x12ff,0x12ff,0x1308,0x1308, -0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x1302,0x1302,0x1302,0x1302,0x192,0x130e,0x130e,0x130e, -0x130e,0x130e,0x130e,0x192,0x192,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x192,0x192,0x130e,0x130e,0x130e, -0x130e,0x130e,0x130e,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x130e,0x130e,0x130e,0x130e, -0x130e,0x130e,0x130e,0x192,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x192,0x157b,0x157b,0x157b,0x157b, -0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x1311,0x1311,0x1311,0x1311, -0x1311,0x1311,0x1314,0x1326,0x1326,0x131a,0x131a,0x131a,0x131a,0x131a,0x195,0x195,0x195,0x195,0x1317,0x1317, -0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x1317,0x131d,0x131d, -0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195, -0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x14d9,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x1329,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x136b,0x1368,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, -0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x132c,0x132c,0x132c,0x132c, -0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x19e,0x19e,0x132c,0x132c,0x132c, -0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x14dc,0x19e,0x132c,0x132c,0x132c, -0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132f,0x19e,0x132c,0x132c,0x132c, -0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x14dc,0x14dc,0x14dc,0x14dc, -0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc, -0x14dc,0x14dc,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e8,0x14e2,0x14e2,0x14e8, -0x14e8,0x14ee,0x14e8,0x14e8,0x14e8,0x14e8,0x1a1,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x1a1,0x14e8,0x14e2,0x14e2, -0x14e8,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e8,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e2,0x14e2,0x14e2,0x1344,0x1341,0x1341,0x1341,0x1341,0x1341,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14fa,0x14fd,0x14fa,0x14fa,0x14fa,0x16aa,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14f7,0x14f7, -0x14f7,0x14fa,0x14f7,0x14fd,0x14fd,0x1a4,0x1a4,0x1a4,0x14fa,0x14f7,0x14f7,0x14fa,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x13bf,0x1503,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x13bf, -0x13bf,0x13bf,0x13bf,0x13bf,0x13bf,0x1503,0x1503,0x1503,0x1503,0x1503,0x1503,0x16b0,0x16b0,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x16ad,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9,0x13b9, -0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x1500, -0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x1ad,0x13c5,0x13c5,0x1ad,0x13c5,0x1ad,0x1ad,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x1ad,0x1ad,0x1ad, -0x1ad,0x1ad,0x13c5,0x1ad,0x1ad,0x1ad,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5, -0x1ad,0x13c5,0x13c5,0x1ad,0x13c5,0x1ad,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5,0x1ad,0x13c5, -0x1ad,0x13c5,0x13c5,0x1ad,0x13c5,0x1ad,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x1ad, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x1ad,0x1ad,0x1ad, -0x1ad,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x1ad,0x1ad,0x1ad,0x1ad, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, +0x1314,0x1314,0x1314,0x1314,0x128a,0x137d,0x137a,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, +0x18c,0x18c,0x18c,0x18c,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287,0x1284, +0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287, +0x1284,0x1284,0x137d,0x137d,0x137d,0x137d,0x137d,0x137a,0x137d,0x137d,0x137d,0x1812,0x18c,0x18c,0x18c,0x18c, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, +0x13aa,0x13aa,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, +0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, +0x18c,0x18c,0x18c,0x18c,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, +0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x1317,0x1317,0x1317, +0x18f,0x18f,0x131a,0x18f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1320,0x1329,0x1323,0x1323,0x1329,0x1329, +0x1329,0x1323,0x1329,0x1323,0x1323,0x1323,0x132c,0x132c,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, +0x1326,0x1326,0x1326,0x1326,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x195,0x195,0x195, +0x195,0x195,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x195,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1338,0x134a,0x134a,0x133e,0x133e,0x133e, +0x133e,0x133e,0x198,0x198,0x198,0x198,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b, +0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, +0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x1518, +0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, +0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x1383,0x1380,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1a1,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x151b,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1386,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, +0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1533,0x1533,0x1533,0x1533,0x1533,0x1536, +0x16a4,0x1536,0x1536,0x1536,0x176d,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1533,0x1533,0x1533,0x1536,0x1533,0x16a1, +0x16a1,0x1a4,0x1a4,0x1a4,0x1536,0x1533,0x1533,0x1536,0x181b,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x13f8,0x153c,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, +0x13f8,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x16f2,0x16f2,0x1aa,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, +0x179d,0x179d,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, +0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, +0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, +0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, 0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13c2,0x13c2,0x1ad,0x1ad, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13da,0x13da,0x13da,0x13da, -0x13da,0x13da,0x13da,0x13c8,0x13c8,0x13c8,0x13c8,0x13c8,0x13d7,0x13c8,0x13cb,0x13cb,0x13c8,0x13c8,0x13c8,0x13ce, -0x13ce,0x1b0,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d1,0x13dd,0x13dd,0x13dd, -0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x158d,0x158d,0x158d,0x158d, -0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e6,0x13e0,0x13e0,0x13e6,0x13e6,0x13ef,0x13ef,0x13e9,0x13ec, -0x13ec,0x13e6,0x13e3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x13f2,0x13f2,0x13f2,0x13f2, -0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2, -0x13f2,0x13f2,0x13f2,0x13f2,0x1b6,0x1b6,0x1b6,0x1b6,0x16b3,0x16b3,0x13f2,0x13f2,0x16b3,0x16b3,0x16b3,0x16b3, -0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x1b6,0x1b6,0x16b3,0x16b3, -0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x13fe,0x13fb,0x13fb,0x13fb, -0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, -0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x1b9, -0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x13f8, -0x13f8,0x13f8,0x13f8,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401,0x1401, -0x1413,0x1416,0x1416,0x1416,0x1416,0x1419,0x1419,0x1407,0x140a,0x16b9,0x16b6,0x16b6,0x16b6,0x1509,0x1bc,0x1bc, -0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x1506,0x16bf,0x16c2,0x16bc,0x16c5,0x16c5, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, -0x1281,0x127e,0x1281,0x126f,0x127e,0x127e,0x127e,0x1284,0x127e,0x1284,0x1287,0x127e,0x1284,0x1284,0x127e,0x127e, -0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1425,0x142e,0x1425,0x142e,0x142e, -0x1425,0x1425,0x1425,0x1425,0x1425,0x1425,0x1431,0x1428,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x1c8,0x1c8, -0x150c,0x150c,0x150c,0x150c,0x150c,0x1512,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1668,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f, -0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1ce,0x1ce,0x1ce,0x1ce, -0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x13fb,0x13fb,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1401,0x1401,0x1401,0x1401,0x1401,0x1410,0x1401,0x1404,0x1404, +0x1401,0x1401,0x1401,0x1407,0x1407,0x1b0,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, +0x140a,0x1416,0x1416,0x1416,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x141f,0x1419,0x1419,0x141f,0x141f, +0x1428,0x1428,0x1422,0x1425,0x1425,0x141f,0x141c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b, +0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x1b6,0x1b6,0x1b6,0x1b6,0x16f5,0x16f5,0x142b,0x142b, +0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, +0x1b6,0x1b6,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, +0x1437,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, +0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, +0x1434,0x1434,0x1434,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1431,0x1431,0x1431,0x1431,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a, +0x143a,0x143a,0x143a,0x143a,0x144c,0x144f,0x1452,0x1452,0x144f,0x1455,0x1455,0x1440,0x1443,0x16fb,0x16f8,0x16f8, +0x16f8,0x1542,0x1bc,0x1bc,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x153f,0x1701, +0x1704,0x16fe,0x1707,0x1707,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x12ae,0x12ab,0x12ae,0x1296,0x12ab,0x12ab,0x12ab,0x12b1,0x12ab,0x12b1,0x12b4,0x12ab, +0x12b1,0x12b1,0x12ab,0x12ab,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1461, +0x146a,0x1461,0x146a,0x146a,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x146d,0x1464,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x1c5,0x1c5,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548, +0x1548,0x1548,0x1c8,0x1c8,0x1545,0x1545,0x1545,0x1545,0x1545,0x154b,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x16b0,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, +0x1ce,0x1ce,0x1ce,0x1ce,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, 0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x1d4,0x1d4,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x1d4,0x1d4, -0x1527,0x1521,0x1524,0x152d,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1d7,0x1d7,0x1d7,0x1d7, -0x1d7,0x1d7,0x1d7,0x1d7,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518, -0x1518,0x1518,0x1518,0x1518,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533, -0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1d4,0x1d4,0x1560,0x155a,0x155d,0x1566,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, +0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x1da,0x1da,0x1da, 0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x16c8,0x1536,0x153c,0x153c, -0x1dd,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1dd,0x1dd,0x1545,0x1545,0x1dd,0x1dd,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1dd,0x1545,0x1545, -0x1545,0x1545,0x1545,0x1545,0x1545,0x1dd,0x1545,0x1545,0x1dd,0x1545,0x1545,0x1545,0x1545,0x1545,0x1dd,0x1dd, -0x1539,0x1545,0x1536,0x153c,0x1536,0x153c,0x153c,0x153c,0x153c,0x1dd,0x1dd,0x153c,0x153c,0x1dd,0x1dd,0x153f, -0x153f,0x1542,0x1dd,0x1dd,0x16cb,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1536,0x1dd,0x1dd,0x1dd,0x1dd, -0x1dd,0x1548,0x1545,0x1545,0x1545,0x1545,0x153c,0x153c,0x1dd,0x1dd,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539, -0x1539,0x1dd,0x1dd,0x1dd,0x1539,0x1539,0x1539,0x1539,0x1539,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x1e0,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, -0x155d,0x155d,0x155d,0x155d,0x1557,0x1557,0x1557,0x154b,0x154b,0x154b,0x1557,0x1557,0x154b,0x155a,0x154e,0x154b, -0x1560,0x1560,0x1554,0x1560,0x1560,0x1551,0x1e0,0x1e0,0x156f,0x156f,0x156f,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1566,0x1569,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x16ce,0x16ce,0x16ce,0x16ce,0x157b,0x1578,0x1e6,0x1e6, -0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8, -0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d, -0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x1584,0x1587,0x158a,0x158d,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x159c,0x159c,0x159c,0x159c,0x159c,0x1590,0x1590,0x1ef, -0x1ef,0x1ef,0x1ef,0x1593,0x1593,0x1593,0x1593,0x1593,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1596,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1f2,0x1f2,0x15a2, -0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x15a2,0x159f,0x159f,0x159f,0x159f,0x159f,0x159f,0x159f,0x1f2, -0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x15a8,0x15ba,0x15ba,0x15ae,0x15b7,0x1f5,0x1f5,0x1f5, -0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1, -0x15b1,0x15b1,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,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,0x1f8,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15c6,0x15cf,0x15cc, -0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9,0x15c9, -0x15c9,0x15c9,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x1fb,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x1fe,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1, -0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15de,0x15de, -0x15de,0x15de,0x15de,0x201,0x201,0x201,0x201,0x201,0x15f9,0x15f9,0x15fc,0x15fc,0x15ff,0x15f0,0x204,0x204, -0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x204,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x204,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0x170a,0x156f,0x1575,0x16b6,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x1dd,0x157e, +0x157e,0x1dd,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x157e,0x157e,0x1dd,0x157e,0x157e,0x157e, +0x157e,0x157e,0x1dd,0x1dd,0x16b3,0x157e,0x156f,0x1575,0x156f,0x1575,0x1575,0x1575,0x1575,0x1dd,0x1dd,0x1575, +0x1575,0x1dd,0x1dd,0x1578,0x1578,0x157b,0x1dd,0x1dd,0x170d,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x156f, +0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1581,0x157e,0x157e,0x157e,0x157e,0x1575,0x1575,0x1dd,0x1dd,0x1572,0x1572, +0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd, +0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596, +0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1e0,0x1596,0x1596,0x1596,0x1596,0x1596, +0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1590,0x1590,0x1590,0x1584,0x1584,0x1584,0x1590,0x1590, +0x1584,0x1593,0x1587,0x1584,0x1599,0x1599,0x158d,0x1599,0x1599,0x158a,0x17a0,0x1e0,0x15a8,0x15a8,0x15a8,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159f,0x15a2,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1710,0x1710,0x1710,0x1710, +0x15b4,0x15b1,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, +0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15bd, +0x15c0,0x15c3,0x15c6,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15d5,0x15d5,0x15d5,0x15d5, +0x15d5,0x15c9,0x15c9,0x1ef,0x1ef,0x1ef,0x1ef,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15d2,0x15d2,0x15d2,0x15d2, +0x15d2,0x15d2,0x15cf,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15de,0x15de,0x15de,0x15de, +0x15de,0x1f2,0x1f2,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x15e1,0x15f3,0x15f3,0x15e7, +0x15f0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15ea,0x15ea,0x15ea,0x15ea, +0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15f9,0x15f9,0x15f9,0x15f9, 0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x204,0x204,0x204,0x204,0x204,0x15f9,0x15f9,0x15f9,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,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611, -0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x1611,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, -0x20a,0x160e,0x160e,0x160e,0x160e,0x20a,0x20a,0x20a,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, -0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x1614,0x1626,0x1626,0x1614,0x1614,0x1614,0x1614,0x210,0x210, -0x1626,0x1626,0x1629,0x1629,0x1614,0x1614,0x1626,0x161a,0x1617,0x161d,0x162f,0x162f,0x1620,0x1620,0x1623,0x1623, -0x1623,0x162f,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7, -0x16d4,0x16d4,0x16d4,0x16d4,0x16d1,0x16d1,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, +0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x1f8,0x1605,0x1605,0x1605,0x1605, +0x1605,0x15ff,0x1608,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1605,0x1605,0x1605,0x1605,0x1605,0x1fb,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1fe,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x201,0x201,0x201,0x201,0x201,0x1632,0x1632,0x1635,0x1635, +0x1638,0x1629,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x204,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x204,0x1632, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1632,0x1632,0x1632,0x1632,0x204,0x204,0x204,0x204,0x204,0x1632,0x1632,0x1632,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x164a,0x164a,0x164a,0x164a, +0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x1647,0x1647,0x1647,0x1647,0x20a,0x20a,0x20a,0x1665,0x1665,0x1665,0x1665, +0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x164d,0x165f,0x165f,0x164d,0x164d, +0x164d,0x164d,0x210,0x210,0x165f,0x165f,0x1662,0x1662,0x164d,0x164d,0x165f,0x1653,0x1650,0x1656,0x1668,0x1668, +0x1659,0x1659,0x165c,0x165c,0x165c,0x1668,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, +0x1719,0x1719,0x1719,0x1719,0x1716,0x1716,0x1716,0x1716,0x1713,0x1713,0x210,0x210,0x210,0x210,0x210,0x210, 0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x213,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x213,0x213,0x213, -0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x216,0x216,0x216,0x216,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x216,0x216,0x216,0x216,0x216,0x216, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x213,0x166b,0x166b,0x166b, +0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b, +0x166b,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, +0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216, +0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, +0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, 0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x1638,0x1647,0x163e,0x163b,0x164d,0x164d,0x1641,0x164d,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x219,0x219, -0x219,0x219,0x219,0x219,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1650,0x1650, -0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, -0x21c,0x21c,0x21c,0x1659,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,0x21f,0x21f, -0x21f,0x16da,0x16da,0x16da,0x16e6,0x16e6,0x16da,0x16da,0x16da,0x16da,0x16e6,0x16da,0x16da,0x16da,0x16da,0x16dd, -0x21f,0x21f,0x21f,0x21f,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e0,0x16e0, -0x16ec,0x16ec,0x16ec,0x16e0,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x222,0x222,0x222,0x222,0x222, +0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x1671,0x1680,0x1677,0x1674,0x1686,0x1686,0x167a,0x1686, +0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, +0x167d,0x167d,0x219,0x219,0x219,0x219,0x219,0x219,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, +0x168c,0x168c,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x21c,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x1692,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, +0x172b,0x172b,0x21f,0x21f,0x21f,0x171c,0x171c,0x171c,0x1728,0x1728,0x171c,0x171c,0x171c,0x171c,0x1728,0x171c, +0x171c,0x171c,0x171c,0x171f,0x21f,0x21f,0x21f,0x21f,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, +0x1725,0x1725,0x1722,0x1722,0x172e,0x172e,0x172e,0x1722,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x222, +0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, 0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x228, -0x1701,0x1701,0x228,0x228,0x228,0x228,0x228,0x16fe,0x16fe,0x16fe,0x16fe,0x16fe,0x1704,0x1704,0x1704,0x1704, -0x1704,0x1704,0x1704,0x22b,0x1704,0x22b,0x1704,0x1704,0x1704,0x1704,0x22b,0x1704,0x1704,0x1704,0x1704,0x1704, -0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x1704,0x22b,0x1704,0x1704,0x1704,0x1704,0x1704, -0x1704,0x1704,0x1704,0x1704,0x1704,0x1707,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1710,0x1710,0x1710,0x1710, -0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x22e, -0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x170d,0x170d,0x170d,0x170d, -0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x22e, -0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x1713,0x1713,0x1713,0x1713, -0x1713,0x1713,0x1713,0x1713,0x1716,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, +0x1743,0x1743,0x1743,0x228,0x1743,0x1743,0x228,0x228,0x228,0x228,0x228,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746,0x22b,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1749,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1752,0x1752,0x1752,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c, 0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x1713,0x1713,0x1713,0x1713,0x1713,0x231,0x231,0x231, +0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1776,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x231, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1824,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x1824,0x231,0x231,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1821,0x181e,0x1824,0x1824,0x1824,0x231, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x181e,0x1821,0x1821,0x1821,0x1821,0x1821,0x231,0x231,0x231,0x231, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x231, 0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x171c,0x171c,0x171c,0x171c, -0x1719,0x171c,0x171c,0x171f,0x1722,0x171f,0x171f,0x171c,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1719,0x1719,0x1719,0x1719,0x1719,0x237,0x237,0x237,0x237, -0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237, -0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x1728,0x1728,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x237,0x237,0x237,0x237, -0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237, -0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x8fa,0x8fa,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a,0x10ad,0x10ad,0x10ad,0x10ad, -0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1437,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, -0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, -0x23d,0x23d,0x23d,0x23d,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0x1254, -0x1254,0x1254,0x240,0x240,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,0x240,0x240, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, -0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -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,0x246,0x246, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249, -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,0x136e,0x136e,0x136e,0x136e,0x136e,0x24c,0x24c, -0x10bf,0x34b,0x34b,0x357,0xc51,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x357,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x357,0x357,0x357,0x357,0x351,0x10c2,0x1296, -0x35a,0x8ca,0x8cd,0x34e,0x34e,0x10bf,0x1293,0x1293,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d,0x35d, -0x35a,0x35a,0x34b,0x34b,0x858,0x85b,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, -0x354,0xf21,0xf1e,0x1299,0x1299,0x1299,0x1299,0x1299,0x145b,0x10c5,0x10c5,0xe73,0xe73,0xd41,0xe73,0xe73, -0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a,0x35d,0x35a,0x35a,0x35a,0x35a,0x35a,0x35a, -0x35a,0x35d,0x35a,0x35a,0x35d,0x35a,0x35a,0x35a,0x35a,0x35a,0x1293,0x1296,0x34e,0x35a,0x357,0x357, -0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b, -0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0x43b,0xb3d,0xb3d,0xd4d,0xd4d,0x438,0xd50,0x137d,0x137d,0x137d, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43e, -0x444,0x444,0x444,0x10da,0x10da,0x10da,0x10da,0x10da,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, -0x447,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444, -0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444, -0x444,0x444,0x444,0x444,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a, -0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a, -0x450,0x44a,0x450,0x44a,0x450,0x44a,0x44a,0x44a,0x44a,0x44a,0x44d,0x93c,0xf6f,0xf6f,0xf72,0xf6f, -0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a, -0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0x450,0x44a,0xf72,0xf6f,0xf72,0xf6f,0xf72,0xf6f, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x63c,0x63c,0x63f,0x47a,0x64b,0x648,0x648,0x645,0x4a4,0x4a4,0x462,0x462,0x462,0x462,0x462,0xa6b, -0x64e,0x486,0x666,0x669,0x49b,0x64e,0x489,0x489,0x47a,0x495,0x495,0x63c,0x4a1,0x49e,0x642,0x474, -0x46b,0x46b,0x46e,0x46e,0x46e,0x46e,0x46e,0x471,0x46e,0x46e,0x46e,0x465,0x4aa,0x4aa,0x4a7,0x4a7, -0x65a,0x48f,0x48c,0x657,0x654,0x651,0x663,0x47d,0x660,0x660,0x492,0x495,0x65d,0x65d,0x492,0x495, -0x477,0x47a,0x47a,0x47a,0x498,0x483,0x480,0xb52,0xa71,0xa74,0xa6e,0xa6e,0xa6e,0xa6e,0xb49,0xb49, -0xb49,0xb49,0xb4f,0xc7e,0xc7b,0xd5c,0xd5f,0xb4c,0xd5f,0xd5f,0xd5f,0xd5f,0xd5c,0xd5f,0xd5f,0xb46, -0x4dd,0x4dd,0x4f5,0x678,0x4da,0x675,0x4dd,0x4f2,0x4da,0x678,0x4ec,0x4f5,0x4f5,0x4f5,0x4ec,0x4ec, -0x4f5,0x4f5,0x4f5,0x681,0x4da,0x4f5,0x67b,0x4da,0x4e9,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4da,0x4da, -0x4e0,0x675,0x67e,0x4da,0x4f5,0x4da,0x684,0x4da,0x4f5,0x4e3,0x4fb,0x687,0x4f5,0x4f5,0x4e6,0x4ec, -0x4f5,0x4f5,0x4f8,0x4f5,0x4ec,0x4ef,0x4ef,0x4ef,0x4ef,0xa80,0xa7d,0xc81,0xd6e,0xb6d,0xb70,0xb70, -0xb6a,0xb67,0xb67,0xb67,0xb67,0xb70,0xb6d,0xb6d,0xb6d,0xb6d,0xb64,0xb67,0xd6b,0xe7f,0xe82,0xf78, -0x10e9,0x10e9,0x10e9,0x68d,0x68a,0x4fe,0x501,0x501,0x501,0x501,0x501,0x68a,0x68d,0x68d,0x68a,0x501, -0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x693,0x50a,0x50a,0x50a,0x50a, -0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x690,0x504,0x504,0x504,0x504,0x504,0x504, -0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x50d,0x516,0x516,0x510,0x510,0x510,0x513,0x50d, -0x510,0x510,0x50d,0x50d,0x50d,0x50d,0x510,0x510,0x696,0x696,0x50d,0x50d,0x510,0x510,0x510,0x510, -0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x513,0x513,0x513,0x510,0x510,0x699,0x510, -0x699,0x510,0x510,0x510,0x510,0x510,0x510,0x510,0x50d,0x510,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d, -0x510,0x510,0x50d,0x696,0x50d,0x50d,0x50d,0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0xa86, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0x69f,0x519,0x69f,0x69f, -0x51c,0x519,0x519,0x69f,0x69f,0x51c,0x519,0x69f,0x51c,0x519,0x519,0x69f,0x519,0x69f,0x528,0x525, -0x519,0x69f,0x519,0x519,0x519,0x519,0x69f,0x519,0x519,0x69f,0x69f,0x69f,0x69f,0x519,0x519,0x69f, -0x51c,0x69f,0x51c,0x69f,0x69f,0x69f,0x69f,0x69f,0x6a5,0x51f,0x69f,0x51f,0x51f,0x519,0x519,0x519, -0x69f,0x69f,0x69f,0x69f,0x519,0x519,0x519,0x519,0x69f,0x69f,0x519,0x519,0x519,0x51c,0x519,0x519, -0x51c,0x519,0x519,0x51c,0x69f,0x51c,0x519,0x519,0x69f,0x519,0x519,0x519,0x519,0x519,0x69f,0x519, -0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x6a2,0x69f,0x51c,0x519, -0x69f,0x69f,0x69f,0x69f,0x519,0x519,0x69f,0x69f,0x519,0x51c,0x6a2,0x6a2,0x51c,0x51c,0x519,0x519, -0x51c,0x51c,0x519,0x519,0x51c,0x51c,0x519,0x519,0x519,0x519,0x519,0x519,0x51c,0x51c,0x69f,0x69f, -0x51c,0x51c,0x69f,0x69f,0x51c,0x51c,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, -0x519,0x69f,0x519,0x519,0x519,0x69f,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x69f,0x519,0x519, -0x519,0x519,0x519,0x519,0x51c,0x51c,0x51c,0x51c,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, -0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x69f,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, -0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, -0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x51c,0x51c,0x51c,0x51c,0x519,0x519,0x519,0x519, -0x519,0x519,0x51c,0x51c,0x51c,0x51c,0x519,0x522,0x519,0x519,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0x52b,0xa89,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x53a,0x537,0x53a,0x537,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x6a8,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x531,0x531,0x52b,0x52b,0x52b,0x52b,0x534,0x534,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52e,0x7ad,0x7aa,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0xa89,0xb7c,0xa89,0xa89,0xa89,0x53d,0x53d,0x53d,0x53d, -0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d, -0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x6b1,0x6b1,0x6b1,0x6b1, -0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x543,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, -0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xcf9,0x6ba,0x6ba,0x6ba,0x6ba, -0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba, -0x546,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x6ba,0x6ba,0x6ba,0x6ba, -0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x549,0x549,0x549,0x549,0x6ba,0x6ba,0x6ba,0x6ba, -0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6bd,0x6bd,0x6bd,0x6bd, -0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x54c,0x54c,0x6bd,0x6bd, -0x6bd,0x6bd,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0x6c3,0x6c3,0x54f,0x6c0, -0x6c0,0x6c0,0x6c0,0x6c0,0x6c0,0x6c0,0x552,0x552,0x54f,0x54f,0x555,0x555,0x555,0x555,0x6c3,0x6c3, -0x555,0x555,0x6c6,0x6c3,0x54f,0x54f,0x54f,0x54f,0x6c3,0x6c3,0x555,0x555,0x6c6,0x6c3,0x54f,0x54f, -0x54f,0x54f,0x6c3,0x6c3,0x6c0,0x54f,0x555,0x6c3,0x54f,0x54f,0x6c0,0x6c3,0x6c3,0x6c3,0x555,0x555, -0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x54f,0x6c3,0x6c0, -0x6c3,0x6c0,0x54f,0x555,0x555,0x555,0x555,0x555,0x555,0x54f,0x54f,0x6c0,0xa8f,0xa8f,0xa8f,0xa8f, -0xa8f,0xa8f,0xa8f,0xa8f,0xb82,0xb82,0xb82,0xb85,0xb85,0xb88,0xb88,0xb82,0x561,0x561,0x561,0x561, -0x55e,0x6d5,0x6d5,0x558,0x558,0x6c9,0x558,0x558,0x558,0x558,0x6cf,0x6c9,0x558,0x55e,0x558,0x558, -0xcfc,0xcfc,0xb8b,0xb8b,0xd7a,0xa92,0x55b,0x55b,0x6cc,0x567,0x6cc,0x55b,0x55e,0x558,0x55e,0x55e, -0x558,0x558,0x55e,0x558,0x558,0x558,0x55e,0x558,0x558,0x558,0x55e,0x55e,0x558,0x558,0x558,0x558, -0x558,0x558,0x558,0x558,0x55e,0x561,0x561,0x55b,0x558,0x558,0x558,0x558,0x6d5,0x558,0x6d5,0x558, -0x558,0x558,0x558,0x558,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x6d8,0x6d5,0x56a,0x6d8, -0x6c9,0x6cf,0x55e,0x6c9,0x6d2,0x6c9,0x6c9,0x558,0x6c9,0x6d5,0x56a,0x6d5,0xa92,0xa92,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb91,0xb8e,0xb8e,0xd74,0xd80,0x56d,0x56d,0x56d,0x56d, -0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d, -0x570,0x12c9,0x12c9,0x12c9,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x147f,0x576,0x582,0x576, -0x576,0x12c9,0x570,0x570,0x582,0x582,0x12cc,0x12cc,0x585,0x585,0x570,0x57c,0x570,0x570,0x57c,0x570, -0x57c,0x570,0x57c,0x570,0x570,0x570,0x570,0x570,0x570,0x57c,0x570,0x570,0x570,0x570,0x570,0x570, -0x12c9,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x57c,0x57c,0x570,0x570,0x570, -0x570,0x570,0x570,0x570,0x570,0x6de,0x570,0x570,0x570,0x570,0x570,0x570,0x57c,0x570,0x570,0x57c, -0x570,0x570,0x570,0x570,0x12c9,0x570,0x12c9,0x570,0x570,0x570,0x570,0x12c9,0x12c9,0x12c9,0x570,0x122a, -0x570,0x570,0x570,0x579,0x579,0x579,0x579,0x12c6,0x12c6,0x570,0x573,0x57f,0x57c,0x570,0x570,0x570, -0xb97,0xb94,0xb97,0xb94,0xb97,0xb94,0xb97,0xb94,0xb97,0xb94,0xb97,0xb94,0xb97,0xb94,0x6db,0x6db, -0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x570,0x57c,0x570,0x570,0x570,0x570,0x570,0x570, -0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x12c9,0x570,0x570,0x570,0x570,0x570,0x570,0x570, -0x570,0x570,0x570,0x570,0x570,0x570,0x570,0x12c9,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5af,0x5af,0x5af,0x5af, -0x5af,0x5af,0x5af,0x5af,0x5a6,0x5ac,0x59d,0x5a0,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6, -0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6, -0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6, -0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6, -0x5a9,0x5af,0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5af,0x5ac,0x5a6, -0x5a9,0x5af,0x5ac,0x5a6,0x5ac,0x5a6,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf,0x12cf, -0x12cf,0x12cf,0x12cf,0x12cf,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5af,0x5a9,0x5af,0x5ac,0x5a6, -0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5ac,0x5a6,0x5a9,0x5ac,0x5a6,0x5a9, -0x5ac,0x5a6,0x5a9,0x5af,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a6,0x5a9,0x5a6,0x5a9,0x5a6,0x5a6,0x5a9,0x5a6,0x5a6,0x5a9, -0x5a6,0x5a9,0x5a6,0x5a6,0x5a9,0x5a6,0x5a9,0x5a9,0x5a6,0x5a6,0x5a6,0x5a9,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a9,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a6,0x5a6,0x5a9,0x5a6,0x5a9,0x5a6, -0x5a6,0x5a6,0x5a6,0x5a6,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5af,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af, -0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5b2,0x5b2,0x5b2,0x5b2,0xf84,0xf84,0xf84,0x1482, -0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1680,0x1680,0x80a,0x810,0x810,0x81c,0x81c,0x80d,0x804,0x80d, -0x804,0x80d,0x804,0x80d,0x804,0x80d,0x804,0x80d,0x5c1,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1, -0x5bb,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5c1,0x5bb,0x5be, -0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1,0x5bb,0x5c1, -0x5bb,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be, -0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be,0x5c4,0x5c1,0x5bb,0x5be, -0x5c4,0x5c1,0x5bb,0x5be,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae, -0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab, -0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab, -0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4, -0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b7,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4,0x6b4, -0x6b4,0x6b4,0x6b4,0x6b4,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1,0x6b1, -0x6b1,0x6b1,0x6b1,0x6b1,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba, -0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba, -0x6ba,0x6ba,0x6ba,0x6ba,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1, -0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1,0x6e1, -0x6e1,0x6e1,0x6e1,0x6e1,0xbeb,0x86d,0x867,0x864,0x86a,0x861,0x6f6,0x6f9,0x6f9,0x6f9,0x6f9,0x6f9, -0x6f9,0x6f9,0x6f9,0x6f9,0x873,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,0x870,0x870,0x6fc,0x882,0x885,0x88b,0x7b0,0x7bc,0x8a0,0x7b9, -0x879,0x876,0x879,0x876,0x87f,0x87c,0x87f,0x87c,0x879,0x876,0x7b6,0x88b,0x879,0x876,0x879,0x876, -0x879,0x876,0x879,0x876,0x88e,0x897,0x894,0x894,0x702,0x73e,0x73e,0x73e,0x73e,0x73e,0x73e,0x738, -0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738, -0x738,0x738,0x738,0x705,0x720,0x6ff,0x726,0x729,0x723,0x73b,0x73b,0x73b,0x73b,0x73b,0x73b,0x735, -0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735, -0x735,0x735,0x735,0x705,0x720,0x6ff,0x720,0xbee,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x124b,0x124b,0x124b,0x124b,0x124b,0x7a7, -0x7b6,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x8d6,0x8d6,0x8d6,0x8d6,0x7bf,0x7bf, -0x891,0x89d,0x89d,0x89d,0x89d,0x89a,0x7b3,0x888,0xab6,0xab6,0xab6,0xbfd,0xc1b,0xc18,0xad1,0x85e, -0x7c5,0x7c2,0x7c5,0x7c8,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c5,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2,0x7c2, -0x7c5,0x7c5,0x7c2,0x7c5,0x7c5,0x7c2,0x7c5,0x7c5,0x7c2,0x7c5,0x7c5,0x7c2,0x7c5,0x7c5,0x7c2,0x7c2, -0xc1e,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1, -0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1, -0x7d4,0x7d1,0x7d4,0x7d7,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d4,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1, -0x7d4,0x7d4,0x7d1,0x7d4,0x7d4,0x7d1,0x7d4,0x7d4,0x7d1,0x7d4,0x7d4,0x7d1,0x7d4,0x7d4,0x7d1,0x7d1, -0x7d1,0x7d1,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d7,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d1,0x7d7,0x7d1, -0x7d1,0x7d1,0x7d1,0x7d1,0x7d4,0x7d7,0x7d7,0x7d4,0x7d4,0x7d4,0x7d4,0x8a6,0x8a9,0x7da,0x7dd,0xc06, -0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e6,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7ef,0x7ef,0x7ef,0x7ef, -0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef, -0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0x7ef,0xd08,0xd08,0xe34,0x7e9,0x8b2,0x8b2,0x8b2,0x8b2, -0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0xd02,0xd02,0xd02,0xd02,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x8bb,0x8bb,0x8bb,0x8bb, -0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x7f5,0x7f5,0x7f5, -0x7f5,0x7f5,0x7f5,0xd0b,0xd0b,0xd0b,0xd0b,0x8be,0x8be,0x8be,0x8be,0x8be,0x7f5,0x7f5,0x7f5,0x7f5, -0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5, -0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0xd0b,0xd0b, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, -0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, -0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37, -0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37, -0x10ad,0x10ad,0x10ad,0x10ad,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe, -0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe, -0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x801,0x801,0x7fe,0x801,0x7fe,0x801,0x801,0x7fe,0x7fe,0x7fe, -0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x801,0x7fe,0x801,0x7fe,0x801,0x801,0x7fe,0x7fe,0x801, -0x801,0x801,0x7fe,0x7fe,0x7fe,0x7fe,0x143a,0x143a,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2, -0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2, -0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x124e,0x124e,0x124e,0x124e,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0xd02,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, -0xc09,0xc09,0xc09,0xc09,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5, -0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b8,0x8b5,0x8b8,0x8b5,0x8b5, -0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5, -0x8b5,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, -0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb, -0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0x8bb,0xd0b, -0x936,0x918,0x918,0x918,0x918,0x912,0x918,0x918,0x92a,0x918,0x918,0x915,0x921,0x927,0x927,0x927, -0x927,0x927,0x92a,0x912,0x91e,0x912,0x912,0x912,0x909,0x909,0x912,0x912,0x912,0x912,0x912,0x912, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x912,0x912,0x912,0x912,0x912,0x912, -0x912,0x912,0x912,0x912,0x915,0x909,0x912,0x909,0x912,0x909,0x924,0x91b,0x924,0x91b,0x933,0x933, -0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, -0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, -0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, -0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, -0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, -0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948,0x948, -0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, -0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x94b,0x94b, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x94e,0x94e, -0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, -0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951,0x951, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954, -0x957,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, -0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x957,0x95a,0x95a,0x95a, -0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a, -0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x9e7,0x9e7,0xf69,0x9e7,0x9e7,0x9e7,0x9ea,0x9e7, -0xf69,0x9e7,0x9e7,0xf60,0x9e1,0x9d5,0x9d5,0x9d5,0x9d5,0x9e4,0x9d5,0xf4e,0xf4e,0xf4e,0x9d5,0x9d8, -0x9e1,0x9db,0xf54,0xf63,0xf63,0xf4e,0xf4e,0xf69,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0x9ed,0x9ed,0x9de,0x9de,0x9de,0x9de,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e4,0x9e4, -0x9d5,0x9d5,0xf69,0xf69,0xf69,0xf69,0xf4e,0xf4e,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, -0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, -0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0xd59, -0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0xd59,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, -0x9fc,0x9fc,0x9fc,0x9fc,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02, -0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02,0xa02, -0xa02,0xa02,0xa02,0xa02,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa05,0xa0b,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10dd,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08, -0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,0xa08,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,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa41,0xa41,0xa41,0xa44,0xa44,0xa41,0xa41,0xa41, -0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa29,0xa29,0xa3e,0xa20, -0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa3e,0xa3e,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,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,0xa5f,0xa5f,0xa5f,0xa62,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,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, +0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x1773,0x1773,0x1773,0x1773,0x1773,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x1773,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, +0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x175b,0x175e,0x175b,0x175b,0x1758,0x234,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1755,0x1755,0x1755,0x1755,0x1755, +0x17b2,0x17b2,0x17b2,0x17b2,0x17a9,0x17a9,0x17a9,0x17a3,0x17a6,0x17a6,0x17a6,0x237,0x237,0x237,0x237,0x237, +0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x237,0x237,0x237,0x237,0x17ac,0x17ac, +0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x23a,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, +0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, +0x17cd,0x17cd,0x17cd,0x17ca,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x23a,0x17b8,0x17b8,0x17b8,0x17b8, +0x17b8,0x17b8,0x17ca,0x17bb,0x17cd,0x17d0,0x17d0,0x17c4,0x17c1,0x17c1,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, +0x23a,0x23a,0x23a,0x23a,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be, +0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x23a,0x23a,0x23a, +0x17dc,0x17df,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, +0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, +0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, +0x1827,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, +0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, +0x246,0x246,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, +0x246,0x17e2,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8, +0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249, +0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1800,0x1800,0x17f1,0x17eb,0x17eb,0x1800,0x17ee,0x1803, +0x1803,0x1803,0x1803,0x1806,0x1806,0x17fa,0x17f7,0x17f4,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, +0x17fd,0x17fd,0x24c,0x17fa,0x24c,0x17f4,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, +0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x24f,0x24f,0x24f,0x24f, +0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, +0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x24f,0x24f,0x24f,0x24f, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x182d,0x182d,0x182d,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, +0x1770,0x1770,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, +0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x921,0x921, +0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, +0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, +0x10d4,0x10d4,0x10d4,0x10d4,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1473,0x1761,0x1761,0x1761, +0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, +0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, +0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, +0xc39,0xc39,0xc39,0x1278,0x1278,0x1278,0x261,0x261,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,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,0x261,0x261,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, +0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0x267,0x267,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, +0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, +0x26a,0x26a,0x26a,0x26a,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x26d,0x26d,0x10ec,0x369,0x369,0x375,0xc7b,0x378,0x378,0x378,0x378,0x378,0x378,0x378, +0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, +0x378,0x378,0x378,0x378,0x375,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x375,0x375,0x375, +0x375,0x36f,0x10ef,0x12c6,0x378,0x8ee,0x8f1,0x36c,0x36c,0x10ec,0x12c3,0x12c3,0x37b,0x37b,0x37b,0x37b, +0x37b,0x37b,0x37b,0x37b,0x378,0x378,0x369,0x369,0x879,0x87c,0x909,0x909,0x909,0x909,0x909,0x909, +0x909,0x909,0x909,0x909,0x372,0xf4e,0xf4b,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x149a,0x10f2,0x10f2,0xea0, +0xea0,0xd6e,0xea0,0xea0,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378, +0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378,0x37b,0x378,0x378,0x378,0x378,0x378,0x12c3,0x12c6, +0x36c,0x378,0x375,0x375,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, +0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xb67,0xb67,0xd7a,0xd7a,0x87f, +0xd7d,0x13b9,0x13b9,0x13b9,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, +0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, +0x459,0x459,0x459,0x459,0x45f,0x45f,0x45f,0x1107,0x1107,0x1107,0x1107,0x1107,0x45c,0x45c,0x45c,0x45c, +0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c, +0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x1104,0x1104, +0x1104,0x1104,0x1104,0x1104,0x462,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, +0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, +0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, +0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, +0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x465,0x465,0x465,0x465,0x468,0x963, +0xf9c,0xf9c,0xf9f,0xf9c,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, +0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0xf9f,0xf9c, +0xf9f,0xf9c,0xf9f,0xf9c,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, +0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, +0x47a,0x47a,0x47a,0x47a,0x657,0x657,0x65a,0x495,0x666,0x663,0x663,0x660,0x4bf,0x4bf,0x47d,0x47d, +0x47d,0x47d,0x47d,0xa95,0x669,0x4a1,0x681,0x684,0x4b6,0x669,0x4a4,0x4a4,0x495,0x4b0,0x4b0,0x657, +0x4bc,0x4b9,0x65d,0x48f,0x486,0x486,0x489,0x489,0x489,0x489,0x489,0x48c,0x489,0x489,0x489,0x480, +0x4c8,0x4c5,0x4c2,0x4c2,0x675,0x4aa,0x4a7,0x672,0x66f,0x66c,0x67e,0x498,0x67b,0x67b,0x4ad,0x4b0, +0x678,0x678,0x4ad,0x4b0,0x492,0x495,0x495,0x495,0x4b3,0x49e,0x49b,0xb7c,0xa9b,0xa9e,0xa98,0xa98, +0xa98,0xa98,0xb73,0xb73,0xb73,0xb73,0xb79,0xca8,0xca5,0xd89,0xd8c,0xb76,0xd8c,0xd8c,0xd8c,0xd8c, +0xd89,0xd8c,0xd8c,0xb70,0x4fb,0x4fb,0x513,0x693,0x4f8,0x690,0x4fb,0x510,0x4f8,0x693,0x50a,0x513, +0x513,0x513,0x50a,0x50a,0x513,0x513,0x513,0x69c,0x4f8,0x513,0x696,0x4f8,0x507,0x513,0x513,0x513, +0x513,0x513,0x4f8,0x4f8,0x4fe,0x690,0x699,0x4f8,0x513,0x4f8,0x69f,0x4f8,0x513,0x501,0x519,0x6a2, +0x513,0x513,0x504,0x50a,0x513,0x513,0x516,0x513,0x50a,0x50d,0x50d,0x50d,0x50d,0xaaa,0xaa7,0xcab, +0xd9b,0xb97,0xb9a,0xb9a,0xb94,0xb91,0xb91,0xb91,0xb91,0xb9a,0xb97,0xb97,0xb97,0xb97,0xb8e,0xb91, +0xd98,0xeac,0xeaf,0xfa5,0x1116,0x1116,0x1116,0x6a8,0x6a5,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x6a5, +0x6a8,0x6a8,0x6a5,0x51f,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae, +0x528,0x528,0x528,0x528,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x522,0x522, +0x522,0x522,0x522,0x522,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x534,0x534,0x52e, +0x52e,0x52e,0x531,0x52b,0x52e,0x52e,0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x6b1,0x6b1,0x52b,0x52b, +0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x531,0x531,0x531, +0x52e,0x52e,0x6b4,0x52e,0x6b4,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x52e,0x52b,0x52b, +0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x52b,0x6b1,0x52b,0x52b,0x52b,0xab0,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, +0x6ba,0x537,0x6ba,0x6ba,0x53a,0x537,0x537,0x6ba,0x6ba,0x53a,0x537,0x6ba,0x53a,0x537,0x537,0x6ba, +0x537,0x6ba,0x546,0x543,0x537,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x6ba,0x6ba,0x6ba, +0x6ba,0x537,0x537,0x6ba,0x53a,0x6ba,0x53a,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6c0,0x53d,0x6ba,0x53d, +0x53d,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x537,0x537, +0x537,0x53a,0x537,0x537,0x53a,0x537,0x537,0x53a,0x6ba,0x53a,0x537,0x537,0x6ba,0x537,0x537,0x537, +0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, +0x6bd,0x6ba,0x53a,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x6ba,0x6ba,0x537,0x53a,0x6bd,0x6bd, +0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, +0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, +0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537, +0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x537,0x537,0x537, +0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537, +0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, +0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a, +0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x540,0x537,0x537,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x549,0xab3,0x549,0x549, +0x549,0x549,0x549,0x549,0x555,0x552,0x555,0x552,0x549,0x549,0x549,0x549,0x549,0x549,0x6c3,0x549, +0x549,0x549,0x549,0x549,0x549,0x549,0x7c5,0x7c5,0x549,0x549,0x549,0x549,0x54f,0x54f,0x549,0x549, +0x549,0x549,0x549,0x549,0x54c,0x7cb,0x7c8,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, +0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, +0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0xab3,0xba6,0xab3,0xab3,0xab3, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x55e,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c, +0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xd20, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x561,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x564,0x564,0x564,0x564, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, +0x567,0x567,0x6d8,0x6d8,0x6d8,0x6d8,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, +0x6de,0x6de,0x56a,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0x56d,0x56a,0x56a,0x570,0x570, +0x570,0x570,0x6de,0x6de,0x570,0x570,0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x570,0x570, +0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x6db,0x56a,0x570,0x6de,0x56a,0x56a,0x6db,0x6de, +0x6de,0x6de,0x570,0x570,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, +0x56a,0x56a,0x6de,0x6db,0x6de,0x6db,0x56a,0x570,0x570,0x570,0x570,0x570,0x570,0x56a,0x56a,0x6db, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xbac,0xbac,0xbac,0xbaf,0xbaf,0xc24,0xc24,0xbac, +0x57c,0x57c,0x57c,0x57c,0x579,0x6f0,0x6f0,0x573,0x573,0x6e4,0x573,0x573,0x573,0x573,0x6ea,0x6e4, +0x573,0x579,0x573,0x573,0xd29,0xd29,0xbb2,0xbb2,0xda7,0xabc,0x576,0x576,0x6e7,0x57f,0x6e7,0x576, +0x579,0x573,0x579,0x579,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x579, +0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x579,0x57c,0x57c,0x576,0x573,0x573,0x573,0x573, +0x6f3,0x573,0x6f3,0x573,0x573,0x573,0x573,0x573,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce, +0x7ce,0x7ce,0x7ce,0x7ce,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, +0x6f3,0x6f0,0x582,0x6f3,0x6e4,0x6ea,0x579,0x6e4,0x6ed,0x6e4,0x6e4,0x573,0x6e4,0x6f0,0x582,0x6f0, +0xabc,0xabc,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb8,0xbb5,0xbb5,0xda1,0xe5e, +0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, +0x585,0x585,0x585,0x585,0x588,0x136e,0x136e,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, +0x14be,0x58e,0x59a,0x58e,0x58e,0x136e,0x588,0x588,0x59a,0x59a,0x1371,0x1371,0x5a0,0x5a0,0x588,0x594, +0x588,0x588,0x594,0x588,0x594,0x588,0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x594,0x588,0x588, +0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x594, +0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x6f9,0x588,0x588,0x588,0x588,0x588,0x588, +0x594,0x588,0x588,0x594,0x588,0x588,0x588,0x588,0x136e,0x588,0x136e,0x588,0x588,0x588,0x588,0x136e, +0x136e,0x136e,0x588,0x1272,0x588,0x588,0x588,0x591,0x591,0x591,0x591,0x12f0,0x12f0,0x588,0x58b,0x597, +0x59d,0x588,0x588,0x588,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb, +0xbbe,0xbbb,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x588,0x594,0x588,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5c1,0x5c7,0x5b8,0x5bb,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, +0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, +0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, +0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, +0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1, +0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca, +0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, +0x5c4,0x5c7,0x5c1,0x5c4,0x5c7,0x5c1,0x5c4,0x5ca,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, +0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c4, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1, +0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5ca,0x5ca,0x5ca,0x5ca, +0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, +0x5ca,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5cd,0x5cd,0x5cd,0x5cd, +0xfb1,0xfb1,0xfb1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x16ce,0x16ce,0x82b,0x831,0x831,0x83d, +0x83d,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x5dc,0x5dc,0x5d6,0x5dc, +0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc, +0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc, +0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, +0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, +0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9, +0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c6,0x6c6,0x6c6,0x6c6, +0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6, +0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6cf,0x6cf, +0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6d2,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf, +0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc, +0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, +0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, +0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0xc12,0x891,0x88b,0x888,0x88e,0x885,0x711,0x714, +0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x897,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,0x894,0x894,0x717,0x8a6,0x8a9,0x8af, +0x7d1,0x7dd,0x8c4,0x7da,0x89d,0x89a,0x89d,0x89a,0x8a3,0x8a0,0x8a3,0x8a0,0x89d,0x89a,0x7d7,0x8af, +0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x8b2,0x8bb,0x8b8,0x8b8,0x71d,0x759,0x759,0x759, +0x759,0x759,0x759,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753, +0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x720,0x73b,0x71a,0x741,0x744,0x73e,0x756,0x756,0x756, +0x756,0x756,0x756,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, +0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x720,0x73b,0x71a,0x73b,0xc15,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x126c,0x126c, +0x126c,0x126c,0x126c,0x7c2,0x7d7,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x8fa,0x8fa, +0x8fa,0x8fa,0x7e0,0x7e0,0x8b5,0x8c1,0x8c1,0x8c1,0x8c1,0x8be,0x7d4,0x8ac,0xae0,0xae0,0xae0,0xc27, +0xc45,0xc42,0xafb,0x882,0x7e6,0x7e3,0x7e6,0x7e9,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3, +0x7e3,0x7e3,0x7e3,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3, +0x7e6,0x7e6,0x7e3,0x7e3,0xc48,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2, +0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2, +0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f8,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f2, +0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2, +0x7f5,0x7f5,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2, +0x7f2,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f8,0x7f8,0x7f5,0x7f5,0x7f5,0x7f5,0x8ca, +0x8cd,0x7fb,0x7fe,0xc30,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x807,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, +0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, +0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0xd32,0xd32,0xe61,0x80a, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0xd2c,0xd2c,0xd2c,0xd2c, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, +0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, +0x8df,0x816,0x816,0x816,0x816,0x816,0x816,0xd35,0xd35,0xd35,0xd35,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, +0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, +0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, +0x816,0x816,0xd35,0xd35,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0x10d4,0x10d4,0x10d4,0x10d4,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x822,0x81f,0x822,0x81f,0x822, +0x822,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x81f,0x822,0x81f,0x822, +0x822,0x81f,0x81f,0x822,0x822,0x822,0x81f,0x81f,0x81f,0x81f,0x1476,0x1476,0xc39,0xc39,0xc39,0xc39, +0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0x8d6,0x8d6,0x8d6,0x8d6, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, +0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x12a8,0x12a8,0x12a8,0x12a8, +0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0xd2c,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, +0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, +0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8dc, +0x8d9,0x8dc,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, +0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, +0xc33,0xc33,0xc33,0xc33,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, +0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, +0x8df,0x8df,0x8df,0xd35,0x95d,0x93f,0x93f,0x93f,0x93f,0x939,0x93f,0x93f,0x951,0x93f,0x93f,0x93c, +0x948,0x94e,0x94e,0x94e,0x94e,0x94e,0x951,0x939,0x945,0x939,0x939,0x939,0x930,0x930,0x939,0x939, +0x939,0x939,0x939,0x939,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x939,0x939, +0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x930,0x939,0x930,0x939,0x930,0x94b,0x942, +0x94b,0x942,0x95a,0x95a,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, +0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, +0x969,0x969,0x969,0x969,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, +0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, +0x96c,0x96c,0x96c,0x96c,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, +0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, +0x96f,0x96f,0x96f,0x96f,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x972,0x972,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x975,0x975,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0x978,0x978,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xa0e,0xa0e,0xf96,0xa0e, +0xa0e,0xa0e,0xa11,0xa0e,0xf96,0xa0e,0xa0e,0xf8d,0xa08,0x9fc,0x9fc,0x9fc,0x9fc,0xa0b,0x9fc,0xf7b, +0xf7b,0xf7b,0x9fc,0x9ff,0xa08,0xa02,0xf81,0xf90,0xf90,0xf7b,0xf7b,0xf96,0xb01,0xb01,0xb01,0xb01, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xa14,0xa14,0xa05,0xa05,0xa05,0xa05,0xa0e,0xa0e,0xa0e,0xa0e, +0xa0e,0xa0e,0xa0b,0xa0b,0x9fc,0x9fc,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xa0e,0xa0e,0xa0e,0xa0e, +0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e, +0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,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,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, +0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2c,0xa32,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0x110d, +0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110a,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, +0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, +0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44, +0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa68,0xa68,0xa68,0xa6b, +0xa6b,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, +0xa50,0xa50,0xa65,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa65,0xa65,0xa68,0xa68,0xa68,0xa68, +0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, +0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa74,0xa74,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, 0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,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,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad, -0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad, -0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,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,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xac2,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa8c,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, +0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xba6, +0xba6,0xba6,0xba6,0xba6,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, 0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xac5,0xac5,0xc0c,0xc0c,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, -0xac5,0xac5,0xac5,0xac5,0xc0c,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, +0xabf,0xabf,0xabf,0xabf,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, +0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, +0xad7,0xad7,0xad7,0xad7,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, 0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0x1485, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xc96,0xc96,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec, -0xaec,0xaec,0xc93,0xc93,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, -0xce4,0xce4,0xce4,0xce4,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, +0xae6,0xae6,0xae6,0xae6,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,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,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xaef,0xaef,0xc36,0xc36, 0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, -0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2, -0xaf2,0xaf2,0xaf2,0xaf2,0xb01,0xb01,0xb01,0xb01,0xb01,0xaf8,0xb04,0xb0a,0xb0a,0xb0a,0xafe,0xafe, -0xafe,0xb07,0xafb,0xafb,0xafb,0xafb,0xafb,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xb01,0xb01,0xb0a,0xb0a,0xb0a,0xafe,0xafe,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xb0a,0xb0a,0xb0a,0xb0a,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xb01,0xb01,0xb01,0xb01,0xb01, -0xb01,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe, -0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0xafe,0x1683,0x1683, -0xb16,0xb0d,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,0xb0d,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb0d,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb0d,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb0d,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, +0xc36,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xb10,0xb10,0xb10,0xb10, 0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,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,0xb16,0xb16,0xb16,0xb16,0xb19,0xb19,0xb19,0xb19, +0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0x14c4,0xb19,0xb19,0xb19,0xb19, +0xb19,0xb19,0xcbd,0xcbd,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, +0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xcba,0xcba, +0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, +0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, 0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb1c, -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,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb79,0xb7c,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xc84,0xc87,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71,0xd71, -0xd71,0xd71,0xd71,0xd71,0xe8b,0xe8b,0xe8b,0xe8b,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xd77,0xd7d,0xd77,0xd74,0xd77,0xd77, -0xd74,0xd77,0xd74,0xd77,0xd77,0xf7e,0x1218,0x1218,0xd86,0xd86,0xd86,0xd86,0xd86,0xd8c,0xd89,0xe9d, -0xe9d,0xe9d,0xe9d,0x1383,0xf90,0x1383,0x12d8,0x12d8,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, -0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbf4,0xbf1,0xbf4,0xbf1,0xbf4,0xbf1, -0x10a7,0x10a4,0xf96,0xf93,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7, -0xbc7,0xbc7,0xbc7,0xbc7,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbcd,0xbcd,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbd0,0xbd0,0xbd0,0xbd6,0xbd3,0xbfa,0xbf7,0xbd6,0xbd3,0xbd6,0xbd3,0xbd6,0xbd3,0xbd6,0xbd3,0xbd6, -0xbd3,0xbd6,0xbd3,0xbd6,0xbd3,0xbd6,0xbd3,0xbd6,0xbd3,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd6,0xbd3,0xbd6,0xbd3, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, -0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd6,0xbd3,0xbd0,0xbd0, -0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbdf,0xbd9,0xbd9,0xbd9, -0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0xbdf,0xbdf,0xbdf,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9,0xbd9, -0xbdc,0xbd9,0xbd9,0xbd9,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xc8d,0xc90,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd74,0xd7d,0xd7d, -0xd74,0xd74,0xd74,0xd74,0xd77,0xd77,0xe8e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, -0xf7e,0x10ef,0x1224,0x121b,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, -0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, -0xcb4,0xcb4,0xcb4,0xcb4,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcba,0xcba,0xcba,0xcba,0xcba,0xcb7, -0xccc,0xccc,0xccc,0xcc6,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xcc6, -0xccc,0xccc,0xccc,0xccc,0xcc0,0xcc0,0xcc9,0xcc9,0xcc9,0xcc9,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcc3, -0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd8f,0xd92,0xd92,0xd92, -0xd92,0xd92,0xd92,0xd92,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc, -0xccc,0xccc,0xcc6,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc, -0xccc,0xcc0,0xcc0,0xcc0,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3, -0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3,0xcc3, -0xcc3,0xcc3,0xcc3,0xcc3,0xccf,0xccf,0xccf,0xccf,0xccf,0xcd2,0xcd2,0xcd2,0xccf,0xccf,0xccf,0xccf, -0xccf,0xccf,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xea0,0xea0,0xea0,0xea0,0xea0,0xea0,0xea0,0xf9c, -0xf9c,0xf99,0xf99,0xf99,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5, -0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5, -0xcd5,0xcd5,0xcd5,0xcd5,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, +0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, +0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb22,0xb2e,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb31,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb34,0xb34,0xb34,0xb34,0xb34, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb2b,0xb2b,0xb34,0xb34,0xb34,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0xb40,0xb37,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,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +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, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, +0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,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,0xb40,0xb40,0xb40,0xb40,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,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,0xb49,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6, +0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba3,0xba6, +0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xcae, +0xcb1,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xeb8,0xeb8,0xeb8,0xeb8, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0xda4,0xe5b,0xda4,0xda4,0xda4,0xda4,0xda1,0xda4,0xda1,0xda4,0xda4,0xfab,0x1242,0x1242, +0xdad,0xdad,0xdad,0xdad,0xdad,0xdb3,0xdb0,0xeca,0xeca,0xeca,0xeca,0x13bf,0xfbd,0x13bf,0x12fc,0x12fc, +0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb, +0xbeb,0xbeb,0xc1b,0xc18,0xc1b,0xc18,0xc1b,0xc18,0x10ce,0x10cb,0xfc3,0xfc0,0xbee,0xbee,0xbee,0xbee, +0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbf1,0xbf1,0xbf1,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,0xbf4,0xbf1,0xbf1, +0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xc21,0xc1e,0xbfd, +0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd, +0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbfd,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbf7,0xbf7,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc06,0xc06,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc00,0xc00,0xc00,0xc39,0xc39,0xc39,0xc39, +0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, +0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xcb7,0xd26,0xda1,0xda1, +0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xe5b,0xe5b,0xda1,0xda1,0xda1,0xda1,0xda4,0xda4,0xebb,0xfab, +0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x126f,0x126f,0x1245,0xcdb,0xcdb,0xcdb,0xcdb, 0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, -0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, -0xce4,0xce4,0xce4,0xce4,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, -0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0,0xcf0, -0xcf0,0xcf0,0xcf0,0xcf0,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b, -0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b, -0xd9b,0xd9b,0xd9b,0xd9b,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e, -0xd9e,0xd9e,0xd9e,0xd9e,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xe5b,0xe5b,0xdb3,0xdb3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xfa8, -0xfa8,0xfa8,0xfa8,0xfa8,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5, -0xfa5,0xfa5,0xfa5,0xfa5,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf, -0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf,0xdc2,0xdbf, -0xdc2,0xdbf,0xdc2,0xdbf,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce, -0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce, -0xdce,0xdce,0xdce,0xdce,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0xdd4,0xdd4,0xdd4,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xea6,0xea6,0xea6,0xea6,0xfab, -0xfab,0xfab,0xfab,0xfab,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, +0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xce1,0xce1,0xce1,0xce1,0xce1,0xcde,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xcf0,0xcf0, +0xcf0,0xcf0,0xce4,0xce4,0xce4,0xce4,0xce4,0xcea,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9, +0xdb9,0xdb9,0xdb9,0xdb9,0xdb6,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, +0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xce7,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcf6,0xcf6,0xcf6,0xcf6, +0xcf6,0xcf9,0xcf9,0xcf9,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, +0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0x10d7,0x10d7,0xfc6,0xfc6,0xfc6,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd0b,0xd0b,0xd0b,0xd0b, +0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, +0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd17,0xd17,0xd17,0xd17, +0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, +0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xdc2,0xdc2,0xdc2,0xdc2, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, +0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xe88,0xe88,0xdda,0xdda, +0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xfd2,0xfd2,0xfd2,0xfd2,0xfd2,0xfcf,0xfcf,0xfcf,0xfcf, +0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xde9,0xde6,0xde9,0xde6, +0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6, +0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xdf5,0xdf5,0xdf5,0xdf5, 0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe,0xdfe, -0xdfe,0xdfe,0xdfe,0xdfe,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,0xe01,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04, -0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe07, -0xe07,0xe07,0xe07,0xe07,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, -0xe10,0xe10,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0a,0xe13,0xfb7,0xfb1,0xfc0,0xfae, -0xe10,0xe10,0xfae,0xfae,0xe25,0xe25,0xe16,0xe25,0xe25,0xe25,0xe1c,0xe25,0xe25,0xe25,0xe25,0xe16, +0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdfb,0xdfb,0xdfb,0xdfb, +0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, +0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xe13,0xe13,0xe13,0xe13, +0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, +0xe13,0xe13,0xe13,0xed3,0xed3,0xed3,0xed3,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe25,0xe25,0xe25,0xe25, 0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,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,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58,0xe58, -0xe58,0xe58,0xe58,0xe58,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, -0x10b3,0x10b3,0x10b3,0x10b3,0xea0,0xea0,0xea0,0xea0,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99, -0xf99,0xf99,0xf99,0xf99,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, -0xf9f,0xf9f,0xf9f,0xf9f,0xec1,0xec1,0xec1,0xec1,0xed3,0xedc,0xedf,0xedc,0xedf,0xedc,0xedf,0xedc, -0xedf,0xedc,0xedf,0xedc,0xedc,0xedc,0xedf,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc, -0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xec4,0xed3,0xec1,0xec1, -0xec1,0xec1,0xec1,0xed6,0xec1,0xed6,0xed3,0xed3,0xee8,0xee5,0xee8,0xee8,0xee8,0xee5,0xee5,0xee8, -0xee5,0xee8,0xee5,0xee8,0xee5,0xfd2,0xfd2,0xfd2,0x110d,0xfc9,0xfd2,0xfc9,0xee5,0xee8,0xee5,0xee5, -0xfc9,0xfc9,0xfc9,0xfc9,0xfcc,0xfcf,0x110d,0x110d,0xeeb,0xeeb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb, -0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfdb,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb, -0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1, -0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1, -0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00, -0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00, -0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0xf00,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0xf06,0xf06,0xf06,0xf06, -0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06, -0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf4e,0xf69,0xf60,0xf5d, -0xf5d,0xf69,0xf69,0xf60,0xf60,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf69,0xf69,0xf69,0xf4e,0xf4e,0xf4e, -0xf4e,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf69,0xf4e,0xf60, -0xf63,0xf4e,0xf4e,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0xf51,0xf69,0xf66,0xf5a,0xf5a,0xf5a,0xf5a, -0xf5a,0xf5a,0xf5a,0xf5a,0xf5a,0xf5a,0x10d4,0x10d4,0x10d1,0x10ce,0xf57,0xf57,0xf81,0xf81,0xf81,0xf81, -0x1224,0x1224,0x121b,0x121b,0x1221,0x1218,0x1218,0x1218,0x1218,0x121b,0x12c3,0x1221,0x121b,0x1221,0x1218,0x1221, -0x1224,0x1218,0x1218,0x1218,0x121b,0x121b,0x1218,0x1218,0x121b,0x1218,0x1218,0x121b,0xf9f,0xf9f,0xf9f,0xf9f, -0xf9f,0xf99,0xf99,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0x1491,0x1491,0x1491,0xf9c,0xf99,0xf99,0xf99, -0xf99,0x1233,0x1230,0x1230,0x1230,0x1230,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0xfbd,0xfbd,0xfba,0xfb4, -0xfba,0xfb4,0xfba,0xfb4,0xfba,0xfb4,0xfb1,0xfb1,0xfb1,0xfb1,0xfc6,0xfc3,0xfb1,0x110a,0x138f,0x1392, -0x1392,0x138f,0x138f,0x138f,0x138f,0x138f,0x1395,0x1395,0x14ac,0x14a0,0x14a0,0x149d,0xfe4,0xfdb,0xfe4,0xfdb, -0xfe4,0xfdb,0xfe4,0xfdb,0xfd8,0xfd5,0xfd5,0xfe4,0xfdb,0x12e7,0x12e4,0x168c,0x12e7,0x12e4,0x139e,0x139b, -0x14af,0x14af,0x14b5,0x14af,0x14b5,0x14af,0x14b5,0x14af,0x14b5,0x14af,0x14b5,0x14af,0xfe4,0xfdb,0xfe4,0xfdb, -0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb, -0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfde,0xfdb,0xfdb,0xfdb, -0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfe4,0xfdb,0xfe4,0xfdb,0xfe4,0xfe4,0xfdb,0xfe7,0xfe7,0xfed,0xff3, -0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3, -0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xfed,0xfe7,0xfe7, -0xfe7,0xfe7,0xfed,0xfed,0xfe7,0xfe7,0xff0,0x13a7,0x13a4,0x13a4,0xff3,0xff3,0xfea,0xfea,0xfea,0xfea, -0xfea,0xfea,0xfea,0xfea,0xfea,0xfea,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x1008,0x1008,0x1008,0x1008, -0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008, -0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1008,0x1011,0x1011,0x1011,0x1011, -0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, -0x1011,0x1011,0x1011,0x1011,0x1014,0x1014,0x1014,0x1017,0x1014,0x1014,0x101a,0x101a,0x101d,0x101d,0x101d,0x101d, +0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,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,0xe2e,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,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe37,0xe37,0xe37,0xe37, +0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34, +0xe34,0xe34,0xe31,0xe3a,0xfe1,0xfdb,0xfea,0xfd8,0xe37,0xe37,0xfd8,0xfd8,0xe4c,0xe4c,0xe3d,0xe4c, +0xe4c,0xe4c,0xe43,0xe4c,0xe4c,0xe4c,0xe4c,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe85,0xe85,0xe85,0xe85, +0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0x10e0,0x10e0,0x10e0,0x10e0, +0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0xecd,0xecd,0xecd,0xecd, +0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9, +0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xeee,0xeee,0xeee,0xeee, +0xf00,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf09,0xf09,0xf0c,0xf09, +0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0xf09,0xf09,0xf09,0xef1,0xf00,0xeee,0xeee,0xeee,0xeee,0xeee,0xf03,0xeee,0xf03,0xf00,0xf00, +0xf15,0xf12,0xf15,0xf15,0xf15,0xf12,0xf12,0xf15,0xf12,0xf15,0xf12,0xf15,0xf12,0xffc,0xffc,0xffc, +0x1137,0xff3,0xffc,0xff3,0xf12,0xf15,0xf12,0xf12,0xff3,0xff3,0xff3,0xff3,0xff6,0xff9,0x1137,0x1137, +0xf18,0xf18,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, +0x1005,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, +0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf2d,0xf2d,0xf2d,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, +0x14f7,0x14f7,0x14f7,0x14f7,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf7b,0xf96,0xf8d,0xf8a,0xf8a,0xf96,0xf96,0xf8d,0xf8d,0xf8a,0xf8a,0xf8a, +0xf8a,0xf8a,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xf7b,0xf7b,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96, +0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf8d,0xf90,0xf7b,0xf7b,0xf93,0xf93,0xf93,0xf93,0xf93, +0xf93,0xf7e,0xf96,0xf93,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0x1101,0x1101, +0x10fe,0x10fb,0xf84,0xf84,0xfae,0xfae,0xfae,0xfae,0x126f,0x126f,0x1245,0x1245,0x124b,0x1242,0x1242,0x1242, +0x1242,0x1245,0x136b,0x124b,0x1245,0x124b,0x1242,0x124b,0x126f,0x1242,0x1242,0x1242,0x1245,0x1245,0x1242,0x1242, +0x1245,0x1242,0x1242,0x1245,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9, +0xfc9,0x14d0,0x14d0,0x14d0,0x10d7,0xfc6,0xfc6,0xfc6,0xfc6,0x127b,0x1254,0x1254,0x1254,0x1254,0x14d0,0x14d0, +0x14d0,0x14d0,0x14d0,0x14d0,0xfe7,0xfe7,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfdb,0xfdb, +0xfdb,0xfdb,0xff0,0xfed,0xfdb,0x1134,0x13cb,0x13ce,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13d1,0x13d1, +0x14eb,0x14df,0x14df,0x14dc,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x1002,0xfff,0xfff,0x100e, +0x1005,0x130b,0x1308,0x16da,0x130b,0x1308,0x13da,0x13d7,0x14ee,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee, +0x14f4,0x14ee,0x14f4,0x14ee,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, +0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, +0x100e,0x1005,0x100e,0x1005,0x1008,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x100e,0x1005,0x100e, +0x1005,0x100e,0x100e,0x1005,0x1011,0x1011,0x1017,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, 0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x1026,0x1026,0x1026,0x1026, -0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1029,0x1020,0x102f,0x102c,0x1026,0x1026,0x1026,0x1026, -0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, -0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x12ed,0x12ea,0x1041,0x103b, -0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x103e,0x10bc,0x1032,0x1032,0x1032,0x1038, -0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x1035,0x1035,0x1038,0x1044,0x1041,0x103b,0x1041,0x103b, -0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b, -0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x1041,0x103b,0x14c4,0x14c1,0x14c4,0x14c1, -0x14c7,0x14c7,0x1695,0x13ad,0x104d,0x104d,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, +0x101d,0x101d,0x101d,0x101d,0x101d,0x1017,0x1011,0x1011,0x1011,0x1011,0x1017,0x1017,0x1011,0x1011,0x101a,0x13e3, +0x13e0,0x13e0,0x101d,0x101d,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x13e6,0x13e6, +0x13e6,0x13e6,0x13e6,0x13e6,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b, +0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103e,0x103e,0x103e,0x1041, +0x103e,0x103e,0x1044,0x1044,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, +0x1053,0x104a,0x1059,0x1056,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, 0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d, -0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x1056,0x1056,0x1056,0x1056,0x1056,0x1059,0x1059,0x1059,0x10b0,0x1062, -0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071,0x1071, -0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f, -0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f,0x105f, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, -0x109b,0x109b,0x109b,0x109b,0x109e,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, -0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, -0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, -0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x1116,0x1116,0x1119,0x1119,0x111f,0x1116,0x1116,0x1116,0x1116,0x1116, -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,0x1122,0x1122,0x1122,0x1122,0x1122, -0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d, -0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d, -0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149, -0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1146,0x114c, -0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158, -0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158,0x1158, -0x1167,0x1167,0x1167,0x1176,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, -0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, -0x117c,0x117c,0x117c,0x116a,0x1176,0x1176,0x1167,0x1167,0x1167,0x1167,0x1176,0x1176,0x1167,0x1176,0x1176,0x1176, -0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, -0x118b,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1182,0x1182,0x1182,0x1188,0x1185,0x14cd,0x14d0,0x14d3,0x14d3, -0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a, -0x118e,0x119a,0x118e,0x118e,0x118e,0x11a3,0x11a3,0x118e,0x118e,0x11a3,0x119a,0x11a3,0x11a3,0x119a,0x118e,0x1191, -0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a, -0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a,0x119a, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5, -0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd, -0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11ca,0x11ca,0x11ca, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6, -0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1203,0x1200,0x1200,0x1200,0x1200, -0x11fd,0x11fd,0x11fd,0x11f1,0x11f1,0x11f1,0x11f1,0x11fd,0x11fd,0x11f7,0x11f4,0x11fa,0x11fa,0x11eb,0x1206,0x1206, -0x11ee,0x11ee,0x11fd,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1203,0x1200,0x1203,0x1200,0x1200,0x1200, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x120f,0x120f,0x120f,0x120c,0x120c,0x120c,0x1209,0x1209,0x1209,0x1209,0x120c,0x1209,0x1209,0x1209,0x120f,0x120c, -0x120f,0x120c,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x120f,0x120c,0x120c, -0x1209,0x1209,0x1209,0x1209,0x121b,0x121b,0x12c0,0x1218,0x12c0,0x12c0,0x12c0,0x12c0,0x1218,0x121e,0x1224,0x1218, -0x1218,0x1218,0x1218,0x1218,0x121e,0x1221,0x1224,0x1224,0x1221,0x1224,0x1218,0x1221,0x1221,0x1227,0x1224,0x1218, -0x1218,0x1224,0x121b,0x121b,0x1356,0x1356,0x1245,0x1356,0x1356,0x1356,0x1245,0x1356,0x1356,0x1356,0x123f,0x123f, -0x123f,0x123f,0x123f,0x134d,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1242,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1242,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b, -0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b,0x130b, -0x130b,0x130b,0x130b,0x130b,0x1320,0x1311,0x1320,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323, -0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323,0x1323, -0x1323,0x1323,0x1323,0x1323,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1329,0x1329,0x1329,0x1329, -0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1332,0x1332,0x1335,0x1335,0x1335,0x1335,0x1335,0x1332,0x1335,0x1335,0x1335,0x1332,0x1335,0x1332,0x1335, -0x1332,0x1335,0x1335,0x1335,0x1335,0x1335,0x1338,0x1335,0x1335,0x1335,0x1335,0x1332,0x1335,0x1332,0x1332,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x14df,0x14df,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x14e8,0x14e2,0x14e2,0x14e8,0x14e8,0x14e8,0x14e8, -0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x16a1,0x16a1,0x16a1,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x14e8,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x14e8,0x16a1,0x16a1, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1338,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x14e2,0x14e2,0x14e8,0x14e8,0x14e2,0x14e8,0x14e8,0x14e8,0x14df,0x14df,0x14e8,0x14e8, -0x1335,0x1335,0x1335,0x1338,0x1338,0x14eb,0x1335,0x1335,0x1335,0x1335,0x1338,0x14ee,0x14e8,0x14e8,0x14e8,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x14e2,0x14e2,0x14e8,0x14eb,0x14e8,0x14e2,0x14e8,0x16a1,0x16a1,0x16a1,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x14e8, -0x1335,0x14e8,0x1338,0x1338,0x1335,0x1335,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338, -0x1338,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1338,0x1338,0x1338,0x1338,0x1335,0x1335,0x1335,0x1335,0x1338,0x1335,0x1338,0x1338,0x1338,0x1338, -0x1338,0x1338,0x1338,0x1338,0x1338,0x1335,0x1335,0x1335,0x1338,0x1335,0x1335,0x1335,0x1335,0x1338,0x1338,0x1338, -0x1335,0x1338,0x1338,0x1338,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x14eb,0x1335,0x1335,0x1335, -0x1335,0x14e8,0x14e2,0x16a1,0x13b3,0x13b3,0x13b3,0x13b3,0x14df,0x14df,0x14df,0x14df,0x14df,0x14e5,0x14e8,0x16a1, -0x16a1,0x16a1,0x16a1,0x169e,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x14e2,0x14e8,0x14e2,0x14e8,0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e8,0x14e2,0x14e2,0x14e2,0x14e8,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x14e8,0x1335, -0x1335,0x1335,0x1335,0x1335,0x13b6,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b, -0x133b,0x133b,0x133b,0x133b,0x133b,0x13b6,0x133b,0x133b,0x133b,0x13b6,0x133b,0x13b6,0x133b,0x13b6,0x133b,0x13b6, -0x133b,0x133b,0x133b,0x13b6,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x13b6,0x13b6,0x133b,0x133b,0x133b,0x133b, -0x13b6,0x133b,0x13b6,0x13b6,0x133b,0x133b,0x133b,0x133b,0x13b6,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b, -0x133b,0x133b,0x133b,0x133b,0x133b,0x14f4,0x14f4,0x16a7,0x16a7,0x133e,0x133e,0x133e,0x133b,0x133b,0x133b,0x133e, -0x133e,0x133e,0x133e,0x133e,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4, -0x15e4,0x15e4,0x15e4,0x15e4,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, -0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, -0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1344,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, -0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1344,0x1344,0x1344,0x1341,0x1341,0x1341,0x1341,0x1341, -0x1341,0x1341,0x1341,0x1341,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, +0x1050,0x1050,0x1050,0x1050,0x1311,0x130e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, +0x106b,0x1065,0x1068,0x10e9,0x105c,0x105c,0x105c,0x1062,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, +0x105f,0x105f,0x1062,0x106e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, +0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, +0x106b,0x1065,0x106b,0x1065,0x1503,0x1500,0x1503,0x1500,0x1506,0x1506,0x16e3,0x13e9,0x1077,0x1077,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,0x1077,0x1077,0x1077,0x1077, +0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1080,0x1080, +0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x10dd,0x108c,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, +0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086, +0x1086,0x1086,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, +0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, +0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, +0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, +0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10c5,0x10c5,0x10c5,0x10c5,0x10da,0x10c5,0x10c5,0x10c5, +0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, +0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149, +0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1140,0x1140, +0x1143,0x1143,0x1149,0x1140,0x1140,0x1140,0x1140,0x1140,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, +0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, +0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, +0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, +0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1170,0x1176,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, +0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, +0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1191,0x1191,0x1191,0x11a0,0x11a6,0x11a6,0x11a6,0x11a6, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, +0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x1194,0x11a0,0x11a0,0x1191,0x1191, +0x1191,0x1191,0x11a0,0x11a0,0x1191,0x11a0,0x11a0,0x11a0,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2, +0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b5,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11ac, +0x11ac,0x11ac,0x11b2,0x11af,0x150c,0x150f,0x1512,0x1512,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11b8,0x11c4,0x11b8,0x11b8,0x11b8,0x11cd,0x11cd,0x11b8, +0x11b8,0x11cd,0x11c4,0x11cd,0x11cd,0x11c4,0x11b8,0x11bb,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, +0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, +0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, +0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, +0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, +0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f4,0x11f4,0x11f4,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, +0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, +0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, +0x122a,0x122a,0x122a,0x122d,0x122a,0x122a,0x122a,0x122a,0x1227,0x1227,0x1227,0x121b,0x121b,0x121b,0x121b,0x1227, +0x1227,0x1221,0x121e,0x1224,0x1224,0x1215,0x1230,0x1230,0x1218,0x1218,0x1227,0x122a,0x122a,0x122a,0x122a,0x122a, +0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, +0x122a,0x122a,0x122d,0x122a,0x122d,0x122a,0x122a,0x122a,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, +0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, +0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1239,0x1239,0x1236,0x1236,0x1236,0x1233,0x1233, +0x1233,0x1233,0x1236,0x1233,0x1233,0x1233,0x1239,0x1236,0x1239,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, +0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, +0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1236,0x1236,0x1233,0x1233,0x1233,0x1233,0x1245,0x1245,0x12ed,0x1242, +0x12ed,0x12ed,0x12ed,0x12ed,0x1242,0x1248,0x126f,0x1242,0x1242,0x1242,0x1242,0x1242,0x1248,0x124b,0x126f,0x126f, +0x124b,0x126f,0x1242,0x124b,0x124b,0x124e,0x126f,0x1242,0x1242,0x126f,0x1245,0x1245,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1257,0x1257,0x1257,0x1257,0x1377,0x1356,0x1260,0x1377,0x1377,0x1377, +0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x180f,0x180f,0x180f,0x180f,0x180f,0x135f,0x135f,0x1266,0x135f, +0x135f,0x135f,0x1266,0x135f,0x135f,0x135f,0x1260,0x1260,0x1260,0x1260,0x1260,0x1359,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x1263,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1263,0x128d,0x128d,0x128d,0x128d, +0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, +0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x132f,0x132f,0x132f,0x132f, +0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f, +0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1344,0x1335,0x1344,0x1347, 0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,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,0x136e,0x136e,0x136e, -0x136e,0x136e,0x136e,0x136e,0x13c8,0x13c8,0x13c8,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, -0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, -0x13da,0x13da,0x13da,0x13da,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x1404,0x1404,0x1410,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416, -0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416, -0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1416,0x1410,0x1410,0x1410,0x1404,0x1404,0x1404,0x1404,0x1404,0x1404, -0x1404,0x1404,0x1404,0x1410,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1434,0x14e2,0x14e2,0x14e8,0x14e8,0x14e8,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e8,0x14e8,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df,0x14df, -0x14e8,0x14e8,0x14e8,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e8,0x14e2,0x14e2,0x14e8,0x14e8, -0x14e8,0x14e8,0x14e2,0x14e2,0x14ee,0x14e2,0x14e2,0x14e2,0x14e2,0x14f1,0x14f1,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e2,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518, -0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1518, -0x1518,0x1518,0x1518,0x1518,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a, -0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a,0x152a, -0x152a,0x152a,0x152a,0x152a,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,0x1530,0x1530, -0x1530,0x1530,0x1530,0x1530,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533, -0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533, -0x1533,0x1533,0x1533,0x1533,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1563,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, -0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x1575, -0x157e,0x157e,0x157e,0x157e,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1593,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,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,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b4,0x15b4,0x15b4,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15b4, -0x15b4,0x15a8,0x15b4,0x15ab,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, -0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db, -0x15db,0x15d8,0x15d8,0x15d8,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4, -0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x15ea,0x15ea,0x15ea,0x15e7,0x15e7,0x15e7, -0x15e4,0x15e4,0x15e4,0x15e4,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ff,0x15ff,0x15f3,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605, -0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1602,0x1602,0x1602,0x1602,0x1602, -0x1602,0x1602,0x1602,0x1602,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,0x1608,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, -0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, -0x162c,0x162c,0x162c,0x162c,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1635,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x1638,0x1647,0x1647,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1647,0x1638,0x164a, -0x164a,0x1638,0x164a,0x1638,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,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,0x1656,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3, -0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3, -0x16b3,0x16b3,0x16b3,0x16b3,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, -0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, -0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16f5,0x16f2,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef, -0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8, -0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8, -0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d, -0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d, -0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x170d,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710, -0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710, -0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1710,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, -0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, -0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x171c,0x171c,0x171c,0x171c,0x1719, -0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x171c,0x171c,0x171c, -0x171c,0x171c,0x171c,0x171c,0x171c,0x1719,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c, -0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c, -0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x171c,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728, -0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728, -0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0x1728,0,0,0,0 +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1335,0x1335,0x1335,0x1335, +0x1335,0x1335,0x1335,0x1335,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, +0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, +0x134d,0x134d,0x134d,0x134d,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, +0x1353,0x1353,0x1353,0x1353,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, +0x1389,0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x138c,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c, +0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x151e,0x151e, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x1527,0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1764,0x1764,0x1764, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x1764,0x1764,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1527, +0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x1527,0x1527,0x138c,0x138c,0x1392,0x1395,0x1395,0x1698,0x138c,0x1392, +0x138c,0x138c,0x1395,0x1530,0x152d,0x1527,0x1527,0x1764,0x1764,0x1764,0x1764,0x1764,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1698,0x1527,0x1521,0x1527, +0x1764,0x1764,0x1764,0x1767,0x1767,0x1767,0x1767,0x1767,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x1527,0x1395,0x1395,0x138c,0x138c,0x1395,0x1395, +0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1398,0x1398,0x1398,0x1398,0x1392,0x1392, +0x1392,0x1392,0x1395,0x1392,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c, +0x1395,0x138c,0x138c,0x138c,0x138c,0x1395,0x1395,0x1395,0x138c,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138f, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1698,0x138c,0x138c,0x138c,0x138c,0x1527,0x1521,0x1764, +0x13ef,0x13ef,0x13ef,0x13ef,0x151e,0x151e,0x151e,0x151e,0x151e,0x1524,0x1527,0x1764,0x1764,0x1764,0x1764,0x16ec, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1527,0x152d,0x1530,0x1527,0x1527, +0x1527,0x1527,0x1818,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1527,0x1521,0x1521,0x1521,0x1521, +0x152a,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521,0x1527,0x151e,0x151e,0x151e,0x151e, +0x151e,0x151e,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479, +0x139b,0x1479,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x1479, +0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479,0x1479,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x169e,0x169e,0x176a,0x176a,0x139e,0x139e,0x139e, +0x139b,0x139b,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a4,0x13a4,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1797,0x1797,0x1794,0x16ef,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x1539,0x1401,0x1401,0x1401,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, +0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, +0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x143d,0x143d,0x1449,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1449,0x1449,0x1449,0x143d,0x143d, +0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x1449,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1521,0x1521,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521, +0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x151e,0x151e, +0x151e,0x151e,0x151e,0x151e,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527, +0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1521,0x1521,0x1530,0x1521,0x1521,0x1521,0x1521,0x169b,0x169b,0x1521, +0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1815,0x1527,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521, +0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521, +0x1527,0x1521,0x1521,0x1521,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, +0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, +0x1551,0x1551,0x1551,0x1551,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1569,0x1569,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, +0x156c,0x156c,0x156c,0x156c,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,0x159c,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15ae, +0x15b7,0x15b7,0x15b7,0x15b7,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, +0x15ba,0x15ba,0x15ba,0x15ba,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15cc,0x15d5,0x15d5,0x15d5, +0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, +0x15d5,0x15d5,0x15d5,0x15d5,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,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15ed,0x15ed,0x15ed,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15ed, +0x15ed,0x15e1,0x15ed,0x15e4,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1611,0x1611,0x1611,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1623,0x1623,0x1623,0x1620,0x1620,0x1620, +0x161d,0x161d,0x161d,0x161d,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1638,0x1638,0x162c,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0x1632,0x1632,0x1632,0x1632,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e, +0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b, +0x163b,0x163b,0x163b,0x163b,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, +0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, +0x1665,0x1665,0x1665,0x1665,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x1671,0x1680,0x1680,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1680,0x1671,0x1683, +0x1683,0x1671,0x1683,0x1671,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,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,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, +0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, +0x1695,0x1695,0x1695,0x1695,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, +0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, +0x16f5,0x16f5,0x16f5,0x16f5,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, +0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, +0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1737,0x1734,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, +0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,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,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,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,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758,0x1758,0x1755, +0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,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,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x17b5,0x17b5,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,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1800,0x1800,0x1800, +0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,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,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4640, + propsVectorsTrie_index+4844, NULL, - 4640, - 22812, + 4844, + 23696, 0xa40, - 0x12a0, + 0x136c, 0x0, 0x0, 0x110000, - 0x6b38, + 0x6f78, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[5931]={ -0x67,0,0,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,0x1767,0,0, -0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67,0,0,0x1f67, -0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0,0,0x2567,0, -0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000,0x2b67,0,0, -0x2d67,0,0,0x3067,0x20000000,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67, -0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0,0,0x4367,0, -0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0,0x5067,0,0, -0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767,0,0,0x5867, -0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0,0,0x6067,0x80000, -0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0,0x6f67,0,0, -0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767,0,0,0x7867, -0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0,0,0x7f67,0, -0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0,0x8567,0,0, -0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67,0,0,0x8c67, -0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0, -0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0, -0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367, -0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0, -0,0xa967,0,0,0xaa67,0,0,0xab67,0,0,0xac67,0,0,0xad67,0,0, -0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467, -0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0, -0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0, -0xc167,0,0,0xc267,0,0,0xc367,0,0,0xc467,0,0,0xc667,0,0,0xc767, -0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0,0,0xcc67,0, -0,0xcd67,0,0,0xcf67,0,0,0xd067,0,0,0xd267,0,0,0xd367,0,0, +static const uint32_t propsVectors[6195]={ +0x67,0,0,0x67,0,0xe00000,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, +0x1767,0,0,0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67, +0,0,0x1f67,0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0, +0,0x2567,0,0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000, +0x2b67,0,0,0x2d67,0,0,0x3067,0x20000000,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67, +0,0,0x3b67,0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0, +0,0x4367,0,0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0, +0x5067,0,0,0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767, +0,0,0x5867,0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, +0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0, +0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767, +0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0, +0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0, +0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67, +0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0, +0,0x9267,0,0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0, +0x9867,0,0,0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167, +0,0,0xa367,0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0, +0,0xa867,0,0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0, +0xad67,0,0,0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367, +0,0,0xb467,0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0, +0,0xba67,0,0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0, +0xc067,0,0,0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667, +0,0,0xc767,0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0, +0,0xcc67,0,0xe00000,0xcf67,0,0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0, 0xd467,0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67, 0,0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0, -0,0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0,0xe467,0,0, +0,0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0, 0xe567,0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67, 0,0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0, 0,0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0, -0xf867,0,0,0xf967,0,0,0xfa67,0,0,0xfb67,0,0,0xfc67,0,0,0xfd67, +0xf867,0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67, 0,0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0, -0,0x10567,0,0,0x10667,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,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,0x10200000,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,0x201000,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,0x2802400,0x962460,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100, -0x220400,0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,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,0,0x218820,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,0x11000c02,0xc000010,0xb48000,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,0x11001d00,0x4000000,0x200000,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,0x440001,0x11002800,0x4000001, -0x440002,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,0x11248002,0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,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,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00, -0x24000020,0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000, -0x10200000,0x11003000,0x24000000,0x30e00000,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,0x10200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000, -0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700,0x24000000,0x30200000,0x11003700,0x24000000,0x90e00000,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000, -0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800, -0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x90e00000,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,0x10200000,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,0x200000,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, -0x1010000f,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,0x10100000,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,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000, -0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700, -0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000, -0x200000,0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a, -0x11045712,0x7c00100,0x23040a,0x11045712,0x7c80100,0x23040a,0x11045716,0x7c00100,0x230c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,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,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000, -0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,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,0x1a40000,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,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001, -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,0x11400c11,0x7c00900,0x230400,0x11400f33,0xc000010,0x448000,0x11400f43,0xc000010,0x448000,0x11403d8a,0x4000000, -0xe00000,0x11445784,0x4000004,0x120000a,0x11445784,0x4000008,0x81000a,0x11445784,0x4000008,0x141000a,0x11445784,0x4000010,0x87000a,0x11445784,0xc000010,0x84800a, -0x1144578d,0x3802500,0x126246a,0x1144578d,0x7c00d00,0x2530c0a,0x114a3d84,0x24000000,0x810000,0x114a3d84,0x24000000,0x1410000,0x114a3d84,0x24000008,0x810000,0x114a3d84, -0x24000008,0x1410000,0x114a3d84,0x24000010,0x870000,0x114a3d84,0x2c000010,0x848000,0x114a3d8a,0x4000000,0xe00000,0x114a3d8a,0x24000000,0xe00000,0x114a3d8a,0x24000002, -0x1200000,0x114a3d8a,0x24000002,0x10e00000,0x114a3d8a,0x24000008,0x810000,0x114a3d8a,0x24000008,0x1410000,0x114a3d8d,0x7c00900,0x930c00,0x114a3d8d,0x7c00900,0xe30c00, -0x114a3d8f,0x7c00300,0xe30000,0x114a3e8d,0x7000400,0x1200c02,0x114a3f84,0x4000004,0x1200000,0x114a3f8d,0x7c00d00,0x2530c00,0x114a428f,0x4000000,0xe00000,0x114a428f, -0x4000000,0xe0000f,0x114a448a,0x4000000,0xe00002,0x114a448a,0x4000000,0xe00003,0x114a448a,0x4000000,0x10e00003,0x114a458a,0x4000000,0xe00002,0x114a458a,0x4000000, -0xe0000d,0x11800906,0x2802400,0x962460,0x11800c16,0x2802100,0x962460,0x11800c16,0x2802500,0x962460,0x11800f1c,0x2802400,0x962460,0x11800f28,0x2802400,0x962460, -0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d92,0x2802400,0x962460,0x118a3e8d,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00c1a, -0x6800000,0x1329800,0x11c00f57,0x6800000,0x1329800,0x11c0105c,0x6800000,0x1329800,0x11c01160,0x6800000,0x1329800,0x11c01264,0x6800000,0x1329800,0x11c01468,0x4000000, -0x200000,0x11c01468,0x6800000,0x1329800,0x11c01468,0x7c00100,0x230400,0x11c0511a,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,0x200000,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,0,0x218820,0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22, -0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,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,0x440000,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,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,0xc4000b,0x30002800,0x24000000, -0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000, -0x30002c00,0x7c00100,0x10220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600, -0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400, -0x500000,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,0x30402573,0x4000010,0x400000,0x30402573,0x4000010,0xb70000,0x30402573,0xc000010, -0xb48000,0x304a3d8a,0x4000000,0xe00000,0x30800c16,0x2802100,0x962460,0x30c01c6d,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,0x80000,0x918820,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,0x440002,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,0x10200000,0x32003600,0x24000020,0x30200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000, -0x200000,0x32003700,0x24000000,0x10200000,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,0x10200000, -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,0x32065700,0x4000000,0x810011,0x32065700,0x4000000, -0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3d11,0x7c00100,0x1230400, -0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11, -0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x3240636f,0xc000010,0x448000,0x324a3d8f,0x4000000,0x10e00000,0x324a3d8f,0x7c00100,0x1230400,0x324a3f8d,0x4000002, -0x1200c00,0x324a538a,0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200000, -0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218820,0x40000c02,0x2802100,0x962460,0x40000c02, -0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,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,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000, -0x40003700,0x24000000,0x30200000,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,0x10200000,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,0x40023700,0x24000000,0x30e00000,0x40027d01, -0x12882000,0x962460,0x400a4400,0x4000000,0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000, -0x810010,0x400a5300,0x4000000,0x1410010,0x404077a6,0x4000000,0x200000,0x404077a6,0x4000000,0x400000,0x40c0511a,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,0xb00000,0x41000c02,0x4000000, -0x1500000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400, -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,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10e00000,0x41003700,0x24000000,0x30200000, -0x41003700,0x24000000,0x30e00000,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,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,0x414a828a,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01468,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, -0x200000,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,0x200000,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,0x50409a93,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, -0x200000,0x51003700,0x24000000,0xe00000,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,0x24000000,0x30200000,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,0x200000,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,0xe00000,0x5100aa00,0x4000000, -0x30e00000,0x5100ab00,0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000, -0x5140a2a1,0x4000400,0x400000,0x514a828a,0x4000000,0xe00000,0x51802b81,0x2802000,0x962460,0x51c0090a,0x2802400,0x962460,0x51c0a00a,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,0x52003700, -0x24000000,0x30e00000,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,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,0,0x218820,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,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247, -0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000, -0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x30e00000,0x52023700,0x24000000,0x90e00000,0x52023800,0x24000000,0x30100000,0x52024400,0x4000000,0x100000, -0x52027300,0x24000000,0x100000,0x52027300,0x24000000,0x30100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300, -0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a4400,0x4000000, -0xe00003,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d, -0x520ac400,0x4000000,0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af75,0x6800400,0x962540,0x5240af75,0x7c00100,0x230400,0x5240af76, -0x4000400,0x200000,0x5240af76,0x6800100,0x962540,0x5240b294,0x4000000,0x200000,0x5240b294,0x4000000,0x1500000,0x5240b5a4,0x7c00900,0x230400,0x5280af75,0x2802400, -0x962460,0x5280af76,0x2802400,0x962460,0x5280af78,0x2802400,0x962460,0x5280af7a,0x2802400,0x962460,0x52c0b39f,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460, +0,0x10567,0,0xe00000,0x10667,0,0,0x10767,0,0,0x10867,0,0,0x10967,0,0, +0x10a67,0,0,0x10b67,0,0,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67, +0,0,0x11067,0,0,0x11167,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,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,0x10200000,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,0x201000,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,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, +0,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,0x11000c02,0xc000010,0xb48000,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,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,0x440001,0x11002800,0x4000001,0x440002,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,0x11248002,0x11002800, +0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,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,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002, +0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,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,0x10200000, +0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700, +0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, +0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200, +0x11003800,0x24000000,0x928045a0,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,0x10200000,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,0x200000,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,0x1010000f,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,0x10100000,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,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020, +0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000, +0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,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,0x440011,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,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000, +0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,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,0x1a40000,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,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000, +0x30200000,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,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000,0x11400f44,0xc000010,0x448000,0x11401d70, +0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787,0x4000008,0x141000a,0x11445787,0x4000010, +0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000,0x810000,0x114a3d87,0x24000000,0x1410000, +0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000,0x114a3d8d,0x4000000,0xe00000,0x114a3d8d, +0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d,0x24000008,0x1410000,0x114a3d90,0x7c00900, +0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004,0x1200000,0x114a3f90,0x7c00d00,0x2530c00, +0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003,0x114a4492,0x4000000,0x10e00003,0x114a4592, +0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17,0x2802500,0x962460,0x11800f1d,0x2802400, +0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400,0x962460,0x118a3e90,0x2802400,0x962460, +0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800,0x11c0105d,0x6800000,0x1329800,0x11c01161, +0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469,0x7c00100,0x230400,0x11c0511b,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,0x200000,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,0,0x218960, +0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22, +0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,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,0x440000,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, +0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19,0x7c00100,0x250400, +0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e, +0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500000,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,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92,0x4000000,0xe00000,0x30800c17,0x2802100, +0x962460,0x30c01c6e,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,0x962460,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,0x440002,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,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,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,0x10200000,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,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020, +0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000, +0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406372, +0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d,0x24000000,0xe00000,0x32820701,0x2802000, +0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200000,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400, +0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02, +0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,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, +0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,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,0x10200000,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,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, +0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077b8,0x4000000, +0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,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,0xb00000,0x41000c02,0x4000000,0x1500000,0x41000f0a,0x7c00100, +0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,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,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10e00000,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,0x30200000,0x410a3700,0x24000000, +0x30e00000,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,0x414a8292,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01469,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,0x200000,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,0x200000,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,0x50409a92,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,0x200000,0x51003700,0x24000000, +0xe00000,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,0x200000,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,0xe00000,0x5100ab00,0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020, +0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000, +0x514a8292,0x4000000,0xe00000,0x51802b84,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,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,0,0x218960,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,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00, +0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000, +0x928045a0,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,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700, +0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100, +0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000, +0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000,0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2, +0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492,0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400, +0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400,0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460, 0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a, -0x7c00100,0x230400,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100, -0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000,0x24000000,0x10e00000,0x60003000,0x24000000,0x30200000,0x60003000,0x24000000,0x30e00000, -0x60003700,0x24000000,0x200000,0x60003700,0x24000000,0x30200000,0x60003800,0x24000000,0x1710000,0x60003800,0x24000000,0x30200000,0x60003800,0x24000000,0xb0e00000,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,0x32703580,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,0xe00000,0x6000cc00, -0x4000000,0x30e00000,0x6000cd00,0x4000000,0x30200000,0x6000cd00,0x4000000,0x30e00000,0x6000cd00,0x4000000,0xb0e00000,0x6000ce00,0x4000000,0x30e00000,0x6000ce00,0x4000000, -0xb0e00000,0x6000cf00,0x4000000,0x30e00000,0x6000cf00,0x4000000,0xb0e00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d, -0x6002c300,0x4000000,0x30100000,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a4305,0x7c00100,0xe30400,0x600ac400, -0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e00003,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600ad111,0x7c40300, -0xe30000,0x61000a03,0x4000000,0x1600000,0x61000c02,0,0x218820,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,0x6100ce00,0x4000000,0x30e00000,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,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,0x6140af75,0x7c00100,0x230400, -0x6140af76,0x6800100,0x962540,0x6140af7f,0x7c00100,0x230400,0x6180af76,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800, -0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0,0x218820,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,0x10200000,0x70003800, -0x24000000,0xe00000,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,0xe00000,0x7000cd00, -0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00,0x4000000,0x30e00000,0x7000cd00,0x4000000, -0x90e00000,0x7000cd00,0x4000000,0xb0e00000,0x7000ce00,0x4000000,0x30e00000,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000cf00,0x4000000,0x30e00000, -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,0x200000,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,0x7040dfa8, -0x4000000,0x200000,0x7040f7aa,0x80000,0x918820,0x7080af76,0x2802400,0x962460,0x7080dfa8,0x2802400,0x962460,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, -0xe00000,0x8000cd00,0x4000000,0x30e00000,0x8000cd00,0x4000000,0x70200000,0x8000ce00,0x4000000,0x30e00000,0x8000cf00,0x4000000,0x30e00000,0x8000d202,0x2802500,0x962460, -0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x200000,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,0x80010500,0x4000000,0x30e00000,0x80010500,0x4000000,0xb0e00000,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, -0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800b0011,0x7c40300,0xe30000}; +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,0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000, +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,0x32703580,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,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300, +0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000, +0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d, +0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00, +0x4000000,0x30e05200,0x600acd00,0x4000000,0xb0e00000,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000,0x600ace00,0x4000000, +0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000, +0x61000c02,0,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,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,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79, +0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000, +0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0,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,0x10200000,0x70003800,0x24000000, +0xe00000,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,0xe00000,0x7000cd00,0x4000000, +0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x90e00000, +0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,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, +0x200000,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,0x30e00000,0x700acd00,0x4000000,0xb28045a0,0x700ace00,0x4000000, +0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb0e00000,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000,0x918820,0x7080af79,0x2802400,0x962460, +0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,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,0xe00000,0x8000d202, +0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x200000,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,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000, +0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,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,0,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,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000, +0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000, +0x90408e06,0x24000000,0x400000}; -static const int32_t countPropsVectors=5931; +static const int32_t countPropsVectors=6195; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[172]={ -0x800e,0x8019,8,0x8059,8,2,8,0x8019,8,0x8038,8,8,3,0x800c,2,0x22, -0x8025,2,0x22,0x54,0x79,0x807b,2,0x8022,2,0x8025,2,0x18,4,0xa,0xf,0x10, -0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15,0x19,0x1a,0x1f, -0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89,0x91, -0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a,0x89, -0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x54,4,0x3a,0x8076,4,0x59,0x10,0x80a4, -0x10,0x5e,0xf,0x809d,0xf,0x62,0x23,0x8089,0x23,0x66,0x1c,0x34,0x8076,0x1c,0x6a,0x2a, -0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa,0x15,0x1a,0x23,0x8024,0xa, -0x8015,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x8016,0x11, -0x14,0x8016,5,0x8011,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,0xa,0x8023,0xa, -0x9d,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x8031,2,0x8007,0x8087,0}; +static const uint16_t scriptExtensions[194]={ +0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, +0x8025,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x19,4,0xa,0xf, +0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15,0x19,0x1a, +0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89, +0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, +0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x55,4,0x3a,0x8076,4,0x5a,0x10, +0x80a4,0x10,0x5f,0xf,0x809d,0xf,0x63,0x23,0x8089,0x23,0x67,0x1c,0x34,0x8076,0x1c,0x6b, +0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa,0x15,0x1a, +0x23,0x8024,0xa,0x8015,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12, +0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78,0x91,0x99,0x9e, +0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a,0xa,0xab,0xa, +0x8023,0xa,0xaf,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89, +0x67,0x8087}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x26ca,0x26ca,0x26ca,0x26ca,0x5c6c,3,0x7397,0x73ed,0x73ed,0x73ed,0xb06a6,0x2774191,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x606c,3,0x789f,0x7900,0x7900,0x7900,0xb11ae,0x2a75631,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstrie.cpp b/deps/icu-small/source/common/ucharstrie.cpp index 476271deacb836..d04d315c7913e0 100644 --- a/deps/icu-small/source/common/ucharstrie.cpp +++ b/deps/icu-small/source/common/ucharstrie.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2011, International Business Machines diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index 05255b48c9b3c8..412a58a45d6bd0 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines @@ -115,7 +117,7 @@ UCharsTrieBuilder::add(const UnicodeString &s, int32_t value, UErrorCode &errorC return *this; } if(elementsLength>0) { - uprv_memcpy(newElements, elements, elementsLength*sizeof(UCharsTrieElement)); + uprv_memcpy(newElements, elements, (size_t)elementsLength*sizeof(UCharsTrieElement)); } delete[] elements; elements=newElements; diff --git a/deps/icu-small/source/common/ucharstrieiterator.cpp b/deps/icu-small/source/common/ucharstrieiterator.cpp index 30867c05f07d82..68ba8c2177878a 100644 --- a/deps/icu-small/source/common/ucharstrieiterator.cpp +++ b/deps/icu-small/source/common/ucharstrieiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2011, International Business Machines diff --git a/deps/icu-small/source/common/uchriter.cpp b/deps/icu-small/source/common/uchriter.cpp index 40b06ce5acf486..fd0a407c6b1763 100644 --- a/deps/icu-small/source/common/uchriter.cpp +++ b/deps/icu-small/source/common/uchriter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1998-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/ucln.h b/deps/icu-small/source/common/ucln.h index cd2630afff8652..3c8c66ad2f39e5 100644 --- a/deps/icu-small/source/common/ucln.h +++ b/deps/icu-small/source/common/ucln.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucln_cmn.cpp b/deps/icu-small/source/common/ucln_cmn.cpp index 53c95e67baa3c5..657ec337d7e041 100644 --- a/deps/icu-small/source/common/ucln_cmn.cpp +++ b/deps/icu-small/source/common/ucln_cmn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/common/ucln_cmn.h b/deps/icu-small/source/common/ucln_cmn.h index 2fdf1c7a67e97c..56fa73053f5c0c 100644 --- a/deps/icu-small/source/common/ucln_cmn.h +++ b/deps/icu-small/source/common/ucln_cmn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2016, International Business Machines diff --git a/deps/icu-small/source/common/ucln_imp.h b/deps/icu-small/source/common/ucln_imp.h index a0a1850acc6745..5aa5b0d19f3aab 100644 --- a/deps/icu-small/source/common/ucln_imp.h +++ b/deps/icu-small/source/common/ucln_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucmndata.c b/deps/icu-small/source/common/ucmndata.c index b9a11eb66aac77..6b7d78d104d186 100644 --- a/deps/icu-small/source/common/ucmndata.c +++ b/deps/icu-small/source/common/ucmndata.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucmndata.h b/deps/icu-small/source/common/ucmndata.h index c3dfc50d884171..4ff37cc20b0576 100644 --- a/deps/icu-small/source/common/ucmndata.h +++ b/deps/icu-small/source/common/ucmndata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnv.c b/deps/icu-small/source/common/ucnv.c index d7f197c5f7967b..7ce05644c7ec9f 100644 --- a/deps/icu-small/source/common/ucnv.c +++ b/deps/icu-small/source/common/ucnv.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -1061,7 +1063,7 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { length=(int32_t)(pArgs->sourceLimit-pArgs->source); if(length>0) { - uprv_memcpy(cnv->preFromU, pArgs->source, length*U_SIZEOF_UCHAR); + u_memcpy(cnv->preFromU, pArgs->source, length); cnv->preFromULength=(int8_t)-length; } @@ -2743,7 +2745,7 @@ ucnv_getInvalidUChars (const UConverter * converter, } if ((*len = converter->invalidUCharLength) > 0) { - uprv_memcpy (errChars, converter->invalidUCharBuffer, sizeof(UChar) * (*len)); + u_memcpy (errChars, converter->invalidUCharBuffer, *len); } } diff --git a/deps/icu-small/source/common/ucnv2022.cpp b/deps/icu-small/source/common/ucnv2022.cpp index c3bcafb4bfcac8..d1d947f93c4ac3 100644 --- a/deps/icu-small/source/common/ucnv2022.cpp +++ b/deps/icu-small/source/common/ucnv2022.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2016, International Business Machines @@ -223,10 +225,10 @@ typedef struct{ /* ISO-2022 ----------------------------------------------------------------- */ /*Forward declaration */ -U_CFUNC void +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs * args, UErrorCode * err); -U_CFUNC void +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs * args, UErrorCode * err); @@ -383,26 +385,31 @@ typedef enum{ } Variant2022; /*********** ISO 2022 Converter Protos ***********/ -static void +static void U_CALLCONV _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode); -static void +static void U_CALLCONV _ISO2022Close(UConverter *converter); -static void +static void U_CALLCONV _ISO2022Reset(UConverter *converter, UConverterResetChoice choice); -static const char* +U_CDECL_BEGIN +static const char * U_CALLCONV _ISO2022getName(const UConverter* cnv); +U_CDECL_END -static void +static void U_CALLCONV _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err); -static UConverter * +U_CDECL_BEGIN +static UConverter * U_CALLCONV _ISO_2022_SafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status); +U_CDECL_END + #ifdef U_ENABLE_GENERIC_ISO_2022 -static void +static void U_CALLCONV T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, UErrorCode* err); #endif @@ -468,7 +475,7 @@ setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConv } } -static void +static void U_CALLCONV _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ char myLocale[6]={' ',' ',' ',' ',' ',' '}; @@ -646,7 +653,7 @@ _ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ } -static void +static void U_CALLCONV _ISO2022Close(UConverter *converter) { UConverterDataISO2022* myData =(UConverterDataISO2022 *) (converter->extraInfo); UConverterSharedData **array = myData->myConverterArray; @@ -669,7 +676,7 @@ _ISO2022Close(UConverter *converter) { } } -static void +static void U_CALLCONV _ISO2022Reset(UConverter *converter, UConverterResetChoice choice) { UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) (converter->extraInfo); if(choice<=UCNV_RESET_TO_UNICODE) { @@ -714,7 +721,9 @@ _ISO2022Reset(UConverter *converter, UConverterResetChoice choice) { } } -static const char* +U_CDECL_BEGIN + +static const char * U_CALLCONV _ISO2022getName(const UConverter* cnv){ if(cnv->extraInfo){ UConverterDataISO2022* myData= (UConverterDataISO2022*)cnv->extraInfo; @@ -723,6 +732,8 @@ _ISO2022getName(const UConverter* cnv){ return NULL; } +U_CDECL_END + /*************** to unicode *******************/ /**************************************************************************** @@ -1243,7 +1254,7 @@ _2022ToGR94DBCS(uint32_t value) { * */ -static void +static void U_CALLCONV T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, UErrorCode* err){ const char* mySourceLimit, *realSourceLimit; @@ -1649,7 +1660,7 @@ static const uint16_t hwkana_fb[HWKANA_END - HWKANA_START + 1] = { 0x212C /* U+FF9F */ }; -static void +static void U_CALLCONV UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err) { UConverter *cnv = args->converter; UConverterDataISO2022 *converterData; @@ -2066,7 +2077,7 @@ UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /*************** to unicode *******************/ -static void +static void U_CALLCONV UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[2]; @@ -2318,7 +2329,7 @@ UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, * ii) There are only 2 shifting sequences SO to shift into double byte mode * and SI to shift into single byte mode */ -static void +static void U_CALLCONV UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args, UErrorCode* err){ UConverter* saveConv = args->converter; @@ -2342,7 +2353,7 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args->converter=saveConv; } -static void +static void U_CALLCONV UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){ const UChar *source = args->source; @@ -2561,7 +2572,7 @@ UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args /************************ To Unicode ***************************************/ -static void +static void U_CALLCONV UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args, UErrorCode* err){ char const* sourceStart; @@ -2659,7 +2670,7 @@ UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args } } -static void +static void U_CALLCONV UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[2]; @@ -2901,7 +2912,7 @@ static const char* const escSeqCharsCN[10] ={ CNS_11643_1992_Plane_7_STR }; -static void +static void U_CALLCONV UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){ UConverter *cnv = args->converter; UConverterDataISO2022 *converterData; @@ -3252,7 +3263,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args } -static void +static void U_CALLCONV UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[3]; @@ -3454,7 +3465,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } #endif /* #if !UCONFIG_ONLY_HTML_CONVERSION */ -static void +static void U_CALLCONV _ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { UConverter *cnv = args->converter; UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo; @@ -3578,7 +3589,9 @@ struct cloneStruct }; -static UConverter * +U_CDECL_BEGIN + +static UConverter * U_CALLCONV _ISO_2022_SafeClone( const UConverter *cnv, void *stackBuffer, @@ -3625,7 +3638,9 @@ _ISO_2022_SafeClone( return &localClone->cnv; } -static void +U_CDECL_END + +static void U_CALLCONV _ISO_2022_GetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index 6deb61d2717d8d..bfbb45a7d1c911 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/common/ucnv_bld.h b/deps/icu-small/source/common/ucnv_bld.h index d95f49228e9277..aeb858c9d50cba 100644 --- a/deps/icu-small/source/common/ucnv_bld.h +++ b/deps/icu-small/source/common/ucnv_bld.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2015 International Business Machines diff --git a/deps/icu-small/source/common/ucnv_cb.c b/deps/icu-small/source/common/ucnv_cb.c index fa34b65832726c..0c9cc2459f1844 100644 --- a/deps/icu-small/source/common/ucnv_cb.c +++ b/deps/icu-small/source/common/ucnv_cb.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2006, International Business Machines diff --git a/deps/icu-small/source/common/ucnv_cnv.c b/deps/icu-small/source/common/ucnv_cnv.c index f8e2f830f91a9b..01f84829dd3f7d 100644 --- a/deps/icu-small/source/common/ucnv_cnv.c +++ b/deps/icu-small/source/common/ucnv_cnv.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnv_cnv.h b/deps/icu-small/source/common/ucnv_cnv.h index 67536c80452771..48978130775a36 100644 --- a/deps/icu-small/source/common/ucnv_cnv.h +++ b/deps/icu-small/source/common/ucnv_cnv.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/common/ucnv_ct.c b/deps/icu-small/source/common/ucnv_ct.c index 91d66e12ef6cbe..f76919c4a54f30 100644 --- a/deps/icu-small/source/common/ucnv_ct.c +++ b/deps/icu-small/source/common/ucnv_ct.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2010-2015, International Business Machines diff --git a/deps/icu-small/source/common/ucnv_err.c b/deps/icu-small/source/common/ucnv_err.c index ea588f6153bb98..449b162152e61e 100644 --- a/deps/icu-small/source/common/ucnv_err.c +++ b/deps/icu-small/source/common/ucnv_err.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * diff --git a/deps/icu-small/source/common/ucnv_ext.cpp b/deps/icu-small/source/common/ucnv_ext.cpp index 0c43693b357547..f8605187240159 100644 --- a/deps/icu-small/source/common/ucnv_ext.cpp +++ b/deps/icu-small/source/common/ucnv_ext.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -883,7 +885,7 @@ ucnv_extContinueMatchFromU(UConverter *cnv, } else { /* the match did not use all of preFromU[] - keep the rest for replay */ int32_t length=cnv->preFromULength-match; - uprv_memmove(cnv->preFromU, cnv->preFromU+match, length*U_SIZEOF_UCHAR); + u_memmove(cnv->preFromU, cnv->preFromU+match, length); cnv->preFromULength=(int8_t)-length; } diff --git a/deps/icu-small/source/common/ucnv_ext.h b/deps/icu-small/source/common/ucnv_ext.h index 69e0523cb0e2b8..e2ce7fa07293c4 100644 --- a/deps/icu-small/source/common/ucnv_ext.h +++ b/deps/icu-small/source/common/ucnv_ext.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnv_imp.h b/deps/icu-small/source/common/ucnv_imp.h index 27c373a98f5e9c..81aa80fd272409 100644 --- a/deps/icu-small/source/common/ucnv_imp.h +++ b/deps/icu-small/source/common/ucnv_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/common/ucnv_io.cpp b/deps/icu-small/source/common/ucnv_io.cpp index 50ffd5843d92fa..eaa08e47cd82cc 100644 --- a/deps/icu-small/source/common/ucnv_io.cpp +++ b/deps/icu-small/source/common/ucnv_io.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -379,8 +381,9 @@ static const uint8_t ebcdicTypes[128] = { # error U_CHARSET_FAMILY is not valid #endif + /* @see ucnv_compareNames */ -U_CFUNC char * U_EXPORT2 +U_CAPI char * U_CALLCONV ucnv_io_stripASCIIForCompare(char *dst, const char *name) { char *dstItr = dst; uint8_t type, nextType; @@ -415,7 +418,7 @@ ucnv_io_stripASCIIForCompare(char *dst, const char *name) { return dst; } -U_CFUNC char * U_EXPORT2 +U_CAPI char * U_CALLCONV ucnv_io_stripEBCDICForCompare(char *dst, const char *name) { char *dstItr = dst; uint8_t type, nextType; @@ -731,9 +734,7 @@ findTaggedConverterNum(const char *alias, const char *standard, UErrorCode *pErr return UINT32_MAX; } - - -U_CFUNC const char * +U_CAPI const char * ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode) { const char *aliasTmp = alias; int32_t i = 0; @@ -764,6 +765,9 @@ ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *p return NULL; } +U_CDECL_BEGIN + + static int32_t U_CALLCONV ucnv_io_countStandardAliases(UEnumeration *enumerator, UErrorCode * /*pErrorCode*/) { int32_t value = 0; @@ -776,7 +780,7 @@ ucnv_io_countStandardAliases(UEnumeration *enumerator, UErrorCode * /*pErrorCode return value; } -static const char* U_CALLCONV +static const char * U_CALLCONV ucnv_io_nextStandardAliases(UEnumeration *enumerator, int32_t* resultLength, UErrorCode * /*pErrorCode*/) @@ -814,6 +818,8 @@ ucnv_io_closeUEnumeration(UEnumeration *enumerator) { uprv_free(enumerator); } +U_CDECL_END + /* Enumerate the aliases for the specified converter and standard tag */ static const UEnumeration gEnumAliases = { NULL, @@ -1010,12 +1016,15 @@ ucnv_getCanonicalName(const char *alias, const char *standard, UErrorCode *pErro return NULL; } +U_CDECL_BEGIN + + static int32_t U_CALLCONV ucnv_io_countAllConverters(UEnumeration * /*enumerator*/, UErrorCode * /*pErrorCode*/) { return gMainTable.converterListSize; } -static const char* U_CALLCONV +static const char * U_CALLCONV ucnv_io_nextAllConverters(UEnumeration *enumerator, int32_t* resultLength, UErrorCode * /*pErrorCode*/) @@ -1040,7 +1049,7 @@ static void U_CALLCONV ucnv_io_resetAllConverters(UEnumeration *enumerator, UErrorCode * /*pErrorCode*/) { *((uint16_t *)(enumerator->context)) = 0; } - +U_CDECL_END static const UEnumeration gEnumAllConverters = { NULL, NULL, @@ -1075,7 +1084,7 @@ ucnv_openAllNames(UErrorCode *pErrorCode) { return myEnum; } -U_CFUNC uint16_t +U_CAPI uint16_t ucnv_io_countKnownConverters(UErrorCode *pErrorCode) { if (haveAliasData(pErrorCode)) { return (uint16_t)gMainTable.converterListSize; @@ -1085,7 +1094,11 @@ ucnv_io_countKnownConverters(UErrorCode *pErrorCode) { /* alias table swapping ----------------------------------------------------- */ +U_CDECL_BEGIN + typedef char * U_CALLCONV StripForCompareFn(char *dst, const char *name); +U_CDECL_END + /* * row of a temporary array @@ -1109,7 +1122,7 @@ enum { STACK_ROW_CAPACITY=500 }; -static int32_t +static int32_t U_CALLCONV io_compareRows(const void *context, const void *left, const void *right) { char strippedLeft[UCNV_MAX_CONVERTER_NAME_LENGTH], strippedRight[UCNV_MAX_CONVERTER_NAME_LENGTH]; @@ -1297,13 +1310,13 @@ ucnv_swapAliases(const UDataSwapper *ds, oldIndex=tempTable.rows[i].sortIndex; ds->swapArray16(ds, p+oldIndex, 2, r+i, pErrorCode); } - uprv_memcpy(q, r, 2*count); + uprv_memcpy(q, r, 2*(size_t)count); for(i=0; iswapArray16(ds, p2+oldIndex, 2, r+i, pErrorCode); } - uprv_memcpy(q2, r, 2*count); + uprv_memcpy(q2, r, 2*(size_t)count); } } diff --git a/deps/icu-small/source/common/ucnv_io.h b/deps/icu-small/source/common/ucnv_io.h index 060ffd05953db4..8b3585786d3238 100644 --- a/deps/icu-small/source/common/ucnv_io.h +++ b/deps/icu-small/source/common/ucnv_io.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2006, International Business Machines @@ -75,10 +77,10 @@ typedef struct UConverterAlias { # error U_CHARSET_FAMILY is not valid #endif -U_CAPI char * U_EXPORT2 +U_CAPI char * U_CALLCONV ucnv_io_stripASCIIForCompare(char *dst, const char *name); -U_CAPI char * U_EXPORT2 +U_CAPI char * U_CALLCONV ucnv_io_stripEBCDICForCompare(char *dst, const char *name); /** @@ -91,7 +93,7 @@ ucnv_io_stripEBCDICForCompare(char *dst, const char *name); * @param pErrorCode The error code * @return the converter name in mixed-case, return NULL if the alias is not found. */ -U_CFUNC const char * +U_CAPI const char * ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *pErrorCode); /** @@ -99,7 +101,7 @@ ucnv_io_getConverterName(const char *alias, UBool *containsOption, UErrorCode *p * @param pErrorCode The error code * @return the number of all aliases */ -U_CFUNC uint16_t +U_CAPI uint16_t ucnv_io_countKnownConverters(UErrorCode *pErrorCode); /** diff --git a/deps/icu-small/source/common/ucnv_lmb.c b/deps/icu-small/source/common/ucnv_lmb.c index 0879eecb081cd6..e595f931a08c09 100644 --- a/deps/icu-small/source/common/ucnv_lmb.c +++ b/deps/icu-small/source/common/ucnv_lmb.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2016, International Business Machines diff --git a/deps/icu-small/source/common/ucnv_set.c b/deps/icu-small/source/common/ucnv_set.c index 3d8d392729176d..c3933ab6109cbf 100644 --- a/deps/icu-small/source/common/ucnv_set.c +++ b/deps/icu-small/source/common/ucnv_set.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ucnv_u16.c b/deps/icu-small/source/common/ucnv_u16.c index 888b69aa45b60a..d8f4576f33763f 100644 --- a/deps/icu-small/source/common/ucnv_u16.c +++ b/deps/icu-small/source/common/ucnv_u16.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2015, International Business Machines @@ -621,7 +623,10 @@ static const UConverterImpl _UTF16BEImpl={ _UTF16BEGetName, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; static const UConverterStaticData _UTF16BEStaticData={ @@ -1217,7 +1222,10 @@ static const UConverterImpl _UTF16LEImpl={ _UTF16LEGetName, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; @@ -1486,7 +1494,10 @@ static const UConverterImpl _UTF16Impl = { _UTF16GetName, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; static const UConverterStaticData _UTF16StaticData = { @@ -1528,7 +1539,10 @@ static const UConverterImpl _UTF16v2Impl = { _UTF16GetName, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; static const UConverterStaticData _UTF16v2StaticData = { diff --git a/deps/icu-small/source/common/ucnv_u32.c b/deps/icu-small/source/common/ucnv_u32.c index fe4ea102830ad3..fa74b85c93c3b8 100644 --- a/deps/icu-small/source/common/ucnv_u32.c +++ b/deps/icu-small/source/common/ucnv_u32.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2015, International Business Machines @@ -480,7 +482,10 @@ static const UConverterImpl _UTF32BEImpl = { NULL, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; /* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ @@ -972,7 +977,10 @@ static const UConverterImpl _UTF32LEImpl = { NULL, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; /* The 1232 CCSID refers to any version of Unicode with any endianess of UTF-32 */ @@ -1214,7 +1222,10 @@ static const UConverterImpl _UTF32Impl = { NULL, NULL, NULL, - ucnv_getNonSurrogateUnicodeSet + ucnv_getNonSurrogateUnicodeSet, + + NULL, + NULL }; /* The 1236 CCSID refers to any version of Unicode with a BOM sensitive endianess of UTF-32 */ diff --git a/deps/icu-small/source/common/ucnv_u7.c b/deps/icu-small/source/common/ucnv_u7.c index 448c43e2dc32d0..3c1d240ed89d6d 100644 --- a/deps/icu-small/source/common/ucnv_u7.c +++ b/deps/icu-small/source/common/ucnv_u7.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2016, International Business Machines @@ -760,7 +762,10 @@ static const UConverterImpl _UTF7Impl={ _UTF7GetName, NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ NULL, - ucnv_getCompleteUnicodeSet + ucnv_getCompleteUnicodeSet, + + NULL, + NULL }; static const UConverterStaticData _UTF7StaticData={ diff --git a/deps/icu-small/source/common/ucnv_u8.c b/deps/icu-small/source/common/ucnv_u8.c index 88b4f5d05aa748..ff73993bd629ef 100644 --- a/deps/icu-small/source/common/ucnv_u8.c +++ b/deps/icu-small/source/common/ucnv_u8.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2016, International Business Machines @@ -1072,7 +1074,10 @@ static const UConverterImpl _CESU8Impl={ NULL, NULL, NULL, - ucnv_getCompleteUnicodeSet + ucnv_getCompleteUnicodeSet, + + NULL, + NULL }; static const UConverterStaticData _CESU8StaticData={ diff --git a/deps/icu-small/source/common/ucnvbocu.cpp b/deps/icu-small/source/common/ucnvbocu.cpp index 2b97c02c318eba..69763ca32136af 100644 --- a/deps/icu-small/source/common/ucnvbocu.cpp +++ b/deps/icu-small/source/common/ucnvbocu.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -386,7 +388,7 @@ packDiff(int32_t diff) { } -static void +static void U_CALLCONV _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -647,7 +649,7 @@ _Bocu1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, * re-copy the original function and remove the variables * offsets, sourceIndex, and nextSourceIndex. */ -static void +static void U_CALLCONV _Bocu1FromUnicode(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -950,7 +952,7 @@ decodeBocu1TrailByte(int32_t count, int32_t b) { } } -static void +static void U_CALLCONV _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1173,7 +1175,7 @@ _Bocu1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * re-copy the original function and remove the variables * offsets, sourceIndex, and nextSourceIndex. */ -static void +static void U_CALLCONV _Bocu1ToUnicode(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; diff --git a/deps/icu-small/source/common/ucnvdisp.c b/deps/icu-small/source/common/ucnvdisp.c index 4075be66da7645..e30f665f4a08e3 100644 --- a/deps/icu-small/source/common/ucnvdisp.c +++ b/deps/icu-small/source/common/ucnvdisp.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnvhz.c b/deps/icu-small/source/common/ucnvhz.c index 56b7ecf666e422..dc5785b2adc1f0 100644 --- a/deps/icu-small/source/common/ucnvhz.c +++ b/deps/icu-small/source/common/ucnvhz.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2015, International Business Machines diff --git a/deps/icu-small/source/common/ucnvisci.c b/deps/icu-small/source/common/ucnvisci.c index c0106f9800de5e..8b509153514eca 100644 --- a/deps/icu-small/source/common/ucnvisci.c +++ b/deps/icu-small/source/common/ucnvisci.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2016, International Business Machines diff --git a/deps/icu-small/source/common/ucnvlat1.c b/deps/icu-small/source/common/ucnvlat1.c index 30ebbeff37609b..fe11b1844c4613 100644 --- a/deps/icu-small/source/common/ucnvlat1.c +++ b/deps/icu-small/source/common/ucnvlat1.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2015, International Business Machines diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index a3b10744532cf5..0b598dbc34c256 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -375,53 +377,55 @@ typedef UBool U_CALLCONV UConverterEnumToUCallback(const void *context, uint32_t value, UChar32 codePoints[32]); -static void +static void U_CALLCONV ucnv_MBCSLoad(UConverterSharedData *sharedData, UConverterLoadArgs *pArgs, const uint8_t *raw, UErrorCode *pErrorCode); -static void +static void U_CALLCONV ucnv_MBCSUnload(UConverterSharedData *sharedData); -static void +static void U_CALLCONV ucnv_MBCSOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode); -static UChar32 +static UChar32 U_CALLCONV ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode); -static void +static void U_CALLCONV ucnv_MBCSGetStarters(const UConverter* cnv, UBool starters[256], UErrorCode *pErrorCode); -static const char * +U_CDECL_BEGIN +static const char* U_CALLCONV ucnv_MBCSGetName(const UConverter *cnv); +U_CDECL_END -static void +static void U_CALLCONV ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, int32_t offsetIndex, UErrorCode *pErrorCode); -static UChar32 +static UChar32 U_CALLCONV ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode); -static void +static void U_CALLCONV ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode); -static void +static void U_CALLCONV ucnv_MBCSGetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode); -static void +static void U_CALLCONV ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode); @@ -503,7 +507,6 @@ static const UConverterImpl _MBCSImpl={ NULL }; - /* Static data is in tools/makeconv/ucnvstat.c for data-based * converters. Be sure to update it as well. */ @@ -1067,7 +1070,7 @@ ucnv_MBCSGetUnicodeSetForUnicode(const UConverterSharedData *sharedData, pErrorCode); } -static void +static void U_CALLCONV ucnv_MBCSGetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, @@ -1547,7 +1550,7 @@ reconstituteData(UConverterMBCSTable *mbcsTable, /* MBCS setup functions ----------------------------------------------------- */ -static void +static void U_CALLCONV ucnv_MBCSLoad(UConverterSharedData *sharedData, UConverterLoadArgs *pArgs, const uint8_t *raw, @@ -1872,7 +1875,7 @@ ucnv_MBCSLoad(UConverterSharedData *sharedData, } } -static void +static void U_CALLCONV ucnv_MBCSUnload(UConverterSharedData *sharedData) { UConverterMBCSTable *mbcsTable=&sharedData->mbcs; @@ -1890,7 +1893,7 @@ ucnv_MBCSUnload(UConverterSharedData *sharedData) { } } -static void +static void U_CALLCONV ucnv_MBCSOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { @@ -1981,7 +1984,9 @@ ucnv_MBCSOpen(UConverter *cnv, #endif } -static const char * +U_CDECL_BEGIN + +static const char* U_CALLCONV ucnv_MBCSGetName(const UConverter *cnv) { if((cnv->options&UCNV_OPTION_SWAP_LFNL)!=0 && cnv->sharedData->mbcs.swapLFNLName!=NULL) { return cnv->sharedData->mbcs.swapLFNLName; @@ -1989,10 +1994,12 @@ ucnv_MBCSGetName(const UConverter *cnv) { return cnv->sharedData->staticData->name; } } +U_CDECL_END + /* MBCS-to-Unicode conversion functions ------------------------------------- */ -static UChar32 +static UChar32 U_CALLCONV ucnv_MBCSGetFallback(UConverterMBCSTable *mbcsTable, uint32_t offset) { const _MBCSToUFallback *toUFallbacks; uint32_t i, start, limit; @@ -2955,7 +2962,7 @@ ucnv_MBCSSingleGetNextUChar(UConverterToUnicodeArgs *pArgs, * * All normal mappings and errors are handled here. */ -static UChar32 +static UChar32 U_CALLCONV ucnv_MBCSGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -5012,7 +5019,7 @@ utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; static const UChar32 utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; -static void +static void U_CALLCONV ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode) { @@ -5318,7 +5325,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, pFromUArgs->target=(char *)target; } -static void +static void U_CALLCONV ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode) { @@ -5630,7 +5637,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* miscellaneous ------------------------------------------------------------ */ -static void +static void U_CALLCONV ucnv_MBCSGetStarters(const UConverter* cnv, UBool starters[256], UErrorCode *) { @@ -5653,7 +5660,7 @@ ucnv_MBCSIsLeadByte(UConverterSharedData *sharedData, char byte) { return (UBool)MBCS_ENTRY_IS_TRANSITION(sharedData->mbcs.stateTable[0][(uint8_t)byte]); } -static void +static void U_CALLCONV ucnv_MBCSWriteSub(UConverterFromUnicodeArgs *pArgs, int32_t offsetIndex, UErrorCode *pErrorCode) { diff --git a/deps/icu-small/source/common/ucnvmbcs.h b/deps/icu-small/source/common/ucnvmbcs.h index df87bae16cff89..12d50b545cc67c 100644 --- a/deps/icu-small/source/common/ucnvmbcs.h +++ b/deps/icu-small/source/common/ucnvmbcs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnvscsu.c b/deps/icu-small/source/common/ucnvscsu.c index 36e33bde183a78..4228b44e7fb1e1 100644 --- a/deps/icu-small/source/common/ucnvscsu.c +++ b/deps/icu-small/source/common/ucnvscsu.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/ucnvsel.cpp b/deps/icu-small/source/common/ucnvsel.cpp index 353152a3f0f197..f6384cf7497297 100644 --- a/deps/icu-small/source/common/ucnvsel.cpp +++ b/deps/icu-small/source/common/ucnvsel.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ucol_data.h b/deps/icu-small/source/common/ucol_data.h index 023064624c6d82..cdd328eccabed7 100644 --- a/deps/icu-small/source/common/ucol_data.h +++ b/deps/icu-small/source/common/ucol_data.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2000-2011, International Business Machines diff --git a/deps/icu-small/source/common/ucol_swp.cpp b/deps/icu-small/source/common/ucol_swp.cpp index ab6ac7495ad12a..ddec0ec1c673b1 100644 --- a/deps/icu-small/source/common/ucol_swp.cpp +++ b/deps/icu-small/source/common/ucol_swp.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ucol_swp.h b/deps/icu-small/source/common/ucol_swp.h index 855b40419dac5e..422436dd30717d 100644 --- a/deps/icu-small/source/common/ucol_swp.h +++ b/deps/icu-small/source/common/ucol_swp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 4385db51ce0e69..41fd8aa212a174 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2016, International Business Machines @@ -117,7 +119,7 @@ U_NAMESPACE_BEGIN // EquivIterator iterates over all strings that are equivalent to a given // string, s. Note that EquivIterator will never yield s itself. -class EquivIterator : icu::UMemory { +class EquivIterator : public icu::UMemory { public: // Constructor. hash stores the equivalence relationships; s is the string // for which we find equivalent strings. @@ -414,7 +416,7 @@ struct CReg : public icu::UMemory { } uprv_strncpy(id, _id, len); id[len] = 0; - uprv_memcpy(iso, _iso, ISO_CURRENCY_CODE_LENGTH * sizeof(const UChar)); + u_memcpy(iso, _iso, ISO_CURRENCY_CODE_LENGTH); iso[ISO_CURRENCY_CODE_LENGTH] = 0; } @@ -938,7 +940,7 @@ toUpperCase(const UChar* source, int32_t len, const char* locale) { dest = (UChar*)uprv_malloc(sizeof(UChar) * MAX(destLen, len)); u_strToUpper(dest, destLen, source, len, locale, &ec); if (U_FAILURE(ec)) { - uprv_memcpy(dest, source, sizeof(UChar) * len); + u_memcpy(dest, source, len); } return dest; } @@ -1023,7 +1025,8 @@ collectCurrencyNames(const char* locale, (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = len; // Add equivalent symbols if (currencySymbolsEquiv != NULL) { - icu::EquivIterator iter(*currencySymbolsEquiv, UnicodeString(TRUE, s, len)); + UnicodeString str(TRUE, s, len); + icu::EquivIterator iter(*currencySymbolsEquiv, str); const UnicodeString *symbol; while ((symbol = iter.next()) != NULL) { (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; diff --git a/deps/icu-small/source/common/ucurrimp.h b/deps/icu-small/source/common/ucurrimp.h index 9f5f2e3608f120..b35d6f47c62583 100644 --- a/deps/icu-small/source/common/ucurrimp.h +++ b/deps/icu-small/source/common/ucurrimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2016, International Business Machines diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index b48ff4f8066e9d..7585855171673b 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -1,7 +1,9 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * -* Copyright (C) 1999-2015, International Business Machines +* Copyright (C) 1999-2016, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -77,7 +79,7 @@ U_NAMESPACE_USE /* * Forward declarations */ -static UDataMemory *udata_findCachedData(const char *path); +static UDataMemory *udata_findCachedData(const char *path, UErrorCode &err); /*********************************************************************** * @@ -132,13 +134,13 @@ udata_cleanup(void) } static UBool U_CALLCONV -findCommonICUDataByName(const char *inBasename) +findCommonICUDataByName(const char *inBasename, UErrorCode &err) { UBool found = FALSE; int32_t i; - UDataMemory *pData = udata_findCachedData(inBasename); - if (pData == NULL) + UDataMemory *pData = udata_findCachedData(inBasename, err); + if (U_FAILURE(err) || pData == NULL) return FALSE; { @@ -268,40 +270,41 @@ static void U_CALLCONV DataCacheElement_deleter(void *pDCEl) { uprv_free(pDCEl); /* delete 'this' */ } -static void udata_initHashTable() { - UErrorCode err = U_ZERO_ERROR; +static void U_CALLCONV udata_initHashTable(UErrorCode &err) { U_ASSERT(gCommonDataCache == NULL); gCommonDataCache = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &err); if (U_FAILURE(err)) { - // TODO: handle errors better. - gCommonDataCache = NULL; - } - if (gCommonDataCache != NULL) { - uhash_setValueDeleter(gCommonDataCache, DataCacheElement_deleter); - ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup); + return; } + U_ASSERT(gCommonDataCache != NULL); + uhash_setValueDeleter(gCommonDataCache, DataCacheElement_deleter); + ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup); } /* udata_getCacheHashTable() * Get the hash table used to store the data cache entries. * Lazy create it if it doesn't yet exist. */ -static UHashtable *udata_getHashTable() { - umtx_initOnce(gCommonDataCacheInitOnce, &udata_initHashTable); +static UHashtable *udata_getHashTable(UErrorCode &err) { + umtx_initOnce(gCommonDataCacheInitOnce, &udata_initHashTable, err); return gCommonDataCache; } -static UDataMemory *udata_findCachedData(const char *path) +static UDataMemory *udata_findCachedData(const char *path, UErrorCode &err) { UHashtable *htable; UDataMemory *retVal = NULL; DataCacheElement *el; const char *baseName; + htable = udata_getHashTable(err); + if (U_FAILURE(err)) { + return NULL; + } + baseName = findBasename(path); /* Cache remembers only the base name, not the full path. */ - htable = udata_getHashTable(); umtx_lock(NULL); el = (DataCacheElement *)uhash_get(htable, baseName); umtx_unlock(NULL); @@ -323,6 +326,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr DataCacheElement *oldValue = NULL; UErrorCode subErr = U_ZERO_ERROR; + htable = udata_getHashTable(*pErr); if (U_FAILURE(*pErr)) { return NULL; } @@ -355,7 +359,6 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr /* Stick the new DataCacheElement into the hash table. */ - htable = udata_getHashTable(); umtx_lock(NULL); oldValue = (DataCacheElement *)uhash_get(htable, path); if (oldValue != NULL) { @@ -393,9 +396,6 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr * * *----------------------------------------------------------------------*/ -#define U_DATA_PATHITER_BUFSIZ 128 /* Size of local buffer for paths */ - /* Overflow causes malloc of larger buf */ - U_NAMESPACE_BEGIN class UDataPathIterator @@ -717,18 +717,18 @@ openCommonData(const char *path, /* Path from OpenChoice? */ #ifdef UDATA_DEBUG fprintf(stderr, "ocd: no basename in %s, bailing.\n", path); #endif - *pErrorCode=U_FILE_ACCESS_ERROR; + if (U_SUCCESS(*pErrorCode)) { + *pErrorCode=U_FILE_ACCESS_ERROR; + } return NULL; } /* Is the requested common data file already open and cached? */ /* Note that the cache is keyed by the base name only. The rest of the path, */ /* if any, is not considered. */ - { - UDataMemory *dataToReturn = udata_findCachedData(inBasename); - if (dataToReturn != NULL) { - return dataToReturn; - } + UDataMemory *dataToReturn = udata_findCachedData(inBasename, *pErrorCode); + if (dataToReturn != NULL || U_FAILURE(*pErrorCode)) { + return dataToReturn; } /* Requested item is not in the cache. @@ -759,6 +759,9 @@ openCommonData(const char *path, /* Path from OpenChoice? */ } #endif + if (U_FAILURE(*pErrorCode)) { + return NULL; + } if (!UDataMemory_isLoaded(&tData)) { /* no common data */ *pErrorCode=U_FILE_ACCESS_ERROR; @@ -834,7 +837,7 @@ static UBool extendICUData(UErrorCode *pErr) umtx_storeRelease(gHaveTriedToLoadCommonData, 1); } - didUpdate = findCommonICUDataByName(U_ICUDATA_NAME); /* Return 'true' when a racing writes out the extended */ + didUpdate = findCommonICUDataByName(U_ICUDATA_NAME, *pErr); /* Return 'true' when a racing writes out the extended */ /* data after another thread has failed to see it (in openCommonData), so */ /* extended data can be examined. */ /* Also handles a race through here before gHaveTriedToLoadCommonData is set. */ @@ -1255,7 +1258,7 @@ doOpenChoice(const char *path, const char *type, const char *name, dataPath = u_getDataDirectory(); /**** Time zone individual files override */ - if (isTimeZoneFile(name, type) && isICUData) { + if (isICUData && isTimeZoneFile(name, type)) { const char *tzFilesDir = u_getTimeZoneFilesDirectory(pErrorCode); if (tzFilesDir[0] != 0) { #ifdef UDATA_DEBUG diff --git a/deps/icu-small/source/common/udatamem.c b/deps/icu-small/source/common/udatamem.c index ec6175d9857917..daa919373b71bb 100644 --- a/deps/icu-small/source/common/udatamem.c +++ b/deps/icu-small/source/common/udatamem.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/udatamem.h b/deps/icu-small/source/common/udatamem.h index 51372851f65173..385a77722cc87f 100644 --- a/deps/icu-small/source/common/udatamem.h +++ b/deps/icu-small/source/common/udatamem.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/udataswp.c b/deps/icu-small/source/common/udataswp.c index 06fe85bc463c0d..f47ac1f5e06f35 100644 --- a/deps/icu-small/source/common/udataswp.c +++ b/deps/icu-small/source/common/udataswp.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -298,7 +300,7 @@ udata_swapDataHeader(const UDataSwapper *ds, /* check minimum length and magic bytes */ pHeader=(const DataHeader *)inData; - if( (length>=0 && length=0 && length<(int32_t)sizeof(DataHeader)) || pHeader->dataHeader.magic1!=0xda || pHeader->dataHeader.magic2!=0x27 || pHeader->info.sizeofUChar!=2 @@ -425,7 +427,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, return NULL; } if( data==NULL || - (length>=0 && length=0 && length<(int32_t)sizeof(DataHeader)) || outCharset>U_EBCDIC_FAMILY ) { *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; diff --git a/deps/icu-small/source/common/udataswp.h b/deps/icu-small/source/common/udataswp.h index 66c84955676708..07e06c221a7075 100644 --- a/deps/icu-small/source/common/udataswp.h +++ b/deps/icu-small/source/common/udataswp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -318,6 +320,20 @@ uprv_compareInvEbcdic(const UDataSwapper *ds, const char *outString, int32_t outLength, const UChar *localString, int32_t localLength); +/** + * \def uprv_compareInvWithUChar + * Compare an invariant-character strings with a UChar string + * @internal + */ +#if U_CHARSET_FAMILY==U_ASCII_FAMILY +# define uprv_compareInvWithUChar uprv_compareInvAscii +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY +# define uprv_compareInvWithUChar uprv_compareInvEbcdic +#else +# error Unknown charset family! +#endif + + /* material... -------------------------------------------------------------- */ #if 0 diff --git a/deps/icu-small/source/common/uelement.h b/deps/icu-small/source/common/uelement.h index 5a6d723b192a95..9231f40ba1e8f2 100644 --- a/deps/icu-small/source/common/uelement.h +++ b/deps/icu-small/source/common/uelement.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2011, International Business Machines diff --git a/deps/icu-small/source/common/uenum.c b/deps/icu-small/source/common/uenum.c index 3ee8771040aaf1..4854b377c90872 100644 --- a/deps/icu-small/source/common/uenum.c +++ b/deps/icu-small/source/common/uenum.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uenumimp.h b/deps/icu-small/source/common/uenumimp.h index dd704b3f970221..04baac5dd13a34 100644 --- a/deps/icu-small/source/common/uenumimp.h +++ b/deps/icu-small/source/common/uenumimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uhash.c b/deps/icu-small/source/common/uhash.c index 9b6f446f1c07df..02572c80ea9f3b 100644 --- a/deps/icu-small/source/common/uhash.c +++ b/deps/icu-small/source/common/uhash.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2016, International Business Machines diff --git a/deps/icu-small/source/common/uhash.h b/deps/icu-small/source/common/uhash.h index e8f38958ac5501..4aa50e40853c81 100644 --- a/deps/icu-small/source/common/uhash.h +++ b/deps/icu-small/source/common/uhash.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines @@ -680,8 +682,8 @@ uhash_equals(const UHashtable* hash1, const UHashtable* hash2); U_NAMESPACE_BEGIN /** - * \class LocalUResourceBundlePointer - * "Smart pointer" class, closes a UResourceBundle via ures_close(). + * \class LocalUHashtablePointer + * "Smart pointer" class, closes a UHashtable via uhash_close(). * For most methods see the LocalPointerBase base class. * * @see LocalPointerBase diff --git a/deps/icu-small/source/common/uhash_us.cpp b/deps/icu-small/source/common/uhash_us.cpp index 71a41cbe29a2be..ac76c1b97821f6 100644 --- a/deps/icu-small/source/common/uhash_us.cpp +++ b/deps/icu-small/source/common/uhash_us.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2011, International Business Machines diff --git a/deps/icu-small/source/common/uidna.cpp b/deps/icu-small/source/common/uidna.cpp index 857c9fc417e863..2f133198491a9a 100644 --- a/deps/icu-small/source/common/uidna.cpp +++ b/deps/icu-small/source/common/uidna.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -316,7 +318,7 @@ _internal_toASCII(const UChar* src, int32_t srcLength, // Step 4: if the source is ASCII then proceed to step 8 if(srcIsASCII){ if(b1Len <= destCapacity){ - uprv_memmove(dest, b1, b1Len * U_SIZEOF_UCHAR); + u_memmove(dest, b1, b1Len); reqLength = b1Len; }else{ reqLength = b1Len; @@ -362,9 +364,9 @@ _internal_toASCII(const UChar* src, int32_t srcLength, goto CLEANUP; } //Step 7: prepend the ACE prefix - uprv_memcpy(dest,ACE_PREFIX,ACE_PREFIX_LENGTH * U_SIZEOF_UCHAR); + u_memcpy(dest, ACE_PREFIX, ACE_PREFIX_LENGTH); //Step 6: copy the contents in b2 into dest - uprv_memcpy(dest+ACE_PREFIX_LENGTH, b2, b2Len * U_SIZEOF_UCHAR); + u_memcpy(dest+ACE_PREFIX_LENGTH, b2, b2Len); }else{ *status = U_IDNA_ACE_PREFIX_ERROR; @@ -541,7 +543,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength, //step 8: return output of step 5 reqLength = b2Len; if(b2Len <= destCapacity) { - uprv_memmove(dest, b2, b2Len * U_SIZEOF_UCHAR); + u_memmove(dest, b2, b2Len); } } else{ @@ -570,7 +572,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength, // just return the source //copy the source to destination if(srcLength <= destCapacity){ - uprv_memmove(dest,src,srcLength * U_SIZEOF_UCHAR); + u_memmove(dest, src, srcLength); } reqLength = srcLength; } @@ -597,7 +599,7 @@ _internal_toUnicode(const UChar* src, int32_t srcLength, if(dest && srcLength <= destCapacity){ // srcLength should have already been set earlier. U_ASSERT(srcLength >= 0); - uprv_memmove(dest,src,srcLength * U_SIZEOF_UCHAR); + u_memmove(dest, src, srcLength); } reqLength = srcLength; *status = U_ZERO_ERROR; diff --git a/deps/icu-small/source/common/uinit.cpp b/deps/icu-small/source/common/uinit.cpp index 901692864b3859..34e82a3db41752 100644 --- a/deps/icu-small/source/common/uinit.cpp +++ b/deps/icu-small/source/common/uinit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2015, International Business Machines diff --git a/deps/icu-small/source/common/uinvchar.c b/deps/icu-small/source/common/uinvchar.c index e0aa41306b1127..f1dbe4fe33e8f9 100644 --- a/deps/icu-small/source/common/uinvchar.c +++ b/deps/icu-small/source/common/uinvchar.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uinvchar.h b/deps/icu-small/source/common/uinvchar.h index 1a9aa78d54e651..19a3b2696e758b 100644 --- a/deps/icu-small/source/common/uinvchar.h +++ b/deps/icu-small/source/common/uinvchar.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uiter.cpp b/deps/icu-small/source/common/uiter.cpp index 2cc76a965fa91c..26ca877814d0e8 100644 --- a/deps/icu-small/source/common/uiter.cpp +++ b/deps/icu-small/source/common/uiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ulist.c b/deps/icu-small/source/common/ulist.c index ea00ac24efd61f..3b8e6c53ed583a 100644 --- a/deps/icu-small/source/common/ulist.c +++ b/deps/icu-small/source/common/ulist.c @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** -* Copyright (C) 2009-2014, International Business Machines +* Copyright (C) 2009-2016, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** */ @@ -63,18 +65,45 @@ static void ulist_addFirstItem(UList *list, UListNode *newItem) { newItem->previous = NULL; list->head = newItem; list->tail = newItem; +} + +static void ulist_removeItem(UList *list, UListNode *p) { + if (p->previous == NULL) { + // p is the list head. + list->head = p->next; + } else { + p->previous->next = p->next; + } + if (p->next == NULL) { + // p is the list tail. + list->tail = p->previous; + } else { + p->next->previous = p->previous; + } + list->curr = NULL; list->currentIndex = 0; + --list->size; + if (p->forceDelete) { + uprv_free(p->data); + } + uprv_free(p); } U_CAPI void U_EXPORT2 ulist_addItemEndList(UList *list, const void *data, UBool forceDelete, UErrorCode *status) { UListNode *newItem = NULL; if (U_FAILURE(*status) || list == NULL || data == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } return; } newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); if (newItem == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } *status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -97,11 +126,17 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo UListNode *newItem = NULL; if (U_FAILURE(*status) || list == NULL || data == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } return; } newItem = (UListNode *)uprv_malloc(sizeof(UListNode)); if (newItem == NULL) { + if (forceDelete) { + uprv_free((void *)data); + } *status = U_MEMORY_ALLOCATION_ERROR; return; } @@ -122,25 +157,31 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo } U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length) { - UBool result = FALSE; - const UListNode *pointer = NULL; - - if (list != NULL && list->size != 0) { - pointer = list->head; - - while (pointer != NULL) { + if (list != NULL) { + const UListNode *pointer; + for (pointer = list->head; pointer != NULL; pointer = pointer->next) { if (length == uprv_strlen(pointer->data)) { if (uprv_memcmp(data, pointer->data, length) == 0) { - result = TRUE; - break; + return TRUE; } } - - pointer = pointer->next; } } + return FALSE; +} - return result; +U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data) { + if (list != NULL) { + UListNode *pointer; + for (pointer = list->head; pointer != NULL; pointer = pointer->next) { + if (uprv_strcmp(data, pointer->data) == 0) { + ulist_removeItem(list, pointer); + // Remove only the first occurrence, like Java LinkedList.remove(Object). + return TRUE; + } + } + } + return FALSE; } U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) { diff --git a/deps/icu-small/source/common/ulist.h b/deps/icu-small/source/common/ulist.h index 4789247e318404..6f292bf9dcaff1 100644 --- a/deps/icu-small/source/common/ulist.h +++ b/deps/icu-small/source/common/ulist.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** -* Copyright (C) 2009, International Business Machines +* Copyright (C) 2009-2016, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** */ @@ -22,6 +24,8 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, int32_t length); +U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data); + U_CAPI void *U_EXPORT2 ulist_getNext(UList *list); U_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list); diff --git a/deps/icu-small/source/common/ulistformatter.cpp b/deps/icu-small/source/common/ulistformatter.cpp index 6931cddfe07c06..98aa50e25fb604 100644 --- a/deps/icu-small/source/common/ulistformatter.cpp +++ b/deps/icu-small/source/common/ulistformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 90c12b4f0d54c4..2a02b27c5ba1f7 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -45,6 +47,8 @@ #include /* for sprintf */ +using namespace icu; + /* ### Declarations **************************************************/ /* Locale stuff from locid.cpp */ @@ -1470,6 +1474,8 @@ typedef struct UKeywordsContext { char* current; } UKeywordsContext; +U_CDECL_BEGIN + static void U_CALLCONV uloc_kw_closeKeywords(UEnumeration *enumerator) { uprv_free(((UKeywordsContext *)enumerator->context)->keywords); @@ -1488,7 +1494,7 @@ uloc_kw_countKeywords(UEnumeration *en, UErrorCode * /*status*/) { return result; } -static const char* U_CALLCONV +static const char * U_CALLCONV uloc_kw_nextKeyword(UEnumeration* en, int32_t* resultLength, UErrorCode* /*status*/) { @@ -1512,6 +1518,9 @@ uloc_kw_resetKeywords(UEnumeration* en, ((UKeywordsContext *)en->context)->current = ((UKeywordsContext *)en->context)->keywords; } +U_CDECL_END + + static const UEnumeration gKeywordsEnum = { NULL, NULL, @@ -2246,7 +2255,7 @@ _uloc_strtod(const char *start, char **end) { typedef struct { float q; int32_t dummy; /* to avoid uninitialized memory copy from qsort */ - char *locale; + char locale[ULOC_FULLNAME_CAPACITY+1]; } _acceptLangItem; static int32_t U_CALLCONV @@ -2288,9 +2297,7 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult UEnumeration* availableLocales, UErrorCode *status) { - _acceptLangItem *j; - _acceptLangItem smallBuffer[30]; - char **strs; + MaybeStackArray<_acceptLangItem, 4> items; // Struct for collecting items. char tmp[ULOC_FULLNAME_CAPACITY +1]; int32_t n = 0; const char *itemEnd; @@ -2300,11 +2307,7 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult int32_t res; int32_t i; int32_t l = (int32_t)uprv_strlen(httpAcceptLanguage); - int32_t jSize; - char *tempstr; /* Use for null pointer check */ - j = smallBuffer; - jSize = UPRV_LENGTHOF(smallBuffer); if(U_FAILURE(*status)) { return -1; } @@ -2332,27 +2335,29 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult while(isspace(*t)) { t++; } - j[n].q = (float)_uloc_strtod(t,NULL); + items[n].q = (float)_uloc_strtod(t,NULL); } else { /* no semicolon - it's 1.0 */ - j[n].q = 1.0f; + items[n].q = 1.0f; paramEnd = itemEnd; } - j[n].dummy=0; + items[n].dummy=0; /* eat spaces prior to semi */ for(t=(paramEnd-1);(paramEnd>s)&&isspace(*t);t--) ; - /* Check for null pointer from uprv_strndup */ - tempstr = uprv_strndup(s,(int32_t)((t+1)-s)); - if (tempstr == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return -1; - } - j[n].locale = tempstr; - uloc_canonicalize(j[n].locale,tmp,UPRV_LENGTHOF(tmp),status); - if(strcmp(j[n].locale,tmp)) { - uprv_free(j[n].locale); - j[n].locale=uprv_strdup(tmp); + int32_t slen = ((t+1)-s); + if(slen > ULOC_FULLNAME_CAPACITY) { + *status = U_BUFFER_OVERFLOW_ERROR; + return -1; // too big + } + uprv_strncpy(items[n].locale, s, slen); + items[n].locale[slen]=0; // terminate + int32_t clen = uloc_canonicalize(items[n].locale, tmp, UPRV_LENGTHOF(tmp)-1, status); + if(U_FAILURE(*status)) return -1; + if((clen!=slen) || (uprv_strncmp(items[n].locale, tmp, slen))) { + // canonicalization had an effect- copy back + uprv_strncpy(items[n].locale, tmp, clen); + items[n].locale[clen] = 0; // terminate } #if defined(ULOC_DEBUG) /*fprintf(stderr,"%d: s <%s> q <%g>\n", n, j[n].locale, j[n].q);*/ @@ -2362,42 +2367,22 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult while(*s==',') { /* eat duplicate commas */ s++; } - if(n>=jSize) { - if(j==smallBuffer) { /* overflowed the small buffer. */ - j = static_cast<_acceptLangItem *>(uprv_malloc(sizeof(j[0])*(jSize*2))); - if(j!=NULL) { - uprv_memcpy(j,smallBuffer,sizeof(j[0])*jSize); - } -#if defined(ULOC_DEBUG) - fprintf(stderr,"malloced at size %d\n", jSize); -#endif - } else { - j = static_cast<_acceptLangItem *>(uprv_realloc(j, sizeof(j[0])*jSize*2)); + if(n>=items.getCapacity()) { // If we need more items + if(NULL == items.resize(items.getCapacity()*2, items.getCapacity())) { + *status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } #if defined(ULOC_DEBUG) - fprintf(stderr,"re-alloced at size %d\n", jSize); + fprintf(stderr,"malloced at size %d\n", items.getCapacity()); #endif - } - jSize *= 2; - if(j==NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - return -1; - } } } - uprv_sortArray(j, n, sizeof(j[0]), uloc_acceptLanguageCompare, NULL, TRUE, status); - if(U_FAILURE(*status)) { - if(j != smallBuffer) { -#if defined(ULOC_DEBUG) - fprintf(stderr,"freeing j %p\n", j); -#endif - uprv_free(j); - } + uprv_sortArray(items.getAlias(), n, sizeof(items[0]), uloc_acceptLanguageCompare, NULL, TRUE, status); + if (U_FAILURE(*status)) { return -1; } - strs = static_cast(uprv_malloc((size_t)(sizeof(strs[0])*n))); - /* Check for null pointer */ - if (strs == NULL) { - uprv_free(j); /* Free to avoid memory leak */ + LocalMemory strs(NULL); + if (strs.allocateInsteadAndReset(n) == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; return -1; } @@ -2405,20 +2390,10 @@ uloc_acceptLanguageFromHTTP(char *result, int32_t resultAvailable, UAcceptResult #if defined(ULOC_DEBUG) /*fprintf(stderr,"%d: s <%s> q <%g>\n", i, j[i].locale, j[i].q);*/ #endif - strs[i]=j[i].locale; + strs[i]=items[i].locale; } res = uloc_acceptLanguage(result, resultAvailable, outResult, - (const char**)strs, n, availableLocales, status); - for(i=0;ikey); } else { cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); + /* Both are u extension keys - we need special handling for 'attribute' */ + if (cmp != 0) { + if (uprv_strcmp(cur->key, LOCALE_ATTRIBUTE_KEY) == 0) { + cmp = 1; + } else if (uprv_strcmp(ext->key, LOCALE_ATTRIBUTE_KEY) == 0) { + cmp = -1; + } + } } } else { cmp = uprv_compareInvCharsAsAscii(ext->key, cur->key); @@ -892,7 +903,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac char buf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; char attrBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY] = { 0 }; int32_t attrBufLength = 0; - UBool isAttribute = FALSE; UEnumeration *keywordEnum = NULL; int32_t reslen = 0; @@ -919,7 +929,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac UBool isBcpUExt; while (TRUE) { - isAttribute = FALSE; key = uenum_next(keywordEnum, NULL, status); if (key == NULL) { break; @@ -941,7 +950,6 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* special keyword used for representing Unicode locale attributes */ if (uprv_strcmp(key, LOCALE_ATTRIBUTE_KEY) == 0) { - isAttribute = TRUE; if (len > 0) { int32_t i = 0; while (TRUE) { @@ -984,6 +992,9 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } } + /* for a place holder ExtensionListEntry */ + bcpKey = LOCALE_ATTRIBUTE_KEY; + bcpValue = NULL; } } else if (isBcpUExt) { bcpKey = uloc_toUnicodeLocaleKey(key); @@ -1063,22 +1074,20 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } } - if (!isAttribute) { - /* create ExtensionListEntry */ - ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); - if (ext == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - break; - } - ext->key = bcpKey; - ext->value = bcpValue; + /* create ExtensionListEntry */ + ext = (ExtensionListEntry*)uprv_malloc(sizeof(ExtensionListEntry)); + if (ext == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + break; + } + ext->key = bcpKey; + ext->value = bcpValue; - if (!_addExtensionToList(&firstExt, ext, TRUE)) { - uprv_free(ext); - if (strict) { - *status = U_ILLEGAL_ARGUMENT_ERROR; - break; - } + if (!_addExtensionToList(&firstExt, ext, TRUE)) { + uprv_free(ext); + if (strict) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + break; } } } @@ -1101,12 +1110,9 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac if (U_SUCCESS(*status) && (firstExt != NULL || firstAttr != NULL)) { UBool startLDMLExtension = FALSE; - - attr = firstAttr; - ext = firstExt; - do { - if (!startLDMLExtension && (ext && uprv_strlen(ext->key) > 1)) { - /* write LDML singleton extension */ + 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; } @@ -1120,7 +1126,20 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac } /* write out the sorted BCP47 attributes, extensions and private use */ - if (ext && (uprv_strlen(ext->key) == 1 || attr == NULL)) { + 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; + } + } else { if (reslen < capacity) { *(appendAt + reslen) = SEP; } @@ -1139,23 +1158,8 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac uprv_memcpy(appendAt + reslen, ext->value, uprv_min(len, capacity - reslen)); } reslen += len; - - ext = ext->next; - } else if (attr) { - /* write the value for the attributes */ - 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; - - attr = attr->next; } - } while (attr != NULL || ext != NULL); + } } cleanup: /* clean up */ @@ -1771,6 +1775,15 @@ _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t cap #define EXTV 0x0040 #define PRIV 0x0080 +/** + * Ticket #12705 - Visual Studio 2015 Update 3 contains a new code optimizer which has problems optimizing + * this function. (See https://blogs.msdn.microsoft.com/vcblog/2016/05/04/new-code-optimizer/ ) + * As a workaround, we will turn off optimization just for this function on VS2015 Update 3 and above. + */ +#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) +#pragma optimize( "", off ) +#endif + static ULanguageTag* ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* status) { ULanguageTag *t; @@ -2134,6 +2147,13 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta return NULL; } +/** +* Ticket #12705 - Turn optimization back on. +*/ +#if (defined(_MSC_VER) && (_MSC_VER >= 1900) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190024210)) +#pragma optimize( "", on ) +#endif + static void ultag_close(ULanguageTag* langtag) { diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index 36713e69be1b7b..26d5c7963e0862 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2004-2016, International Business Machines diff --git a/deps/icu-small/source/common/umapfile.c b/deps/icu-small/source/common/umapfile.c index 016758892992dc..377b14d30f2df8 100644 --- a/deps/icu-small/source/common/umapfile.c +++ b/deps/icu-small/source/common/umapfile.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/umapfile.h b/deps/icu-small/source/common/umapfile.h index 2995e381ed30c0..70a6cc5f861784 100644 --- a/deps/icu-small/source/common/umapfile.h +++ b/deps/icu-small/source/common/umapfile.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/umath.c b/deps/icu-small/source/common/umath.c index 9e540d4d8d7a82..86f58819e067ac 100644 --- a/deps/icu-small/source/common/umath.c +++ b/deps/icu-small/source/common/umath.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index cffa109d6348cf..13569cb075fa58 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -1,7 +1,9 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * -* Copyright (C) 1997-2015, International Business Machines +* Copyright (C) 1997-2016, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** @@ -37,16 +39,7 @@ static UMutex globalMutex = U_MUTEX_INITIALIZER; // Build time user mutex hook: #include "U_USER_MUTEX_CPP" #include U_MUTEX_XSTR(U_USER_MUTEX_CPP) -#elif U_PLATFORM_HAS_WIN32_API - -//------------------------------------------------------------------------------------------- -// -// Windows Specific Definitions -// -// Note: Cygwin (and possibly others) have both WIN32 and POSIX. -// Prefer Win32 in these cases. (Win32 comes ahead in the #if chain) -// -//------------------------------------------------------------------------------------------- +#elif U_PLATFORM_USES_ONLY_WIN32_API #if defined U_NO_PLATFORM_ATOMICS #error ICU on Win32 requires support for low level atomic operations. @@ -68,10 +61,8 @@ U_NAMESPACE_BEGIN U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &uio) { for (;;) { int32_t previousState = InterlockedCompareExchange( -#if (U_PLATFORM == U_PF_MINGW) || (U_PLATFORM == U_PF_CYGWIN) || defined(__clang__) - (LONG volatile *) // this is the type given in the API doc for this function. -#endif - &uio.fState, // Destination + (LONG volatile *) // this is the type given in the API doc for this function. + &uio.fState, // Destination 1, // Exchange Value 0); // Compare value diff --git a/deps/icu-small/source/common/umutex.h b/deps/icu-small/source/common/umutex.h index f670b3d13ff371..d6618ed76621fb 100644 --- a/deps/icu-small/source/common/umutex.h +++ b/deps/icu-small/source/common/umutex.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2015, International Business Machines @@ -229,7 +231,7 @@ struct UInitOnce { U_COMMON_API UBool U_EXPORT2 umtx_initImplPreInit(UInitOnce &); U_COMMON_API void U_EXPORT2 umtx_initImplPostInit(UInitOnce &); -template void umtx_initOnce(UInitOnce &uio, T *obj, void (T::*fp)()) { +template void umtx_initOnce(UInitOnce &uio, T *obj, void (U_CALLCONV T::*fp)()) { if (umtx_loadAcquire(uio.fState) == 2) { return; } @@ -242,7 +244,7 @@ template void umtx_initOnce(UInitOnce &uio, T *obj, void (T::*fp)()) { // umtx_initOnce variant for plain functions, or static class functions. // No context parameter. -inline void umtx_initOnce(UInitOnce &uio, void (*fp)()) { +inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)()) { if (umtx_loadAcquire(uio.fState) == 2) { return; } @@ -254,7 +256,7 @@ inline void umtx_initOnce(UInitOnce &uio, void (*fp)()) { // umtx_initOnce variant for plain functions, or static class functions. // With ErrorCode, No context parameter. -inline void umtx_initOnce(UInitOnce &uio, void (*fp)(UErrorCode &), UErrorCode &errCode) { +inline void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(UErrorCode &), UErrorCode &errCode) { if (U_FAILURE(errCode)) { return; } @@ -273,7 +275,7 @@ inline void umtx_initOnce(UInitOnce &uio, void (*fp)(UErrorCode &), UErrorCode & // umtx_initOnce variant for plain functions, or static class functions, // with a context parameter. -template void umtx_initOnce(UInitOnce &uio, void (*fp)(T), T context) { +template void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T), T context) { if (umtx_loadAcquire(uio.fState) == 2) { return; } @@ -285,7 +287,7 @@ template void umtx_initOnce(UInitOnce &uio, void (*fp)(T), T context) { // umtx_initOnce variant for plain functions, or static class functions, // with a context parameter and an error code. -template void umtx_initOnce(UInitOnce &uio, void (*fp)(T, UErrorCode &), T context, UErrorCode &errCode) { +template void umtx_initOnce(UInitOnce &uio, void (U_CALLCONV *fp)(T, UErrorCode &), T context, UErrorCode &errCode) { if (U_FAILURE(errCode)) { return; } @@ -318,13 +320,7 @@ U_NAMESPACE_END // #inlcude "U_USER_MUTEX_H" #include U_MUTEX_XSTR(U_USER_MUTEX_H) -#elif U_PLATFORM_HAS_WIN32_API - -/* Windows Definitions. - * Windows comes first in the platform chain. - * Cygwin (and possibly others) have both WIN32 and POSIX APIs. Prefer Win32 in this case. - */ - +#elif U_PLATFORM_USES_ONLY_WIN32_API /* For CRITICAL_SECTION */ diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index 58d1a39bf55b31..b8c4151f42ccc7 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/appendable.h b/deps/icu-small/source/common/unicode/appendable.h index a6a83b15cf9719..2ae334505ef1f5 100644 --- a/deps/icu-small/source/common/unicode/appendable.h +++ b/deps/icu-small/source/common/unicode/appendable.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2012, International Business Machines diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 26ad182eafff56..88b39c6699b2f6 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -168,6 +170,11 @@ class U_COMMON_API BreakIterator : public UObject { /** * Change the text over which this operates. The text boundary is * reset to the start. + * + * The BreakIterator will retain a reference to the supplied string. + * The caller must not modify or delete the text while the BreakIterator + * retains the reference. + * * @param text The UnicodeString used to change the text. * @stable ICU 2.0 */ diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index cdab0ec743577a..4e404a6edc737b 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2012, International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/common/unicode/bytestrie.h b/deps/icu-small/source/common/unicode/bytestrie.h index 9c7782740dba27..4a30ce1c0428b5 100644 --- a/deps/icu-small/source/common/unicode/bytestrie.h +++ b/deps/icu-small/source/common/unicode/bytestrie.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines @@ -306,7 +308,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @return The NUL-terminated byte sequence for the last successful next(). * @stable ICU 4.8 */ - const StringPiece &getString() const { return sp_; } + StringPiece getString() const; /** * @return The value for the last successful next(). * @stable ICU 4.8 @@ -325,7 +327,6 @@ class U_COMMON_API BytesTrie : public UMemory { int32_t initialRemainingMatchLength_; CharString *str_; - StringPiece sp_; int32_t maxLength_; int32_t value_; diff --git a/deps/icu-small/source/common/unicode/bytestriebuilder.h b/deps/icu-small/source/common/unicode/bytestriebuilder.h index e7fbd6b23713e0..3ad800975b778c 100644 --- a/deps/icu-small/source/common/unicode/bytestriebuilder.h +++ b/deps/icu-small/source/common/unicode/bytestriebuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2016, International Business Machines @@ -29,7 +31,6 @@ U_NAMESPACE_BEGIN class BytesTrieElement; class CharString; - /** * Builder class for BytesTrie. * @@ -65,7 +66,7 @@ class U_COMMON_API BytesTrieBuilder : public StringTrieBuilder { * @return *this * @stable ICU 4.8 */ - BytesTrieBuilder &add(const StringPiece &s, int32_t value, UErrorCode &errorCode); + BytesTrieBuilder &add(StringPiece s, int32_t value, UErrorCode &errorCode); /** * Builds a BytesTrie for the add()ed data. @@ -141,7 +142,6 @@ class U_COMMON_API BytesTrieBuilder : public StringTrieBuilder { virtual int32_t getMinLinearMatch() const { return BytesTrie::kMinLinearMatch; } virtual int32_t getMaxLinearMatchLength() const { return BytesTrie::kMaxLinearMatchLength; } - // don't use #ifndef U_HIDE_INTERNAL_API with private class members /** * @internal */ diff --git a/deps/icu-small/source/common/unicode/caniter.h b/deps/icu-small/source/common/unicode/caniter.h index 31fcea312ada02..b988b2003d73a8 100644 --- a/deps/icu-small/source/common/unicode/caniter.h +++ b/deps/icu-small/source/common/unicode/caniter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unicode/chariter.h b/deps/icu-small/source/common/unicode/chariter.h index a955ad52a40d0c..7c6f98f640eada 100644 --- a/deps/icu-small/source/common/unicode/chariter.h +++ b/deps/icu-small/source/common/unicode/chariter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** * diff --git a/deps/icu-small/source/common/unicode/dbbi.h b/deps/icu-small/source/common/unicode/dbbi.h index ebc80fa9ac2ad9..be9618c551c7dc 100644 --- a/deps/icu-small/source/common/unicode/dbbi.h +++ b/deps/icu-small/source/common/unicode/dbbi.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2006,2013 IBM Corp. All rights reserved. diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 5e804bc1707827..7b053b04640df2 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2012, International Business Machines Corporation and @@ -147,7 +149,7 @@ * * * Bidirectional Algorithm - * ubidi.h + * ubidi.h, ubiditransform.h * C API * * diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index 0212fa236ac55d..c16ee63d9632e6 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2009, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unicode/enumset.h b/deps/icu-small/source/common/unicode/enumset.h index 715ca57c1f2b53..e7c39c40dd2586 100644 --- a/deps/icu-small/source/common/unicode/enumset.h +++ b/deps/icu-small/source/common/unicode/enumset.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/errorcode.h b/deps/icu-small/source/common/unicode/errorcode.h index 3fcbb7e0436f3c..92feb2b1b6b87e 100644 --- a/deps/icu-small/source/common/unicode/errorcode.h +++ b/deps/icu-small/source/common/unicode/errorcode.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/filteredbrk.h b/deps/icu-small/source/common/unicode/filteredbrk.h index fff9bb5771f3f8..261151138cdc8f 100644 --- a/deps/icu-small/source/common/unicode/filteredbrk.h +++ b/deps/icu-small/source/common/unicode/filteredbrk.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2015, International Business Machines @@ -13,8 +15,6 @@ #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION -#ifndef U_HIDE_DRAFT_API - U_NAMESPACE_BEGIN /** @@ -31,13 +31,13 @@ U_NAMESPACE_BEGIN * but with "Mr." as an exception, a filtered break iterator * would consider the string "Mr. Smith" to be a single segment. * - * @draft ICU 56 + * @stable ICU 56 */ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { public: /** * destructor. - * @draft ICU 56 + * @stable ICU 56 */ virtual ~FilteredBreakIteratorBuilder(); @@ -51,7 +51,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * @param where the locale. * @param status The error code. * @return the new builder - * @draft ICU 56 + * @stable ICU 56 */ static FilteredBreakIteratorBuilder *createInstance(const Locale& where, UErrorCode& status); @@ -60,7 +60,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * In this state, it will not suppress any segment boundaries. * @param status The error code. * @return the new builder - * @draft ICU 56 + * @stable ICU 56 */ static FilteredBreakIteratorBuilder *createInstance(UErrorCode &status); @@ -72,7 +72,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * @param status error code * @return returns TRUE if the string was not present and now added, * FALSE if the call was a no-op because the string was already being suppressed. - * @draft ICU 56 + * @stable ICU 56 */ virtual UBool suppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0; @@ -85,7 +85,7 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * @param status error code * @return returns TRUE if the string was present and now removed, * FALSE if the call was a no-op because the string was not being suppressed. - * @draft ICU 56 + * @stable ICU 56 */ virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0; @@ -99,14 +99,14 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * @param adoptBreakIterator the break iterator to adopt * @param status error code * @return the new BreakIterator, owned by the caller. - * @draft ICU 56 + * @stable ICU 56 */ virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; protected: /** * For subclass use - * @draft ICU 56 + * @stable ICU 56 */ FilteredBreakIteratorBuilder(); }; @@ -114,8 +114,6 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { U_NAMESPACE_END -#endif /* U_HIDE_DRAFT_API */ - #endif // #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION #endif // #ifndef FILTEREDBRK_H diff --git a/deps/icu-small/source/common/unicode/icudataver.h b/deps/icu-small/source/common/unicode/icudataver.h index 485c07081dd390..c5c44fc0754f15 100644 --- a/deps/icu-small/source/common/unicode/icudataver.h +++ b/deps/icu-small/source/common/unicode/icudataver.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/icuplug.h b/deps/icu-small/source/common/unicode/icuplug.h index 3b33a3608b9ad5..ff5e054d38e24b 100644 --- a/deps/icu-small/source/common/unicode/icuplug.h +++ b/deps/icu-small/source/common/unicode/icuplug.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -157,7 +159,11 @@ typedef enum { UPLUG_REASON_QUERY = 0, /**< The plugin is being queried for info. **/ UPLUG_REASON_LOAD = 1, /**< The plugin is being loaded. **/ UPLUG_REASON_UNLOAD = 2, /**< The plugin is being unloaded. **/ - UPLUG_REASON_COUNT /**< count of known reasons **/ + /** + * Number of known reasons. + * @internal The numeric value may change over time, see ICU ticket #12420. + */ + UPLUG_REASON_COUNT } UPlugReason; @@ -173,7 +179,11 @@ typedef enum { UPLUG_LEVEL_UNKNOWN = 1, /**< The plugin is waiting to be installed. **/ UPLUG_LEVEL_LOW = 2, /**< The plugin must be called before u_init completes **/ UPLUG_LEVEL_HIGH = 3, /**< The plugin can run at any time. **/ - UPLUG_LEVEL_COUNT /**< count of known reasons **/ + /** + * Number of known levels. + * @internal The numeric value may change over time, see ICU ticket #12420. + */ + UPLUG_LEVEL_COUNT } UPlugLevel; /** diff --git a/deps/icu-small/source/common/unicode/idna.h b/deps/icu-small/source/common/unicode/idna.h index 90194a378f3825..23a1d7ca0e8441 100644 --- a/deps/icu-small/source/common/unicode/idna.h +++ b/deps/icu-small/source/common/unicode/idna.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines @@ -198,7 +200,7 @@ class U_COMMON_API IDNA : public UObject { * @stable ICU 4.6 */ virtual void - labelToASCII_UTF8(const StringPiece &label, ByteSink &dest, + labelToASCII_UTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; /** @@ -216,7 +218,7 @@ class U_COMMON_API IDNA : public UObject { * @stable ICU 4.6 */ virtual void - labelToUnicodeUTF8(const StringPiece &label, ByteSink &dest, + labelToUnicodeUTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; /** @@ -234,7 +236,7 @@ class U_COMMON_API IDNA : public UObject { * @stable ICU 4.6 */ virtual void - nameToASCII_UTF8(const StringPiece &name, ByteSink &dest, + nameToASCII_UTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; /** @@ -252,7 +254,7 @@ class U_COMMON_API IDNA : public UObject { * @stable ICU 4.6 */ virtual void - nameToUnicodeUTF8(const StringPiece &name, ByteSink &dest, + nameToUnicodeUTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; }; diff --git a/deps/icu-small/source/common/unicode/listformatter.h b/deps/icu-small/source/common/unicode/listformatter.h index cb5d50d7a2e975..f2c898881a7939 100644 --- a/deps/icu-small/source/common/unicode/listformatter.h +++ b/deps/icu-small/source/common/unicode/listformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index 35e37765c2342d..9ac5de5f06d751 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -211,18 +213,16 @@ class LocalPointer : public LocalPointerBase { errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#ifndef U_HIDE_DRAFT_API #if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer - * @draft ICU 56 + * @stable ICU 56 */ LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } #endif -#endif /* U_HIDE_DRAFT_API */ /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -230,19 +230,19 @@ class LocalPointer : public LocalPointerBase { ~LocalPointer() { delete LocalPointerBase::ptr; } -#ifndef U_HIDE_DRAFT_API #if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. * @param src source smart pointer * @return *this - * @draft ICU 56 + * @stable ICU 56 */ LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { return moveFrom(src); } #endif + // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -261,19 +261,18 @@ class LocalPointer : public LocalPointerBase { /** * Swap pointers. * @param other other smart pointer - * @draft ICU 56 + * @stable ICU 56 */ void swap(LocalPointer &other) U_NOEXCEPT { T *temp=LocalPointerBase::ptr; LocalPointerBase::ptr=other.ptr; other.ptr=temp; } -#endif /* U_HIDE_DRAFT_API */ /** * Non-member LocalPointer swap function. * @param p1 will get p2's pointer * @param p2 will get p1's pointer - * @draft ICU 56 + * @stable ICU 56 */ friend inline void swap(LocalPointer &p1, LocalPointer &p2) U_NOEXCEPT { p1.swap(p2); @@ -345,7 +344,6 @@ class LocalArray : public LocalPointerBase { * @stable ICU 4.4 */ explicit LocalArray(T *p=NULL) : LocalPointerBase(p) {} -#ifndef U_HIDE_DRAFT_API /** * Constructor takes ownership and reports an error if NULL. * @@ -357,7 +355,7 @@ class LocalArray : public LocalPointerBase { * @param p simple pointer to an array of T objects that is adopted * @param errorCode in/out UErrorCode, set to U_MEMORY_ALLOCATION_ERROR * if p==NULL and no other failure code had been set - * @draft ICU 56 + * @stable ICU 56 */ LocalArray(T *p, UErrorCode &errorCode) : LocalPointerBase(p) { if(p==NULL && U_SUCCESS(errorCode)) { @@ -368,13 +366,12 @@ class LocalArray : public LocalPointerBase { /** * Move constructor, leaves src with isNull(). * @param src source smart pointer - * @draft ICU 56 + * @stable ICU 56 */ LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } #endif -#endif /* U_HIDE_DRAFT_API */ /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -382,19 +379,19 @@ class LocalArray : public LocalPointerBase { ~LocalArray() { delete[] LocalPointerBase::ptr; } -#ifndef U_HIDE_DRAFT_API #if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. * @param src source smart pointer * @return *this - * @draft ICU 56 + * @stable ICU 56 */ LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { return moveFrom(src); } #endif + // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -413,19 +410,18 @@ class LocalArray : public LocalPointerBase { /** * Swap pointers. * @param other other smart pointer - * @draft ICU 56 + * @stable ICU 56 */ void swap(LocalArray &other) U_NOEXCEPT { T *temp=LocalPointerBase::ptr; LocalPointerBase::ptr=other.ptr; other.ptr=temp; } -#endif /* U_HIDE_DRAFT_API */ /** * Non-member LocalArray swap function. * @param p1 will get p2's pointer * @param p2 will get p1's pointer - * @draft ICU 56 + * @stable ICU 56 */ friend inline void swap(LocalArray &p1, LocalArray &p2) U_NOEXCEPT { p1.swap(p2); @@ -440,7 +436,6 @@ class LocalArray : public LocalPointerBase { delete[] LocalPointerBase::ptr; LocalPointerBase::ptr=p; } -#ifndef U_HIDE_DRAFT_API /** * Deletes the array it owns, * and adopts (takes ownership of) the one passed in. @@ -454,7 +449,7 @@ class LocalArray : public LocalPointerBase { * @param p simple pointer to an array of T objects that is adopted * @param errorCode in/out UErrorCode, set to U_MEMORY_ALLOCATION_ERROR * if p==NULL and no other failure code had been set - * @draft ICU 56 + * @stable ICU 56 */ void adoptInsteadAndCheckErrorCode(T *p, UErrorCode &errorCode) { if(U_SUCCESS(errorCode)) { @@ -467,7 +462,6 @@ class LocalArray : public LocalPointerBase { delete[] p; } } -#endif /* U_HIDE_DRAFT_API */ /** * Array item access (writable). * No index bounds check. @@ -485,9 +479,6 @@ class LocalArray : public LocalPointerBase { * like LocalPointer except that this subclass will use the closeFunction * rather than the C++ delete operator. * - * Requirement: The closeFunction must tolerate a NULL pointer. - * (We could add a NULL check here but it is normally redundant.) - * * Usage example: * \code * LocalUCaseMapPointer csm(ucasemap_open(localeID, options, &errorCode)); @@ -512,12 +503,12 @@ class LocalArray : public LocalPointerBase { : LocalPointerBase(src.ptr) { \ src.ptr=NULL; \ } \ - ~LocalPointerClassName() { closeFunction(ptr); } \ + ~LocalPointerClassName() { if (ptr != NULL) { closeFunction(ptr); } } \ LocalPointerClassName &operator=(LocalPointerClassName &&src) U_NOEXCEPT { \ return moveFrom(src); \ } \ LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ - closeFunction(ptr); \ + if (ptr != NULL) { closeFunction(ptr); } \ LocalPointerBase::ptr=src.ptr; \ src.ptr=NULL; \ return *this; \ @@ -531,7 +522,7 @@ class LocalArray : public LocalPointerBase { p1.swap(p2); \ } \ void adoptInstead(Type *p) { \ - closeFunction(ptr); \ + if (ptr != NULL) { closeFunction(ptr); } \ ptr=p; \ } \ } @@ -544,7 +535,7 @@ class LocalArray : public LocalPointerBase { explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase(p) {} \ ~LocalPointerClassName() { closeFunction(ptr); } \ LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ - closeFunction(ptr); \ + if (ptr != NULL) { closeFunction(ptr); } \ LocalPointerBase::ptr=src.ptr; \ src.ptr=NULL; \ return *this; \ @@ -558,7 +549,7 @@ class LocalArray : public LocalPointerBase { p1.swap(p2); \ } \ void adoptInstead(Type *p) { \ - closeFunction(ptr); \ + if (ptr != NULL) { closeFunction(ptr); } \ ptr=p; \ } \ } diff --git a/deps/icu-small/source/common/unicode/locdspnm.h b/deps/icu-small/source/common/unicode/locdspnm.h index ba168d8c95a6de..b8c7a0ccae9281 100644 --- a/deps/icu-small/source/common/unicode/locdspnm.h +++ b/deps/icu-small/source/common/unicode/locdspnm.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2010-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index e8edd919b6c8b1..f797c25e8b6069 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/messagepattern.h b/deps/icu-small/source/common/unicode/messagepattern.h index f8b8dfb43f3149..8c1115e04dc1db 100644 --- a/deps/icu-small/source/common/unicode/messagepattern.h +++ b/deps/icu-small/source/common/unicode/messagepattern.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2013, International Business Machines diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index c03cba39e987a6..6a7668bfd5ff3e 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/normlzr.h b/deps/icu-small/source/common/unicode/normlzr.h index cdd7f37d6706ad..b9b67bc434df9d 100644 --- a/deps/icu-small/source/common/unicode/normlzr.h +++ b/deps/icu-small/source/common/unicode/normlzr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** * COPYRIGHT: @@ -179,6 +181,7 @@ class U_COMMON_API Normalizer : public UObject { * @deprecated ICU 56 Use Normalizer2 instead. */ Normalizer(const CharacterIterator& iter, UNormalizationMode mode); +#endif /* U_HIDE_DEPRECATED_API */ /** * Copy constructor. @@ -186,7 +189,6 @@ class U_COMMON_API Normalizer : public UObject { * @deprecated ICU 56 Use Normalizer2 instead. */ Normalizer(const Normalizer& copy); -#endif /* U_HIDE_DEPRECATED_API */ /** * Destructor @@ -750,9 +752,7 @@ class U_COMMON_API Normalizer : public UObject { FilteredNormalizer2*fFilteredNorm2; // owned if not NULL const Normalizer2 *fNorm2; // not owned; may be equal to fFilteredNorm2 -#ifndef U_HIDE_DEPRECATED_API - UNormalizationMode fUMode; -#endif /* U_HIDE_DEPRECATED_API */ + UNormalizationMode fUMode; // deprecated int32_t fOptions; // The input text and our position in it diff --git a/deps/icu-small/source/common/unicode/parseerr.h b/deps/icu-small/source/common/unicode/parseerr.h index 0096a13b1cdd56..f1976581a1ea63 100644 --- a/deps/icu-small/source/common/unicode/parseerr.h +++ b/deps/icu-small/source/common/unicode/parseerr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2005, International Business Machines diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index 1d56bd07a4bbb7..7bc2627773ef01 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2005, International Business Machines Corporation and others. All Rights Reserved. ******************************************************************************* diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index 33ad07f0cc175b..bf31af5d1331cc 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -841,6 +843,12 @@ * This is only used for non-ICU-API functions. * When a function is a public ICU API, * you must use the U_CAPI and U_EXPORT2 qualifiers. + * + * Please note, you need to use U_CALLCONV after the *. + * + * NO : "static const char U_CALLCONV *func( . . . )" + * YES: "static const char* U_CALLCONV func( . . . )" + * * @stable ICU 2.0 */ #if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) diff --git a/deps/icu-small/source/common/unicode/ptypes.h b/deps/icu-small/source/common/unicode/ptypes.h index b7f711603282c3..69d7286d323e3d 100644 --- a/deps/icu-small/source/common/unicode/ptypes.h +++ b/deps/icu-small/source/common/unicode/ptypes.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/putil.h b/deps/icu-small/source/common/unicode/putil.h index 81d24c90081786..6f3250ed685fdc 100644 --- a/deps/icu-small/source/common/unicode/putil.h +++ b/deps/icu-small/source/common/unicode/putil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 0af960a9c94597..9f2a1a62b369d1 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** -* Copyright (C) 1999-2014 International Business Machines Corporation * +* Copyright (C) 1999-2016 International Business Machines Corporation * * and others. All rights reserved. * *************************************************************************** @@ -56,15 +58,11 @@ struct RBBIStateTable; * *

See the ICU User Guide for information on Break Iterator Rules.

* - *

This class is not intended to be subclassed. (Class DictionaryBasedBreakIterator - * is a subclass, but that relationship is effectively internal to the ICU - * implementation. The subclassing interface to RulesBasedBreakIterator is - * not part of the ICU API, and may not remain stable.

- * + *

This class is not intended to be subclassed.

*/ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { -protected: +private: /** * The UText through which this BreakIterator accesses the text * @internal @@ -165,24 +163,10 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ int32_t fBreakType; -protected: //======================================================================= // constructors //======================================================================= -#ifndef U_HIDE_INTERNAL_API - /** - * Constant to be used in the constructor - * RuleBasedBreakIterator(RBBIDataHeader*, EDontAdopt, UErrorCode &); - * which does not adopt the memory indicated by the RBBIDataHeader* - * parameter. - * - * @internal - */ - enum EDontAdopt { - kDontAdopt - }; - /** * Constructor from a flattened set of RBBI data in malloced memory. * RulesBasedBreakIterators built from a custom set of rules @@ -195,17 +179,6 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); - /** - * Constructor from a flattened set of RBBI data in memory which need not - * be malloced (e.g. it may be a memory-mapped file, etc.). - * - * This version does not adopt the memory, and does not - * free it when done. - * @internal - */ - RuleBasedBreakIterator(const RBBIDataHeader* data, enum EDontAdopt dontAdopt, UErrorCode &status); -#endif /* U_HIDE_INTERNAL_API */ - friend class RBBIRuleBuilder; /** @internal */ @@ -402,6 +375,11 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { /** * Set the iterator to analyze a new piece of text. This function resets * the current iteration position to the beginning of the text. + * + * The BreakIterator will retain a reference to the supplied string. + * The caller must not modify or delete the text while the BreakIterator + * retains the reference. + * * @param newText The text to analyze. * @stable ICU 2.0 */ @@ -661,7 +639,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { virtual RuleBasedBreakIterator &refreshInputText(UText *input, UErrorCode &status); -protected: +private: //======================================================================= // implementation //======================================================================= @@ -670,41 +648,19 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * in text or iteration position. * @internal */ - virtual void reset(void); - -#if 0 - /** - * Return true if the category lookup for this char - * indicates that it is in the set of dictionary lookup chars. - * This function is intended for use by dictionary based break iterators. - * @return true if the category lookup for this char - * indicates that it is in the set of dictionary lookup chars. - * @internal - */ - virtual UBool isDictionaryChar(UChar32); - - /** - * Get the type of the break iterator. - * @internal - */ - virtual int32_t getBreakType() const; -#endif + void reset(void); /** * Set the type of the break iterator. * @internal */ - virtual void setBreakType(int32_t type); + void setBreakType(int32_t type); -#ifndef U_HIDE_INTERNAL_API /** * Common initialization function, used by constructors and bufferClone. * @internal */ void init(); -#endif /* U_HIDE_INTERNAL_API */ - -private: /** * This method backs the iterator back up to a "safe position" in the text. @@ -728,9 +684,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ int32_t handleNext(const RBBIStateTable *statetable); -protected: -#ifndef U_HIDE_INTERNAL_API /** * This is the function that actually implements dictionary-based * breaking. Covering at least the range from startPos to endPos, @@ -746,9 +700,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * @internal */ int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse); -#endif /* U_HIDE_INTERNAL_API */ -private: /** * This function returns the appropriate LanguageBreakEngine for a diff --git a/deps/icu-small/source/common/unicode/rep.h b/deps/icu-small/source/common/unicode/rep.h index 21eb2918648749..8fa2332a71ca3e 100644 --- a/deps/icu-small/source/common/unicode/rep.h +++ b/deps/icu-small/source/common/unicode/rep.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** * Copyright (C) 1999-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unicode/resbund.h b/deps/icu-small/source/common/unicode/resbund.h index 8c979663622cfb..0d37d4209d6f44 100644 --- a/deps/icu-small/source/common/unicode/resbund.h +++ b/deps/icu-small/source/common/unicode/resbund.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/schriter.h b/deps/icu-small/source/common/unicode/schriter.h index 65042494a0ad89..b5fa32d0aecb8d 100644 --- a/deps/icu-small/source/common/unicode/schriter.h +++ b/deps/icu-small/source/common/unicode/schriter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 7530cf796fcabe..2b74f5ca527ca2 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014-2016, International Business Machines diff --git a/deps/icu-small/source/common/unicode/std_string.h b/deps/icu-small/source/common/unicode/std_string.h index 05955c5d1e727f..104ef0c83e8cfe 100644 --- a/deps/icu-small/source/common/unicode/std_string.h +++ b/deps/icu-small/source/common/unicode/std_string.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/strenum.h b/deps/icu-small/source/common/unicode/strenum.h index 8defe2039b8d41..74ff28decc3df2 100644 --- a/deps/icu-small/source/common/unicode/strenum.h +++ b/deps/icu-small/source/common/unicode/strenum.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/stringpiece.h b/deps/icu-small/source/common/unicode/stringpiece.h index 1df790562e801c..43864ad81a8292 100644 --- a/deps/icu-small/source/common/unicode/stringpiece.h +++ b/deps/icu-small/source/common/unicode/stringpiece.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. // @@ -40,9 +42,9 @@ U_NAMESPACE_BEGIN * in a "const char*" or a "string" wherever a "StringPiece" is * expected. * - * Functions or methods may use const StringPiece& parameters to accept either - * a "const char*" or a "string" value that will be implicitly converted to - * a StringPiece. + * Functions or methods may use StringPiece parameters to accept either a + * "const char*" or a "string" value that will be implicitly converted to a + * StringPiece. * * Systematic usage of StringPiece is encouraged as it will reduce unnecessary * conversions from "const char*" to "string" and back again. diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index 1749ef4bf7c7c9..c2839fe53f29ff 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012,2014, International Business Machines @@ -184,7 +186,8 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ UHashtable *nodes; -#ifndef U_HIDE_INTERNAL_API + // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API, + // it is needed for layout of other objects. /** @internal */ class Node : public UObject { public: @@ -243,6 +246,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { int32_t offset; }; +#ifndef U_HIDE_INTERNAL_API // This class should not be overridden because // registerFinalValue() compares a stack-allocated FinalValueNode // (stack-allocated so that we don't unnecessarily create lots of duplicate nodes) @@ -258,7 +262,10 @@ class U_COMMON_API StringTrieBuilder : public UObject { protected: int32_t value; }; +#endif /* U_HIDE_INTERNAL_API */ + // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API, + // it is needed for layout of other objects. /** * @internal */ @@ -276,6 +283,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { int32_t value; }; +#ifndef U_HIDE_INTERNAL_API /** * @internal */ @@ -289,7 +297,10 @@ class U_COMMON_API StringTrieBuilder : public UObject { protected: Node *next; }; +#endif /* U_HIDE_INTERNAL_API */ + // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API, + // it is needed for layout of other objects. /** * @internal */ @@ -305,6 +316,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { Node *next; }; +#ifndef U_HIDE_INTERNAL_API /** * @internal */ diff --git a/deps/icu-small/source/common/unicode/symtable.h b/deps/icu-small/source/common/unicode/symtable.h index bc34dde51b4cf2..829c8105d05d85 100644 --- a/deps/icu-small/source/common/unicode/symtable.h +++ b/deps/icu-small/source/common/unicode/symtable.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2000-2005, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ubidi.h b/deps/icu-small/source/common/unicode/ubidi.h index 27042ed7f4b94e..e59969861f3402 100644 --- a/deps/icu-small/source/common/unicode/ubidi.h +++ b/deps/icu-small/source/common/unicode/ubidi.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -718,9 +720,13 @@ typedef enum UBiDiReorderingMode { * UBIDI_REORDER_NUMBERS_SPECIAL Bidi algorithm. * @stable ICU 3.6 */ UBIDI_REORDER_INVERSE_FOR_NUMBERS_SPECIAL, - /** Number of values for reordering mode. - * @stable ICU 3.6 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * Number of values for reordering mode. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UBIDI_REORDER_COUNT +#endif // U_HIDE_DEPRECATED_API } UBiDiReorderingMode; /** @@ -1959,13 +1965,19 @@ U_STABLE int32_t U_EXPORT2 ubidi_getResultLength(const UBiDi *pBiDi); U_CDECL_BEGIN + +#ifndef U_HIDE_DEPRECATED_API /** - * value returned by UBiDiClassCallback callbacks when + * Value returned by UBiDiClassCallback callbacks when * there is no need to override the standard Bidi class for a given code point. + * + * This constant is deprecated; use u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS)+1 instead. + * * @see UBiDiClassCallback - * @stable ICU 3.6 + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ #define U_BIDI_CLASS_DEFAULT U_CHAR_DIRECTION_COUNT +#endif // U_HIDE_DEPRECATED_API /** * Callback type declaration for overriding default Bidi class values with @@ -1981,8 +1993,8 @@ U_CDECL_BEGIN * * @return The directional property / Bidi class for the given code point * c if the default class has been overridden, or - * #U_BIDI_CLASS_DEFAULT if the standard Bidi class value - * for c is to be used. + * #U_BIDI_CLASS_DEFAULT=u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS)+1 + * if the standard Bidi class value for c is to be used. * @see ubidi_setClassCallback * @see ubidi_getClassCallback * @stable ICU 3.6 @@ -1995,8 +2007,8 @@ U_CDECL_END /** * Retrieve the Bidi class for a given code point. *

If a #UBiDiClassCallback callback is defined and returns a - * value other than #U_BIDI_CLASS_DEFAULT, that value is used; - * otherwise the default class determination mechanism is invoked.

+ * value other than #U_BIDI_CLASS_DEFAULT=u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS)+1, + * that value is used; otherwise the default class determination mechanism is invoked.

* * @param pBiDi is the paragraph UBiDi object. * diff --git a/deps/icu-small/source/common/unicode/ubiditransform.h b/deps/icu-small/source/common/unicode/ubiditransform.h new file mode 100644 index 00000000000000..509f68bcc012e0 --- /dev/null +++ b/deps/icu-small/source/common/unicode/ubiditransform.h @@ -0,0 +1,321 @@ +/* +****************************************************************************** +* +* Copyright (C) 2016 and later: Unicode, Inc. and others. +* License & terms of use: http://www.unicode.org/copyright.html +* +****************************************************************************** +* file name: ubiditransform.h +* encoding: US-ASCII +* tab size: 8 (not used) +* indentation:4 +* +* created on: 2016jul24 +* created by: Lina Kemmel +* +*/ + +#ifndef UBIDITRANSFORM_H +#define UBIDITRANSFORM_H + +#include "unicode/utypes.h" +#include "unicode/ubidi.h" +#include "unicode/uchar.h" +#include "unicode/localpointer.h" + +#ifndef U_HIDE_DRAFT_API + +/** + * \file + * \brief Bidi Transformations + * + * UBiDiOrder indicates the order of text.

+ * This bidi transformation engine supports all possible combinations (4 in + * total) of input and output text order: + *

    + *
  • : unless the output direction is RTL, this + * corresponds to a normal operation of the Bidi algorithm as described in the + * Unicode Technical Report and implemented by UBiDi when the + * reordering mode is set to UBIDI_REORDER_DEFAULT. Visual RTL + * mode is not supported by UBiDi and is accomplished through + * reversing a visual LTR string,
  • + *
  • : unless the input direction is RTL, this + * corresponds to an "inverse bidi algorithm" in UBiDi with the + * reordering mode set to UBIDI_REORDER_INVERSE_LIKE_DIRECT. + * Visual RTL mode is not not supported by UBiDi and is + * accomplished through reversing a visual LTR string,
  • + *
  • : if the input and output base directions + * mismatch, this corresponds to the UBiDi implementation with the + * reordering mode set to UBIDI_REORDER_RUNS_ONLY; and if the + * input and output base directions are identical, the transformation engine + * will only handle character mirroring and Arabic shaping operations without + * reordering,
  • + *
  • : this reordering mode is not supported by + * the UBiDi engine; it implies character mirroring, Arabic + * shaping, and - if the input/output base directions mismatch - string + * reverse operations.
  • + *
+ * @see ubidi_setInverse + * @see ubidi_setReorderingMode + * @see UBIDI_REORDER_DEFAULT + * @see UBIDI_REORDER_INVERSE_LIKE_DIRECT + * @see UBIDI_REORDER_RUNS_ONLY + * @draft ICU 58 + */ +typedef enum { + /** 0: Constant indicating a logical order. + * This is the default for input text. + * @draft ICU 58 + */ + UBIDI_LOGICAL = 0, + /** 1: Constant indicating a visual order. + * This is a default for output text. + * @draft ICU 58 + */ + UBIDI_VISUAL +} UBiDiOrder; + +/** + * UBiDiMirroring indicates whether or not characters with the + * "mirrored" property in RTL runs should be replaced with their mirror-image + * counterparts. + * @see UBIDI_DO_MIRRORING + * @see ubidi_setReorderingOptions + * @see ubidi_writeReordered + * @see ubidi_writeReverse + * @draft ICU 58 + */ +typedef enum { + /** 0: Constant indicating that character mirroring should not be + * performed. + * This is the default. + * @draft ICU 58 + */ + UBIDI_MIRRORING_OFF = 0, + /** 1: Constant indicating that character mirroring should be performed. + * This corresponds to calling ubidi_writeReordered or + * ubidi_writeReverse with the + * UBIDI_DO_MIRRORING option bit set. + * @draft ICU 58 + */ + UBIDI_MIRRORING_ON +} UBiDiMirroring; + +/** + * Forward declaration of the UBiDiTransform structure that stores + * information used by the layout transformation engine. + * @draft ICU 58 + */ +typedef struct UBiDiTransform UBiDiTransform; + +/** + * Performs transformation of text from the bidi layout defined by the input + * ordering scheme to the bidi layout defined by the output ordering scheme, + * and applies character mirroring and Arabic shaping operations.

+ * In terms of UBiDi, such a transformation implies: + *

    + *
  • calling ubidi_setReorderingMode as needed (when the + * reordering mode is other than normal),
  • + *
  • calling ubidi_setInverse as needed (when text should be + * transformed from a visual to a logical form),
  • + *
  • resolving embedding levels of each character in the input text by + * calling ubidi_setPara,
  • + *
  • reordering the characters based on the computed embedding levels, also + * performing character mirroring as needed, and streaming the result to the + * output, by calling ubidi_writeReordered,
  • + *
  • performing Arabic digit and letter shaping on the output text by calling + * u_shapeArabic.
  • + *
+ * An "ordering scheme" encompasses the base direction and the order of text, + * and these characteristics must be defined by the caller for both input and + * output explicitly .

+ * There are 36 possible combinations of ordering schemes, + * which are partially supported by UBiDi already. Examples of the + * currently supported combinations: + *

    + *
  • : this is equivalent to calling + * ubidi_setPara with paraLevel == UBIDI_LTR,
  • + *
  • : this is equivalent to calling + * ubidi_setPara with paraLevel == UBIDI_RTL,
  • + *
  • : this is equivalent to + * calling ubidi_setPara with + * paraLevel == UBIDI_DEFAULT_LTR,
  • + *
  • : this is equivalent to + * calling ubidi_setPara with + * paraLevel == UBIDI_DEFAULT_RTL,
  • + *
  • : this is equivalent to + * calling ubidi_setInverse(UBiDi*, TRUE) and then + * ubidi_setPara with paraLevel == UBIDI_LTR,
  • + *
  • : this is equivalent to + * calling ubidi_setInverse(UBiDi*, TRUE) and then + * ubidi_setPara with paraLevel == UBIDI_RTL.
  • + *
+ * All combinations that involve the Visual RTL scheme are unsupported by + * UBiDi, for instance: + *
    + *
  • ,
  • + *
  • .
  • + *
+ *

Example of usage of the transformation engine:
+ *

+ * \code
+ * UChar text1[] = {'a', 'b', 'c', 0x0625, '1', 0};
+ * UChar text2[] = {'a', 'b', 'c', 0x0625, '1', 0};
+ * UErrorCode errorCode = U_ZERO_ERROR;
+ * // Run a transformation.
+ * ubiditransform_transform(pBidiTransform,
+ *          text1, -1, text2, -1,
+ *          UBIDI_LTR, UBIDI_VISUAL,
+ *          UBIDI_RTL, UBIDI_LOGICAL,
+ *          UBIDI_MIRRORING_OFF,
+ *          U_SHAPE_DIGITS_AN2EN | U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
+ *          &errorCode);
+ * // Do something with text2.
+ *  text2[4] = '2';
+ * // Run a reverse transformation.
+ * ubiditransform_transform(pBidiTransform,
+ *          text2, -1, text1, -1,
+ *          UBIDI_RTL, UBIDI_LOGICAL,
+ *          UBIDI_LTR, UBIDI_VISUAL,
+ *          UBIDI_MIRRORING_OFF,
+ *          U_SHAPE_DIGITS_EN2AN | U_SHAPE_DIGIT_TYPE_AN_EXTENDED,
+ *          &errorCode);
+ *\endcode
+ * 
+ *

+ * + * @param pBiDiTransform A pointer to a UBiDiTransform object + * allocated with ubiditransform_open() or + * NULL.

+ * This object serves for one-time setup to amortize initialization + * overheads. Use of this object is not thread-safe. All other threads + * should allocate a new UBiDiTransform object by calling + * ubiditransform_open() before using it. Alternatively, + * a caller can set this parameter to NULL, in which case + * the object will be allocated by the engine on the fly.

+ * @param src A pointer to the text that the Bidi layout transformations will + * be performed on. + *

Note: the text must be (at least) + * srcLength long.

+ * @param srcLength The length of the text, in number of UChars. If + * length == -1 then the text must be zero-terminated. + * @param dest A pointer to where the processed text is to be copied. + * @param destSize The size of the dest buffer, in number of + * UChars. If the U_SHAPE_LETTERS_UNSHAPE option is set, + * then the destination length could be as large as + * srcLength * 2. Otherwise, the destination length will + * not exceed srcLength. If the caller reserves the last + * position for zero-termination, it should be excluded from + * destSize. + *

destSize == -1 is allowed and makes sense when + * dest was holds some meaningful value, e.g. that of + * src. In this case dest must be + * zero-terminated.

+ * @param inParaLevel A base embedding level of the input as defined in + * ubidi_setPara documentation for the + * paraLevel parameter. + * @param inOrder An order of the input, which can be one of the + * UBiDiOrder values. + * @param outParaLevel A base embedding level of the output as defined in + * ubidi_setPara documentation for the + * paraLevel parameter. + * @param outOrder An order of the output, which can be one of the + * UBiDiOrder values. + * @param doMirroring Indicates whether or not to perform character mirroring, + * and can accept one of the UBiDiMirroring values. + * @param shapingOptions Arabic digit and letter shaping options defined in the + * ushape.h documentation. + *

Note: Direction indicator options are computed by + * the transformation engine based on the effective ordering schemes, so + * user-defined direction indicators will be ignored.

+ * @param pErrorCode A pointer to an error code value. + * + * @return The destination length, i.e. the number of UChars written to + * dest. If the transformation fails, the return value + * will be 0 (and the error code will be written to + * pErrorCode). + * + * @see UBiDiLevel + * @see UBiDiOrder + * @see UBiDiMirroring + * @see ubidi_setPara + * @see u_shapeArabic + * @draft ICU 58 + */ +U_DRAFT uint32_t U_EXPORT2 +ubiditransform_transform(UBiDiTransform *pBiDiTransform, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destSize, + UBiDiLevel inParaLevel, UBiDiOrder inOrder, + UBiDiLevel outParaLevel, UBiDiOrder outOrder, + UBiDiMirroring doMirroring, uint32_t shapingOptions, + UErrorCode *pErrorCode); + +/** + * Allocates a UBiDiTransform object. This object can be reused, + * e.g. with different ordering schemes, mirroring or shaping options.

+ * Note:The object can only be reused in the same thread. + * All other threads should allocate a new UBiDiTransform object + * before using it.

+ * Example of usage:

+ *

+ * \code
+ * UErrorCode errorCode = U_ZERO_ERROR;
+ * // Open a new UBiDiTransform.
+ * UBiDiTransform* transform = ubiditransform_open(&errorCode);
+ * // Run a transformation.
+ * ubiditransform_transform(transform,
+ *          text1, -1, text2, -1,
+ *          UBIDI_RTL, UBIDI_LOGICAL,
+ *          UBIDI_LTR, UBIDI_VISUAL,
+ *          UBIDI_MIRRORING_ON,
+ *          U_SHAPE_DIGITS_EN2AN,
+ *          &errorCode);
+ * // Do something with the output text and invoke another transformation using
+ * //   that text as input.
+ * ubiditransform_transform(transform,
+ *          text2, -1, text3, -1,
+ *          UBIDI_LTR, UBIDI_VISUAL,
+ *          UBIDI_RTL, UBIDI_VISUAL,
+ *          UBIDI_MIRRORING_ON,
+ *          0, &errorCode);
+ *\endcode
+ * 
+ *

+ * The UBiDiTransform object must be deallocated by calling + * ubiditransform_close(). + * + * @return An empty UBiDiTransform object. + * @draft ICU 58 + */ +U_DRAFT UBiDiTransform* U_EXPORT2 +ubiditransform_open(UErrorCode *pErrorCode); + +/** + * Deallocates the given UBiDiTransform object. + * @draft ICU 58 + */ +U_DRAFT void U_EXPORT2 +ubiditransform_close(UBiDiTransform *pBidiTransform); + +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + +/** + * \class LocalUBiDiTransformPointer + * "Smart pointer" class, closes a UBiDiTransform via ubiditransform_close(). + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 58 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close); + +U_NAMESPACE_END + +#endif + +#endif /* U_HIDE_DRAFT_API */ +#endif diff --git a/deps/icu-small/source/common/unicode/ubrk.h b/deps/icu-small/source/common/unicode/ubrk.h index 59f0ed181f8458..f43943ed1ab12c 100644 --- a/deps/icu-small/source/common/unicode/ubrk.h +++ b/deps/icu-small/source/common/unicode/ubrk.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1996-2015, International Business Machines Corporation and others. @@ -114,8 +116,12 @@ typedef enum UBreakIteratorType { * @deprecated ICU 2.8 Use the word break iterator for titlecasing for Unicode 4 and later. */ UBRK_TITLE = 4, -#endif /* U_HIDE_DEPRECATED_API */ - UBRK_COUNT = 5 + /** + * One more than the highest normal UBreakIteratorType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + UBRK_COUNT = 5 +#endif // U_HIDE_DEPRECATED_API } UBreakIteratorType; /** Value indicating all text boundaries have been returned. @@ -130,7 +136,10 @@ typedef enum UBreakIteratorType { * word, to allow for further subdivisions of a category in future releases. * Applications should check for tag values falling within the range, rather * than for single individual values. - * @stable ICU 2.2 + * + * The numeric values of all of these constants are stable (will not change). + * + * @stable ICU 2.2 */ typedef enum UWordBreak { /** Tag value for "words" that do not fit into any of other categories. @@ -163,7 +172,10 @@ typedef enum UWordBreak { * word, to allow for further subdivisions of a category in future releases. * Applications should check for tag values falling within the range, rather * than for single individual values. - * @stable ICU 2.8 + * + * The numeric values of all of these constants are stable (will not change). + * + * @stable ICU 2.8 */ typedef enum ULineBreakTag { /** Tag value for soft line breaks, positions at which a line break @@ -185,7 +197,10 @@ typedef enum ULineBreakTag { * sentence, to allow for further subdivisions of a category in future releases. * Applications should check for tag values falling within the range, rather * than for single individual values. - * @stable ICU 2.8 + * + * The numeric values of all of these constants are stable (will not change). + * + * @stable ICU 2.8 */ typedef enum USentenceBreakTag { /** Tag value for for sentences ending with a sentence terminator @@ -316,7 +331,11 @@ U_NAMESPACE_END #endif /** - * Sets an existing iterator to point to a new piece of text + * Sets an existing iterator to point to a new piece of text. + * The break iterator retains a pointer to the supplied text. + * The caller must not modify or delete the text while the BreakIterator + * retains the reference. + * * @param bi The iterator to use * @param text The text to be set * @param textLength The length of the text diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index b37e16588697f1..d7345e8a402ab6 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/ucat.h b/deps/icu-small/source/common/unicode/ucat.h index 875477c2138b07..418b64fa19d919 100644 --- a/deps/icu-small/source/common/unicode/ucat.h +++ b/deps/icu-small/source/common/unicode/ucat.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2004, International Business Machines diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 61835840a33c0a..7f6ea6d9343ab7 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -39,7 +41,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "8.0" +#define U_UNICODE_VERSION "9.0" /** * \file @@ -427,8 +429,13 @@ typedef enum UProperty { */ UCHAR_EMOJI_MODIFIER_BASE=60, #endif /* U_HIDE_DRAFT_API */ - /** One more than the last constant for binary Unicode properties. @stable ICU 2.1 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for binary Unicode properties. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_BINARY_LIMIT=61, +#endif // U_HIDE_DEPRECATED_API /** Enumerated property Bidi_Class. Same as u_charDirection, returns UCharDirection values. @stable ICU 2.2 */ @@ -515,8 +522,13 @@ typedef enum UProperty { (http://www.unicode.org/reports/tr9/) Returns UBidiPairedBracketType values. @stable ICU 52 */ UCHAR_BIDI_PAIRED_BRACKET_TYPE=0x1015, - /** One more than the last constant for enumerated/integer Unicode properties. @stable ICU 2.2 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for enumerated/integer Unicode properties. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_INT_LIMIT=0x1016, +#endif // U_HIDE_DEPRECATED_API /** Bitmask property General_Category_Mask. This is the General_Category property returned as a bit mask. @@ -529,16 +541,26 @@ typedef enum UProperty { UCHAR_GENERAL_CATEGORY_MASK=0x2000, /** First constant for bit-mask Unicode properties. @stable ICU 2.4 */ UCHAR_MASK_START=UCHAR_GENERAL_CATEGORY_MASK, - /** One more than the last constant for bit-mask Unicode properties. @stable ICU 2.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for bit-mask Unicode properties. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_MASK_LIMIT=0x2001, +#endif // U_HIDE_DEPRECATED_API /** Double property Numeric_Value. Corresponds to u_getNumericValue. @stable ICU 2.4 */ UCHAR_NUMERIC_VALUE=0x3000, /** First constant for double Unicode properties. @stable ICU 2.4 */ UCHAR_DOUBLE_START=UCHAR_NUMERIC_VALUE, - /** One more than the last constant for double Unicode properties. @stable ICU 2.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for double Unicode properties. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_DOUBLE_LIMIT=0x3001, +#endif // U_HIDE_DEPRECATED_API /** String property Age. Corresponds to u_charAge. @stable ICU 2.4 */ @@ -590,8 +612,13 @@ typedef enum UProperty { /** String property Bidi_Paired_Bracket (new in Unicode 6.3). Corresponds to u_getBidiPairedBracket. @stable ICU 52 */ UCHAR_BIDI_PAIRED_BRACKET=0x400D, - /** One more than the last constant for string Unicode properties. @stable ICU 2.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for string Unicode properties. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_STRING_LIMIT=0x400E, +#endif // U_HIDE_DEPRECATED_API /** Miscellaneous property Script_Extensions (new in Unicode 6.0). Some characters are commonly used in multiple scripts. @@ -601,9 +628,14 @@ typedef enum UProperty { UCHAR_SCRIPT_EXTENSIONS=0x7000, /** First constant for Unicode properties with unusual value types. @stable ICU 4.6 */ UCHAR_OTHER_PROPERTY_START=UCHAR_SCRIPT_EXTENSIONS, - /** One more than the last constant for Unicode properties with unusual value types. - * @stable ICU 4.6 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the last constant for Unicode properties with unusual value types. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCHAR_OTHER_PROPERTY_LIMIT=0x7001, +#endif // U_HIDE_DEPRECATED_API + /** Represents a nonexistent or invalid property or property value. @stable ICU 2.4 */ UCHAR_INVALID_CODE = -1 } UProperty; @@ -684,7 +716,13 @@ typedef enum UCharCategory U_INITIAL_PUNCTUATION = 28, /** Pf @stable ICU 2.0 */ U_FINAL_PUNCTUATION = 29, - /** One higher than the last enum UCharCategory constant. @stable ICU 2.0 */ + /** + * One higher than the last enum UCharCategory constant. + * This numeric value is stable (will not change), see + * http://www.unicode.org/policies/stability_policy.html#Property_Value + * + * @stable ICU 2.0 + */ U_CHAR_CATEGORY_COUNT } UCharCategory; @@ -858,8 +896,15 @@ typedef enum UCharDirection { U_RIGHT_TO_LEFT_ISOLATE = 21, /** PDI @stable ICU 52 */ U_POP_DIRECTIONAL_ISOLATE = 22, - /** @stable ICU 2.0 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest UCharDirection value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_BIDI_CLASS). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_CHAR_DIRECTION_COUNT +#endif // U_HIDE_DEPRECATED_API } UCharDirection; /** @@ -881,8 +926,15 @@ typedef enum UBidiPairedBracketType { U_BPT_OPEN, /** Close paired bracket. @stable ICU 52 */ U_BPT_CLOSE, - /** @stable ICU 52 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UBidiPairedBracketType value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_BIDI_PAIRED_BRACKET_TYPE). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_BPT_COUNT /* 3 */ +#endif // U_HIDE_DEPRECATED_API } UBidiPairedBracketType; /** @@ -1572,8 +1624,40 @@ enum UBlockCode { /** @stable ICU 56 */ UBLOCK_SUTTON_SIGNWRITING = 262, /*[1D800]*/ - /** @stable ICU 2.0 */ - UBLOCK_COUNT = 263, + /* New blocks in Unicode 9.0 */ + + /** @stable ICU 58 */ + UBLOCK_ADLAM = 263, /*[1E900]*/ + /** @stable ICU 58 */ + UBLOCK_BHAIKSUKI = 264, /*[11C00]*/ + /** @stable ICU 58 */ + UBLOCK_CYRILLIC_EXTENDED_C = 265, /*[1C80]*/ + /** @stable ICU 58 */ + UBLOCK_GLAGOLITIC_SUPPLEMENT = 266, /*[1E000]*/ + /** @stable ICU 58 */ + UBLOCK_IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION = 267, /*[16FE0]*/ + /** @stable ICU 58 */ + UBLOCK_MARCHEN = 268, /*[11C70]*/ + /** @stable ICU 58 */ + UBLOCK_MONGOLIAN_SUPPLEMENT = 269, /*[11660]*/ + /** @stable ICU 58 */ + UBLOCK_NEWA = 270, /*[11400]*/ + /** @stable ICU 58 */ + UBLOCK_OSAGE = 271, /*[104B0]*/ + /** @stable ICU 58 */ + UBLOCK_TANGUT = 272, /*[17000]*/ + /** @stable ICU 58 */ + UBLOCK_TANGUT_COMPONENTS = 273, /*[18800]*/ + +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UBlockCode value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_BLOCK). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + UBLOCK_COUNT = 274, +#endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ UBLOCK_INVALID_CODE=-1 @@ -1602,7 +1686,15 @@ typedef enum UEastAsianWidth { U_EA_FULLWIDTH, /*[F]*/ U_EA_NARROW, /*[Na]*/ U_EA_WIDE, /*[W]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UEastAsianWidth value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_EAST_ASIAN_WIDTH). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_EA_COUNT +#endif // U_HIDE_DEPRECATED_API } UEastAsianWidth; /** @@ -1631,8 +1723,13 @@ typedef enum UCharNameChoice { U_EXTENDED_CHAR_NAME = U_UNICODE_CHAR_NAME+2, /** Corrected name from NameAliases.txt. @stable ICU 4.4 */ U_CHAR_NAME_ALIAS, - /** @stable ICU 2.0 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UCharNameChoice value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_CHAR_NAME_CHOICE_COUNT +#endif // U_HIDE_DEPRECATED_API } UCharNameChoice; /** @@ -1651,7 +1748,13 @@ typedef enum UCharNameChoice { typedef enum UPropertyNameChoice { U_SHORT_PROPERTY_NAME, U_LONG_PROPERTY_NAME, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UPropertyNameChoice value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_PROPERTY_NAME_CHOICE_COUNT +#endif // U_HIDE_DEPRECATED_API } UPropertyNameChoice; /** @@ -1685,7 +1788,15 @@ typedef enum UDecompositionType { U_DT_SUPER, /*[sup]*/ U_DT_VERTICAL, /*[vert]*/ U_DT_WIDE, /*[wide]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UDecompositionType value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_DECOMPOSITION_TYPE). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_DT_COUNT /* 18 */ +#endif // U_HIDE_DEPRECATED_API } UDecompositionType; /** @@ -1707,7 +1818,15 @@ typedef enum UJoiningType { U_JT_LEFT_JOINING, /*[L]*/ U_JT_RIGHT_JOINING, /*[R]*/ U_JT_TRANSPARENT, /*[T]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UJoiningType value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_JOINING_TYPE). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_JT_COUNT /* 6 */ +#endif // U_HIDE_DEPRECATED_API } UJoiningType; /** @@ -1810,7 +1929,18 @@ typedef enum UJoiningGroup { U_JG_MANICHAEAN_YODH, /**< @stable ICU 54 */ U_JG_MANICHAEAN_ZAYIN, /**< @stable ICU 54 */ U_JG_STRAIGHT_WAW, /**< @stable ICU 54 */ + U_JG_AFRICAN_FEH, /**< @stable ICU 58 */ + U_JG_AFRICAN_NOON, /**< @stable ICU 58 */ + U_JG_AFRICAN_QAF, /**< @stable ICU 58 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UJoiningGroup value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_JOINING_GROUP). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_JG_COUNT +#endif // U_HIDE_DEPRECATED_API } UJoiningGroup; /** @@ -1836,10 +1966,31 @@ typedef enum UGraphemeClusterBreak { U_GCB_LVT = 7, /*[LVT]*/ U_GCB_T = 8, /*[T]*/ U_GCB_V = 9, /*[V]*/ + /** @stable ICU 4.0 */ U_GCB_SPACING_MARK = 10, /*[SM]*/ /* from here on: new in Unicode 5.1/ICU 4.0 */ + /** @stable ICU 4.0 */ U_GCB_PREPEND = 11, /*[PP]*/ + /** @stable ICU 50 */ U_GCB_REGIONAL_INDICATOR = 12, /*[RI]*/ /* new in Unicode 6.2/ICU 50 */ - U_GCB_COUNT = 13 + /** @stable ICU 58 */ + U_GCB_E_BASE = 13, /*[EB]*/ /* from here on: new in Unicode 9.0/ICU 58 */ + /** @stable ICU 58 */ + U_GCB_E_BASE_GAZ = 14, /*[EBG]*/ + /** @stable ICU 58 */ + U_GCB_E_MODIFIER = 15, /*[EM]*/ + /** @stable ICU 58 */ + U_GCB_GLUE_AFTER_ZWJ = 16, /*[GAZ]*/ + /** @stable ICU 58 */ + U_GCB_ZWJ = 17, /*[ZWJ]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UGraphemeClusterBreak value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_GRAPHEME_CLUSTER_BREAK). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_GCB_COUNT = 18 +#endif // U_HIDE_DEPRECATED_API } UGraphemeClusterBreak; /** @@ -1864,16 +2015,43 @@ typedef enum UWordBreakValues { U_WB_MIDNUM = 5, /*[MN]*/ U_WB_NUMERIC = 6, /*[NU]*/ U_WB_EXTENDNUMLET = 7, /*[EX]*/ + /** @stable ICU 4.0 */ U_WB_CR = 8, /*[CR]*/ /* from here on: new in Unicode 5.1/ICU 4.0 */ + /** @stable ICU 4.0 */ U_WB_EXTEND = 9, /*[Extend]*/ + /** @stable ICU 4.0 */ U_WB_LF = 10, /*[LF]*/ + /** @stable ICU 4.0 */ U_WB_MIDNUMLET =11, /*[MB]*/ + /** @stable ICU 4.0 */ U_WB_NEWLINE =12, /*[NL]*/ + /** @stable ICU 50 */ U_WB_REGIONAL_INDICATOR = 13, /*[RI]*/ /* new in Unicode 6.2/ICU 50 */ + /** @stable ICU 52 */ U_WB_HEBREW_LETTER = 14, /*[HL]*/ /* from here on: new in Unicode 6.3/ICU 52 */ + /** @stable ICU 52 */ U_WB_SINGLE_QUOTE = 15, /*[SQ]*/ + /** @stable ICU 52 */ U_WB_DOUBLE_QUOTE = 16, /*[DQ]*/ - U_WB_COUNT = 17 + /** @stable ICU 58 */ + U_WB_E_BASE = 17, /*[EB]*/ /* from here on: new in Unicode 9.0/ICU 58 */ + /** @stable ICU 58 */ + U_WB_E_BASE_GAZ = 18, /*[EBG]*/ + /** @stable ICU 58 */ + U_WB_E_MODIFIER = 19, /*[EM]*/ + /** @stable ICU 58 */ + U_WB_GLUE_AFTER_ZWJ = 20, /*[GAZ]*/ + /** @stable ICU 58 */ + U_WB_ZWJ = 21, /*[ZWJ]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UWordBreakValues value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_WORD_BREAK). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_WB_COUNT = 22 +#endif // U_HIDE_DEPRECATED_API } UWordBreakValues; /** @@ -1904,7 +2082,15 @@ typedef enum USentenceBreak { U_SB_EXTEND = 12, /*[EX]*/ U_SB_LF = 13, /*[LF]*/ U_SB_SCONTINUE = 14, /*[SC]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal USentenceBreak value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_SENTENCE_BREAK). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_SB_COUNT = 15 +#endif // U_HIDE_DEPRECATED_API } USentenceBreak; /** @@ -1951,18 +2137,43 @@ typedef enum ULineBreak { U_LB_SPACE = 26, /*[SP]*/ U_LB_BREAK_SYMBOLS = 27, /*[SY]*/ U_LB_ZWSPACE = 28, /*[ZW]*/ + /** @stable ICU 2.6 */ U_LB_NEXT_LINE = 29, /*[NL]*/ /* from here on: new in Unicode 4/ICU 2.6 */ + /** @stable ICU 2.6 */ U_LB_WORD_JOINER = 30, /*[WJ]*/ + /** @stable ICU 3.4 */ U_LB_H2 = 31, /*[H2]*/ /* from here on: new in Unicode 4.1/ICU 3.4 */ + /** @stable ICU 3.4 */ U_LB_H3 = 32, /*[H3]*/ + /** @stable ICU 3.4 */ U_LB_JL = 33, /*[JL]*/ + /** @stable ICU 3.4 */ U_LB_JT = 34, /*[JT]*/ + /** @stable ICU 3.4 */ U_LB_JV = 35, /*[JV]*/ + /** @stable ICU 4.4 */ U_LB_CLOSE_PARENTHESIS = 36, /*[CP]*/ /* new in Unicode 5.2/ICU 4.4 */ + /** @stable ICU 49 */ U_LB_CONDITIONAL_JAPANESE_STARTER = 37,/*[CJ]*/ /* new in Unicode 6.1/ICU 49 */ + /** @stable ICU 49 */ U_LB_HEBREW_LETTER = 38, /*[HL]*/ /* new in Unicode 6.1/ICU 49 */ + /** @stable ICU 50 */ U_LB_REGIONAL_INDICATOR = 39,/*[RI]*/ /* new in Unicode 6.2/ICU 50 */ - U_LB_COUNT = 40 + /** @stable ICU 58 */ + U_LB_E_BASE = 40, /*[EB]*/ /* from here on: new in Unicode 9.0/ICU 58 */ + /** @stable ICU 58 */ + U_LB_E_MODIFIER = 41, /*[EM]*/ + /** @stable ICU 58 */ + U_LB_ZWJ = 42, /*[ZWJ]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal ULineBreak value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_LINE_BREAK). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_LB_COUNT = 43 +#endif // U_HIDE_DEPRECATED_API } ULineBreak; /** @@ -1982,7 +2193,15 @@ typedef enum UNumericType { U_NT_DECIMAL, /*[de]*/ U_NT_DIGIT, /*[di]*/ U_NT_NUMERIC, /*[nu]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UNumericType value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_NUMERIC_TYPE). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_NT_COUNT +#endif // U_HIDE_DEPRECATED_API } UNumericType; /** @@ -2004,7 +2223,15 @@ typedef enum UHangulSyllableType { U_HST_TRAILING_JAMO, /*[T]*/ U_HST_LV_SYLLABLE, /*[LV]*/ U_HST_LVT_SYLLABLE, /*[LVT]*/ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UHangulSyllableType value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_HANGUL_SYLLABLE_TYPE). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_HST_COUNT +#endif // U_HIDE_DEPRECATED_API } UHangulSyllableType; /** diff --git a/deps/icu-small/source/common/unicode/ucharstrie.h b/deps/icu-small/source/common/unicode/ucharstrie.h index 0575a974d0c957..8daed447cedab1 100644 --- a/deps/icu-small/source/common/unicode/ucharstrie.h +++ b/deps/icu-small/source/common/unicode/ucharstrie.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ucharstriebuilder.h b/deps/icu-small/source/common/unicode/ucharstriebuilder.h index f7a8039b776729..cc9fb77a9176e0 100644 --- a/deps/icu-small/source/common/unicode/ucharstriebuilder.h +++ b/deps/icu-small/source/common/unicode/ucharstriebuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2016, International Business Machines diff --git a/deps/icu-small/source/common/unicode/uchriter.h b/deps/icu-small/source/common/unicode/uchriter.h index bf8f2a8cdd1b05..1365c9b7d1a0ae 100644 --- a/deps/icu-small/source/common/unicode/uchriter.h +++ b/deps/icu-small/source/common/unicode/uchriter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1998-2005, International Business Machines diff --git a/deps/icu-small/source/common/unicode/uclean.h b/deps/icu-small/source/common/unicode/uclean.h index ad16158e6c5f38..6a5a4f42b6c886 100644 --- a/deps/icu-small/source/common/unicode/uclean.h +++ b/deps/icu-small/source/common/unicode/uclean.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 564656c284f8e0..767c1a2a7f44f1 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2014, International Business Machines @@ -941,8 +943,13 @@ typedef enum UConverterUnicodeSet { UCNV_ROUNDTRIP_SET, /** Select the set of Unicode code points with roundtrip or fallback mappings. @stable ICU 4.0 */ UCNV_ROUNDTRIP_AND_FALLBACK_SET, - /** Number of UConverterUnicodeSet selectors. @stable ICU 2.6 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * Number of UConverterUnicodeSet selectors. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCNV_SET_COUNT +#endif // U_HIDE_DEPRECATED_API } UConverterUnicodeSet; diff --git a/deps/icu-small/source/common/unicode/ucnv_cb.h b/deps/icu-small/source/common/unicode/ucnv_cb.h index 1698de8e333093..a553481c45f893 100644 --- a/deps/icu-small/source/common/unicode/ucnv_cb.h +++ b/deps/icu-small/source/common/unicode/ucnv_cb.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2000-2004, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ucnv_err.h b/deps/icu-small/source/common/unicode/ucnv_err.h index 9d37e18c158bfa..ea7f757d0ce799 100644 --- a/deps/icu-small/source/common/unicode/ucnv_err.h +++ b/deps/icu-small/source/common/unicode/ucnv_err.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2009, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ucnvsel.h b/deps/icu-small/source/common/unicode/ucnvsel.h index af27f3d9a9a015..b5820031a5a9f0 100644 --- a/deps/icu-small/source/common/unicode/ucnvsel.h +++ b/deps/icu-small/source/common/unicode/ucnvsel.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 90f5a58da34938..d681febf4f8c3d 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2016, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ucurr.h b/deps/icu-small/source/common/unicode/ucurr.h index fc8999351f6330..8b5d41ae3b8a7f 100644 --- a/deps/icu-small/source/common/unicode/ucurr.h +++ b/deps/icu-small/source/common/unicode/ucurr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2016, International Business Machines @@ -50,11 +52,13 @@ enum UCurrencyUsage { * @stable ICU 54 */ UCURR_USAGE_CASH=1, +#ifndef U_HIDE_DEPRECATED_API /** * One higher than the last enum UCurrencyUsage constant. - * @stable ICU 54 + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UCURR_USAGE_COUNT=2 +#endif // U_HIDE_DEPRECATED_API }; typedef enum UCurrencyUsage UCurrencyUsage; diff --git a/deps/icu-small/source/common/unicode/udata.h b/deps/icu-small/source/common/unicode/udata.h index 16c1aabbdc10f3..abc043f6d01c91 100644 --- a/deps/icu-small/source/common/unicode/udata.h +++ b/deps/icu-small/source/common/unicode/udata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -408,8 +410,13 @@ typedef enum UDataFileAccess { UDATA_PACKAGES_FIRST, /** ICU does not access the file system for data loading. @stable ICU 3.4 */ UDATA_NO_FILES, - /** Number of real UDataFileAccess values. @stable ICU 3.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * Number of real UDataFileAccess values. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UDATA_FILE_ACCESS_COUNT +#endif // U_HIDE_DEPRECATED_API } UDataFileAccess; /** diff --git a/deps/icu-small/source/common/unicode/udisplaycontext.h b/deps/icu-small/source/common/unicode/udisplaycontext.h index 7ecb95b02c9a08..eaef02d7956ef4 100644 --- a/deps/icu-small/source/common/unicode/udisplaycontext.h +++ b/deps/icu-small/source/common/unicode/udisplaycontext.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2014-2016, International Business Machines @@ -41,7 +43,15 @@ enum UDisplayContextType { * UDISPCTX_LENGTH_FULL, UDISPCTX_LENGTH_SHORT. * @stable ICU 54 */ - UDISPCTX_TYPE_DISPLAY_LENGTH = 2 + UDISPCTX_TYPE_DISPLAY_LENGTH = 2, +#ifndef U_HIDE_DRAFT_API + /** + * Type to retrieve the substitute handling setting, e.g. + * UDISPCTX_SUBSTITUTE, UDISPCTX_NO_SUBSTITUTE. + * @draft ICU 58 + */ + UDISPCTX_TYPE_SUBSTITUTE_HANDLING = 3 +#endif /* U_HIDE_DRAFT_API */ }; /** * @stable ICU 51 @@ -132,7 +142,29 @@ enum UDisplayContext { * e.g. "U.S." for US. * @stable ICU 54 */ - UDISPCTX_LENGTH_SHORT = (UDISPCTX_TYPE_DISPLAY_LENGTH<<8) + 1 + UDISPCTX_LENGTH_SHORT = (UDISPCTX_TYPE_DISPLAY_LENGTH<<8) + 1, +#ifndef U_HIDE_DRAFT_API + /** + * ================================ + * SUBSTITUTE_HANDLING can be set to one of UDISPCTX_SUBSTITUTE or + * UDISPCTX_NO_SUBSTITUTE. Use UDisplayContextType UDISPCTX_TYPE_SUBSTITUTE_HANDLING + * to get the value. + */ + /** + * A possible setting for SUBSTITUTE_HANDLING: + * Returns a fallback value (e.g., the input code) when no data is available. + * This is the default value. + * @draft ICU 58 + */ + UDISPCTX_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 0, + /** + * A possible setting for SUBSTITUTE_HANDLING: + * Returns a null value when no data is available. + * @draft ICU 58 + */ + UDISPCTX_NO_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 1 +#endif /* U_HIDE_DRAFT_API */ + }; /** * @stable ICU 51 diff --git a/deps/icu-small/source/common/unicode/uenum.h b/deps/icu-small/source/common/unicode/uenum.h index ec19b0b59e61fc..50dde60da1824b 100644 --- a/deps/icu-small/source/common/unicode/uenum.h +++ b/deps/icu-small/source/common/unicode/uenum.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/uidna.h b/deps/icu-small/source/common/unicode/uidna.h index a5677a44064690..d49729a29ce846 100644 --- a/deps/icu-small/source/common/unicode/uidna.h +++ b/deps/icu-small/source/common/unicode/uidna.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/uiter.h b/deps/icu-small/source/common/unicode/uiter.h index 693ba2ca827de2..74075e5a6e0ea7 100644 --- a/deps/icu-small/source/common/unicode/uiter.h +++ b/deps/icu-small/source/common/unicode/uiter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/uldnames.h b/deps/icu-small/source/common/unicode/uldnames.h index 8c153d6a41e05b..8a3dfd0a6a36fa 100644 --- a/deps/icu-small/source/common/unicode/uldnames.h +++ b/deps/icu-small/source/common/unicode/uldnames.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unicode/ulistformatter.h b/deps/icu-small/source/common/unicode/ulistformatter.h index bd83199441c89a..bed18984e9c255 100644 --- a/deps/icu-small/source/common/unicode/ulistformatter.h +++ b/deps/icu-small/source/common/unicode/ulistformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2015-2016, International Business Machines diff --git a/deps/icu-small/source/common/unicode/uloc.h b/deps/icu-small/source/common/unicode/uloc.h index 0caa02ed7e04dc..5146000f28cca4 100644 --- a/deps/icu-small/source/common/unicode/uloc.h +++ b/deps/icu-small/source/common/unicode/uloc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -348,10 +350,14 @@ typedef enum { * @deprecated ICU 2.8 */ ULOC_REQUESTED_LOCALE = 2, -#endif /* U_HIDE_DEPRECATED_API */ - ULOC_DATA_LOCALE_TYPE_LIMIT = 3 -} ULocDataLocaleType ; + /** + * One more than the highest normal ULocDataLocaleType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + ULOC_DATA_LOCALE_TYPE_LIMIT = 3 +#endif // U_HIDE_DEPRECATED_API +} ULocDataLocaleType; #ifndef U_HIDE_SYSTEM_API /** diff --git a/deps/icu-small/source/common/unicode/umachine.h b/deps/icu-small/source/common/unicode/umachine.h index d7829bafacc6da..22820d4b003a55 100644 --- a/deps/icu-small/source/common/unicode/umachine.h +++ b/deps/icu-small/source/common/unicode/umachine.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -49,6 +51,29 @@ */ #include +#ifndef U_HIDE_INTERNAL_API +/* + * U_USE_CHAR16_T + * When defined, force use of char16_t for UChar. + * Note: char16_t is expected to become the default and required in the future, + * and this option will be removed. + * @internal + */ +#ifdef U_USE_CHAR16_T +#ifdef UCHAR_TYPE +#undef UCHAR_TYPE +#endif +#define UCHAR_TYPE char16_t + +/* + * In plain C, is needed for the definition of char16_t + */ +#ifndef __cplusplus +#include +#endif +#endif +#endif /* U_HIDE_INTERNAL_API */ + /*==========================================================================*/ /* For C wrappers, we use the symbol U_STABLE. */ /* This works properly if the includer is C or C++. */ diff --git a/deps/icu-small/source/common/unicode/umisc.h b/deps/icu-small/source/common/unicode/umisc.h index cbc2d9ceed319c..4cc665721a00be 100644 --- a/deps/icu-small/source/common/unicode/umisc.h +++ b/deps/icu-small/source/common/unicode/umisc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2006, International Business Machines diff --git a/deps/icu-small/source/common/unicode/unifilt.h b/deps/icu-small/source/common/unicode/unifilt.h index c504d17ed9e8d0..cedde81de4a0e1 100644 --- a/deps/icu-small/source/common/unicode/unifilt.h +++ b/deps/icu-small/source/common/unicode/unifilt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2010, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/common/unicode/unifunct.h b/deps/icu-small/source/common/unicode/unifunct.h index 3fda80a64b0c53..724893ad962bb0 100644 --- a/deps/icu-small/source/common/unicode/unifunct.h +++ b/deps/icu-small/source/common/unicode/unifunct.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2005, International Business Machines Corporation diff --git a/deps/icu-small/source/common/unicode/unimatch.h b/deps/icu-small/source/common/unicode/unimatch.h index 0ac66c49e26e1d..a83199ef61f720 100644 --- a/deps/icu-small/source/common/unicode/unimatch.h +++ b/deps/icu-small/source/common/unicode/unimatch.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2001-2005, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 3277f11328a8f5..32e973dd791d5d 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 1999-2016, International Business Machines Corporation @@ -360,7 +362,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { UnicodeSet(); /** - * Constructs a set containing the given range. If end > + * Constructs a set containing the given range. If end < * start then an empty set is created. * * @param start first character, inclusive, of range diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index bf00974fddb70f..6f62244a1e2824 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1998-2016, International Business Machines @@ -74,7 +76,9 @@ UStringCaseMapper(const UCaseMap *csm, U_NAMESPACE_BEGIN +#if !UCONFIG_NO_BREAK_ITERATION class BreakIterator; // unicode/brkiter.h +#endif class Locale; // unicode/locid.h class StringCharacterIterator; class UnicodeStringAppendable; // unicode/appendable.h @@ -172,8 +176,6 @@ class UnicodeStringAppendable; // unicode/appendable.h # endif #endif -/* Cannot make the following #ifndef U_HIDE_DRAFT_API, - it is used to construct other non-internal constants */ /** * \def UNISTR_OBJECT_SIZE * Desired sizeof(UnicodeString) in bytes. @@ -205,7 +207,7 @@ class UnicodeStringAppendable; // unicode/appendable.h * and the internal buffer would hold up to 11 UChars in that case. * * @see U16_MAX_LENGTH - * @draft ICU 56 + * @stable ICU 56 */ #ifndef UNISTR_OBJECT_SIZE # define UNISTR_OBJECT_SIZE 64 @@ -1902,7 +1904,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString &fastCopyFrom(const UnicodeString &src); -#ifndef U_HIDE_DRAFT_API #if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, might leave src in bogus state. @@ -1910,12 +1911,13 @@ class U_COMMON_API UnicodeString : public Replaceable * The behavior is undefined if *this and src are the same object. * @param src source string * @return *this - * @draft ICU 56 + * @stable ICU 56 */ UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { return moveFrom(src); } #endif + // 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. @@ -1931,16 +1933,15 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Swap strings. * @param other other string - * @draft ICU 56 + * @stable ICU 56 */ void swap(UnicodeString &other) U_NOEXCEPT; -#endif /* U_HIDE_DRAFT_API */ /** * Non-member UnicodeString swap function. * @param s1 will get s2's contents and state * @param s2 will get s1's contents and state - * @draft ICU 56 + * @stable ICU 56 */ friend U_COMMON_API inline void U_EXPORT2 swap(UnicodeString &s1, UnicodeString &s2) U_NOEXCEPT { @@ -3212,17 +3213,15 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString(const UnicodeString& that); -#ifndef U_HIDE_DRAFT_API #if U_HAVE_RVALUE_REFERENCES /** * Move constructor, might leave src in bogus state. * This string will have the same contents and state that the source string had. * @param src source string - * @draft ICU 56 + * @stable ICU 56 */ UnicodeString(UnicodeString &&src) U_NOEXCEPT; #endif -#endif /* U_HIDE_DRAFT_API */ /** * 'Substring' constructor from tail of source string. @@ -3277,7 +3276,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see toUTF8String * @stable ICU 4.2 */ - static UnicodeString fromUTF8(const StringPiece &utf8); + static UnicodeString fromUTF8(StringPiece utf8); /** * Create a UnicodeString from a UTF-32 string. @@ -3392,7 +3391,7 @@ class U_COMMON_API UnicodeString : public Replaceable private: // For char* constructors. Could be made public. - UnicodeString &setToUTF8(const StringPiece &utf8); + UnicodeString &setToUTF8(StringPiece utf8); // For extract(char*). // We could make a toUTF8(target, capacity, errorCode) public but not // this version: New API will be cleaner if we make callers create substrings @@ -3617,7 +3616,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ US_STACKBUF_SIZE=(int32_t)(UNISTR_OBJECT_SIZE-sizeof(void *)-2)/U_SIZEOF_UCHAR, kInvalidUChar=0xffff, // U+FFFF returned by charAt(invalid index) - kGrowSize=128, // grow size for this buffer kInvalidHashCode=0, // invalid hash code kEmptyHashCode=1, // hash code for empty string diff --git a/deps/icu-small/source/common/unicode/unorm.h b/deps/icu-small/source/common/unicode/unorm.h index ab3e34e84b3add..f527c263f0298a 100644 --- a/deps/icu-small/source/common/unicode/unorm.h +++ b/deps/icu-small/source/common/unicode/unorm.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (c) 1996-2016, International Business Machines Corporation @@ -22,8 +24,6 @@ #include "unicode/uiter.h" #include "unicode/unorm2.h" -#ifndef U_HIDE_DEPRECATED_API - /** * \file * \brief C API: Unicode Normalization @@ -129,6 +129,8 @@ * For more usage examples, see the Unicode Standard Annex. */ +// Do not conditionalize the following enum with #ifndef U_HIDE_DEPRECATED_API, +// it is needed for layout of Normalizer object. /** * Constants for normalization modes. * @deprecated ICU 56 Use unorm2.h instead. @@ -153,6 +155,8 @@ typedef enum { UNORM_MODE_COUNT } UNormalizationMode; +#ifndef U_HIDE_DEPRECATED_API + /** * Constants for options flags for normalization. * Use 0 for default options, diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index b557d6a3ec2ebf..56e99b2a22b413 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/uobject.h b/deps/icu-small/source/common/unicode/uobject.h index cdd14f42accb7e..96b1b8fbeadd19 100644 --- a/deps/icu-small/source/common/unicode/uobject.h +++ b/deps/icu-small/source/common/unicode/uobject.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 627ffa9bdc46df..b220a546975e47 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2002-2016, International Business Machines @@ -474,6 +476,9 @@ #define ubidi_setReorderingOptions U_ICU_ENTRY_POINT_RENAME(ubidi_setReorderingOptions) #define ubidi_writeReordered U_ICU_ENTRY_POINT_RENAME(ubidi_writeReordered) #define ubidi_writeReverse U_ICU_ENTRY_POINT_RENAME(ubidi_writeReverse) +#define ubiditransform_close U_ICU_ENTRY_POINT_RENAME(ubiditransform_close) +#define ubiditransform_open U_ICU_ENTRY_POINT_RENAME(ubiditransform_open) +#define ubiditransform_transform U_ICU_ENTRY_POINT_RENAME(ubiditransform_transform) #define ublock_getCode U_ICU_ENTRY_POINT_RENAME(ublock_getCode) #define ubrk_close U_ICU_ENTRY_POINT_RENAME(ubrk_close) #define ubrk_countAvailable U_ICU_ENTRY_POINT_RENAME(ubrk_countAvailable) @@ -1013,6 +1018,7 @@ #define ulist_getListSize U_ICU_ENTRY_POINT_RENAME(ulist_getListSize) #define ulist_getNext U_ICU_ENTRY_POINT_RENAME(ulist_getNext) #define ulist_next_keyword_value U_ICU_ENTRY_POINT_RENAME(ulist_next_keyword_value) +#define ulist_removeString U_ICU_ENTRY_POINT_RENAME(ulist_removeString) #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) @@ -1355,6 +1361,7 @@ #define uprv_toupper U_ICU_ENTRY_POINT_RENAME(uprv_toupper) #define uprv_trunc U_ICU_ENTRY_POINT_RENAME(uprv_trunc) #define uprv_tzname U_ICU_ENTRY_POINT_RENAME(uprv_tzname) +#define uprv_tzname_clear_cache U_ICU_ENTRY_POINT_RENAME(uprv_tzname_clear_cache) #define uprv_tzset U_ICU_ENTRY_POINT_RENAME(uprv_tzset) #define uprv_uint16Comparator U_ICU_ENTRY_POINT_RENAME(uprv_uint16Comparator) #define uprv_uint32Comparator U_ICU_ENTRY_POINT_RENAME(uprv_uint32Comparator) @@ -1456,10 +1463,7 @@ #define ures_countArrayItems U_ICU_ENTRY_POINT_RENAME(ures_countArrayItems) #define ures_findResource U_ICU_ENTRY_POINT_RENAME(ures_findResource) #define ures_findSubResource U_ICU_ENTRY_POINT_RENAME(ures_findSubResource) -#define ures_getAllArrayItems U_ICU_ENTRY_POINT_RENAME(ures_getAllArrayItems) -#define ures_getAllArrayItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllArrayItemsWithFallback) -#define ures_getAllTableItems U_ICU_ENTRY_POINT_RENAME(ures_getAllTableItems) -#define ures_getAllTableItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllTableItemsWithFallback) +#define ures_getAllItemsWithFallback U_ICU_ENTRY_POINT_RENAME(ures_getAllItemsWithFallback) #define ures_getBinary U_ICU_ENTRY_POINT_RENAME(ures_getBinary) #define ures_getByIndex U_ICU_ENTRY_POINT_RENAME(ures_getByIndex) #define ures_getByKey U_ICU_ENTRY_POINT_RENAME(ures_getByKey) @@ -1607,13 +1611,20 @@ #define uspoof_areConfusableUTF8 U_ICU_ENTRY_POINT_RENAME(uspoof_areConfusableUTF8) #define uspoof_areConfusableUnicodeString U_ICU_ENTRY_POINT_RENAME(uspoof_areConfusableUnicodeString) #define uspoof_check U_ICU_ENTRY_POINT_RENAME(uspoof_check) +#define uspoof_check2 U_ICU_ENTRY_POINT_RENAME(uspoof_check2) +#define uspoof_check2UTF8 U_ICU_ENTRY_POINT_RENAME(uspoof_check2UTF8) +#define uspoof_check2UnicodeString U_ICU_ENTRY_POINT_RENAME(uspoof_check2UnicodeString) #define uspoof_checkUTF8 U_ICU_ENTRY_POINT_RENAME(uspoof_checkUTF8) #define uspoof_checkUnicodeString U_ICU_ENTRY_POINT_RENAME(uspoof_checkUnicodeString) #define uspoof_clone U_ICU_ENTRY_POINT_RENAME(uspoof_clone) #define uspoof_close U_ICU_ENTRY_POINT_RENAME(uspoof_close) +#define uspoof_closeCheckResult U_ICU_ENTRY_POINT_RENAME(uspoof_closeCheckResult) #define uspoof_getAllowedChars U_ICU_ENTRY_POINT_RENAME(uspoof_getAllowedChars) #define uspoof_getAllowedLocales U_ICU_ENTRY_POINT_RENAME(uspoof_getAllowedLocales) #define uspoof_getAllowedUnicodeSet U_ICU_ENTRY_POINT_RENAME(uspoof_getAllowedUnicodeSet) +#define uspoof_getCheckResultChecks U_ICU_ENTRY_POINT_RENAME(uspoof_getCheckResultChecks) +#define uspoof_getCheckResultNumerics U_ICU_ENTRY_POINT_RENAME(uspoof_getCheckResultNumerics) +#define uspoof_getCheckResultRestrictionLevel U_ICU_ENTRY_POINT_RENAME(uspoof_getCheckResultRestrictionLevel) #define uspoof_getChecks U_ICU_ENTRY_POINT_RENAME(uspoof_getChecks) #define uspoof_getInclusionSet U_ICU_ENTRY_POINT_RENAME(uspoof_getInclusionSet) #define uspoof_getInclusionUnicodeSet U_ICU_ENTRY_POINT_RENAME(uspoof_getInclusionUnicodeSet) @@ -1625,6 +1636,7 @@ #define uspoof_getSkeletonUnicodeString U_ICU_ENTRY_POINT_RENAME(uspoof_getSkeletonUnicodeString) #define uspoof_internalInitStatics U_ICU_ENTRY_POINT_RENAME(uspoof_internalInitStatics) #define uspoof_open U_ICU_ENTRY_POINT_RENAME(uspoof_open) +#define uspoof_openCheckResult U_ICU_ENTRY_POINT_RENAME(uspoof_openCheckResult) #define uspoof_openFromSerialized U_ICU_ENTRY_POINT_RENAME(uspoof_openFromSerialized) #define uspoof_openFromSource U_ICU_ENTRY_POINT_RENAME(uspoof_openFromSource) #define uspoof_serialize U_ICU_ENTRY_POINT_RENAME(uspoof_serialize) diff --git a/deps/icu-small/source/common/unicode/urep.h b/deps/icu-small/source/common/unicode/urep.h index 3d1b0b6902e386..128f465319e2be 100644 --- a/deps/icu-small/source/common/unicode/urep.h +++ b/deps/icu-small/source/common/unicode/urep.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2010, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ures.h b/deps/icu-small/source/common/unicode/ures.h index 190a5050aefc4c..620d9268aaceeb 100644 --- a/deps/icu-small/source/common/unicode/ures.h +++ b/deps/icu-small/source/common/unicode/ures.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -120,9 +122,13 @@ typedef enum { RES_INT_VECTOR=URES_INT_VECTOR, /** @deprecated ICU 2.6 Not used. */ RES_RESERVED=15, -#endif /* U_HIDE_DEPRECATED_API */ + /** + * One more than the highest normal UResType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ URES_LIMIT = 16 +#endif // U_HIDE_DEPRECATED_API } UResType; /* diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index 7615a49998df89..a20cd157a45507 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** - * Copyright (C) 1997-2015, International Business Machines + * Copyright (C) 1997-2016, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * @@ -32,13 +34,13 @@ * See UAX #24 Unicode Script Property (http://www.unicode.org/reports/tr24/) * and http://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt . * - * Starting with ICU 3.6, constants for most ISO 15924 script codes + * In addition, constants for many ISO 15924 script codes * are included, for use with language tags, CLDR data, and similar. * Some of those codes are not used in the Unicode Character Database (UCD). * For example, there are no characters that have a UCD script property value of * Hans or Hant. All Han ideographs have the Hani script property value in Unicode. * - * Private-use codes Qaaa..Qabx are not included. + * Private-use codes Qaaa..Qabx are not included, except as used in the UCD or in CLDR. * * Starting with ICU 55, script codes are only added when their scripts * have been or will certainly be encoded in Unicode, @@ -424,18 +426,33 @@ typedef enum UScriptCode { /** @stable ICU 54 */ USCRIPT_SIDDHAM = 166,/* Sidd */ - /** - * One higher than the last script code constant. - * This value increases as constants for script codes are added. - * - * There are constants for Unicode 7 script property values. - * There are constants for ISO 15924 script codes assigned on or before 2013-10-12. - * There are no constants for private use codes from Qaaa - Qabx - * except as used in the UCD. - * - * @stable ICU 2.2 - */ - USCRIPT_CODE_LIMIT = 167 + /** @stable ICU 58 */ + USCRIPT_ADLAM = 167,/* Adlm */ + /** @stable ICU 58 */ + USCRIPT_BHAIKSUKI = 168,/* Bhks */ + /** @stable ICU 58 */ + USCRIPT_MARCHEN = 169,/* Marc */ + /** @stable ICU 58 */ + USCRIPT_NEWA = 170,/* Newa */ + /** @stable ICU 58 */ + USCRIPT_OSAGE = 171,/* Osge */ + + /** @stable ICU 58 */ + USCRIPT_HAN_WITH_BOPOMOFO = 172,/* Hanb */ + /** @stable ICU 58 */ + USCRIPT_JAMO = 173,/* Jamo */ + /** @stable ICU 58 */ + USCRIPT_SYMBOLS_EMOJI = 174,/* Zsye */ + +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UScriptCode value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_SCRIPT). + * + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + USCRIPT_CODE_LIMIT = 175 +#endif // U_HIDE_DEPRECATED_API } UScriptCode; /** @@ -503,9 +520,6 @@ uscript_getScript(UChar32 codepoint, UErrorCode *err); * * Some characters are commonly used in multiple scripts. * For more information, see UAX #24: http://www.unicode.org/reports/tr24/. - * - * The Script_Extensions property is provisional. It may be modified or removed - * in future versions of the Unicode Standard, and thus in ICU. * @param c code point * @param sc script code * @return TRUE if sc is in Script_Extensions(c) @@ -532,8 +546,6 @@ uscript_hasScript(UChar32 c, UScriptCode sc); * U_BUFFER_OVERFLOW_ERROR is set and the number of Script_Extensions is returned. * (Usual ICU buffer handling behavior.) * - * The Script_Extensions property is provisional. It may be modified or removed - * in future versions of the Unicode Standard, and thus in ICU. * @param c code point * @param scripts output script code array * @param capacity capacity of the scripts array diff --git a/deps/icu-small/source/common/unicode/uset.h b/deps/icu-small/source/common/unicode/uset.h index 1db3d3db59e938..b4ed176eb951a6 100644 --- a/deps/icu-small/source/common/unicode/uset.h +++ b/deps/icu-small/source/common/unicode/uset.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -196,11 +198,13 @@ typedef enum USetSpanCondition { * @stable ICU 3.8 */ USET_SPAN_SIMPLE = 2, +#ifndef U_HIDE_DEPRECATED_API /** * One more than the last span condition. - * @stable ICU 3.8 + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ USET_SPAN_CONDITION_COUNT +#endif // U_HIDE_DEPRECATED_API } USetSpanCondition; enum { diff --git a/deps/icu-small/source/common/unicode/usetiter.h b/deps/icu-small/source/common/unicode/usetiter.h index a0aae22115238d..d70e897b223335 100644 --- a/deps/icu-small/source/common/unicode/usetiter.h +++ b/deps/icu-small/source/common/unicode/usetiter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2014, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ushape.h b/deps/icu-small/source/common/unicode/ushape.h index dcd8bfe6791f29..97fe9e3880b843 100644 --- a/deps/icu-small/source/common/unicode/ushape.h +++ b/deps/icu-small/source/common/unicode/ushape.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unicode/usprep.h b/deps/icu-small/source/common/unicode/usprep.h index 767279857adb47..fce161759d9f9b 100644 --- a/deps/icu-small/source/common/unicode/usprep.h +++ b/deps/icu-small/source/common/unicode/usprep.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index 10080350d66144..8f4809c8159ca9 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1998-2014, International Business Machines diff --git a/deps/icu-small/source/common/unicode/ustringtrie.h b/deps/icu-small/source/common/unicode/ustringtrie.h index 871d0f887a3765..50d31ba226c308 100644 --- a/deps/icu-small/source/common/unicode/ustringtrie.h +++ b/deps/icu-small/source/common/unicode/ustringtrie.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2012, International Business Machines diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 5c6d3d05c6c9ce..84ff22ad630f38 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utf.h b/deps/icu-small/source/common/unicode/utf.h index 679e8f6e630e77..7f40190eb81ac7 100644 --- a/deps/icu-small/source/common/unicode/utf.h +++ b/deps/icu-small/source/common/unicode/utf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utf16.h b/deps/icu-small/source/common/unicode/utf16.h index 986b4137170476..3455a40e56cceb 100644 --- a/deps/icu-small/source/common/unicode/utf16.h +++ b/deps/icu-small/source/common/unicode/utf16.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utf32.h b/deps/icu-small/source/common/unicode/utf32.h index bf63e69dba00c7..f93727c109442a 100644 --- a/deps/icu-small/source/common/unicode/utf32.h +++ b/deps/icu-small/source/common/unicode/utf32.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 94a01342407745..095e955ecd3c7e 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utf_old.h b/deps/icu-small/source/common/unicode/utf_old.h index 47dd1da3cc98d8..b550b28ae3ad98 100644 --- a/deps/icu-small/source/common/unicode/utf_old.h +++ b/deps/icu-small/source/common/unicode/utf_old.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unicode/utrace.h b/deps/icu-small/source/common/unicode/utrace.h index 1a51ff9a62d467..9add16f1ccb078 100644 --- a/deps/icu-small/source/common/unicode/utrace.h +++ b/deps/icu-small/source/common/unicode/utrace.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -64,7 +66,13 @@ typedef enum UTraceFunctionNumber { UTRACE_FUNCTION_START=0, UTRACE_U_INIT=UTRACE_FUNCTION_START, UTRACE_U_CLEANUP, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal collation trace location. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UTRACE_FUNCTION_LIMIT, +#endif // U_HIDE_DEPRECATED_API UTRACE_CONVERSION_START=0x1000, UTRACE_UCNV_OPEN=UTRACE_CONVERSION_START, @@ -75,7 +83,13 @@ typedef enum UTraceFunctionNumber { UTRACE_UCNV_FLUSH_CACHE, UTRACE_UCNV_LOAD, UTRACE_UCNV_UNLOAD, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal collation trace location. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UTRACE_CONVERSION_LIMIT, +#endif // U_HIDE_DEPRECATED_API UTRACE_COLLATION_START=0x2000, UTRACE_UCOL_OPEN=UTRACE_COLLATION_START, @@ -87,7 +101,13 @@ typedef enum UTraceFunctionNumber { UTRACE_UCOL_STRCOLLITER, UTRACE_UCOL_OPEN_FROM_SHORT_STRING, UTRACE_UCOL_STRCOLLUTF8, /**< @stable ICU 50 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal collation trace location. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UTRACE_COLLATION_LIMIT +#endif // U_HIDE_DEPRECATED_API } UTraceFunctionNumber; /** diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index 5a761c094b8e48..8325d534ed1167 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1996-2016, International Business Machines @@ -373,88 +375,6 @@ typedef double UDate; #define U_STANDARD_CPP_NAMESPACE #endif - -/*===========================================================================*/ -/* Global delete operator */ -/*===========================================================================*/ - -/* - * The ICU4C library must not use the global new and delete operators. - * These operators here are defined to enable testing for this. - * See Jitterbug 2581 for details of why this is necessary. - * - * Verification that ICU4C's memory usage is correct, i.e., - * that global new/delete are not used: - * - * a) Check for imports of global new/delete (see uobject.cpp for details) - * b) Verify that new is never imported. - * c) Verify that delete is only imported from object code for interface/mixin classes. - * d) Add global delete and delete[] only for the ICU4C library itself - * and define them in a way that crashes or otherwise easily shows a problem. - * - * The following implements d). - * The operator implementations crash; this is intentional and used for library debugging. - * - * Note: This is currently only done on Windows because - * some Linux/Unix compilers have problems with defining global new/delete. - * On Windows, it is _MSC_VER>=1200 for MSVC 6.0 and higher. - */ -#if defined(__cplusplus) && U_DEBUG && U_OVERRIDE_CXX_ALLOCATION && (_MSC_VER>=1200) && !defined(U_STATIC_IMPLEMENTATION) && (defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) || defined(U_LAYOUT_IMPLEMENTATION) || defined(U_LAYOUTEX_IMPLEMENTATION)) - -#ifndef U_HIDE_INTERNAL_API -/** - * Global operator new, defined only inside ICU4C, must not be used. - * Crashes intentionally. - * @internal - */ -inline void * -operator new(size_t /*size*/) { - char *q=NULL; - *q=5; /* break it */ - return q; -} - -#ifdef _Ret_bytecap_ -/* This is only needed to suppress a Visual C++ 2008 warning for operator new[]. */ -_Ret_bytecap_(_Size) -#endif -/** - * Global operator new[], defined only inside ICU4C, must not be used. - * Crashes intentionally. - * @internal - */ -inline void * -operator new[](size_t /*size*/) { - char *q=NULL; - *q=5; /* break it */ - return q; -} - -/** - * Global operator delete, defined only inside ICU4C, must not be used. - * Crashes intentionally. - * @internal - */ -inline void -operator delete(void * /*p*/) { - char *q=NULL; - *q=5; /* break it */ -} - -/** - * Global operator delete[], defined only inside ICU4C, must not be used. - * Crashes intentionally. - * @internal - */ -inline void -operator delete[](void * /*p*/) { - char *q=NULL; - *q=5; /* break it */ -} - -#endif /* U_HIDE_INTERNAL_API */ -#endif - /*===========================================================================*/ /* UErrorCode */ /*===========================================================================*/ @@ -499,8 +419,13 @@ typedef enum UErrorCode { U_PLUGIN_CHANGED_LEVEL_WARNING = -120, /**< A plugin caused a level change. May not be an error, but later plugins may not load. */ - U_ERROR_WARNING_LIMIT, /**< This must always be the last warning value to indicate the limit for UErrorCode warnings (last warning code +1) */ - +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UErrorCode warning value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_ERROR_WARNING_LIMIT, +#endif // U_HIDE_DEPRECATED_API U_ZERO_ERROR = 0, /**< No error, no warning. */ @@ -536,9 +461,16 @@ typedef enum UErrorCode { U_USELESS_COLLATOR_ERROR = 29, /**< Collator is options only and no base is specified */ U_NO_WRITE_PERMISSION = 30, /**< Attempt to modify read-only or constant data. */ - U_STANDARD_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for standard errors */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest standard error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_STANDARD_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API + /* - * the error code range 0x10000 0x10100 are reserved for Transliterator + * Error codes in the range 0x10000 0x10100 are reserved for Transliterator. */ U_BAD_VARIABLE_DEFINITION=0x10000,/**< Missing '$' or duplicate variable name */ U_PARSE_ERROR_START = 0x10000, /**< Start of Transliterator errors */ @@ -576,10 +508,16 @@ typedef enum UErrorCode { U_INTERNAL_TRANSLITERATOR_ERROR, /**< Internal transliterator system error */ U_INVALID_ID, /**< A "::id" rule specifies an unknown transliterator */ U_INVALID_FUNCTION, /**< A "&fn()" rule specifies an unknown transliterator */ - U_PARSE_ERROR_LIMIT, /**< The limit for Transliterator errors */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal Transliterator error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_PARSE_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API /* - * the error code range 0x10100 0x10200 are reserved for formatting API parsing error + * Error codes in the range 0x10100 0x10200 are reserved for the formatting API. */ U_UNEXPECTED_TOKEN=0x10100, /**< Syntax error in format pattern */ U_FMT_PARSE_ERROR_START=0x10100, /**< Start of format library errors */ @@ -601,10 +539,16 @@ 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 */ - U_FMT_PARSE_ERROR_LIMIT, /**< The limit for format library errors */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal formatting API error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_FMT_PARSE_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API /* - * the error code range 0x10200 0x102ff are reserved for Break Iterator related error + * Error codes in the range 0x10200 0x102ff are reserved for BreakIterator. */ U_BRK_INTERNAL_ERROR=0x10200, /**< An internal error (bug) was detected. */ U_BRK_ERROR_START=0x10200, /**< Start of codes indicating Break Iterator failures */ @@ -621,10 +565,16 @@ typedef enum UErrorCode { U_BRK_RULE_EMPTY_SET, /**< Rule contains an empty Unicode Set. */ U_BRK_UNRECOGNIZED_OPTION, /**< !!option in RBBI rules not recognized. */ U_BRK_MALFORMED_RULE_TAG, /**< The {nnn} tag on a rule is mal formed */ - U_BRK_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for Break Iterator failures */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal BreakIterator error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_BRK_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API /* - * The error codes in the range 0x10300-0x103ff are reserved for regular expression related errrs + * Error codes in the range 0x10300-0x103ff are reserved for regular expression related errors. */ U_REGEX_INTERNAL_ERROR=0x10300, /**< An internal error (bug) was detected. */ U_REGEX_ERROR_START=0x10300, /**< Start of codes indicating Regexp failures */ @@ -651,10 +601,16 @@ typedef enum UErrorCode { U_REGEX_STOPPED_BY_CALLER, /**< Matching operation aborted by user callback fn. */ U_REGEX_PATTERN_TOO_BIG, /**< Pattern exceeds limits on size or complexity. @stable ICU 55 */ U_REGEX_INVALID_CAPTURE_GROUP_NAME, /**< Invalid capture group name. @stable ICU 55 */ - U_REGEX_ERROR_LIMIT=U_REGEX_STOPPED_BY_CALLER+3, /**< This must always be the last value to indicate the limit for regexp errors */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal regular expression error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_REGEX_ERROR_LIMIT=U_REGEX_STOPPED_BY_CALLER+3, +#endif // U_HIDE_DEPRECATED_API /* - * The error code in the range 0x10400-0x104ff are reserved for IDNA related error codes + * Error codes in the range 0x10400-0x104ff are reserved for IDNA related error codes. */ U_IDNA_PROHIBITED_ERROR=0x10400, U_IDNA_ERROR_START=0x10400, @@ -666,7 +622,13 @@ typedef enum UErrorCode { U_IDNA_LABEL_TOO_LONG_ERROR, U_IDNA_ZERO_LENGTH_LABEL_ERROR, U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal IDNA error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ U_IDNA_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API /* * Aliases for StringPrep */ @@ -675,14 +637,26 @@ typedef enum UErrorCode { U_STRINGPREP_CHECK_BIDI_ERROR = U_IDNA_CHECK_BIDI_ERROR, /* - * The error code in the range 0x10500-0x105ff are reserved for Plugin related error codes + * Error codes in the range 0x10500-0x105ff are reserved for Plugin related error codes. */ U_PLUGIN_ERROR_START=0x10500, /**< Start of codes indicating plugin failures */ U_PLUGIN_TOO_HIGH=0x10500, /**< The plugin's level is too high to be loaded right now. */ U_PLUGIN_DIDNT_SET_LEVEL, /**< The plugin didn't call uplug_setPlugLevel in response to a QUERY */ - U_PLUGIN_ERROR_LIMIT, /**< This must always be the last value to indicate the limit for plugin errors */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal plug-in error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_PLUGIN_ERROR_LIMIT, +#endif // U_HIDE_DEPRECATED_API - U_ERROR_LIMIT=U_PLUGIN_ERROR_LIMIT /**< This must always be the last value to indicate the limit for UErrorCode (last error code +1) */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal error code. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + U_ERROR_LIMIT=U_PLUGIN_ERROR_LIMIT +#endif // U_HIDE_DEPRECATED_API } UErrorCode; /* Use the following to determine if an UErrorCode represents */ diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 9c6edc3730d045..fb7b48bc07055c 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2000-2016, International Business Machines @@ -32,13 +34,12 @@ * by running the UNIX makefile target 'update-windows-makefiles' in icu/source. * * - * source/common/common.vcproj - update 'Output file name' on the link tab so + * source/common/common.vcxproj - update 'Output file name' on the link tab so * that it contains the new major/minor combination - * source/i18n/i18n.vcproj - same as for the common.vcproj - * source/layout/layout.vcproj - same as for the common.vcproj + * source/i18n/i18n.vcxproj - same as for the common.vcxproj * source/layoutex/layoutex.vcproj - same - * source/stubdata/stubdata.vcproj - same as for the common.vcproj - * source/io/io.vcproj - same as for the common.vcproj + * source/stubdata/stubdata.vcproj - same as for the common.vcxproj + * source/io/io.vcproj - same as for the common.vcxproj * source/data/makedata.mak - change U_ICUDATA_NAME so that it contains * the new major/minor combination and the Unicode version. */ @@ -51,13 +52,13 @@ * @stable ICU 2.4 */ #define U_COPYRIGHT_STRING \ - " Copyright (C) 2016, International Business Machines Corporation and others. All Rights Reserved. " + " Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html " /** The current ICU major version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 57 +#define U_ICU_VERSION_MAJOR_NUM 58 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU @@ -83,7 +84,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _57 +#define U_ICU_VERSION_SUFFIX _58 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -118,19 +119,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "57.1" +#define U_ICU_VERSION "58.1" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "57" +#define U_ICU_VERSION_SHORT "58" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "57.1" +#define U_ICU_DATA_VERSION "58.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unicode/uversion.h b/deps/icu-small/source/common/unicode/uversion.h index 2200cfaff199af..63e2d17a363d94 100644 --- a/deps/icu-small/source/common/unicode/uversion.h +++ b/deps/icu-small/source/common/unicode/uversion.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2000-2011, International Business Machines diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index d7450f785a3e1c..3e8e33a1ff2806 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index 7807b5dbbb146e..67c676d4531c72 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015, International Business Machines Corporation and @@ -140,7 +142,7 @@ class LocaleCacheKey : public CacheKey { : CacheKey(other), fLoc(other.fLoc) { } virtual ~LocaleCacheKey() { } virtual int32_t hashCode() const { - return 37 *CacheKey::hashCode() + fLoc.hashCode(); + return (int32_t)(37u * (uint32_t)CacheKey::hashCode() + (uint32_t)fLoc.hashCode()); } virtual UBool operator == (const CacheKeyBase &other) const { // reflexive diff --git a/deps/icu-small/source/common/unifilt.cpp b/deps/icu-small/source/common/unifilt.cpp index 5e1a131f11d2be..2d8ce355c7532a 100644 --- a/deps/icu-small/source/common/unifilt.cpp +++ b/deps/icu-small/source/common/unifilt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2012, International Business Machines diff --git a/deps/icu-small/source/common/unifunct.cpp b/deps/icu-small/source/common/unifunct.cpp index b834eeed53526d..8fdc638407dee6 100644 --- a/deps/icu-small/source/common/unifunct.cpp +++ b/deps/icu-small/source/common/unifunct.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2004, International Business Machines diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index 355dc40ac8ae02..ef1b6113d9b96e 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2015, International Business Machines @@ -234,7 +236,7 @@ UnicodeSet::UnicodeSet(const UnicodeSet& o, UBool /* asThawed */) : if(list!=NULL){ // *this = o except for bmpSet and stringSpan len = o.len; - uprv_memcpy(list, o.list, len*sizeof(UChar32)); + 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. @@ -286,7 +288,7 @@ UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) { return *this; // There is no way to report this error :-( } len = o.len; - uprv_memcpy(list, o.list, len*sizeof(UChar32)); + uprv_memcpy(list, o.list, (size_t)len*sizeof(UChar32)); if (o.bmpSet == NULL) { bmpSet = NULL; } else { @@ -1253,14 +1255,14 @@ UnicodeSet& UnicodeSet::complement(void) { if (U_FAILURE(status)) { return *this; } - uprv_memcpy(buffer, list + 1, (len-1)*sizeof(UChar32)); + uprv_memcpy(buffer, list + 1, (size_t)(len-1)*sizeof(UChar32)); --len; } else { ensureBufferCapacity(len+1, status); if (U_FAILURE(status)) { return *this; } - uprv_memcpy(buffer + 1, list, len*sizeof(UChar32)); + uprv_memcpy(buffer + 1, list, (size_t)len*sizeof(UChar32)); buffer[0] = UNICODESET_LOW; ++len; } diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index e7aeff846a79a7..cacadf47758334 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index d8b7042b83ebed..8348f8a33aa611 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unisetspan.cpp b/deps/icu-small/source/common/unisetspan.cpp index 63cf985c034fc8..1179495d4feb6a 100644 --- a/deps/icu-small/source/common/unisetspan.cpp +++ b/deps/icu-small/source/common/unisetspan.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unisetspan.h b/deps/icu-small/source/common/unisetspan.h index 2fe0fc30d9f158..36cdd98d044d09 100644 --- a/deps/icu-small/source/common/unisetspan.h +++ b/deps/icu-small/source/common/unisetspan.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 4804083b207066..f825de91bba9dc 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1999-2016, International Business Machines Corporation and @@ -82,7 +84,7 @@ us_arrayCopy(const UChar *src, int32_t srcStart, UChar *dst, int32_t dstStart, int32_t count) { if(count>0) { - uprv_memmove(dst+dstStart, src+srcStart, (size_t)(count*sizeof(*src))); + uprv_memmove(dst+dstStart, src+srcStart, (size_t)count*sizeof(*src)); } } @@ -151,41 +153,39 @@ UnicodeString::UnicodeString(int32_t capacity, UChar32 c, int32_t count) { if(count <= 0 || (uint32_t)c > 0x10ffff) { // just allocate and do not do anything else allocate(capacity); - } else { - // count > 0, allocate and fill the new string with count c's - int32_t unitCount = U16_LENGTH(c), length = count * unitCount; + } else if(c <= 0xffff) { + int32_t length = count; if(capacity < length) { capacity = length; } if(allocate(capacity)) { UChar *array = getArrayStart(); - int32_t i = 0; - - // fill the new string with c - if(unitCount == 1) { - // fill with length UChars - while(i < length) { - array[i++] = (UChar)c; - } - } else { - // get the code units for c - UChar units[U16_MAX_LENGTH]; - U16_APPEND_UNSAFE(units, i, c); - - // now it must be i==unitCount - i = 0; - - // for Unicode, unitCount can only be 1, 2, 3, or 4 - // 1 is handled above - while(i < length) { - int32_t unitIdx = 0; - while(unitIdx < unitCount) { - array[i++]=units[unitIdx++]; - } - } + UChar unit = (UChar)c; + for(int32_t i = 0; i < length; ++i) { + array[i] = unit; + } + setLength(length); + } + } else { // supplementary code point, write surrogate pairs + if(count > (INT32_MAX / 2)) { + // We would get more than 2G UChars. + allocate(capacity); + return; + } + int32_t length = count * 2; + if(capacity < length) { + capacity = length; + } + if(allocate(capacity)) { + UChar *array = getArrayStart(); + UChar lead = U16_LEAD(c); + UChar trail = U16_TRAIL(c); + for(int32_t i = 0; i < length; i += 2) { + array[i] = lead; + array[i + 1] = trail; } + setLength(length); } - setLength(length); } } @@ -342,33 +342,60 @@ UnicodeString::clone() const { // array allocation //======================================== +namespace { + +const int32_t kGrowSize = 128; + +// The number of bytes for one int32_t reference counter and capacity UChars +// must fit into a 32-bit size_t (at least when on a 32-bit platform). +// We also add one for the NUL terminator, to avoid reallocation in getTerminatedBuffer(), +// and round up to a multiple of 16 bytes. +// This means that capacity must be at most (0xfffffff0 - 4) / 2 - 1 = 0x7ffffff5. +// (With more complicated checks we could go up to 0x7ffffffd without rounding up, +// but that does not seem worth it.) +const int32_t kMaxCapacity = 0x7ffffff5; + +int32_t getGrowCapacity(int32_t newLength) { + int32_t growSize = (newLength >> 2) + kGrowSize; + if(growSize <= (kMaxCapacity - newLength)) { + return newLength + growSize; + } else { + return kMaxCapacity; + } +} + +} // namespace + UBool UnicodeString::allocate(int32_t capacity) { if(capacity <= US_STACKBUF_SIZE) { fUnion.fFields.fLengthAndFlags = kShortString; - } else { - // count bytes for the refCounter and the string capacity, and - // round up to a multiple of 16; then divide by 4 and allocate int32_t's - // to be safely aligned for the refCount - // the +1 is for the NUL terminator, to avoid reallocation in getTerminatedBuffer() - int32_t words = (int32_t)(((sizeof(int32_t) + (capacity + 1) * U_SIZEOF_UCHAR + 15) & ~15) >> 2); - int32_t *array = (int32_t*) uprv_malloc( sizeof(int32_t) * words ); - if(array != 0) { + return TRUE; + } + if(capacity <= kMaxCapacity) { + ++capacity; // for the NUL + // Switch to size_t which is unsigned so that we can allocate up to 4GB. + // Reference counter + UChars. + size_t numBytes = sizeof(int32_t) + (size_t)capacity * U_SIZEOF_UCHAR; + // Round up to a multiple of 16. + numBytes = (numBytes + 15) & ~15; + int32_t *array = (int32_t *) uprv_malloc(numBytes); + if(array != NULL) { // set initial refCount and point behind the refCount *array++ = 1; + numBytes -= sizeof(int32_t); // have fArray point to the first UChar fUnion.fFields.fArray = (UChar *)array; - fUnion.fFields.fCapacity = (int32_t)((words - 1) * (sizeof(int32_t) / U_SIZEOF_UCHAR)); + fUnion.fFields.fCapacity = (int32_t)(numBytes / U_SIZEOF_UCHAR); fUnion.fFields.fLengthAndFlags = kLongString; - } else { - fUnion.fFields.fLengthAndFlags = kIsBogus; - fUnion.fFields.fArray = 0; - fUnion.fFields.fCapacity = 0; - return FALSE; + return TRUE; } } - return TRUE; + fUnion.fFields.fLengthAndFlags = kIsBogus; + fUnion.fFields.fArray = 0; + fUnion.fFields.fCapacity = 0; + return FALSE; } //======================================== @@ -415,7 +442,7 @@ UnicodeString::~UnicodeString() // Factory methods //======================================== -UnicodeString UnicodeString::fromUTF8(const StringPiece &utf8) { +UnicodeString UnicodeString::fromUTF8(StringPiece utf8) { UnicodeString result; result.setToUTF8(utf8); return result; @@ -526,7 +553,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { // src is a writable alias; we make a copy of that instead int32_t srcLength = src.length(); if(allocate(srcLength)) { - uprv_memcpy(getArrayStart(), src.getArrayStart(), srcLength * U_SIZEOF_UCHAR); + u_memcpy(getArrayStart(), src.getArrayStart(), srcLength); setLength(srcLength); break; } @@ -855,7 +882,7 @@ UnicodeString::extract(UChar *dest, int32_t destCapacity, } else { const UChar *array = getArrayStart(); if(len>0 && len<=destCapacity && array!=dest) { - uprv_memcpy(dest, array, len*U_SIZEOF_UCHAR); + u_memcpy(dest, array, len); } return u_terminateUChars(dest, destCapacity, len, &errorCode); } @@ -1217,7 +1244,7 @@ UnicodeString::getTerminatedBuffer() { return array; } } - if(cloneArrayIfNeeded(len+1)) { + if(len (INT32_MAX - newLength)) { + setToBogus(); + return *this; + } + newLength += srcLength; // cloneArrayIfNeeded(doCopyArray=FALSE) may change fArray but will not copy the current contents; // therefore we need to keep the current fArray @@ -1446,7 +1479,7 @@ UnicodeString::doReplace(int32_t start, // clone our array and allocate a bigger array if needed int32_t *bufferToDelete = 0; - if(!cloneArrayIfNeeded(newLength, newLength + (newLength >> 2) + kGrowSize, + if(!cloneArrayIfNeeded(newLength, getGrowCapacity(newLength), FALSE, &bufferToDelete) ) { return *this; @@ -1513,7 +1546,7 @@ UnicodeString::doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLeng int32_t newLength = oldLength + srcLength; // optimize append() onto a large-enough, owned string if((newLength <= getCapacity() && isBufferWritable()) || - cloneArrayIfNeeded(newLength, newLength + (newLength >> 2) + kGrowSize)) { + cloneArrayIfNeeded(newLength, getGrowCapacity(newLength))) { UChar *newArray = getArrayStart(); // Do not copy characters when // UChar *buffer=str.getAppendBuffer(...); @@ -1861,7 +1894,9 @@ UnicodeStringAppendable::getAppendBuffer(int32_t minCapacity, return NULL; } int32_t oldLength = str.length(); - if(str.cloneArrayIfNeeded(oldLength + minCapacity, oldLength + desiredCapacityHint)) { + if(minCapacity <= (kMaxCapacity - oldLength) && + desiredCapacityHint <= (kMaxCapacity - oldLength) && + str.cloneArrayIfNeeded(oldLength + minCapacity, oldLength + desiredCapacityHint)) { *resultCapacity = str.getCapacity() - oldLength; return str.getArrayStart() + oldLength; } diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 1b52eb60decb8e..1715b6ec66e268 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unistr_case_locale.cpp b/deps/icu-small/source/common/unistr_case_locale.cpp index a8d5704431ec17..a01be5c30b372a 100644 --- a/deps/icu-small/source/common/unistr_case_locale.cpp +++ b/deps/icu-small/source/common/unistr_case_locale.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/unistr_cnv.cpp b/deps/icu-small/source/common/unistr_cnv.cpp index 38998ffd026c4d..a9b44ee424c33f 100644 --- a/deps/icu-small/source/common/unistr_cnv.cpp +++ b/deps/icu-small/source/common/unistr_cnv.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unistr_props.cpp b/deps/icu-small/source/common/unistr_props.cpp index 87e19275946f72..533a683928c0bc 100644 --- a/deps/icu-small/source/common/unistr_props.cpp +++ b/deps/icu-small/source/common/unistr_props.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp index 9b60e2a0358748..3d6737cfc5e3d9 100644 --- a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/unistrappender.h b/deps/icu-small/source/common/unistrappender.h index a6f7c2efc44714..600fd9033585a8 100644 --- a/deps/icu-small/source/common/unistrappender.h +++ b/deps/icu-small/source/common/unistrappender.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/unorm.cpp b/deps/icu-small/source/common/unorm.cpp index fb948b88051d15..75aaea9cdfc02b 100644 --- a/deps/icu-small/source/common/unorm.cpp +++ b/deps/icu-small/source/common/unorm.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (c) 1996-2014, International Business Machines diff --git a/deps/icu-small/source/common/unormcmp.cpp b/deps/icu-small/source/common/unormcmp.cpp index 1b072c4c34d8be..b40a10a1385fb4 100644 --- a/deps/icu-small/source/common/unormcmp.cpp +++ b/deps/icu-small/source/common/unormcmp.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/unormimp.h b/deps/icu-small/source/common/unormimp.h index 3dce76bc8fd361..c382f38b8beaae 100644 --- a/deps/icu-small/source/common/unormimp.h +++ b/deps/icu-small/source/common/unormimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uobject.cpp b/deps/icu-small/source/common/uobject.cpp index 900e0345952cdc..37406e4a0dc07a 100644 --- a/deps/icu-small/source/common/uobject.cpp +++ b/deps/icu-small/source/common/uobject.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/uposixdefs.h b/deps/icu-small/source/common/uposixdefs.h index ca84fefad1eff3..495deea49e3f7c 100644 --- a/deps/icu-small/source/common/uposixdefs.h +++ b/deps/icu-small/source/common/uposixdefs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2015, International Business Machines diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 3bf44317b26466..46ceb66d8cf632 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index d45fc6c79b433f..63c588088ad1c3 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -86,8 +88,15 @@ enum { * ((ntv>>2)-0xbf) * 60^((ntv&3)+1) = (1..9)*(60^1..60^4) */ UPROPS_NTV_BASE60_START=0x300, + /** + * Fraction-20 values: + * frac20 = ntv-0x324 = 0..0x17 -> 1|3|5|7 / 20|40|80|160|320|640 + * numerator: num = 2*(frac20&3)+1 + * denominator: den = 20<<(frac20>>2) + */ + UPROPS_NTV_FRACTION20_START=UPROPS_NTV_BASE60_START+36, // 0x300+9*4=0x324 /** No numeric value (yet). */ - UPROPS_NTV_RESERVED_START=UPROPS_NTV_BASE60_START+36, /* 0x300+9*4=0x324 */ + UPROPS_NTV_RESERVED_START=UPROPS_NTV_FRACTION20_START+24, // 0x324+6*4=0x34c UPROPS_NTV_MAX_SMALL_INT=UPROPS_NTV_FRACTION_START-UPROPS_NTV_NUMERIC_START-1 }; diff --git a/deps/icu-small/source/common/ures_cnv.c b/deps/icu-small/source/common/ures_cnv.c index 6a16c50b624c7d..a810fc08567144 100644 --- a/deps/icu-small/source/common/ures_cnv.c +++ b/deps/icu-small/source/common/ures_cnv.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index bb6b039495399f..6813645c98b614 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2016, International Business Machines Corporation and @@ -267,7 +269,7 @@ static UBool U_CALLCONV ures_cleanup(void) } /** INTERNAL: Initializes the cache for resources */ -static void createCache(UErrorCode &status) { +static void U_CALLCONV createCache(UErrorCode &status) { U_ASSERT(cache == NULL); cache = uhash_open(hashEntry, compareEntries, NULL, &status); ucln_common_registerCleanup(UCLN_COMMON_URES, ures_cleanup); @@ -1885,32 +1887,27 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, namespace { -void getAllContainerItemsWithFallback( +void getAllItemsWithFallback( const UResourceBundle *bundle, ResourceDataValue &value, - ResourceArraySink *arraySink, ResourceTableSink *tableSink, + ResourceSink &sink, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } // We recursively enumerate child-first, // only storing parent items in the absence of child items. - // We store a placeholder value for the no-fallback/no-inheritance marker + // The sink needs to store a placeholder value for the no-fallback/no-inheritance marker // to prevent a parent item from being stored. // // It would be possible to recursively enumerate parent-first, // overriding parent items with child items. - // When we see the no-fallback/no-inheritance marker, - // then we would remove the parent's item. + // When the sink sees the no-fallback/no-inheritance marker, + // then it would remove the parent's item. // We would deserialize parent values even though they are overridden in a child bundle. - UResType expectedType = arraySink != NULL ? URES_ARRAY : URES_TABLE; - if (ures_getType(bundle) == expectedType) { - value.pResData = &bundle->fResData; - if (arraySink != NULL) { - ures_getAllArrayItems(&bundle->fResData, bundle->fRes, value, *arraySink, errorCode); - } else /* tableSink != NULL */ { - ures_getAllTableItems(&bundle->fResData, bundle->fRes, value, *tableSink, errorCode); - } - } - UResourceDataEntry *entry = bundle->fData->fParent; - if (entry != NULL && U_SUCCESS(entry->fBogus)) { + value.pResData = &bundle->fResData; + UResourceDataEntry *parentEntry = bundle->fData->fParent; + UBool hasParent = parentEntry != NULL && U_SUCCESS(parentEntry->fBogus); + value.setResource(bundle->fRes); + sink.put(bundle->fKey, value, !hasParent, errorCode); + if (hasParent) { // We might try to query the sink whether // any fallback from the parent bundle is still possible. @@ -1921,40 +1918,41 @@ void getAllContainerItemsWithFallback( // so that we need not create UResourceBundle objects. UResourceBundle parentBundle; ures_initStackObject(&parentBundle); - parentBundle.fTopLevelData = parentBundle.fData = entry; + parentBundle.fTopLevelData = parentBundle.fData = parentEntry; // TODO: What is the difference between bundle fData and fTopLevelData? - uprv_memcpy(&parentBundle.fResData, &entry->fData, sizeof(ResourceData)); + uprv_memcpy(&parentBundle.fResData, &parentEntry->fData, sizeof(ResourceData)); // TODO: Try to replace bundle.fResData with just using bundle.fData->fData. parentBundle.fHasFallback = !parentBundle.fResData.noFallback; parentBundle.fIsTopLevel = TRUE; parentBundle.fRes = parentBundle.fResData.rootRes; parentBundle.fSize = res_countArrayItems(&(parentBundle.fResData), parentBundle.fRes); parentBundle.fIndex = -1; - entryIncrease(entry); + entryIncrease(parentEntry); // Look up the container item in the parent bundle. UResourceBundle containerBundle; ures_initStackObject(&containerBundle); const UResourceBundle *rb; + UErrorCode pathErrorCode = U_ZERO_ERROR; // Ignore if parents up to root do not have this path. if (bundle->fResPath == NULL || *bundle->fResPath == 0) { rb = &parentBundle; } else { rb = ures_getByKeyWithFallback(&parentBundle, bundle->fResPath, - &containerBundle, &errorCode); + &containerBundle, &pathErrorCode); } - if (U_SUCCESS(errorCode) && ures_getType(rb) == expectedType) { - getAllContainerItemsWithFallback(rb, value, - arraySink, tableSink, errorCode); + if (U_SUCCESS(pathErrorCode)) { + getAllItemsWithFallback(rb, value, sink, errorCode); } ures_close(&containerBundle); ures_close(&parentBundle); } } -void getAllContainerItemsWithFallback( - const UResourceBundle *bundle, const char *path, - ResourceArraySink *arraySink, ResourceTableSink *tableSink, - UErrorCode &errorCode) { +} // namespace + +U_CAPI void U_EXPORT2 +ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path, + icu::ResourceSink &sink, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } if (path == NULL) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; @@ -1973,32 +1971,12 @@ void getAllContainerItemsWithFallback( return; } } - UResType expectedType = arraySink != NULL ? URES_ARRAY : URES_TABLE; - if (ures_getType(rb) != expectedType) { - errorCode = U_RESOURCE_TYPE_MISMATCH; - ures_close(&stackBundle); - return; - } // Get all table items with fallback. ResourceDataValue value; - getAllContainerItemsWithFallback(rb, value, arraySink, tableSink, errorCode); + getAllItemsWithFallback(rb, value, sink, errorCode); ures_close(&stackBundle); } -} // namespace - -U_CAPI void U_EXPORT2 -ures_getAllArrayItemsWithFallback(const UResourceBundle *bundle, const char *path, - ResourceArraySink &sink, UErrorCode &errorCode) { - getAllContainerItemsWithFallback(bundle, path, &sink, NULL, errorCode); -} - -U_CAPI void U_EXPORT2 -ures_getAllTableItemsWithFallback(const UResourceBundle *bundle, const char *path, - ResourceTableSink &sink, UErrorCode &errorCode) { - getAllContainerItemsWithFallback(bundle, path, NULL, &sink, errorCode); -} - U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) { Resource res = RES_BOGUS; UResourceDataEntry *realData = NULL; @@ -2430,7 +2408,10 @@ ures_loc_countLocales(UEnumeration *en, UErrorCode * /*status*/) { return ures_getSize(&ctx->installed); } -static const char* U_CALLCONV +U_CDECL_BEGIN + + +static const char * U_CALLCONV ures_loc_nextLocale(UEnumeration* en, int32_t* resultLength, UErrorCode* status) { @@ -2456,6 +2437,7 @@ ures_loc_resetLocales(UEnumeration* en, ures_resetIterator(res); } +U_CDECL_END static const UEnumeration gLocalesEnum = { NULL, diff --git a/deps/icu-small/source/common/uresdata.cpp b/deps/icu-small/source/common/uresdata.cpp index 00231d7fc20018..f775bcdffb57a7 100644 --- a/deps/icu-small/source/common/uresdata.cpp +++ b/deps/icu-small/source/common/uresdata.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1999-2016, International Business Machines Corporation @@ -380,6 +382,36 @@ UBool isNoInheritanceMarker(const ResourceData *pResData, Resource res) { return FALSE; } +int32_t getStringArray(const ResourceData *pResData, const icu::ResourceArray &array, + icu::UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) { + if(U_FAILURE(errorCode)) { + return 0; + } + if(dest == NULL ? capacity != 0 : capacity < 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t length = array.getSize(); + if(length == 0) { + return 0; + } + if(length > capacity) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + return length; + } + for(int32_t i = 0; i < length; ++i) { + int32_t sLength; + const UChar *s = res_getString(pResData, array.internalGetResource(pResData, i), &sLength); + if(s == NULL) { + errorCode = U_RESOURCE_TYPE_MISMATCH; + return 0; + } + dest[i].setTo(TRUE, s, sLength); + } + return length; +} + } // namespace U_CAPI const UChar * U_EXPORT2 @@ -463,42 +495,6 @@ res_countArrayItems(const ResourceData *pResData, Resource res) { } } -namespace { - -int32_t getArrayLength(const ResourceData *pResData, Resource res) { - uint32_t offset=RES_GET_OFFSET(res); - if(offset == 0) { - return 0; - } - int32_t type = RES_GET_TYPE(res); - if(type == URES_ARRAY) { - return *(pResData->pRoot+offset); - } else if(type == URES_ARRAY16) { - return pResData->p16BitUnits[offset]; - } else { - return 0; - } -} - -int32_t getTableLength(const ResourceData *pResData, Resource res) { - uint32_t offset=RES_GET_OFFSET(res); - if(offset == 0) { - return 0; - } - int32_t type = RES_GET_TYPE(res); - if(type == URES_TABLE) { - return *((const uint16_t *)(pResData->pRoot+offset)); - } else if(type == URES_TABLE16) { - return pResData->p16BitUnits[offset]; - } else if(type == URES_TABLE32) { - return *(pResData->pRoot+offset); - } else { - return 0; - } -} - -} // namespace - U_NAMESPACE_BEGIN ResourceDataValue::~ResourceDataValue() {} @@ -571,6 +567,130 @@ const uint8_t *ResourceDataValue::getBinary(int32_t &length, UErrorCode &errorCo return b; } +ResourceArray ResourceDataValue::getArray(UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return ResourceArray(); + } + const uint16_t *items16 = NULL; + const Resource *items32 = NULL; + uint32_t offset=RES_GET_OFFSET(res); + int32_t length = 0; + switch(RES_GET_TYPE(res)) { + case URES_ARRAY: + if (offset!=0) { // empty if offset==0 + items32 = (const Resource *)pResData->pRoot+offset; + length = *items32++; + } + break; + case URES_ARRAY16: + items16 = pResData->p16BitUnits+offset; + length = *items16++; + break; + default: + errorCode = U_RESOURCE_TYPE_MISMATCH; + return ResourceArray(); + } + return ResourceArray(items16, items32, length); +} + +ResourceTable ResourceDataValue::getTable(UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return ResourceTable(); + } + const uint16_t *keys16 = NULL; + const int32_t *keys32 = NULL; + const uint16_t *items16 = NULL; + const Resource *items32 = NULL; + uint32_t offset = RES_GET_OFFSET(res); + int32_t length = 0; + switch(RES_GET_TYPE(res)) { + case URES_TABLE: + if (offset != 0) { // empty if offset==0 + keys16 = (const uint16_t *)(pResData->pRoot+offset); + length = *keys16++; + items32 = (const Resource *)(keys16+length+(~length&1)); + } + break; + case URES_TABLE16: + keys16 = pResData->p16BitUnits+offset; + length = *keys16++; + items16 = keys16 + length; + break; + case URES_TABLE32: + if (offset != 0) { // empty if offset==0 + keys32 = pResData->pRoot+offset; + length = *keys32++; + items32 = (const Resource *)keys32 + length; + } + break; + default: + errorCode = U_RESOURCE_TYPE_MISMATCH; + return ResourceTable(); + } + return ResourceTable(keys16, keys32, items16, items32, length); +} + +UBool ResourceDataValue::isNoInheritanceMarker() const { + return ::isNoInheritanceMarker(pResData, res); +} + +int32_t ResourceDataValue::getStringArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const { + return ::getStringArray(pResData, getArray(errorCode), dest, capacity, errorCode); +} + +int32_t ResourceDataValue::getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const { + if(URES_IS_ARRAY(res)) { + return ::getStringArray(pResData, getArray(errorCode), dest, capacity, errorCode); + } + if(U_FAILURE(errorCode)) { + return 0; + } + if(dest == NULL ? capacity != 0 : capacity < 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + if(capacity < 1) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + return 1; + } + int32_t sLength; + const UChar *s = res_getString(pResData, res, &sLength); + if(s != NULL) { + dest[0].setTo(TRUE, s, sLength); + return 1; + } + errorCode = U_RESOURCE_TYPE_MISMATCH; + return 0; +} + +UnicodeString ResourceDataValue::getStringOrFirstOfArray(UErrorCode &errorCode) const { + UnicodeString us; + if(U_FAILURE(errorCode)) { + return us; + } + int32_t sLength; + const UChar *s = res_getString(pResData, res, &sLength); + if(s != NULL) { + us.setTo(TRUE, s, sLength); + return us; + } + ResourceArray array = getArray(errorCode); + if(U_FAILURE(errorCode)) { + return us; + } + if(array.getSize() > 0) { + s = res_getString(pResData, array.internalGetResource(pResData, 0), &sLength); + if(s != NULL) { + us.setTo(TRUE, s, sLength); + return us; + } + } + errorCode = U_RESOURCE_TYPE_MISMATCH; + return us; +} + U_NAMESPACE_END static Resource @@ -691,91 +811,26 @@ res_getResource(const ResourceData *pResData, const char *key) { return res_getTableItemByKey(pResData, pResData->rootRes, &idx, &realKey); } -// TODO: Ported from Java, but enumerating at this low level may prevent us -// from doing necessary things, like resolving aliases, -// which need access to higher-level UResourceBundle code. -// Consider porting the low-level Container/Array/Table classes from Java, -// with getters for keys and values, -// and doing the enumeration in the higher-level code on top of those accessors. -U_CFUNC void -ures_getAllTableItems(const ResourceData *pResData, Resource table, - icu::ResourceDataValue &value, icu::ResourceTableSink &sink, - UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { return; } - const uint16_t *keys16 = NULL; - const int32_t *keys32 = NULL; - const uint16_t *items16 = NULL; - const Resource *items32 = NULL; - uint32_t offset = RES_GET_OFFSET(table); - int32_t length = 0; - switch(RES_GET_TYPE(table)) { - case URES_TABLE: { - if (offset != 0) { /* empty if offset==0 */ - keys16 = (const uint16_t *)(pResData->pRoot+offset); - length = *keys16++; - items32 = (const Resource *)(keys16+length+(~length&1)); - } - break; - } - case URES_TABLE16: { - keys16 = pResData->p16BitUnits+offset; - length = *keys16++; - items16 = keys16 + length; - break; - } - case URES_TABLE32: { - if (offset != 0) { /* empty if offset==0 */ - keys32 = pResData->pRoot+offset; - length = *keys32++; - items32 = (const Resource *)keys32 + length; - } - break; - } - default: - errorCode = U_RESOURCE_TYPE_MISMATCH; - return; - } - for (int32_t i = 0; i < length; ++i) { - const char *key; +UBool icu::ResourceTable::getKeyAndValue(int32_t i, + const char *&key, icu::ResourceValue &value) const { + if(0 <= i && i < length) { + icu::ResourceDataValue &rdValue = static_cast(value); if (keys16 != NULL) { - key=RES_GET_KEY16(pResData, keys16[i]); + key = RES_GET_KEY16(rdValue.pResData, keys16[i]); } else { - key=RES_GET_KEY32(pResData, keys32[i]); + key = RES_GET_KEY32(rdValue.pResData, keys32[i]); } Resource res; if (items16 != NULL) { - res = makeResourceFrom16(pResData, items16[i]); + res = makeResourceFrom16(rdValue.pResData, items16[i]); } else { res = items32[i]; } - int32_t type = RES_GET_TYPE(res); - if (URES_IS_ARRAY(type)) { - int32_t numItems = getArrayLength(pResData, res); - icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(key, numItems, errorCode); - if (subSink != NULL) { - ures_getAllArrayItems(pResData, res, value, *subSink, errorCode); - } - } else if (URES_IS_TABLE(type)) { - int32_t numItems = getTableLength(pResData, res); - icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(key, numItems, errorCode); - if (subSink != NULL) { - ures_getAllTableItems(pResData, res, value, *subSink, errorCode); - } - /* TODO: settle on how to deal with aliases, port to Java - } else if (type == URES_ALIAS) { - // aliases not handled in resource enumeration - errorCode = U_UNSUPPORTED_ERROR; - return; */ - } else if (isNoInheritanceMarker(pResData, res)) { - sink.putNoFallback(key, errorCode); - } else { - value.setResource(res); - sink.put(key, value, errorCode); - } - if(U_FAILURE(errorCode)) { return; } + rdValue.setResource(res); + return TRUE; } - sink.leave(errorCode); + return FALSE; } U_CAPI Resource U_EXPORT2 @@ -805,65 +860,21 @@ res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) { return RES_BOGUS; } -U_CFUNC void -ures_getAllArrayItems(const ResourceData *pResData, Resource array, - icu::ResourceDataValue &value, icu::ResourceArraySink &sink, - UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { return; } - const uint16_t *items16 = NULL; - const Resource *items32 = NULL; - uint32_t offset=RES_GET_OFFSET(array); - int32_t length = 0; - switch(RES_GET_TYPE(array)) { - case URES_ARRAY: { - if (offset!=0) { /* empty if offset==0 */ - items32 = (const Resource *)pResData->pRoot+offset; - length = *items32++; - } - break; - } - case URES_ARRAY16: { - items16 = pResData->p16BitUnits+offset; - length = *items16++; - break; - } - default: - errorCode = U_RESOURCE_TYPE_MISMATCH; - return; +uint32_t icu::ResourceArray::internalGetResource(const ResourceData *pResData, int32_t i) const { + if (items16 != NULL) { + return makeResourceFrom16(pResData, items16[i]); + } else { + return items32[i]; } +} - for (int32_t i = 0; i < length; ++i) { - Resource res; - if (items16 != NULL) { - res = makeResourceFrom16(pResData, items16[i]); - } else { - res = items32[i]; - } - int32_t type = RES_GET_TYPE(res); - if (URES_IS_ARRAY(type)) { - int32_t numItems = getArrayLength(pResData, res); - icu::ResourceArraySink *subSink = sink.getOrCreateArraySink(i, numItems, errorCode); - if (subSink != NULL) { - ures_getAllArrayItems(pResData, res, value, *subSink, errorCode); - } - } else if (URES_IS_TABLE(type)) { - int32_t numItems = getTableLength(pResData, res); - icu::ResourceTableSink *subSink = sink.getOrCreateTableSink(i, numItems, errorCode); - if (subSink != NULL) { - ures_getAllTableItems(pResData, res, value, *subSink, errorCode); - } - /* TODO: settle on how to deal with aliases, port to Java - } else if (type == URES_ALIAS) { - // aliases not handled in resource enumeration - errorCode = U_UNSUPPORTED_ERROR; - return; */ - } else { - value.setResource(res); - sink.put(i, value, errorCode); - } - if(U_FAILURE(errorCode)) { return; } +UBool icu::ResourceArray::getValue(int32_t i, icu::ResourceValue &value) const { + if(0 <= i && i < length) { + icu::ResourceDataValue &rdValue = static_cast(value); + rdValue.setResource(internalGetResource(rdValue.pResData, i)); + return TRUE; } - sink.leave(errorCode); + return FALSE; } U_CFUNC Resource @@ -974,7 +985,7 @@ typedef struct Row { int32_t keyIndex, sortIndex; } Row; -static int32_t +static int32_t U_CALLCONV ures_compareRows(const void *context, const void *left, const void *right) { const char *keyChars=(const char *)context; return (int32_t)uprv_strcmp(keyChars+((const Row *)left)->keyIndex, diff --git a/deps/icu-small/source/common/uresdata.h b/deps/icu-small/source/common/uresdata.h index 1afa77c0748eb4..ae7d9a817d2b2f 100644 --- a/deps/icu-small/source/common/uresdata.h +++ b/deps/icu-small/source/common/uresdata.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** -* Copyright (C) 1999-2015, International Business Machines +* Copyright (C) 1999-2016, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uresdata.h @@ -379,7 +381,7 @@ enum { /* * Structure for a single, memory-mapped ResourceBundle. */ -typedef struct { +typedef struct ResourceData { UDataMemory *data; const int32_t *pRoot; const uint16_t *p16BitUnits; @@ -486,6 +488,14 @@ class ResourceDataValue : public ResourceValue { virtual uint32_t getUInt(UErrorCode &errorCode) const; virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const; virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const; + virtual ResourceArray getArray(UErrorCode &errorCode) const; + virtual ResourceTable getTable(UErrorCode &errorCode) const; + virtual UBool isNoInheritanceMarker() const; + virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const; + virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity, + UErrorCode &errorCode) const; + virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const; const ResourceData *pResData; @@ -495,24 +505,6 @@ class ResourceDataValue : public ResourceValue { U_NAMESPACE_END -/** - * @param value will be set during enumeration; input contents is ignored - * @param sink receives all table item key-value pairs - */ -U_CFUNC void -ures_getAllTableItems(const ResourceData *pResData, Resource table, - icu::ResourceDataValue &value, icu::ResourceTableSink &sink, - UErrorCode &errorCode); - -/** - * @param value will be set during enumeration; input contents is ignored - * @param sink receives all array item values - */ -U_CFUNC void -ures_getAllArrayItems(const ResourceData *pResData, Resource array, - icu::ResourceDataValue &value, icu::ResourceArraySink &sink, - UErrorCode &errorCode); - #endif /* __cplusplus */ /** diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index ce0b03ccf8233f..8339240a276b6f 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** -* Copyright (C) 2000-2015, International Business Machines +* Copyright (C) 2000-2016, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** */ @@ -225,12 +227,8 @@ ures_getStringByKeyWithFallback(const UResourceBundle *resB, #ifdef __cplusplus U_CAPI void U_EXPORT2 -ures_getAllArrayItemsWithFallback(const UResourceBundle *bundle, const char *path, - icu::ResourceArraySink &sink, UErrorCode &errorCode); - -U_CAPI void U_EXPORT2 -ures_getAllTableItemsWithFallback(const UResourceBundle *bundle, const char *path, - icu::ResourceTableSink &sink, UErrorCode &errorCode); +ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path, + icu::ResourceSink &sink, UErrorCode &errorCode); #endif /* __cplusplus */ diff --git a/deps/icu-small/source/common/ureslocs.h b/deps/icu-small/source/common/ureslocs.h index e89ddb95ff69dd..85dd8fb4b7f211 100644 --- a/deps/icu-small/source/common/ureslocs.h +++ b/deps/icu-small/source/common/ureslocs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2009-2014 International Business Machines diff --git a/deps/icu-small/source/common/usc_impl.c b/deps/icu-small/source/common/usc_impl.c index a66e0d5edca020..c2b2a3656c4ebb 100644 --- a/deps/icu-small/source/common/usc_impl.c +++ b/deps/icu-small/source/common/usc_impl.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/common/usc_impl.h b/deps/icu-small/source/common/usc_impl.h index 2e972b0e9a9378..7c9c5e095052ff 100644 --- a/deps/icu-small/source/common/usc_impl.h +++ b/deps/icu-small/source/common/usc_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/common/uscript.c b/deps/icu-small/source/common/uscript.c index 3700099cd2a70e..336e185799ab96 100644 --- a/deps/icu-small/source/common/uscript.c +++ b/deps/icu-small/source/common/uscript.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2014, International Business Machines diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index fa7f78afd99c2e..20c7cdce2ffad1 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 2013-2015, International Business Machines +* Copyright (C) 2013-2016, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uscript_props.cpp @@ -72,7 +74,7 @@ const int32_t SCRIPT_PROPS[] = { 0x1826 | ASPIRATIONAL, // Mong 0x1000 | RECOMMENDED | LB_LETTERS, // Mymr 0x168F | EXCLUSION, // Ogam - 0x10308 | EXCLUSION, // Ital + 0x10300 | EXCLUSION, // Ital 0x0B15 | RECOMMENDED, // Orya 0x16A0 | EXCLUSION, // Runr 0x0D85 | RECOMMENDED, // Sinh @@ -102,7 +104,7 @@ const int32_t SCRIPT_PROPS[] = { 0x10A00 | EXCLUSION | RTL, // Khar 0xA800 | LIMITED_USE, // Sylo 0x1980 | LIMITED_USE | LB_LETTERS, // Talu - 0x2D5E | ASPIRATIONAL, // Tfng + 0x2D30 | ASPIRATIONAL, // Tfng 0x103A0 | EXCLUSION, // Xpeo 0x1B05 | LIMITED_USE, // Bali 0x1BC0 | LIMITED_USE, // Batk @@ -129,7 +131,7 @@ const int32_t SCRIPT_PROPS[] = { 0x0840 | LIMITED_USE | RTL, // Mand 0, 0x10980 | EXCLUSION | RTL, // Mero - 0x07D8 | LIMITED_USE | RTL, // Nkoo + 0x07CA | LIMITED_USE | RTL, // Nkoo 0x10C00 | EXCLUSION | RTL, // Orkh 0x1036B | EXCLUSION, // Perm 0xA840 | EXCLUSION, // Phag @@ -146,7 +148,7 @@ const int32_t SCRIPT_PROPS[] = { 0x12000 | EXCLUSION, // Xsux 0, 0xFDD0 | UNKNOWN, // Zzzz - 0x102B7 | EXCLUSION, // Cari + 0x102A0 | EXCLUSION, // Cari 0x304B | RECOMMENDED | LB_LETTERS, // Jpan 0x1A20 | LIMITED_USE | LB_LETTERS, // Lana 0x10280 | EXCLUSION, // Lyci @@ -163,7 +165,7 @@ const int32_t SCRIPT_PROPS[] = { 0x11103 | LIMITED_USE, // Cakm 0xAC00 | RECOMMENDED, // Kore 0x11083 | EXCLUSION, // Kthi - 0x10AC1 | EXCLUSION | RTL, // Mani + 0x10AD8 | EXCLUSION | RTL, // Mani 0x10B60 | EXCLUSION | RTL, // Phli 0x10B8F | EXCLUSION | RTL, // Phlp 0, @@ -173,7 +175,7 @@ const int32_t SCRIPT_PROPS[] = { 0, 0, 0xA6A0 | LIMITED_USE, // Bamu - 0xA4E8 | LIMITED_USE, // Lisu + 0xA4D0 | LIMITED_USE, // Lisu 0, 0x10A60 | EXCLUSION | RTL, // Sarb 0x16AE6 | EXCLUSION, // Bass @@ -196,7 +198,7 @@ const int32_t SCRIPT_PROPS[] = { 0x11183 | EXCLUSION, // Shrd 0x110D0 | EXCLUSION, // Sora 0x11680 | EXCLUSION, // Takr - 0, + 0x18229 | EXCLUSION | LB_LETTERS, // Tang 0, 0x14400 | EXCLUSION, // Hluw 0x11208 | EXCLUSION, // Khoj @@ -209,6 +211,14 @@ const int32_t SCRIPT_PROPS[] = { 0x1128F | EXCLUSION, // Mult 0x11AC0 | EXCLUSION, // Pauc 0x1158E | EXCLUSION, // Sidd + 0x1E909 | LIMITED_USE | RTL | CASED, // Adlm + 0x11C0E | EXCLUSION, // Bhks + 0x11C72 | EXCLUSION, // Marc + 0x11412 | LIMITED_USE, // Newa + 0x104B5 | LIMITED_USE | CASED, // Osge + 0x5B57 | RECOMMENDED | LB_LETTERS, // Hanb + 0x1112 | RECOMMENDED, // Jamo + 0, // 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 717ea0430aaa4a..f15d4a14ab7d81 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uset_imp.h b/deps/icu-small/source/common/uset_imp.h index a7171ad715765c..8cb31edfcf779e 100644 --- a/deps/icu-small/source/common/uset_imp.h +++ b/deps/icu-small/source/common/uset_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/uset_props.cpp b/deps/icu-small/source/common/uset_props.cpp index ccbaf91e34eeac..cf772957ee5eac 100644 --- a/deps/icu-small/source/common/uset_props.cpp +++ b/deps/icu-small/source/common/uset_props.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index bd1ecaa0e7753a..2be2079c513069 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2006, International Business Machines diff --git a/deps/icu-small/source/common/ushape.cpp b/deps/icu-small/source/common/ushape.cpp index 16442072702dbd..4913a3ff573ce7 100644 --- a/deps/icu-small/source/common/ushape.cpp +++ b/deps/icu-small/source/common/ushape.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -777,7 +779,7 @@ handleGeneratedSpaces(UChar *dest, int32_t sourceLength, count--; } - uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, sourceLength); destSize = u_strlen(dest); } @@ -835,7 +837,7 @@ handleGeneratedSpaces(UChar *dest, int32_t sourceLength, tempbuffer[i] = SPACE_CHAR; } - uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, sourceLength); destSize = sourceLength; } @@ -877,7 +879,7 @@ handleGeneratedSpaces(UChar *dest, int32_t sourceLength, count--; } - uprv_memcpy(dest,tempbuffer, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, sourceLength); destSize = sourceLength; } @@ -941,7 +943,7 @@ expandCompositCharAtBegin(UChar *dest, int32_t sourceLength, int32_t destSize,UE i--; j--; } - uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, sourceLength); uprv_free(tempbuffer); @@ -1002,14 +1004,14 @@ expandCompositCharAtEnd(UChar *dest, int32_t sourceLength, int32_t destSize,UErr } if(countr > 0) { - uprv_memmove(tempbuffer, tempbuffer+countr, sourceLength*U_SIZEOF_UCHAR); + u_memmove(tempbuffer, tempbuffer+countr, sourceLength); if(u_strlen(tempbuffer) < sourceLength) { for(i=sourceLength-1;i>=sourceLength-countr;i--) { tempbuffer[i] = SPACE_CHAR; } } } - uprv_memcpy(dest, tempbuffer, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, sourceLength); uprv_free(tempbuffer); @@ -1177,7 +1179,7 @@ expandCompositChar(UChar *dest, int32_t sourceLength, j++; } - uprv_memcpy(dest, tempbuffer, destSize*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, destSize); } } @@ -1571,7 +1573,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, return 0; } } - uprv_memcpy(tempbuffer, source, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(tempbuffer, source, sourceLength); if (tempsource != NULL){ uprv_free(tempsource); } @@ -1637,7 +1639,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, countSpaces(tempbuffer,destLength,options,&spacesCountl,&spacesCountr); invertBuffer(tempbuffer,destLength,options,spacesCountl,spacesCountr); } - uprv_memcpy(dest, tempbuffer, uprv_min(destLength, destCapacity)*U_SIZEOF_UCHAR); + u_memcpy(dest, tempbuffer, uprv_min(destLength, destCapacity)); if(tempbuffer!=buffer) { uprv_free(tempbuffer); @@ -1659,7 +1661,7 @@ u_shapeArabic(const UChar *source, int32_t sourceLength, *pErrorCode=U_BUFFER_OVERFLOW_ERROR; return sourceLength; } - uprv_memcpy(dest, source, sourceLength*U_SIZEOF_UCHAR); + u_memcpy(dest, source, sourceLength); destLength=sourceLength; } diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index a3ff4e289d4b27..fb9c18b66bc83e 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ustack.cpp b/deps/icu-small/source/common/ustack.cpp index c58de7ba1f5336..1de79ecfe3559c 100644 --- a/deps/icu-small/source/common/ustack.cpp +++ b/deps/icu-small/source/common/ustack.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2003-2011, International Business Machines diff --git a/deps/icu-small/source/common/ustr_cnv.cpp b/deps/icu-small/source/common/ustr_cnv.cpp index 6d3cd567059028..4b845d5adca0e7 100644 --- a/deps/icu-small/source/common/ustr_cnv.cpp +++ b/deps/icu-small/source/common/ustr_cnv.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/ustr_cnv.h b/deps/icu-small/source/common/ustr_cnv.h index eefeaa5328dcd7..e647356560e95f 100644 --- a/deps/icu-small/source/common/ustr_cnv.h +++ b/deps/icu-small/source/common/ustr_cnv.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2010, International Business Machines diff --git a/deps/icu-small/source/common/ustr_imp.h b/deps/icu-small/source/common/ustr_imp.h index 6881bce6a944dc..21ee6cba624aac 100644 --- a/deps/icu-small/source/common/ustr_imp.h +++ b/deps/icu-small/source/common/ustr_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2015, International Business Machines @@ -218,6 +220,44 @@ ucasemap_mapUTF8(const UCaseMap *csm, UTF8CaseMapper *stringCaseMapper, UErrorCode *pErrorCode); +#ifdef __cplusplus + +U_NAMESPACE_BEGIN +namespace GreekUpper { + +// Data bits. +static const uint32_t UPPER_MASK = 0x3ff; +static const uint32_t HAS_VOWEL = 0x1000; +static const uint32_t HAS_YPOGEGRAMMENI = 0x2000; +static const uint32_t HAS_ACCENT = 0x4000; +static const uint32_t HAS_DIALYTIKA = 0x8000; +// Further bits during data building and processing, not stored in the data map. +static const uint32_t HAS_COMBINING_DIALYTIKA = 0x10000; +static const uint32_t HAS_OTHER_GREEK_DIACRITIC = 0x20000; + +static const uint32_t HAS_VOWEL_AND_ACCENT = HAS_VOWEL | HAS_ACCENT; +static const uint32_t HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA = + HAS_VOWEL_AND_ACCENT | HAS_DIALYTIKA; +static const uint32_t HAS_EITHER_DIALYTIKA = HAS_DIALYTIKA | HAS_COMBINING_DIALYTIKA; + +// State bits. +static const uint32_t AFTER_CASED = 1; +static const uint32_t AFTER_VOWEL_WITH_ACCENT = 2; + +uint32_t getLetterData(UChar32 c); + +/** + * Returns a non-zero value for each of the Greek combining diacritics + * listed in The Unicode Standard, version 8, chapter 7.2 Greek, + * plus some perispomeni look-alikes. + */ +uint32_t getDiacriticData(UChar32 c); + +} // namespace GreekUpper +U_NAMESPACE_END + +#endif // __cplusplus + U_CAPI int32_t U_EXPORT2 ustr_hashUCharsN(const UChar *str, int32_t length); diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 4a2352eed507dd..63808776199cc4 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/ustr_wcs.cpp b/deps/icu-small/source/common/ustr_wcs.cpp index 33a7b194553427..572e41290f59f8 100644 --- a/deps/icu-small/source/common/ustr_wcs.cpp +++ b/deps/icu-small/source/common/ustr_wcs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -42,7 +44,7 @@ u_growAnyBufferFromStatic(void *context, char *newBuffer=(char *)uprv_malloc(reqCapacity*size); if(newBuffer!=NULL) { if(length>0) { - uprv_memcpy(newBuffer, *pBuffer, length*size); + uprv_memcpy(newBuffer, *pBuffer, (size_t)length*size); } *pCapacity=reqCapacity; } else { @@ -200,7 +202,7 @@ _strToWCS(wchar_t *dest, count = (int32_t)(pIntTarget-intTarget); if(0 < count && count <= destCapacity){ - uprv_memcpy(dest,intTarget,count*sizeof(wchar_t)); + uprv_memcpy(dest, intTarget, (size_t)count*sizeof(wchar_t)); } if(pDestLength){ @@ -252,13 +254,13 @@ u_strToWCS(wchar_t *dest, srcLength = u_strlen(src); } if(0 < srcLength && srcLength <= destCapacity){ - uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); + u_memcpy(dest, src, srcLength); } if(pDestLength){ *pDestLength = srcLength; } - u_terminateUChars(dest,destCapacity,srcLength,pErrorCode); + u_terminateUChars((UChar *)dest,destCapacity,srcLength,pErrorCode); return dest; @@ -395,7 +397,7 @@ _strFromWCS( UChar *dest, } if(nulLen>0){ /* copy the contents to tempStack */ - uprv_memcpy(pWStack,pSrc,nulLen*sizeof(wchar_t)); + uprv_memcpy(pWStack, pSrc, (size_t)nulLen*sizeof(wchar_t)); } /* null terminate the tempBuffer */ @@ -504,10 +506,10 @@ u_strFromWCS(UChar *dest, #ifdef U_WCHAR_IS_UTF16 /* wchar_t is UTF-16 just do a memcpy */ if(srcLength == -1){ - srcLength = u_strlen(src); + srcLength = u_strlen((const UChar *)src); } if(0 < srcLength && srcLength <= destCapacity){ - uprv_memcpy(dest,src,srcLength*U_SIZEOF_UCHAR); + u_memcpy(dest, src, srcLength); } if(pDestLength){ *pDestLength = srcLength; diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index 44952c4ee8122c..69c17e43b9b612 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -45,24 +47,27 @@ appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, if(result<0) { /* (not) original code point */ c=~result; - length=-1; + length=U16_LENGTH(c); } else if(result<=UCASE_MAX_STRING_LENGTH) { c=U_SENTINEL; length=result; } else { c=result; - length=-1; + length=U16_LENGTH(c); + } + if(length>(INT32_MAX-destIndex)) { + return -1; // integer overflow } if(destIndex=0) { /* code point */ UBool isError=FALSE; U16_APPEND(dest, destIndex, destCapacity, c, isError); if(isError) { /* overflow, nothing written */ - destIndex+=U16_LENGTH(c); + destIndex+=length; } } else { /* string */ @@ -78,11 +83,32 @@ appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, } } else { /* preflight */ - if(length<0) { - destIndex+=U16_LENGTH(c); - } else { - destIndex+=length; + destIndex+=length; + } + return destIndex; +} + +static inline int32_t +appendUChar(UChar *dest, int32_t destIndex, int32_t destCapacity, UChar c) { + if(destIndex0) { + if(length>(INT32_MAX-destIndex)) { + return -1; // integer overflow } + if((destIndex+length)<=destCapacity) { + u_memcpy(dest+destIndex, s, length); + } + destIndex+=length; } return destIndex; } @@ -149,6 +175,10 @@ _caseMap(const UCaseMap *csm, UCaseMapFull *map, dest[destIndex++]=(UChar)c2; } else { destIndex=appendResult(dest, destIndex, destCapacity, c, s); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } } @@ -167,7 +197,7 @@ ustrcase_internalToTitle(const UCaseMap *csm, UErrorCode *pErrorCode) { const UChar *s; UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex, length; + int32_t prev, titleStart, titleLimit, idx, destIndex; UBool isFirstIndex; if(U_FAILURE(*pErrorCode)) { @@ -233,12 +263,10 @@ ustrcase_internalToTitle(const UCaseMap *csm, break; /* cased letter at [titleStart..titleLimit[ */ } } - length=titleStart-prev; - if(length>0) { - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, src+prev, length*U_SIZEOF_UCHAR); - } - destIndex+=length; + destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } } @@ -248,15 +276,22 @@ ustrcase_internalToTitle(const UCaseMap *csm, csc.cpLimit=titleLimit; c=ucase_toFullTitle(csm->csp, c, utf16_caseContextIterator, &csc, &s, csm->locale, &locCache); destIndex=appendResult(dest, destIndex, destCapacity, c, s); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } /* Special case Dutch IJ titlecasing */ - if ( titleStart+1 < idx && - ucase_getCaseLocale(csm->locale,&locCache) == UCASE_LOC_DUTCH && - ( src[titleStart] == (UChar32) 0x0049 || src[titleStart] == (UChar32) 0x0069 ) && - ( src[titleStart+1] == (UChar32) 0x004A || src[titleStart+1] == (UChar32) 0x006A )) { - c=(UChar32) 0x004A; - destIndex=appendResult(dest, destIndex, destCapacity, c, s); - titleLimit++; + if (titleStart+1 < idx && + ucase_getCaseLocale(csm->locale,&locCache) == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && + (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + titleLimit++; } /* lowercase [titleLimit..index[ */ @@ -270,13 +305,16 @@ ustrcase_internalToTitle(const UCaseMap *csm, src, &csc, titleLimit, idx, pErrorCode); + if(U_FAILURE(*pErrorCode)) { + return destIndex; + } } else { /* Optionally just copy the rest of the word unchanged. */ - length=idx-titleLimit; - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, src+titleLimit, length*U_SIZEOF_UCHAR); + destIndex=appendString(dest, destIndex, destCapacity, src+titleLimit, idx-titleLimit); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; } - destIndex+=length; } } } @@ -293,6 +331,605 @@ ustrcase_internalToTitle(const UCaseMap *csm, #endif // !UCONFIG_NO_BREAK_ITERATION +U_NAMESPACE_BEGIN +namespace GreekUpper { + +// Data generated by prototype code, see +// http://site.icu-project.org/design/case/greek-upper +// TODO: Move this data into ucase.icu. +static const uint16_t data0370[] = { + // U+0370..03FF + 0x0370, + 0x0370, + 0x0372, + 0x0372, + 0, + 0, + 0x0376, + 0x0376, + 0, + 0, + 0x037A, + 0x03FD, + 0x03FE, + 0x03FF, + 0, + 0x037F, + 0, + 0, + 0, + 0, + 0, + 0, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x0391 | HAS_VOWEL, + 0x0392, + 0x0393, + 0x0394, + 0x0395 | HAS_VOWEL, + 0x0396, + 0x0397 | HAS_VOWEL, + 0x0398, + 0x0399 | HAS_VOWEL, + 0x039A, + 0x039B, + 0x039C, + 0x039D, + 0x039E, + 0x039F | HAS_VOWEL, + 0x03A0, + 0x03A1, + 0, + 0x03A3, + 0x03A4, + 0x03A5 | HAS_VOWEL, + 0x03A6, + 0x03A7, + 0x03A8, + 0x03A9 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_DIALYTIKA, + 0x03A5 | HAS_VOWEL | HAS_DIALYTIKA, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x0391 | HAS_VOWEL, + 0x0392, + 0x0393, + 0x0394, + 0x0395 | HAS_VOWEL, + 0x0396, + 0x0397 | HAS_VOWEL, + 0x0398, + 0x0399 | HAS_VOWEL, + 0x039A, + 0x039B, + 0x039C, + 0x039D, + 0x039E, + 0x039F | HAS_VOWEL, + 0x03A0, + 0x03A1, + 0x03A3, + 0x03A3, + 0x03A4, + 0x03A5 | HAS_VOWEL, + 0x03A6, + 0x03A7, + 0x03A8, + 0x03A9 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_DIALYTIKA, + 0x03A5 | HAS_VOWEL | HAS_DIALYTIKA, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03CF, + 0x0392, + 0x0398, + 0x03D2, + 0x03D2 | HAS_ACCENT, + 0x03D2 | HAS_DIALYTIKA, + 0x03A6, + 0x03A0, + 0x03CF, + 0x03D8, + 0x03D8, + 0x03DA, + 0x03DA, + 0x03DC, + 0x03DC, + 0x03DE, + 0x03DE, + 0x03E0, + 0x03E0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x039A, + 0x03A1, + 0x03F9, + 0x037F, + 0x03F4, + 0x0395 | HAS_VOWEL, + 0, + 0x03F7, + 0x03F7, + 0x03F9, + 0x03FA, + 0x03FA, + 0x03FC, + 0x03FD, + 0x03FE, + 0x03FF, +}; + +static const uint16_t data1F00[] = { + // U+1F00..1FFF + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL, + 0x0395 | HAS_VOWEL, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0x0395 | HAS_VOWEL, + 0x0395 | HAS_VOWEL, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0x0397 | HAS_VOWEL, + 0x0397 | HAS_VOWEL, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL, + 0x0397 | HAS_VOWEL, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL, + 0x039F | HAS_VOWEL, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0x039F | HAS_VOWEL, + 0x039F | HAS_VOWEL, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0, + 0x03A5 | HAS_VOWEL, + 0, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL, + 0x03A9 | HAS_VOWEL, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL, + 0x03A9 | HAS_VOWEL, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_ACCENT, + 0x0391 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0, + 0x0399 | HAS_VOWEL, + 0, + 0, + 0, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0395 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_ACCENT, + 0x0397 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0, + 0, + 0, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x0399 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0, + 0, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0x0399 | HAS_VOWEL | HAS_ACCENT, + 0, + 0, + 0, + 0, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x03A5 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x03A1, + 0x03A1, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT | HAS_DIALYTIKA, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A5 | HAS_VOWEL | HAS_ACCENT, + 0x03A1, + 0, + 0, + 0, + 0, + 0, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x039F | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_ACCENT, + 0x03A9 | HAS_VOWEL | HAS_YPOGEGRAMMENI, + 0, + 0, + 0, +}; + +// U+2126 Ohm sign +static const uint16_t data2126 = 0x03A9 | HAS_VOWEL; + +uint32_t getLetterData(UChar32 c) { + if (c < 0x370 || 0x2126 < c || (0x3ff < c && c < 0x1f00)) { + return 0; + } else if (c <= 0x3ff) { + return data0370[c - 0x370]; + } else if (c <= 0x1fff) { + return data1F00[c - 0x1f00]; + } else if (c == 0x2126) { + return data2126; + } else { + return 0; + } +} + +uint32_t getDiacriticData(UChar32 c) { + switch (c) { + case 0x0300: // varia + case 0x0301: // tonos = oxia + case 0x0342: // perispomeni + case 0x0302: // circumflex can look like perispomeni + case 0x0303: // tilde can look like perispomeni + case 0x0311: // inverted breve can look like perispomeni + return HAS_ACCENT; + case 0x0308: // dialytika = diaeresis + return HAS_COMBINING_DIALYTIKA; + case 0x0344: // dialytika tonos + return HAS_COMBINING_DIALYTIKA | HAS_ACCENT; + case 0x0345: // ypogegrammeni = iota subscript + return HAS_YPOGEGRAMMENI; + case 0x0304: // macron + case 0x0306: // breve + case 0x0313: // comma above + case 0x0314: // reversed comma above + case 0x0343: // koronis + return HAS_OTHER_GREEK_DIACRITIC; + default: + return 0; + } +} + +UBool isFollowedByCasedLetter(const UCaseProps *csp, const UChar *s, int32_t i, int32_t length) { + while (i < length) { + UChar32 c; + U16_NEXT(s, i, length, c); + int32_t type = ucase_getTypeOrIgnorable(csp, c); + if ((type & UCASE_IGNORABLE) != 0) { + // Case-ignorable, continue with the loop. + } else if (type != UCASE_NONE) { + return TRUE; // Followed by cased letter. + } else { + return FALSE; // Uncased and not case-ignorable. + } + } + return FALSE; // Not followed by cased letter. +} + +/** + * Greek string uppercasing with a state machine. + * Probably simpler than a stateless function that has to figure out complex context-before + * for each character. + * TODO: Try to re-consolidate one way or another with the non-Greek function. + */ +int32_t toUpper(const UCaseMap *csm, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UErrorCode *pErrorCode) { + int32_t locCache = UCASE_LOC_GREEK; + int32_t destIndex=0; + uint32_t state = 0; + for (int32_t i = 0; i < srcLength;) { + int32_t nextIndex = i; + UChar32 c; + U16_NEXT(src, nextIndex, srcLength, c); + uint32_t nextState = 0; + int32_t type = ucase_getTypeOrIgnorable(csm->csp, c); + if ((type & UCASE_IGNORABLE) != 0) { + // c is case-ignorable + nextState |= (state & AFTER_CASED); + } else if (type != UCASE_NONE) { + // c is cased + nextState |= AFTER_CASED; + } + uint32_t data = getLetterData(c); + if (data > 0) { + uint32_t upper = data & UPPER_MASK; + // Add a dialytika to this iota or ypsilon vowel + // if we removed a tonos from the previous vowel, + // and that previous vowel did not also have (or gain) a dialytika. + // Adding one only to the final vowel in a longer sequence + // (which does not occur in normal writing) would require lookahead. + // Set the same flag as for preserving an existing dialytika. + if ((data & HAS_VOWEL) != 0 && (state & AFTER_VOWEL_WITH_ACCENT) != 0 && + (upper == 0x399 || upper == 0x3A5)) { + data |= HAS_DIALYTIKA; + } + int32_t numYpogegrammeni = 0; // Map each one to a trailing, spacing, capital iota. + if ((data & HAS_YPOGEGRAMMENI) != 0) { + numYpogegrammeni = 1; + } + // Skip combining diacritics after this Greek letter. + while (nextIndex < srcLength) { + uint32_t diacriticData = getDiacriticData(src[nextIndex]); + if (diacriticData != 0) { + data |= diacriticData; + if ((diacriticData & HAS_YPOGEGRAMMENI) != 0) { + ++numYpogegrammeni; + } + ++nextIndex; + } else { + break; // not a Greek diacritic + } + } + if ((data & HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA) == HAS_VOWEL_AND_ACCENT) { + nextState |= AFTER_VOWEL_WITH_ACCENT; + } + // Map according to Greek rules. + UBool addTonos = FALSE; + if (upper == 0x397 && + (data & HAS_ACCENT) != 0 && + numYpogegrammeni == 0 && + (state & AFTER_CASED) == 0 && + !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + // Keep disjunctive "or" with (only) a tonos. + // We use the same "word boundary" conditions as for the Final_Sigma test. + if (i == nextIndex) { + upper = 0x389; // Preserve the precomposed form. + } else { + addTonos = TRUE; + } + } else if ((data & HAS_DIALYTIKA) != 0) { + // Preserve a vowel with dialytika in precomposed form if it exists. + if (upper == 0x399) { + upper = 0x3AA; + data &= ~HAS_EITHER_DIALYTIKA; + } else if (upper == 0x3A5) { + upper = 0x3AB; + data &= ~HAS_EITHER_DIALYTIKA; + } + } + destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); + if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika + } + if (destIndex >= 0 && addTonos) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); + } + while (destIndex >= 0 && numYpogegrammeni > 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); + --numYpogegrammeni; + } + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + } else { + const UChar *s; + UChar32 c2 = 0; + c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); + if((destIndexdestCapacity) { + *pErrorCode=U_BUFFER_OVERFLOW_ERROR; + } + return destIndex; +} + +} // namespace GreekUpper +U_NAMESPACE_END + /* functions available in the common library (for unistr_case.cpp) */ U_CFUNC int32_t U_CALLCONV @@ -315,6 +952,10 @@ ustrcase_internalToUpper(const UCaseMap *csm, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UErrorCode *pErrorCode) { + int32_t locCache = csm->locCache; + if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { + return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + } UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; @@ -346,6 +987,10 @@ ustr_foldCase(const UCaseProps *csp, dest[destIndex++]=(UChar)c2; } else { destIndex=appendResult(dest, destIndex, destCapacity, c, s); + if(destIndex<0) { + *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } } @@ -419,7 +1064,7 @@ ustrcase_map(const UCaseMap *csm, if(destLength>0) { int32_t copyLength= destLength<=destCapacity ? destLength : destCapacity; if(copyLength>0) { - uprv_memmove(dest, temp, copyLength*U_SIZEOF_UCHAR); + u_memmove(dest, temp, copyLength); } } if(temp!=buffer) { diff --git a/deps/icu-small/source/common/ustrcase_locale.cpp b/deps/icu-small/source/common/ustrcase_locale.cpp index 5707c5a5be13f4..78f4bbd7a2fe7f 100644 --- a/deps/icu-small/source/common/ustrcase_locale.cpp +++ b/deps/icu-small/source/common/ustrcase_locale.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011, International Business Machines diff --git a/deps/icu-small/source/common/ustrenum.cpp b/deps/icu-small/source/common/ustrenum.cpp index af3c9fa9048b68..699ce32cfef242 100644 --- a/deps/icu-small/source/common/ustrenum.cpp +++ b/deps/icu-small/source/common/ustrenum.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2014, International Business Machines diff --git a/deps/icu-small/source/common/ustrenum.h b/deps/icu-small/source/common/ustrenum.h index d02c20779501b0..868fddcb53527d 100644 --- a/deps/icu-small/source/common/ustrenum.h +++ b/deps/icu-small/source/common/ustrenum.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2014, International Business Machines diff --git a/deps/icu-small/source/common/ustrfmt.c b/deps/icu-small/source/common/ustrfmt.c index 5e9fb924f8d3ff..c7805d8d2a3062 100644 --- a/deps/icu-small/source/common/ustrfmt.c +++ b/deps/icu-small/source/common/ustrfmt.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2006, International Business Machines diff --git a/deps/icu-small/source/common/ustrfmt.h b/deps/icu-small/source/common/ustrfmt.h index f1891bdabf58ea..3cc3d69add5e05 100644 --- a/deps/icu-small/source/common/ustrfmt.h +++ b/deps/icu-small/source/common/ustrfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2006, International Business Machines diff --git a/deps/icu-small/source/common/ustring.cpp b/deps/icu-small/source/common/ustring.cpp index ef4b05dd735478..8361fe37077fbd 100644 --- a/deps/icu-small/source/common/ustring.cpp +++ b/deps/icu-small/source/common/ustring.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -991,7 +993,7 @@ U_CAPI int32_t U_EXPORT2 u_strlen(const UChar *s) { #if U_SIZEOF_WCHAR_T == U_SIZEOF_UCHAR - return (int32_t)uprv_wcslen(s); + return (int32_t)uprv_wcslen((const wchar_t *)s); #else const UChar *t = s; while(*t != 0) { @@ -1113,7 +1115,7 @@ u_strHasMoreChar32Than(const UChar *s, int32_t length, int32_t number) { U_CAPI UChar * U_EXPORT2 u_memcpy(UChar *dest, const UChar *src, int32_t count) { if(count > 0) { - uprv_memcpy(dest, src, count*U_SIZEOF_UCHAR); + uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR); } return dest; } @@ -1121,7 +1123,7 @@ u_memcpy(UChar *dest, const UChar *src, int32_t count) { U_CAPI UChar * U_EXPORT2 u_memmove(UChar *dest, const UChar *src, int32_t count) { if(count > 0) { - uprv_memmove(dest, src, count*U_SIZEOF_UCHAR); + uprv_memmove(dest, src, (size_t)count*U_SIZEOF_UCHAR); } return dest; } diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index e835d96b6aa52b..b61d771fafcdc2 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index 20952a8459273a..a89e7a62b56366 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/utf_impl.c b/deps/icu-small/source/common/utf_impl.c index a1f43b94655731..91cb9ba5f2935f 100644 --- a/deps/icu-small/source/common/utf_impl.c +++ b/deps/icu-small/source/common/utf_impl.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/util.cpp b/deps/icu-small/source/common/util.cpp index 5a853ea34609ef..b5d1fa4888ad27 100644 --- a/deps/icu-small/source/common/util.cpp +++ b/deps/icu-small/source/common/util.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/common/util.h b/deps/icu-small/source/common/util.h index 427d25ca38c9e4..b3ed037ab62696 100644 --- a/deps/icu-small/source/common/util.h +++ b/deps/icu-small/source/common/util.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/common/util_props.cpp b/deps/icu-small/source/common/util_props.cpp index 44349061e74974..3b7bb20d254a86 100644 --- a/deps/icu-small/source/common/util_props.cpp +++ b/deps/icu-small/source/common/util_props.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2016, International Business Machines diff --git a/deps/icu-small/source/common/utrace.c b/deps/icu-small/source/common/utrace.c index 15f5ccef5255a4..e702497d8c0f69 100644 --- a/deps/icu-small/source/common/utrace.c +++ b/deps/icu-small/source/common/utrace.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2014, International Business Machines diff --git a/deps/icu-small/source/common/utracimp.h b/deps/icu-small/source/common/utracimp.h index d88b80967a8297..5ec047a967a858 100644 --- a/deps/icu-small/source/common/utracimp.h +++ b/deps/icu-small/source/common/utracimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/common/utrie.cpp b/deps/icu-small/source/common/utrie.cpp index b8caeb722b3058..478560df66eb3b 100644 --- a/deps/icu-small/source/common/utrie.cpp +++ b/deps/icu-small/source/common/utrie.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -139,7 +141,7 @@ utrie_clone(UNewTrie *fillIn, const UNewTrie *other, uint32_t *aliasData, int32_ uprv_free(aliasData); } else { uprv_memcpy(trie->index, other->index, sizeof(trie->index)); - uprv_memcpy(trie->data, other->data, other->dataLength*4); + uprv_memcpy(trie->data, other->data, (size_t)other->dataLength*4); trie->dataLength=other->dataLength; trie->isDataAllocated=isDataAllocated; } @@ -839,7 +841,7 @@ utrie_serialize(UNewTrie *trie, void *dt, int32_t capacity, } /* write 32-bit data values */ - uprv_memcpy(dest16, trie->data, 4*trie->dataLength); + uprv_memcpy(dest16, trie->data, 4*(size_t)trie->dataLength); } return length; diff --git a/deps/icu-small/source/common/utrie.h b/deps/icu-small/source/common/utrie.h index 3cec027fe34595..17e660b3e308cb 100644 --- a/deps/icu-small/source/common/utrie.h +++ b/deps/icu-small/source/common/utrie.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index 5f873c5cac0825..4bd35a924d874a 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/utrie2.h b/deps/icu-small/source/common/utrie2.h index 36ea9b4bb9423f..810bcfc9591058 100644 --- a/deps/icu-small/source/common/utrie2.h +++ b/deps/icu-small/source/common/utrie2.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 0815822c5035f7..664051c5f9bd04 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -248,11 +250,11 @@ cloneBuilder(const UNewTrie2 *other) { /* clone data */ uprv_memcpy(trie->index1, other->index1, sizeof(trie->index1)); - uprv_memcpy(trie->index2, other->index2, other->index2Length*4); + uprv_memcpy(trie->index2, other->index2, (size_t)other->index2Length*4); trie->index2NullOffset=other->index2NullOffset; trie->index2Length=other->index2Length; - uprv_memcpy(trie->data, other->data, other->dataLength*4); + uprv_memcpy(trie->data, other->data, (size_t)other->dataLength*4); trie->dataNullOffset=other->dataNullOffset; trie->dataLength=other->dataLength; @@ -260,7 +262,7 @@ cloneBuilder(const UNewTrie2 *other) { if(other->isCompacted) { trie->firstFreeBlock=0; } else { - uprv_memcpy(trie->map, other->map, (other->dataLength>>UTRIE2_SHIFT_2)*4); + uprv_memcpy(trie->map, other->map, ((size_t)other->dataLength>>UTRIE2_SHIFT_2)*4); trie->firstFreeBlock=other->firstFreeBlock; } @@ -540,7 +542,7 @@ allocDataBlock(UNewTrie2 *trie, int32_t copyBlock) { if(data==NULL) { return -1; } - uprv_memcpy(data, trie->data, trie->dataLength*4); + uprv_memcpy(data, trie->data, (size_t)trie->dataLength*4); uprv_free(trie->data); trie->data=data; trie->dataCapacity=capacity; @@ -1402,7 +1404,7 @@ utrie2_freeze(UTrie2 *trie, UTrie2ValueBits valueBits, UErrorCode *pErrorCode) { /* write 32-bit data values */ trie->data16=NULL; trie->data32=(uint32_t *)dest16; - uprv_memcpy(dest16, newTrie->data, newTrie->dataLength*4); + uprv_memcpy(dest16, newTrie->data, (size_t)newTrie->dataLength*4); break; default: *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; diff --git a/deps/icu-small/source/common/utrie2_impl.h b/deps/icu-small/source/common/utrie2_impl.h index ecb3b6fc40a4d9..48883638b185c4 100644 --- a/deps/icu-small/source/common/utrie2_impl.h +++ b/deps/icu-small/source/common/utrie2_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index 13a1f246c21cc9..7bc4f925caca0b 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2015, International Business Machines @@ -68,7 +70,7 @@ isASCIIOkBiDi(const char *s, int32_t length); IDNA::~IDNA() {} void -IDNA::labelToASCII_UTF8(const StringPiece &label, ByteSink &dest, +IDNA::labelToASCII_UTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { if(U_SUCCESS(errorCode)) { UnicodeString destString; @@ -78,7 +80,7 @@ IDNA::labelToASCII_UTF8(const StringPiece &label, ByteSink &dest, } void -IDNA::labelToUnicodeUTF8(const StringPiece &label, ByteSink &dest, +IDNA::labelToUnicodeUTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { if(U_SUCCESS(errorCode)) { UnicodeString destString; @@ -88,7 +90,7 @@ IDNA::labelToUnicodeUTF8(const StringPiece &label, ByteSink &dest, } void -IDNA::nameToASCII_UTF8(const StringPiece &name, ByteSink &dest, +IDNA::nameToASCII_UTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { if(U_SUCCESS(errorCode)) { UnicodeString destString; @@ -98,7 +100,7 @@ IDNA::nameToASCII_UTF8(const StringPiece &name, ByteSink &dest, } void -IDNA::nameToUnicodeUTF8(const StringPiece &name, ByteSink &dest, +IDNA::nameToUnicodeUTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { if(U_SUCCESS(errorCode)) { UnicodeString destString; @@ -131,19 +133,19 @@ class UTS46 : public IDNA { IDNAInfo &info, UErrorCode &errorCode) const; virtual void - labelToASCII_UTF8(const StringPiece &label, ByteSink &dest, + labelToASCII_UTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; virtual void - labelToUnicodeUTF8(const StringPiece &label, ByteSink &dest, + labelToUnicodeUTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; virtual void - nameToASCII_UTF8(const StringPiece &name, ByteSink &dest, + nameToASCII_UTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; virtual void - nameToUnicodeUTF8(const StringPiece &name, ByteSink &dest, + nameToUnicodeUTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; private: @@ -154,7 +156,7 @@ class UTS46 : public IDNA { IDNAInfo &info, UErrorCode &errorCode) const; void - processUTF8(const StringPiece &src, + processUTF8(StringPiece src, UBool isLabel, UBool toASCII, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; @@ -251,25 +253,25 @@ UTS46::nameToUnicode(const UnicodeString &name, UnicodeString &dest, } void -UTS46::labelToASCII_UTF8(const StringPiece &label, ByteSink &dest, +UTS46::labelToASCII_UTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { processUTF8(label, TRUE, TRUE, dest, info, errorCode); } void -UTS46::labelToUnicodeUTF8(const StringPiece &label, ByteSink &dest, +UTS46::labelToUnicodeUTF8(StringPiece label, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { processUTF8(label, TRUE, FALSE, dest, info, errorCode); } void -UTS46::nameToASCII_UTF8(const StringPiece &name, ByteSink &dest, +UTS46::nameToASCII_UTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { processUTF8(name, FALSE, TRUE, dest, info, errorCode); } void -UTS46::nameToUnicodeUTF8(const StringPiece &name, ByteSink &dest, +UTS46::nameToUnicodeUTF8(StringPiece name, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { processUTF8(name, FALSE, FALSE, dest, info, errorCode); } @@ -401,7 +403,7 @@ UTS46::process(const UnicodeString &src, } void -UTS46::processUTF8(const StringPiece &src, +UTS46::processUTF8(StringPiece src, UBool isLabel, UBool toASCII, ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const { diff --git a/deps/icu-small/source/common/utypeinfo.h b/deps/icu-small/source/common/utypeinfo.h index 51c3a03bf7c332..b39aa0d6053344 100644 --- a/deps/icu-small/source/common/utypeinfo.h +++ b/deps/icu-small/source/common/utypeinfo.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/utypes.c b/deps/icu-small/source/common/utypes.c index 6ff84607476400..c506dd44f5424c 100644 --- a/deps/icu-small/source/common/utypes.c +++ b/deps/icu-small/source/common/utypes.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/common/uvector.cpp b/deps/icu-small/source/common/uvector.cpp index c0cb2d83661ec6..e48913e55eac12 100644 --- a/deps/icu-small/source/common/uvector.cpp +++ b/deps/icu-small/source/common/uvector.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1999-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/uvector.h b/deps/icu-small/source/common/uvector.h index c209a30a76d251..f6abe3e78ad1c9 100644 --- a/deps/icu-small/source/common/uvector.h +++ b/deps/icu-small/source/common/uvector.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/common/uvectr32.cpp b/deps/icu-small/source/common/uvectr32.cpp index 09342f2f82d557..3607d974ce5a9d 100644 --- a/deps/icu-small/source/common/uvectr32.cpp +++ b/deps/icu-small/source/common/uvectr32.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1999-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/uvectr32.h b/deps/icu-small/source/common/uvectr32.h index 451b741f598d65..c975de769b55b4 100644 --- a/deps/icu-small/source/common/uvectr32.h +++ b/deps/icu-small/source/common/uvectr32.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/common/uvectr64.cpp b/deps/icu-small/source/common/uvectr64.cpp index afbe14f8da6049..9196274aba1826 100644 --- a/deps/icu-small/source/common/uvectr64.cpp +++ b/deps/icu-small/source/common/uvectr64.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1999-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/uvectr64.h b/deps/icu-small/source/common/uvectr64.h index 13d3c2e5c76e61..fec10983988de9 100644 --- a/deps/icu-small/source/common/uvectr64.h +++ b/deps/icu-small/source/common/uvectr64.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2014, International Business Machines diff --git a/deps/icu-small/source/common/wintz.c b/deps/icu-small/source/common/wintz.c index 166da0b484ac65..5a3ecae0a43f36 100644 --- a/deps/icu-small/source/common/wintz.c +++ b/deps/icu-small/source/common/wintz.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2015, International Business Machines diff --git a/deps/icu-small/source/common/wintz.h b/deps/icu-small/source/common/wintz.h index 39f886ab1c095a..01a906a401348d 100644 --- a/deps/icu-small/source/common/wintz.h +++ b/deps/icu-small/source/common/wintz.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2011, International Business Machines diff --git a/deps/icu-small/source/data/in/icudt57l.dat b/deps/icu-small/source/data/in/icudt57l.dat deleted file mode 100644 index 87131f44e10ac40aaedc96158dffe7a84df9be08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1933056 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�do<0 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

ouR z%26LGM}4TQ@peWUuc+~g8n3AFit=?q@`>_^@`>_^@^wYSEag)ypD3R=dZN$YhVf@U zWH`rix#c>`=V7|_iSmi^iSmi^wSekRluwjTluwi|7s@BfC(0+vC(3sXluwjTluwjT zl&=uVC(0+vC(0+v*B;6z$|uSv$|uU#8OkThC(0+vC(2g}j&i%*Pn1uTPn2&eluwjTluwjTl&=!XC(0+vC(0+vR}JM81!e4>1!eD6T{MEOMdMEOMdjzRfE`9%3d`9%5t3gr{!6Xg@-6XiP# zl24RRluwjTl&=KIC(0+v zC(0+v*9pld$|uSv$|uTq8tR^0SoNanC)#=#)+<)MsQRh49)|UbRWGW(($>SU zUa{&$)mPhk7}hIRy{P(ywjPG{id8SF{=2pwhV_b7FRFfpt%qT~V%3YPf7aH+uwJq1 zMb)pj^)Regta?%PFW7n*)+<)MsQPWT9)|UbRWGXk6On_33iG>Y9aNpNiF|sQSjX9)|UbRWGVO-PXgfUa{&$)wi(q zFsxUsdQtVcwjPG{id8SF{u)~k!+OQ47gb+q>tR^0SoNan+uM2=)+<)MsQS*f9)|Ub zRWGW()YikWUa{&$)%UXXFsxUsdQtWLY&{I?6{}uU{UBQp!+OQ47gc}1t%qT~V%3YP zA8qSlSg%<1BK3LR-_XA-n@r~4;87mxFxe|_7m9xeoWjpbp(d8iEStmLDAUH-HqN!o zxA`K=n=Eg!ybY@T?O~kjHLS?x?~~{uf<|MI-a;}X<#j1Y_I z8%NwN^eJxdHJV!DwX^xmsYM(4bFSp%EAa}Z&heT|)!)%tY1tmO_tL}q_Fgl4{N^DQ z7khb#e(V@bf9clOE74ZIIbQRy?`4+7P{(fX4W^IgXb|N#sK~~{!#Z=$9FuVsd&BM6 zO>D;9gT6Duz86`RK;t*QDAu{FKgI36{)zshdd+Q#*E(z)`E*Rxi{ZJ3;}}G_S0Z2H z^-j!z=_B%w;27qd<}gp1+hvv)_NDVS>y=608b^L&eWGKFW?UUP=PcWwVKK3pE6sJb zoe#reVpG>W+zX1O0#q2zw_+W$n6^2#tzikV)=A?vo}6%;+ApThUbM-zV==sh_!8!X zpQR4xI65z_$sG2AnFqr;oTuVNmOAffKSpKE%^a_l^%>4#olHB!G|=j;?4>xXyF9Kbd10 zhH-c-;_z7J{$=JO*N%~#ogb~c?r}P&a1YpfWOUyvVc*o3+fnXf{ko58T&91sM|JIV zx8pGk<8VC0;dr=)62~xQ)7D&DI)BCH{JYb??rqfBxsCG4Z6d!sC0>tk4$T_r-V?<` zxTbobJexE7MD=D)b^blVV{5KEcmwTqR7Sn7U32d&@yh6bFkZt??=|h~-gu+?W_?-X zHskD@SYM5|y=P*L!Q4~LbEhag{^0Of(LK<3biddAbBLWsvq#K1)bG*yz26J(u%tQV zKF4u2mSx_EaIIE(qbx^-DxKBJ;0C=E43>8Lr%K$$2DWuqLFi}FxDYK2;( z0@MaQgdRqZqOYRI(BtR{^dy>srlRTSYv}8!3Vj33LDlG+=v(M1^lkJr^mFtg`UQFk z{Sv)`eDo{yYxEoR8hRbQiGGWIhu%WJM}I(nMDL(Kp+BQK^cVCldJj3xQ3lfAFUdmL zCl#dj#KG5v(Rib7tKTS(E_v(Evn2zp0gM&K}(63!ewYVT7g!gRpeK})o2Y` zi`J1_2iL>(a0A*%d1GY}@|;bSH&Nb1c{AnBa0}XswxR842YMOpM7z+ds21%;d(azb zFWQIpqXXz5I)vUvhtUyq6dkMd+~bvAKI)D}p;>4(+J%mx2Jcq#dvldu4>TIhMr+Wk z=s0S4qS9-P%FtLe7p+CL=mcu?UZq!ndZBUeRi-0;N2`+G&#Lt1p>=5YdzJhR^-Av~ zYI3sDYjd)azolO3^+u1N`NW97r(Wr;M|;pIl=j!kJjCBsuk;F0A2gmEDnkENLAyXlKwp58k2l2SfyRNVL2E!yfnGh{fcF#|@a|v(-WzO)`wuAPvxd0A zpb4NF&|1*bpw~esK&hWM#0>#W1T6rq13d$J1N0>*?OzRX`JhrzEoePxH>d@45|r^p zLtFu95~vQe5wsWd7U&yL=D!=_hJhx77K1i{p8aa()GW0u_U1fEq!~pu?b6P~u7W4`?)KCTIo74|);w z3CQ&|d<8THG#j)Mv;*`K=s3vy20j5A3z`F31=AsLN;A@@B?KoWQhR#CK^|#N)?BoQ4!>hL9PC(JKRTrV-kH7IYp^?=XEIl*`dN z`&h&PtLCC}ekpL1dkO|qHU}U+$CxcQTr$SBzpO&Ed zq->p$AVqJa^+_=L_CZ=d$a#TJJWjg(6U6{Nc zZ9a;AZAL#qq6zXd+@IZyd!ZYasQqU+VYAdv;~K$qJ?+bIuxG15o(Fx;b&HU@GjN5JKf=_cvkqJ4=W%SB|?17vI zd9cf<7z}v`_s1HLVufye6v}egL>ycu41{`Welo@T*KuSxFWCDTJ&*=%A@DGAxb`< zEzdHpb2(!p;|j)=3RQh_75cRb{aDRuYc$HWE@RbN=-07+J?l5RjJ9piH?xf2J{r3d z@-CL~8%W>(HRRv0jNd|G2s5gk>GvZ;xV2VW|I1qMM0KcmCeqFzPsVB5$vjPZ)@jl`r%CU9n)E*1rc2om^N|gEU99q* zhq04Q(?MicvJ2Uk;yl^+2OzQ!&I4rU2K-(a{HF@KD$Hkp%x8ZcCldQhVKVQAK3VZp z7E{w-wbdE(Q;|2rmY#|H;s;S05`#V+hr)$L}11wv>!>8>0!GoB8A+ zQlv7Urcjs5V4b+^toxzoCLiO>*JDfs?^3+3+ho0)G1-=ul8>`A@{6J0vE2gQrjs$T z06xgPTcPelGV4+bgh;jN(;$n>&$eyM>o9J280^iwOCgV$b#A1KADwOedf$j24x54! zhwHXnj3%R-F_|%iQT+HjwpU2)=>9tukG2ajm&}`tZpLJVI)4i5QjtH6`3%NP#wp8;N6rP@sqaSe1$N_#%}Bb|k4 zzo%-88^U}(_+iY8YyK~Nwe7=W(dV&P3uCoyOhz|!DPvU|oj#cg zod@~Fwcokz;Qn8Nc1v`diHt7jOy=E;$&4u_i2KZo>&~`)%*{BS`*Da-%)7>6jEdJW zAQf^Zr)Amn9_ahn%-hkLS2)%PmC@`6KQVd#ZBL# z?#ZZoGS@vBF`0QcW3obR=M>hZGNv(ROjhl7u7ga}nZ;=y)Y*^uY{veKIgA4sbCGul z^ZASgVRa8fo>A4Il4vJAmohf)VhfG(-L)BmwSaS)MZAf%N;?NtaY7sPq{_UV=7}> zSb7HQGsE;*T8`LHk4_62S8uMTk520{hJIo7XJbtLqvXvA%R3-U&JC0Ev>ei(!Ki-- z_bH#TfN_}4-=&YkQKk^&)#(w(Uc_~bVk~AH9oDBY5&AT?n|e!hT9-bJ3#)em`ZqB` z-KEe^;=W8~oT5>dA+22Tdd*gFdL`ow#+i(>8RsxoF;+9yFfLH2>#Vi$b)3GKaS3As zqmOYJ<8sDE#ubb!8CNl`W?aL#mT?{9dd7{6n;0Ku+|1a-xRr4mV>6?laR=j0#$Ak0 zF+R=s4C8Lby^PN?KF_$1F~E3$@et!-#upi1VtkqL2;-}auQR^E*rHK7$`E_XXx;0% zaVj2rIHSv!X4-gnCm%eYC3Be+##F{M#tenJolMqcF?tw#GxlNZ$C#~9m+f!kbAr4a zpz|g$id-#=ykH(Nm~}%m%6yFpjG}7}kwtEMXjH z%QL~oPvrDc#z~Bm8K-EJWf~J0MY)o7KPoV%m7H$|=VNp;ikVt3W;4!VtYWNIsOzg? z-2%qive5myj`fQfmoPRk`WTlnE@y0HToG2^O4hGZsQa**b!!;cGOn}bSR3MzM|aG&A}ccPP~T*~z+H8s$^Lv;@uL`AbkIo(b}Dw=R>wDE4Yu zJgZSY&*_YAjjG*Vtjl8T%b3F`_NlTeuMBWKjN*Wn#UaMS3U%HWIWMDliSxY7c!cp) z#@89&U~FN0OQE*WQP#Z^)XDd>F5$g0;RcCgVRQc>m-#4IMzn_I`9$ZD$AftiG%v*G zT>gt-n*5K}C1})rJE3**OHR|M(%d$_7pG_0bbVQu!#Iesz?NqO>xvn#wWZHOnm0N#G|l zKLval^X1?xn6CssgZY`@XEQ$sd=>N6;A@y)0KS&_I`E5`Ujn{?c^~*?%r6Ju$ovZM zE16#fel_!Jz^`R~9r*RkZv?-I`A5s8XkvaV_#MpeM4nycnD1$r?`e9jos5Z$E=E(K zj!ACTB{QZlrZT26W+>EUGFg{p(|K6eo3RgLKgMjv{){;ab$tU^muu7Iv2HNq5XOAQ z0>)vC!x;+|>UzDbD`FhQSZvEPnss9s$1;{Mj++LXR=}neWK&(QQ}I|!j4oT6$vQV< zas}>jF`r?}mucg(Y`ll__C}k1nD57!&DbAlIm{0LpR0M9S7B_*s}OQfg|T}O&@mnT zo^JJ<&di7doih4w<6X#W+GMwlPY&`jWxC-`LEhBqUG5#oG^C{=Eu(9i$W(RU9*a)v zavkZ3P^NbTU7xNx*>Ad0&=2iq2m2}dM`K%EM`?W*I~GULk4C@8P8YIdy3w};<;UrKo%dlTgvk?awk$>2DK@#x z#+Re63Y%OBc?Q~<3165Aes);BbHd~*TiI%~v&1GhpdR0JBgcn&mg#a`#=AU8aA9qB~BX=sBh=iTf zjb7lx--FD8J|}{H5cDIstk@N$?x!$MPoeFnBd3dJy0#~FBmZ9X`&pEIwrhH?XQzuS zka)gpn%svn`?~6T?L(Oe`o73tj5HC@Wy0rQ9>Dw_K>DGG=_=;Q!)Ws`^1K)^j}R|u zedk(uS<4~!>yBW&uVS8FMLn-asppLdaeR?UPw3o^(#ONteAx%yn)hyLJ;m>&gxEb}Gcr!Zf}SPtE6=I4N4r+MkXnIWFe4OMvWwF>XORvFK2 z0X9_`Js$^dtuo&HIdEH*QS}6{xytyq8R)Mv-g^?b1NvV8cUBn>{t~#W$}oNfd%aXw=7d_A8gqnk0AF@-UeF^w^UF_STi(ZkrAu@7TE z#%#v^j5&-07;_o(7zZ;BVa#VNU>wFcoUxG6%UHxXim{k+G~*b?v5X~*;}|C}PGl@) zoWwYpaSCG@V>x35V8RsxoF;+9yFfL%MWvpXd%(#THfzijfjBz<*BjXCj zm5i$xS2M0*T+6tQaXsTk#!ZZmGHzyUV%*BOjj@^0&$xqeC*v;0rx>4Rd`6?(J>R(V zPw?HB<{P_T0y-8TCN0o0)u~YLHHizzueIJ~>1!wrv{*=UfziuES$BlA{oq1ss>^+4_#G5h`yF^`Z&f3j1w7465_a%D9=aiE%6AHk4^*-p{y$aVO(0#-}vOr?C#6M!9ELzngI{mt&RJ+YlmmHymPIc3JWdrJ(D%x3w#dqgTPlazX<%}%=^I~V*bzI z&70BIEnMeR#%Wyl^jhPq>5A85xHZgPx7pHW+4$RS{9GGg<)+hvZdAA z_&aU?3jMKI-J`UZ_InNWdM!^%1w{zN)DE~`N`xWNuS4jIcbiY+PJr8?0@9%87 z=WP57$p3qre9*@K!N&j5#{bF2|Jla>1?|70WFcNdy&u;K`A@8ge?tE$>p#;d{{>(C z7xe#T{eQv#kJG-YHL||ad|&Vd%#Zl0RunUTE%X)4&w{?1`9;uw!TeW@-$M6`uhAFB zBE+;s4YBI%7N=rcFYpxKLjD%mc?NkB&mfNr?U`qg&wU1Yl0)-^-`f-^i_~~R?n9<( zU6;IRr>QF=O1aDkZDgIMF3)Mwdq=3VPXt}R2)gVDy8fZKUWUbe^kFumB9P!j8UtA57Zf14bmc&z3ro01}UDz4$rf6O7v# zpJe<6<1ZP1#rSK+-!T4`aS!9~7@uQ&fpI_M?->s={(x@6Q0{>ZO-1G_X(>i1Kr@-TN#cbtrgj4no#(ao65n8KLKn8ujFn8}#M=wa;5*oUznV>V-d#vH~0 zjJb??jDs16Fy=EBFb-oJ&REFkWh`PG#aPTZnsE%{SjG~@af}l*%8B*Hgd6IGEUh>G zdJ}MRz47{F;LY_$<`m#9^+r`0aB98rtEs^9dgJfqz-jfyD>Hz%)#Izqf%EE(yK8{+ z>y1Cp2QC0E04}UIeq4)rs;gIPT`sOSau!2>XT5RrozVY;`?0j%7_=06A9TyOkIOl& zv0fyA#0r*I)*HQ6LSDuBRx_?)T+6slqg-Ea^j(kq8(H3jb{?rW9(n}$XuYxNQQ%|1 z$AFvbje9l&x6~UATYydIR};!^<^FH0H(uBV{S&a$6Ts$rBY!*4UvC^a4E!VP@Db3l z7{0lf;~Qflql?jGbTcL^L>ZhXQ&^YEm}X1Mu<@BTK8y2u7<)7JvGVYJx_+$BX6(D>gP#JP>Ma95Csws9s$$!u54?T9Uj|)^PFM5r7G&wr`5lfn zc}(-FecFdU12=Wv^F^jGSxpB{L4B`907k6JoVun z@T<~w{j1a4_0|00zHQRePxHO|waMNW zX}-@zZ88@;jU^9!sn#ob667hIuMGSFTiPMW%d%A+4P>k3*==&j#X&j$;x;(}GSxc~ z`~h3qA;{S|y8Zq+ZPN8a&6_`jO~9-91ixc|*6$q9CSL_lb-fP$EzPTZMb$uBF+hjg?YNr7F@k@2xpI_Q0EAq9zGQUmsze4BFxdQn$ zPkm5puK>DHR|eZEz7l=_nS6OQ__5=4*^=>Xax!>oYYKQdLF*k8+GHN{gTZfOz8U;( z@RWZq_?N-cxQ~F}d%bRt(w@D(O+F79?Ww%`AirE1?9Y+XHrZOC+xnye@n^cOGjTe6 z3cO{bF_3pu>U=vZ+vH2kzYM$3|t$$}R^54n%@5Fq7C!5olD4 zHQ(o6tQGK7XCC+()-M3xexJ(IK;!>b^Fpp{lWSJ$vTMPQyI=DY?r)PHfv0*}!OvKw z`!jPD`o20?&l1gxhSl)#&ARM>&27>Pp2`-1FKp6!ZxiO|ab1?uGBhtTA4i{U`aH;T zt1j=@ikP%b^U2%V59+#_4q~r5qO})|?!%pVMe<>c zPs_pse#M_U(^UUg{t15kj&7&%9qf;|9z z53MiwN1JT=Nb_4iYLm^(`@y#|{|WdZAL~5%AH!ch(fpE6+GGRsKJdGl-wS^1rz#Ki zMU-e>jANYeDfYb2w9T?VgFV1gz6Rn?Xnn&8_}NL#dr!8>1&;R4_))8QQRirvFU2Xn zcsZ_J`kd{`KFgf#a_6~Pze}SU_fzM#%Qup>z9qR`n&)ZWeO|jPWZuhI1f3&Ar^lzX zOJ`5bC-!WYLo~1I%!izjs?yXLGE>{-$~2vK731o(cKM$ytviv0y1vJC0ck#5-)ooc z7irzM7q!b>*_wYUyImgbulaZSx61)PP`nyr?ho2!K+EC)_-~n)Ip}vzyV?`tf#mN_ z=u*IwjZ?wTxJ1`OZO^=hv`p>P4QrR56zOuui`u3C3eE4hqFuf>O7q7?waXJ@gJr(d zyf`_wUAnK;dds(yuWgsjL7nhJ_LS&)dY8bS;A!mNf?qOT>l?qtJ~$FdYyi_9&@!s^YKgI7eCQ_qDIw@E678x73NRck52d8(=M|cHQ&FnU1r{=c-4n2 z%?rjP>pERpws@{~zX0 zfZzPE&eQZT#>@O(@R^&mK1*Y#4LqCL<%DN++C;|EXWHdQzty_d-?qyG2Q+`^K)alB zQ1fL6+okJ}=1oTTp>|pQXRWJYT)Bo zzN+)hc(q-o9@Tu>(RNw>j^-=gX_xX{%{$)3T4DY;_&M)uebxKz^5ikie{-x|CV!xK zwcb)bfZsu;_J)D~#+KF&x%bDqT%V6&XXa0U_qFOesNAyFc3E^>%jDyuj)|^T}=PvX%Kyz^`xD`i<@IN#+9@$u6K;aR6x^c}n%Qw>%}QVo#|t zRL7o@!{Se=I8W^lk3S_}?xAFHq{k`w>^Yi${+v_tOXg34pXk2f4SB>FNdD_=fNKVPvd_Tyt`26NiIAkk1_ut`23MtUoi5N+{}Cv_?MV}nem85 zHU3vAy;zrfx%ia)*r~^J>j!U42TfDAD}N67=o5V3}91J0;&4 zuhZTee@d>Np!qcu(9R8-fBA+}GPP9mX{D!R9`l32yKhu_)qe7gr)2I;I$z#Rr{u0_ znty5<>Yc9nHPex2F6WsGdsHc2mH)8nlx)01r>(f-l>EF}^Iue-k~3>GKfC6XY+`;Z zc*lILk7snwhhH$i4SePTou0Mel=ReUzIQEb&wK&+7ny$vd<*k$fp;&``I8r&lAD-+ zl=wQWf3yzkqh9f<|HJD~$!aZ&8t}EYv^vP^?$qVh-+4+pmjuftE;%J9Xjx1IUl~k8 zy|rQnbo)3x0R9m3hrxfd zdOo3}qXFFCfIi@oSybQf9+1FI1U3L~04@V&%%=MO1}O{NBoJzVR0fW;6~M`$T%|1s z*LXWg6I~r0E5R+8L(*R%)q-0Nk|N-8DorD#H;}Rd_{C3F;*;{N0urxFk<>VsS{;dKY?_jM{plww~tSkSEoA6M1@>Zy`^z`8xRX z%)f$9G2cM`bCB;G^9W?O`3mH7%~w&zWxfPH$^0{T)BFp{#G}pxiMW&rv)^Y_p%j&9As56v%8Mp@H)vH5TC z%9>tfO<$)qy~>(CWzB%HrcYTj(APYUG9lIsTxfm_owBC)0`nMnWlgWLrcYTjkZ!&W zy|SiPS<|Pi2|L)W*@8UEnqFm1pR%S`S<|Pi8R)d8Pgyf?uK60uC~F3i%$LC{Yr7m!C;)2poMQ`QW`nFpX>62+SEN~x^rRo3(=YkHM6 zeaf1FPHXy@KmT$rq&sBrk>?!mR04*7PZB29z~@%9?=`@?6^sjTU3h;B`r|*{tbR*7PZB29z~@%9?@iQ5=xUnqFm1pR#7)d|KmDSrc{$ zv!+j3Gti6TgH+ZGoJVV1DrGMUmCgLVmI^yO@lu_11+(g7g+=MkbZX#kLZo-;~ zoA6DavL@mtd=qgKD;+koSrc&+D?QMgqN`NaMBGHgMBIcm5jWwRh?`jHh?|I*h?}q` z;wF3(b_la3;wB;{;wG$#xQU2~xCv__Zo)S?Zo-;~oA6D5rfYa(vKHxW0n(h)ZiF%dUmO~g(3CgLVmdcb=kfITVC?C6*Y zyH3XM`DTen@YTS6GeaE3*X18I(*p-%-!{(=9Q^(}WLNLIrVJeP`ppiMe$u=ka8Ulj z%z|d8`MtnFUlYnSndb!#1|BziBJJm9D$<@Xdm-%+(}ey}(+&M&=DE;sF_WQRi?%kP z+y*lN=^M=+NPpOLA$^mXq|zPGKV-&3zs@wE|C#B8{vMRM$2^5THJaaIL@Ue~pSB=f5#uj+OOhcL) zn^%p^r^Xi8LNhEw#^zOH^Qo}~HqlHY9b@yVvH8^40zab}mYrh@G?EudH8$VJeXSC0+eDAm}!YHR^D zHm@3+SB=f5#uliEJhr>k*dAA7!+OKmu-@R4SZ`QqSZ^2`)*I%H*Bg8i>kTUn>kVV` zsfb=LsZZ+HWD zLZ;vLc8EL9F~z)d%24Ng`t&v+^=YIm1wI1|{NxsSFi@>>)O6;c6#DINTlv8JbEcve zD!-e{?^Wf?B@>0`u}^uA(SdWzVdo&Z`I zIM~~tem_2+Okai1ZRz*o^NI8o_-szU51(7om*KN1{ce0dp1vHPThs5s=g-p{@%b=n zdK5K1n!Xg$W9dG8Zce{TrQ8V{Zc1N*&qvZ5pjnq*3;t*6i}1NVy$+un((CcLF?}&U z??b;00G|(~FU05S^lE(mG<_aE*QD3r^S<=k@wqa64nFTspNr2` z=~eiAApH(}-i?|XQB!03Oi1^p&%)=5^w}!qR(vi`pMlSN(r?3OLwY$rm!?m{r!Tz% zpLeBC$LF&2N_@VB-}Q}RxpHN>a%H)4Ww~-?xpHN>a%H)4Ww~-?xpHN>a%H*l5X+S- z%atq3AqAETD9Z(u<;s=i0?Kj$Wx0T|TtHba(8Y2AWx0T|TtHbapez?qmP3A6E}$$I zP?ifQ%LSC>0wIH7UzADa$n}%QY#>H7UzADa$n}%Qb~qu1Q(0Nm&jl@HV+A{U?EgP0Dgj>&V;W z&&b>4dh#~8fxJy_Bpb_6%fZ{^TJkpe5P7OxP2MJdO5P^dkVhgvyiKkoZlS|3lq>sE!-bLOfmywO>_oI77 zvD`6bxns(5$CTxcDa##GmOG{_cT8FCn6lh4Ww~R@a>qg}cT8FCn6eyFU^%a{+%aXj zW6E+~WjU|1oL5=St1Rd3VmYs}oL5=St1RbLmh&phAwMkVRhIKA%XyXMyvlOk5X*U$ z<-E#rNP*?N%5q+1Ij^#uS6R-hEaz30^D4`Ezrru0=ZZ_u@8|&M2KDNcvLN;ClyV>q z>XZr~jp&q$A>G_5Rh+EZ->fBYzXUzgDLn`2K&SL7q(5~^Z$f&nQ~LPU>itVD5$pXE z#a4fR;rFMAU-%P1H)6hb`X^zOzx3aPc;ok95B^F2MDRQOH(HTE`^TW%qyACgAM;-cezU(AA^+4r1Z7tGF9CnQe<1i({ydafjymr}-h2Hy(5>+Q z5W4&P15j?cKO6i#{)@pk`un5YUC4KrzYpYP{=Sg!_FsfD4So;!rT*UFeg5yG3@m(i z6bpNmg?-Ax0cByIvT$IBzZB&=EgWd}kB6)*?A_`g3tm~+t1JvV+AQo<7WOF%2b6_< z%EE!o{;N=~)53vG{vycA!rt}%AA?sG_9_eex>(q&EbLPj4k!!zl!XIp{RJr7Y2m{Ax@DhvCRg<(gVg?-Ax zfyc?yrLu6~G4fuiEbP@5hWAQkVXv~VPg&TjEbLPj4s@}wPgywdGxBz+EF5@{yjLm< zd$on(y;51&t1OIpf`z@x!aikT*wJQTpR#b^KJs*_EF8FpyjLm(PuyAt}3kP;me2~h*UO&YLsVwYO7WQ>o*sCn;Qx*;=3;UFX1KTKuz>YQx z2bw58NM&K~qZA*cvanZK*w<-cud=XDSva69>{AvFY@`?>yI44|j^cw<7WS^8_#l;q zy~@JAP78aLg?-Axm?v1+rz{*;MKJ_+v{^W?g5rZz7WOWu_#l;qy~@JAP78aLg?-Ax z0cByIvT(phF+{?`zl>yIL}0{WSQv2_K8!dF3nLE0hY^PnB{&YlhY^PnB@l-ZsS$?} zB@l-Zff0vcVc5~KFd{JGFf5EX3?KF>3nLE0hY^PnB{&YlhY^PnB@l-ZsS$?}B@l-Z zff0vcVQ;8~5rGkhVPV8!_%PxyEQ~k|A4VKTl;AiFA4VKTlt3Itq{ckK!id9&z=*@J zFzjeq7!eq87#2nxh7bFcg%OA0!-&I(5*&x&!-&I(5{Scy)QH1~5{Scyz=*@JuosVE z@I2-Q;mOz@leoP&#?i7$oZFHsE@?>y#fyTL1aah4M~CCv{W4d0j&^jE))Obe-Li1M zJh#OuGFp0w^HD~;+tKkr9i(^J4WwDlhFF5ouc z5#UtR5{vR9ajG2$Y=+(;mLcV7aI2ts256$DL%;^$VPG%R_#!YyJdK=N(93;D`Ji(| ze$=|}$tDqluSkhO|7A;G5!(`@M!R~!ez^suh5_U7N5{=5aT)Ly;FYNBHed>J zIe;a=iNFTnWT0DYe!HL8|4s_1qoWBLvgblzA@DI^8E`Z30pJ$kX4LF}l?C!2L%+*_ z^PztTxBz(Ks9T&s?T>(`-sDy6mmc7!7*T^&7U}blUI=^?I1hLya2?PG-1j8fMBQQs z+NuS%7$WywH>jiIGt@H+STPm#0iQtr&A?_LdB8Lv*|rt=ehd63(24Zpz{Kqx9fL4C zxxj(IWx%h2!r#&HKVSo}vUrF6&V{^azkHH0ZXjgjyWyse4teK(+1S+4F&pxv%wD3PUk{Lc2|dU` zE{tf(4^e9+rQ&Jhe0Z)W{@{MO!*k1@Va1G&j`z{aIDK}NcL85RPxb*FGzyeCgdX-x zDi@nmb45e13{jHq0wEub4){9dLp^UJUqi2sjw>MdOGA0IC6N9i^qW&5!=qx6{wCz_ z1K$FU1pXa34R{nN+!^A)c`gv1h@$+y6x?|LK7jHsQGK|xFc|f}26U98-ejy)jIAf0 z3_9lSmvp4e6y%5JPB8T;iWjtr5FA5YE3^IOMstOt~H zAm2)0Ch!smtB7);S^S8!Y6@`{fw?F%rfl)$G4! zpm4NY1fK_=51L?;fBfqzx=L_hB@c&pLOO7R#y|b0YX2{D5vQcs1%HNgV6VpKp40g1 z!K(dkyavOY5u3#pJjpg3!NjJaS8DW4<)Qics}8Uguf-UB=k&7 zO?)VEU1HB3sXd1G_;HVkJxY5#)MH(b=X<=+<8M7$dh~Rqx+c1Aa6RN&=L)!f@A|9j zZ?2w6sY%0=ew=heQfboNNz0R7O!`yOUy_a_y_@u2QjB?tnP(0%mzsB(%gnpYd(3;y z73O{B{pKojt-0RZU~V?Im|M-Co7>DM%x2SX?l6C0{?dHP{Iz-1e9tUAXT&*ooU`DZ zhI4%92zQKofcp~nYwp+Go0GRBA2{#edHYiKr#z6lI(2jEmekl@j$YsI)u-3UUPZm8 z^{VLA&}(V0erXq_iS(HClJx7+8`5{Ai;S2IPsW8Aap%XMf9d%{&cEyYW#{iZfB*R+ zGbVFV=1rNIo(nuXJiqW1^t-&D$cf3B^21wxcy;cW+$VE)`uXUeZ{D_Ln`n+{E^Hpr>}$TOIdOZB?YY|rZeOoE6<=mF!mW-CnmP=Z4TMAk(Z#i=6l~XbJ@u3*?uL1kSQqXTfyFt#_ z7?A+V1q}qv0?h_BfR=(bgSLQD95JFNs04H!r~$MTB=DR+26P!HA9Q7Wj3@@d3q%a4 z5Htcb4^#tM2l^T41n7Stk$`+459mTr186B|GiVD)BqAMD2AT?b2(%8g9~1zI9!Lij zf<}PKKvO{vfL4Qq3+bROpe9h9I|jc`8zb%lEdw0^y#k6oH%2%>7lE=t<3Qs_@Z>N^@FsX0xZcPjhy2PIGSa;LWb}uGLtf zo6X&>)k%Bu_YB)pxTk1u@t!ezO7=|HTe`PwPsN@YduH#g+Ecq{@t%e~jeA$_S-ofd zo=tl;@7cPidC!j0q~@fuq=Bnn} z=Ecno&5g|~n^!llZ{F0rxp`}IbMuZFNxRIdqX8QBo%AR~B5Ief3*c9lmPs=;qNGS39rH80{SW^>wY+y?Nc?>-LOm9{2UQ)^T57 z-+KLxHx%EnaZ=-?f}65$dh5o+H)h=AylL;G=E?C+r}LYsty90QY^`iww&AwM+rFOJ zIx~HybLOI1GiKd5t9aJNI~wo!rn-KI!#CZ(CF&cm)^tid<)e^-2X<@S|_^S2lOuJm_h+e^2XZGU=u z)tj}@*KRL<#r29S#*8uXzK^-xwcXW$V|qu-6RLyf;m5Ym7n4PaNEAK943Qzyg(+?o z3E~2gDVB*z!YytR7lN)7mkC4k7GuQ~Vw|WHSz^5SzDN<@6CRN&hKQl!I&ri3kr*z1 zEDBL~wHSsMLT8EFM6p6Bf>VJPc?OHCRWImcDQFq~m5T}Bt`S9~ z6b0fA(G%zsy~On*Nn9?@6}PAq>tiCA2GHFCU%xI!i)muIxK@l5{U8kj^%0B2d@%~# zMdD6Tk1vqJU;2t25@8HDaMyAbudqlm=hsDlQgt#6Tt8 zCHjj2;&zcO^6>g!uE-Hn#U)sYQp5^}fN{J07cZQoi;a&HF8o5eiOyxiShtkjf(E8m zOvRw5iHf`md{g{%QF(r4W~Hz4{>ld`F%dIhz?m@PY&1AW%oSCetD35|R&A?luJTvy zsM=YztLmw$r>mZ+I#hMI>cy(ps@|(QRt2L~S5}L8hvprg_u{-a=e;%W@AHn%!}oyJ z46GScGq`4C%@sAT)x2Kwe$D@CzN-1UM$C84Pn^GdKE9Q2!LSARZnK4B7EW1s%R&rq zk*J$pcYoajbzAB_sQX7$lW5)jv_+T<@>{BaDCPVobuf0$1Muzy24~?SKEjHhm_Q z$KcMoN4#}Wipq>%wVyuE8w)f$%t={ZUK;^lL8AbTKw#hq&+9#x(pu^PrBu z$-g>PSlmFmHIoev%Pa31`2ASe$jk2qQb*Q1mNYiBO% znGH{-daRP8AWenaO@nSEYAII|eF+7%Ks9zPZEv}JN5IHKN-)Q)aydqAk~97N@LUW8k$mJOBn&{1n0LB{hzC53twxE$UU29-s(Hqcb526 z&BS!1-in&Ez3rp&B9}eQJ}#Yh8zM2yY^e8n(KcCaL1(Qc$ff-)+RW3OM4Nk^wg_HJ z{x=u%6Y75>G2iwyyAKw@DmAb%`Hc3H+32laZT7TVl@A5eMxmvdo&66TAK569CsIGJ zRB2>gnmO`zYWsFzXj(;B+EuU*|=u|xleLX3_F{TA$&m!6+PkrBS=l*P2cZUu{;sI+eVt4m~2j(!D0{r3gngYpYC0 zTIedKvf=CT3U~mGm@LpWl}2h$rC!a2=a+Z3YxRrDlGVvOtv=bKT-Q{4q>H}Vsn12K zO|pNa$QpgcQ&}2c4a!qlZK+wRpL%|yM+7QMsdH3Gy+4w_SHtgS0lTJBJP4*%#&cHNgs@Wb7!y5mN2DL-f^7HD7~1hOQ$zn^^0JQpr1};h&xb`<~P_)!r_xx6o)|MFeU$ zdQ8x%(V~J*tx~Fy#2^~{S>pEc}B-*(tC!G?b z=ePp3Qr&ch)T>FaB(g2Vaq_arIV^9YQ+W6~w?_#YN%t$+%2BPnDcWl5ezj8_-LF^5 zafPxzt!T2AHS57^(`Y&7!HW9ol~$GgjC?(IqLH{e6ZA~l*XDCHq*JfnVM13 zZxkPcyFsKJp;jM{QPCX5%Sw1W#KOrS%;Q8tr(DXaLF;BM;3x zosaCXGg9QBaa)mt>bM@IW`X7+;!)(Ia|Z3R`s$6M=jqlh)e>n3o{E|%B9ITzNqR(x zY^|A4%hLMpZuL@IWM>`4JebYko?^Fdd|ZYR+OX|OuiB75tPSTiNP}^*-P(qw_(n7p6*wgm8TB2*4G}^u6%{f zH}s0_n#b-xv~x^{-*~XzXm_VQlYA(2PD_-Q+M-lz-f6$5doFa1Ln~YFK=UzbiXA%E zh4v?Mp3wfBZvE5PPq)4)58ZR@ZguKB-LF2KhgK8SMdP=|6>1-{9o-<`+764o_$ zv^>G<5$bbrj~=1+k>J|UahUEzW~0{76;IK?zTz)NuG6n)8r|tvbZ9PX?#Ckn=@SuM zag&|xby>M6PKD>9dt-FJ&GLHkHadOM)tm=A*>uE9Iwf??MdyE=iy|fEI(;0W-iJnj zNUNK2(H=^tBf5SG`Z%4mD2CJQQ!d&AyI)b1>-1~No@)|DL#>ZbYE zS65`QY2v@i7IW1(iB=z#?rw!ri?se|zVy{yof=tqcKkG={EspeYv9{95-BX_q~-wKNs^XjbTM6`ejUfAruX9a*SGdHrlv-xz3WRW53e zW-jub_3rXjq7>Pj&Xv|`>24j+IHGwkoeu5(8`+ye{p3u2fbvE10%|kd5A4yK`k?Pb zSUW})djdu9a8C%<7VZmlB}V&d(85=vW~z()bqs7s>xR6mYtC7=ochG6bDl}0qh3=? zj6T!B8Kj*030o2RWu3xlPH1Lp(L0K1bXSO?OXQpsO=x%Rn$sQ)sZLt8k?Rc4IWIz; zk>=8xNxGT{KBc59$VGhO@u+)@R)nV6vbSYFUsEZXk#hW_s7|vKn)giSiL5#Sbv002bxr-XV%OEmA`~g~^8|_|+GD!r zrTfTq?GT$@YAJ9v$DIv=8*SWnBTy!JBd>YPq2bk8if zA4SR?eqyv=Uw5sW?p%>?1nUm^(kNwTdi8_)LFX5`A8$!COZLb|F;YJ<(Ge^>uiYol z#;4EJqiEJ?f26ku^xE-;s?=!pDxHsr5qZa@ky~D= z@8NZS+9e+f&mTPZp1Eg5_7;j8bdQNn2(&9usAr+0|19zgyZoCaco+0G zifgpK=>UhF0yuBT$2mWLBJ}D=&JA ztV;~WyK?7wsO%6f5$TF7x{pr9C`RJUNRgQC)=@;zQJvZdUhnC9)nwW3O9Zd|LZ5O+ z^1SGt8p$`hpKB^X5k2&Io1TAdt9)2!P?)W{mLN;fZba6NTtc7R^_AHqWi9Ky|@Do(Hx6>6*_uf7UIp{tay~4Oq*@n(#MX1|; zTGi_#Uyb8zN(}9$gnd6FtDU}$$R%_ek>Wz|97IoN!z05L>iUhY>a3?6==3`qYms)^;7$@fMn;Z!6pzkqPOk`=)2?q{kX2|0vF23UP5b9%%5GiDSZ{1Z zFH@rY46o|K7ig^dF0kF-$lHQ3hQ>p8N$268wG##Jnp*7)MbxySpI)EgWhg#dCvY8` zx|SJ_mg(xkYNrSsd1bY-fgX8qpVaXzybM|FbY;#qqLB?Ip&t~*tkZl@wrp^j%?5)w z;)Ir=`;xkj?#e`pg!Y)DukOw+PT9-oNY(WowdM2HIVSuHgjOo8Ou9DHS2R;?QqWKH zu)?jgj9%X(FeCbIoGy1YKgA$>1T8_OXeTAV&~0^nSB>^<+NpJ^eC*Vg-(80N_smKS zMJek%kl%UQ>e?1vxt)Dmp`{|V6+NozS&9~myT(k?3t*58u^0 zY4DvoZAU9ckr!*nGX{HWLEA@<+1ALca%UQ~!^@pXEDb%?(mj!`_w>k%qsL&fN%V48A&nvx z%>a4TH2C4w@Bw-w#frnUe~~@O&uD+5_9B&|yQ`-!7aASyan73Dt2WqP z*L6$xJ-T~`FgSx&Ou7_jq3&0NZZGt9-(}S}@=({CW$swKhF6nN7USFXlDbCTeJ~|WHS4!8C(R(|CuQIGwsh7IHLppak zy8o%)g`>Z-qF&P(l&ntnrF+oUwJMd>=O}&MIYQk#?OOKsGbl@c?-KskF!a|Z^VR-J zUT3vScOtEwL|?Z>Doby>o=Mqg>y5lYKP&%#v*PUQ#@bc7`hU=igV&BaV%t~1Sj-T; z^+WSy?Yq?95tt!*qC-AnU6a!t4f~rW(S4)%w7wDU%i$gwTtQuZGW?`QW1u(qf_iIy zhj#j;wbKOi=ru%(|q|vqKp%E--wX=(V;XOaIaa(PNmp-#` zM=u>d?ygV5PJdD=#W`lAvf6hoT@Cal-wS8u#b=#5O$fPH_6u+k-u369BtScG& zDv4a0&eCU6nj+D6+dXLC8q577f2F-eN92(qZ+2R1jIL_+PHo-4j9fbOz0l~T?R!`F z^N?|>C;A>p*ZWYk#=0v_qp|LwL@piaY9|;|vvD;`<>@UidO{I=PCt*&a&#Ke_M-1o zpp#%Qre?#Yp`|Tf(xuPjy-#g5Iy=(cU;9pU`rR`aTh4U<3_Z;RXDoaNwVryCZ_+tZ z|NVqMQ3iJetGs{5jNh&Kf>RMLQ?f%~* zr#1dau~Xj@rTY=|wAb<++Cl01V;r>M&u<5J?s(Rj zLMHy=BWLMW{FYjuzQe@9lbCqSay9gzj~nu8v4oE><6`c?rJ`plc@U9*mAO zk!rDe5jrzLAIXQ8Sm(ntpWoB>rTf{T_Vv#5-R39w9$?oQ3f}jyJT}@41>cnEI!9+- zi)Gw_|q4C#-}SL{VXe5#0|YmsINCdpC#*k>$}tx zehSv_bXDN)tp1xTeZ>*^&XRRMnj$jwD!eZJ_D*m^+_|_ z?sjYGa%XP&vmc|qXW^ra=It~KmGD&h1{Xa8-FvFOB8XNS%|mEyLAyor*6&`MeXK$6 zx2{*tWF1+%L!|KrcYXa7ty|Aw?f~;ZP|S$1EK$ z#d>iP`n9nKHcIiHeB-1PAIg8zXUrY{kYaG`?9Zf#iTQAi6xlIbZkHlI*65I;A?A^n zq-c$4d>TLW5Hla2!(v<8qP-Rf}s7xl|6Xsf~TE9f_ggj%#N zjy;Gv<>woum=LocHMhzyQFeXoumXwiLm!D&_R9%(;Aa-(QRG<`v)~|v*RD=+sc^ve@CBV|MHa-X^wkNpttgie@ihrX558RoRFRm zrD%@5<)2a5j)X`vY4HyXRv%0^)!l+=<|u#H;`Hsd%@-Cv-knVTOk%eUlUt~ zxxn8cp#L%A8~oB_actE`QmmHyF^V1XhIA>$I_|g{wK*>S0-rIjK%WwG4f>NG^Zqqb z)XMm^u#dP0wXKc$%|%jpVg|r&nT|ooGbXkMJv3jxvFHB?ekhaB$}-30=ubmzIYzWQ#+QK>ZXPscv{4Xi5vhR^?xy*H23tElq-t4S|JL^cswltw`oi6kr% zmH@q_)9E$cofU+1LO@I)7y=j+qT@IYDk84q0-}zif(SY~>bQ;DD2k(wI*y|bgNP6? zpn{?x^838+=bqHP&(j_M`ThA#UZ?MU>eO=T)TvXaPAzw+WiMgB*3v1?{4DLYRXpEi z>zSfz)_adsP16QZvZ3YUqH}WA)enl2S+^*B*I7SOxi8-3ohtF0>FuKP;?~YRRmWL> z7KInLe2coIe~=_>Zs`*r?wGavHs!y|sjA(ET|TT-uiWJ)l7T;`534S3*yS!!b!h7= zf2$H_-Ky4kBweBw`S;d;*j@Tz)|I~ze`dW|e^<{s;&J8H^1qUq@3qWPo*n7KDt&Y7 zeD(L2wft1_aL_J4d5);spUk zp{I$4SvR-ulK$zUoAmxj>vrXEbn6kKC$&AUTA$N)ic-C4*4rf;7wp8BWTRAaD*|LKnM?UnajFZm{H>-OiWXYh9M11rlEx7~eP zne$`s`WLk-*bi*`8`00(XI}c$cl)jN&)0}&g#FLm*Gd9;d&eKT|Kzt1ZXYajKIq|# z)M{W~`rOx^?6-9CttF+mEt)*0m;Gl+ z%T?`NYIoA!u-97-^xKIYKbAxgw(XuL%5uN)#8zo2!k&Kj-eqYmf4RO4yM5o=_civ9 z_w0V3-=6%#TS^YS^?}cn9N+fndi5l7x$%+x)#G^U_}%f6Io`hfi{rTJD z;FpK}%5N8M8!B7o(rru1x5KaaLs`q$KJ&oC9q;&G%_%AP)JdZy@9*9APi2bnUo9xH zPdnw9uZBzPieFBZ^j-10kCyc~ zQQ6AciZ{@;kViMKUnhM-M&(D??gO<}*e5|bb(z`!e^6$d? zo-geQcI%4omDoG>zoX3MODld?hFx~*!7Cl_lPB-7%y0jB@-gMxf^7>*x!?AeZDnZ} zKXGx{r$@Gpl-SWD&Og;@fAyQ6l&$sPTdynYd&ScZKfu_Z{OZb*FArVy-#0kyn)^;I zDP8f5|0=1!Xj;B94T54`ljGTzpe-z}+M{;h+`-uT!r9xF9Ny64f7(rZ`lQ_}a*KVMpM z_pR6eyyV&!?i()oa`oL$3tji{f0lak;_JUv##{93-bQt||TbeXlIj{_F93 zta8{<4{j~7i+|ZuQgHC9FO(F#f5Ahg9PIbtyUV_C&29&jW6FkKFVF}@D;#ytargSI z_4g+{=C|$lU00Siy6Vm{zef*fJJQ&(2X8I&d(*Gimbtw9Gv6&~Ic=|JALw{ryZ@6V z@9#M7btgIOx+CYG=C@0a{NDwB`_!XjWx20Da(fx}cYAFpbGhz!kCeLPsv9~#>lD9x z?3bmy?EZLq!eO@``Q|d`NALglvfTY2`0w)V+B0`8d;I)+y36{$_ss8H<+S(z`aNYm zZhi2pW!)Cuv!smotNSl2u{R$0aLI%3o_X9>r+w9~uiDjbPuu>LGTy?^Zv39ZZvNiQ z<=bti9ekF<-gnyjN=gqNJ*uSYpMQ^)LwmgQ8CW{Jz3cb0WFhdj>esDh&Ko}a>N3Bl zz4wD9H{Sl+FUdwB-g#U9e1qR^`NbWjbbjbJlV$(?{BK@TzV$qQP|3Bc?tNDD__Ib! z`hN7_k4qjLJaq7o^Sj~cmpspJyF5+*i_*URhnM}yZ{PpTN6Vb=d+>oW?YR$swye?G z-@UbL!9V}z*(If4`R!NA6hpszMTz~{1K%#?{*T+fRr2M(e)rTemqQMxs`{A;TJsx^`sb606$K%SJKXCVC+4KIg*EdQD>)hU1Vz)d# zS@Pv6r*AE}apE7(e%z()_lNamd;I11OUk#t_P+L;Zj!~9-kQ?tbM|go&HKO2N~<5* z-S7XWk751K;eLPH{b}{DC;a|3#rfHpe*dA~cUkB6H?*eJ2b|^iJr#b@xqja)L-unE z{Qe%rIq^KduTcIcY*Tub`wE3$UZ#Dq(#~7!I2Y^vQ)T$i^uBIQnUCIoScbn$Y2RMH zpP}$CO*zirs$P5j+WC*EtTj*g{Vc`*NSV(As_UnhI{ui#KU32DCdGgIEQg<}_r)ch z|Hylp&wRz-y4rDGrm_x?vY??1*N3-OKky>QxlQ4V&i4D!3O}dJ^Tm2Uwk+%K#j9J( z_y1O&dp>HK|4;9`|H1DcR-C7l;a^kuTb|-Pk5K;Sly(0{#aU3&^G)UdZ>^5gdTUz! zwUP#P$JOUP$KgLzoU2QECfmfH*$)4^lUr7AEa|^l?{AE{DDB>VHa+*L+@Js6?`Mc7 zCzW(ARX$(%qr;!B@Gq2Y`aQ+pUh@CfdjDi84uXzgYr8Ogwe1^i-){SE+aVo?b^M_1rRm3Q zyQMwae%iKA+nsHfrXxGH=tDGjx82+JK--*-c^&(;ozU_6)@xf|rSAw`olfd_sO{ml zN8286d$Mhhw4kG_qp#zdbYR=8_Ulqd``gkx(?03owt3B!$^=WCxe(8N_ zWyc58ZtZ)te zV0v!**VFCk@b-h#g&p5X$F-f<_Wg89+mF)eZO?B%ru`@Bxb_p>*KtD2`u6p08{1B5SN)v~VTwQU!) zyuR(V?bo)wrR~C&m$qEm^7{5`+kepdF)OB>E8Aac6_Acf%aQE zKGgP5`{S(-w|~6j(e_VuJl_7nmM2?3(()vqsch@$_-w}&N2WLFJ3FtuUT~$}UnzLC z;O_)CD(q@KKcMG72|gltgMNQh&ujI3v*2xle-OM|aD(7|f`1g;syLqzd`j>k{k}sHw51j z{EvSBT=0K_y9M7-*st{5Ciu1BA;IqizZd*b@VMYFf|jG?Did@Fo+8*?u%}=j!7~K= z3l0)|Px&3J=MVIJj-H1Jju1Rw@B+a+!SRCs68=OzPZlf?{6xQhCOAXyJ%WXT0l|>q zPKA%^IWAZ#SRpu5aJFDdaIWBd!Ak@e3N9A>LTN71^D@B}!7Bt?1%D%Wjo|MEuNS;g zaGl_-f_DhsCAeO2qu>LAe-eB|@KM37f=>uOCHRcsbAm4lzAX5f;2VN(3BDuvp5PwQ z@B=;nOYjrH&jfc0ej&I=a37#J59s-z;J1QD1dj?H6FebMmwwYMLAzkK;HiQ=1bYki z6+BaLpy1hp2b9+#dLAk`TyT_Nj$p3fIKhL$zfjMU1g8pqtKX;V*)8Z3Jfh!^3Kr>o zP%t7`BA65`7pxMzNU&P)nBuL~^E|-?f(?R=f=z-;1uql4TyT}(Rf4}2yjJi!!8L*> zl>SY6zD1x9%)RpMdcITe9>IGB?-zVfFiW@(>v^-_V}f@5o-O#e-aje$wBTO_Ul9D8 z;H!eC3crWo-}QdG;10oe1^+47Tj4*_^S=c@75uN@F2OGa_X_S8Y!~dSc)!u}VZk2+ z&(!Y&1%J}}p9N0}b~##nS6G{#y9#y_JWX(j!VVQ2E;vdsN3fT|pDviI_x zdT#~4Y*owZ6@|TJ{99x*ja1_Q{KS^kKa{Ny^sLtSeswX%JN~t@E#5ep@vlFmW%ZXT z`Cl$O;d#n4(!W{dJzOboo@|gOEAd||TVk@XEu8ugAeen%>KxH?cReTcTp`#??=RAGUp@C1JWH@fzYo##d_6Y^UMjdu z@N&T`1&0au8aCSKcM5J0d_eGF!7YLl6z3Cqep>K(!IuU9E;vcy z-`4Ycf(3f-67&gvq~8O24hxnD{zt#>6#P=KO|Vp959;}_;E#eQ1iQ>hV;zF03ic8_ zLvWy=Q*fBzD8Vs;;{_)PP80M9772z0dOxmEDD zf~y5n3VWlTZxQ^1;CjLP1s@W8RPb@ZzX(1j_&34V1>X{USMWo@PXzxfxLa_aV7uUV zf=2~^7PPz|jkODQ6YMG2S8#yfV8Nk+BLy!I94DABSRm*Y^b3XrO9aaVX9`ve)(KuB z*eKX6*dn+}@M^)|3$78oS?~_Qdj#(j{FC5j!EJ(13D&93|ElMg1YZ-}F8B|@4+Q@$ z__^R0f_nwO7W`K52f^b4eQI{BP4E=K9)hO}_7^-`@La(Wf;oa?1t$tFP+6zy*(F#g zxKO_b^&Ar{6}(ixSLu0<;9S84f{O%~2wo<*QgEr_{EePl^n9(JZxCE3c)Q@;f*S=N z6x<}ZQgLq8^OJ(l3ce`#s^FV~?+E@=@MFQN6z^wx-X-{z-~qvJ1iu%&M!3iHd{WRl zS8}4?*9d0o{b_=I1kV&aOYj`Q;ezXgKU&Xuf)@%-5u73D6D$^t3MK_B1!oK1rub|1 ze6ip{!6v~w6?VCvuMoUSaJ_#2ou023yif0M((`SCcM0Ar_(#D<1RoQ8Q237s{#oyz z5qv@L6~Q+IcL=^O_%FdNit|%F|4(p_;C{hFf=2{@5`0|vPYFIN_=4ceg1;zy*1R;f ztKjSUy}O>b>$$g{`w3d*KfAf@-&%eu+i!6H)cGCZ4pR6J7qqOtsr>iXzBj8ZI{8ZR zE^@|w_yY$0OtS?1=6ka}mu}j$?xM99th*$2E!EZR<3p*Zt2gzGtW14N$5VgzSXwmL zn+Ap^(!j`gT0FKg4UR8Q!z)J8$g18nxx6%%UZ z+O%oo<*945D|L-er0%Za)ZMMpdM8u&u%1fYJ=&eRl~ecfvDCeCJasGgo}sbSGb$MG zNj*yey{{Tfy@LXU_w@@V#?r#Yy=md#SnBT^O8ose)oF5kWtvpj(ym2m>B^;PS>M96s%t#0 z8eU%I=w(xzE||J#a|CT!deH@&$EG%KUbpEY9k<>5;&q$SvUQs-xnQHN5p)x8nYegr z?FAR%UUaTf8NFuRc^fya z+mSY2hNmu0T|Mc%O&j&uwR6+vjj5|Ibq%P!Q`eHzHJQ4Wr>+&LYgOv*OWg}ocYo?$ zl)48}_u|y8?}kenMkD~Kdx->4QjoeO7fVz3GD(AkL9!sBOg$2S{?xN5_2|=4gA$I^ zGb}-sgrpwH#nRLx4y{N%DS84I6`bZk=ON0Fqu{1a!AxndZm?TUBCizN3J!xnl4K0;yrJB_WpRa(}Smi4D)15yNO z+0wLpBCQxqEBn&QNeORSCGlOJR;d+BQ5;^kc`9}Fj-{@JBdKd>D0QI)76}HVHx>zo z7ODvsb}b#6R6DBYE)mPe#b@=%#iQ!2(mO-y(L?IF!~F}>@c5|eubw6iGNJq?MkhqL zD3@lLlunymH6gNBh}r>>J0TjEi9CAMph)YLyb4D8C8&Z`5=Qmx?n%j3uV`5&S&}yD z8`r0{CM7D1dIS@xUo`iROh_iw)O{0b@rg7vq1KaT81B_mdUIGkdU%;M#&T(oRl@?c zM_0GTFg^PR)i9!YbR=r%Uqv}`V(zep7-Q((zO9$1- zbhuf(>ydWskv8h>9TxwG)oIj62IwTxs7usGq_z5&>nSb0NbduEW9kRen3K|;($GUo z(U_{Q#)4tB;jr3kcv3uAAy|dTN^*xJqC=}RcK4-mwfXp{+N)RXHZYkcq}eCN#RF;0 ziDeSR#geBCr|4VO*RAoUU$8W-=%CvPN>q0%b+@FlTRHSB>Jvx<4e2?e)*4-!`g$e=%QQww{Y;=_2E{G3#bS-3 z(hic^;U00RSN(rboqiddS|;fj5U8dakCu&$q!ntV6%(q-(k@XxETBV;r^5~#o6_jL zSub5f16>p8oO8}eYo|7-XHMzkKkLq$x^%5SGF=AHLSnf+`zr#{rcNo zgfG;tQ?OSQe|K*o{>6H~B6aJ%H?7e-Ut!~`88SptU-7rQ%%`UaC;y=$pKjd=K32ri zuvg;;1Qi|nz zs*#HDE~O^CTj_`=aWBfJw&XLUGgMB`w@Ikm@*;dfB|*o8(oYoe#>;rp|3$czS@G0J zpy#TR?jD7j?xkgVb+RI!6nXJfr_ys$wI{v0dim@x_@OS9KB#bwR%wNvgQA%7rF)BK zkK!My-_#R2)ZL2w7AtqstrGp@+pqe<`{5!c`Arn*D24pS6$0P86d(FD_!WGX5mwNl z(Y45ze2CvK3YO?OtTSxzg?wp0nFM7$HB9PvkHUF&3kx0H%9V0@R37!0x-aljYel#W zyyEwSav}bt+THaXE#fazx@8L2xLV*f02SrRz$%|^e_D(B$_OmdQBT@ok)H5-k?_z3 z7WvSKR^+E4Lpj06t^z-#zpkGKC521P7vbutMYuY7@zjt}(rYn{1)Exg;y_3SP48&D|x7*I=tAJ8v;FD}z9 zRy@K7OSzLGEy{yygllLl;`5a)>Q8U>)8$Ex7x5>BSt-1xDnrQMPDZav9wpbV#e;Awa3Sxqg9cy4d< zL4ITf7wLLRz97BUALN8Sa{tkQqMZ1>tf&`S#Q9mD45)m550!iyQasBwlIZ@6{)7+E zgMOf0cp_gi9m^-0#`S@J-J*;7$p9B6@NJ;LYl2kp9ezb0 zWj+`2h)w;5RTBB42dO7m@<9*74{GIn`9=!)TaIP>7xYc)FLa{?+`gj)UC1GHQa=1e zPN)yDov-^B>Ap+{(I}<^ddY?Q_N)Jr&$u}0 zdRgCbPXhH>q1-8taSVFV|D;2H+;23+DdNe1E8;CLextYG+d`cY`GB6(it>>I`2HQ) z2AhiTp5ixJ=_8%cHCp7OIaoUVX&$#|M}CujnYaNz;2ZT~95EmJ^+x`hrt3-h)Qk28 zPkWFL<)9CE+I~Rug4gU$Puhicg73sY-QG)!{!TuO8_-4g0j*DOJycK1 zgKzX+!qFQ%87FCH_&~Wb{fltw1D%ZH#ACci@A2(l=%D`*t~p%6AMn@#jPJzLv_~mv zAM05er$zih*=jE?@N%K(No(?()*@f@3*n@rohZlgN6YxutA`epAt${>z0s$KDn70F z0zD5cY6SnR53vtE)hWw!WUmb^XY<7u+Zmc_DPJh%X_{7u3jU|GTPMBM{e?RoHx}`b zG|J-l#==_MxAoZ8Gg?n;r5>E@C7wq*;@#1{sC}M**5WQ7=sRj{%c{X8`<6v zpIY7{qvi4o=Pv){#HY_m>FmufTVm|ln;%&5qYeM@rj$;9`yFR4-*D<#$U3)Oa(xy&A&^eZe4fa zg?o+;mV9~R)}AH1K6%Lcd)Cc<65hP(J&(L-zjKyvr7pLvJ9znVue@x@9oOByCZ(5) zhAUI2p7ZoXqnR5%X`RxkXHoN?ZT|k216DrrBH|N|_@qne;F4qWTNj9PDy!l5v1-qG zf@5`;-wSkC0J4Sk!FLpb9}#lG4mk;2XBis}aDiI0Q>{Ct*1e>b&t>A>R0Hk)vXCZr zk}7|V`?2NUzm6U=s9f?**%6X&x(y1eEw+OT*99MFe@>>FcFt2jVaFC&?&8VujxD)4zZT|P;BMq+ zesh0mrXzo$B!>m3;i&s~{R{AoVe1vIdXKd6kv89%L%eadneQ(fC|c;ETG(jvy-)NN zO9CfS&9fvuK%4ptED;uUGp{)DU#%}v#(m<|Fl26C1OF_C^vcNZSmi`K`fXzvymuXQ z-PS5B*wJJV6K`)ALeJvh5sE);M} zS~U!sxeKB(Y<>d|Tn~5v&0Q)v_(*$1Tjutww`K4-*Ui0-y77fxGy|uSxozOWA`ETL z*O9m#XoKE}7hz}+ZlQCSoMVdDqd0uWh>?wZFSy&3-+a$7%Ve+g-CXIDlhtFmtML-? zm|N1gRfRs|F9p?U@!c!jm6zp;_`U)85}hgKwxy&SE78848V~vIJrb65y7am7qdZst z=Zep0@RYuxl8MKuZDP%9$zfY6VF!y+#*E`z=eMqC?P)z#G@m|A*a2$qBZ@XZW_H)? zcD<)`%45BoT8JcHiFb-}}K}D%Riv8^76HVOJcm(@G_62KU{z0c=vf|wOyb5{&m;9mT_b1Z#SIf zbYES5>$;oIK0xElN8dU5rW?m^)u^ly_qrQK?vPGx=)=iBMeppH;#0c8jiTb!a*H(evB!$B`}XG^f1yPms#H} zQG9=Gk~s)p@4TcaFViro7;u5U184jd`sl6P2|#bb=1N68#ym7l=o^RfJxJeOx4F12 zKR8Jb=3e#SWQ;r2(LMA*)@xHLp*fVVn%4WUZ=YUQ)Hsi?nGd-}odp-DXYSomN0%03 zWQ4jj-y!CH&nUsy0qLhVHpyB_2hBch_ECc9UHwJhT2@FOnzt%_P-0F#QQ>5>e$S&} z<__GSjytw`X{l;lbYWw@>m}bgG_>5@LeE9q2t8RkB;r=JI5c=Pfh$NV`j}A579(a= zb{0$exs~K1jRhf}9=)1n2g{jI?)imNyxUf$uV9}#Cu%%Y@D=%uo86!xhw=@rO`>J0 z4Bag4OKf_-M+I(u<5!hySV*=C2oIf3&&qPvE9-oL^li1jtyErNO++oNF-$RWeZQJ( z!fiRU5Ps@r9fkbz1qH13$c;H8apyGXvyk6tH@9YEs9Td+d2?yL`7S7HbxK(Cin?UNn1OX|cLpaO2(w?S0hV zH}Cy6*#&>td$+IN^US4c4LCmbz>hZUwmjxNT5^~494Y?V%0h0eGZ=Ac zjWueGkhZmIy^uA&>+bu!xDAeR&#mY08F-|vY7crLR!bGj$s_gqa<{~18PS2rTR}USUs73ZtwM1PdX*nlx6Me`?2UB z+(c+f=_AjPHF`!N%X1~8r%0BObm|+niM1QI5N}X?`0O?c>KRL749Z%XaT_{w-8&1O ztkLL3_}~ofJ0vXrAh<}4(JB`!KH(mV{N``#5N_SUw?7#-oYvv!pJ9bChxT`Q>tn>i zf`)UYBkJK{qd=!^Kih`fW93;zo|$+Y%(Ii}>{;@Gd*-_Bl?{d5Apg_LCsJpbsgF?A z@Z2*}r4M1bVpm+7EuPu<@ zkp9)F_Xs~j@AFz$7UBCyuZNX7R~~?4^y}E!n$hdI&+Hc#A?W;l^>&oP(KDCGs<-?P z74=15(NFX2xm$Je?3r(ztWizYib||oEF5NB*3TZO7ZiI-#t6zxoRQjx}e99v6F8hV|wwfx*T;oy zbHUN9AEvXhk!NlOr?%y&W$cs>&nl=a4R z`XBy>tsk_+_!!|~VKOs-pZGC6E2;CJ5kIsxdWN2Xp2@OpEf)QYUR90nujLV+esQ7r zK!1yp7)Rg<^+FdQp`KL--OL-|Y0Mw;_+m{!pM;;}0!`#(o7~<{+jZofM=$7S*6V)c z5i#az9!G-D9!1DMhg;)fC7|bX_%@Z{_&GdlZsJEi)j2MD6#o(ZX*#=(aI_2*(K3{W zSJDyyEn$_S6O-~nPnrwW_G%1|c8Q*behY~wfBG)1MX7wF;8N*Onu3wF$by0rd;Z!_jmCu_9h zH>*8ov@&PfUolP$86KSA*$`~=0%Gc)JJ+>U(s3!T*LpyJ64j_~Q}>7Rj~ z2&dejlX8#N9B*-Zzvg+zX`XkC=6U?qTC-L?7wVRQPQ_T{Dwq#`%gpd-n5+e5&zTZ#bc_HV!Rv>Yjac zVTY{L{P9GAJm`XD#k`W)#A9+#Bs-7jpu6})_Io$UUpZ@mS*Bmpt@s+zy9=>wJlHHcyf9+|TmTQ1H zucF-T6sJ+M^x{0$mLY({HF_^M`_64lfj ztC%kr)N`xPQhSv{*k6pF%$2VYs0UUsw4B?l-iFn&iLoZeCMeibdSISlCrZLu*^d;vK-ZK<&62 z9ZQy32)rgIWFc0!+)}o2>()pWQ}q}iA*_*P3i6CD=V00x8Qd50T)Ri5+m~W1tSZa) zf=BxdsT63&PGS!PV~*2+!Kapa!*6PeyfIGkwW!9~xaZ}_U^NaaC-99Hp@*8&TZ-K3 zm}muhaF$VK9;_4Lxu#8#D(n^H`o%?V^sFgiuvO^+hULICP@z4KU#?GTqqO;B4{W&2e~@0(vHrXH2!GmVNpIdWT=+ zg&h-~Eo&EgEK*K6=z?mEY-vpi6Lawkingw{++G_0kCQ&|*pHVMeQ>Pw!9EJ>FYScm z^**%UdTA~9M&|jWg|whe(Y}N;^I|MSrs#>-x^S4^jbr1SVyuMARm~T25SlOR ztvNM~#;6H3jBnOEVaa*#GMdMe9720$4hW0@YpqlZJI=W|vElOW7 zhB6v^aIf+}Hw0y90NeL@#9@^m-QeC%Zqb*ja}-lh)$#Of#xGNlG3a6DGC_6543?pk zAjAjV9~0ckwf zgKvR@wmkkIJyk7M$Kc`Ft~mp=fq~cP|nub;#*_0I|l0TATbwZ8ju=H9?S4_&}ZO1n3zXb{ZZJKjN2ZC zDc3VeY+z%WM|5M5OZOg1WCtR0Pa3RF%XxkLLGNr(s^E?FHSJR$(QOOtY^zxsmZ9jdsMr}n`F_s+k3FVBac4&cSO#x=pv~%M+CNvUy)EXH+2k%1O#>5>o zG2YV7LPzsvtA>6X`Yq4jv3J0{M0r_u0%r_3mlEOlJEr&F(Wc|2-tmHXZik&{N}H{X6@`2=X8>m(Ev+(>M~-sPw4UF=y|C2Kob&S)#A$)20AX`{8X#bt~&ws{mfq;B03FZ}MAQ=J8O^Zc}m$-cNLQC-C_w&OoX z&(|?QKIf}U_r>*Tn<&h4CPvliXVo5ctL?eIs8v|r>&te_yb4TiAKPeX%RGjWBkL|z z%bRiEHX2d@rBF>@_dL(NK93muo_@p#9mtq%tBl+jOJZ~(E#tHEpd4d@+n(u=zcE$c zC@nzCfUy^a+K_@gyv_y&En@2)n}YJ4#Zz1l<$E+VaRu(q3Ze3aO! zy$a-Xe$n3O>x_y1A9LDf4Avqw&6ubeB^oo+h>_PvX}9W#aj{kry>erE)T+(Zd9U zX2Q@L@sQv_3`xxU2aNGpkDjPvXj7yf8t56WA8WUHO&8vHO&6&OuP1X1+5qk1nVv1y zs&#F8*dN7P%(!W9{{|EN5uTYEdZ1_G)a9;%2k7wdp)f}W16}JC*BEHqRWo0_>e*+v zLUZ&5nxpSq`1(&1mRT}0>v{UC+lp0EZ~oQ-#GxziF%Ileq$u@}xd zf7jQsqQWXl{)+Z=7=Ird%!l8w_Uvk!?qYvlGltWIN2;H0y?Xm4D>wac{n;xfSM2&^ zl*k&6_kx9guycoBb~-!W7TA>X829pg;MQjffhVR=v3x_o^5#b#kj}= zn-(vwb8p0XZw*#5@yRo%n=JI8=a{7HE9l#-ztGyLS?84I1@^|&{p|L4Qv*i1*vSVM zJ!^z&P7E~S^8P={tAFFOYX>*MF;6G|jRmivI-kGr93DJnFze1c35~EHrqurOP1lp6iZ0y%$ zUIHz)P-C4Bylvts3Hc1$ zAkT-r;>XyFg~|BMx)^h=b;{FL4I?V$!-d=*x)cZ7&UOqE6Z0%&zBvM1Q>9xGpzSM{+rmNzI4GLu9u8gU`lNcEf@QcbTy2B*^Jb|DqC(t6fD#$m-U z*XYq-_?h)Ybw^a}9L>8;X*pf4roTuZdpTpyj{c&>8!cq)DfGrndJv6asVBecuSQP< z_$(9Q#SM=`cof+cQk`>Pts#xBapTGvJr?3SMx3p2aP%?v-}+pQIl0G`@bi)%eUJRy z-#u@q#!;ToN8hI z#P08qq%6BtoFysrn@(QHT0BMeblz{2tDU?Ah{zXM2sT zPpyotl6M|<6?)KiC7SLCjfk9PK2qtrls_|PCxEW((b#F!<8=)27c(2Nf zl{Cgpe&zF|A&1C(qtyb=(hLs0W=()btNNj|tFAFpUbU_nN8g0X>R45krOpOfs^g$N%UQM`qBmqeaN{~;RpuLUbz1Vu zCan?)*(G#alb`l#Xd~R zt7`p5pH9}7NH(-nDlI{}&_te9#2#O-d$Km-@sAd?_S#nP?A&7A#5n5-L|<~(>Un%uF>2V?ki}?zu7kw^5;HX#ldkTJJyQ= zH{Ey}tEah*^0*1d;2WpOXm_NJKAz`X@RwYxGb?ON^FCTV^B$aU(xB~~GV{#yF?a-q z5NG8lvC(gbg^-JGRTiCj^c4v!2F< zu7PWe6V{j+=Y6Q;Sd}Go6t)ei{BG~dR8fcNarE0rM-Or>A_SaQKfNZ647v`;ggNgt zjdrU!3vW6F=soW!pifsl0hu%FB;Cz8m*~|`^i5byBYLAX%$d5spl*jJwIcD%3)hdn zgO+N>!BeCjd(h*A_XO5wLseYWwjtjtu4>zCQLf-(-j9zSSu|bXT$ky6WEsa?m=TlN}N|%2E*;j9-)&`it?wx(%sDpHYf^yKs!wMY3$8)NydkxT#7ydp#IAXTs64 z#vx1AH0YSf?_9|PD7sITuWM)s<%`spGPb z1zqPpc9;0YU0H6g&}evuW6wwUTi_TyJAO|o-RhnAUv`zJ#HYo=%bwR}_mq#txcRN4 zt+6_KYOw~JPm?vLJ3xMWJTNE8J5$}O?HfJfv>EB@C(fQ#(BhTQ#x=$1R*+duWIdo$ z`5dpbE6Nq&!dx zYyTN5v8Rh)Gp(;wPufxY>UwaWQqAOdtK+;fj!%yA78MdPy-%)+Yg|vSuNc!t-n#%_ z@=3nK+K(&Ni@CAIr}^4+{%&~ov$f{Ssk#?vrTBUJ%}KtL+O(cLtW$QJ{^#63r~HrA zn()5D9i*Gz<_ddI1%s#U4B?KF@9ZL z?D@j^9+`}rUzB#VFs7q=!jSm8%-&CQ9wqwcs?>Zh9j6AlzrZWw+*Uy8#Fm_?EKU@1 zlil+RI_GMYe3znrCn-&fVzHLavzq5?cl*R{@7(P>yS;6HaZrklEyWOS89Enu!%YIcAQll)*3qZ;+;4RZbUIBg>||$#i>T; zH#~=5^NJAitm4j`b7qm_l&~pLQcy84=PbpfbmFT&2*b^M+`z-R$prYZ^nvsLmM1i0ob8;IISpxp@4N*us|! zSY^}aes+poF6_9{gh#=759}DTv(GZh9aQPqOUw_w+UGGX@NtLV1;Tn>%h^QFL7<-1 zTE=_VHkZV#-IU;^Gj_3Jdc^`hFw){R#}a~5LwYv{Y*z<|@J(YoVZGQou6v-nlmoWA zeX+4BZ_6G(Gh;dPI@%^YiNwZyDzD4Mslh2> znUlrN!Jx~&Yi5FbYMg(eY=C^yu6ovOFWCWof>U=`2vsWxYmHO-9)G>djJ*`Lk@8Nv zyxT2y+%XG-A9xWu^>khA$$@6;BU_@m2ii_GwzsGi5`#xI`?;fs!fSL2y}R0v$a%bw zJaFN!q;=s2*ku)daq^ts%=hTsdG1ZV)tR~1rO0oS%8ivi*7;wiyqo)Py{AZ|Ef!sao8H1<4ZePt~5frqi@ocu_OzKXd$ zeK2NV*1+(>I@J3nzOx61x z=->8jO$i$|jJ?Y6536Ne`mN{#o24!!KTCVYLS?4_{}A^pz)9+5nT!^q)$l9OkE(t$ z@KBvKfB0&>D&X|7mPlIGDv*k-`^goavF`;*&mQLLnU=;~F|=Rid^6T7#=&PxeIDiL z&0ZaYlg3te>V&mnZ0Ka{9@oekn>Ml^7dZsu6Dd2}SyQEX`h7R1i=2@&^g)zbO^ZH& zt~~DNI;DaV&X~DnXjSVMw=cWb@&Ay*^~v%;+Q7O-RgDQY{JfF2N)@9=*n@$$myz~` zYka!^iJ@1}(+OiN36EoSRkS*G+aDQNatJJ~P{+Cz+(xvZdn{I6thYul150g#$Mnz4 zN3hu%LBF^L!OM(=)7714=5uwAkZFqbPI9KdhRxrsCpYa_D-1qX+lclwowQLSH>zhU z+`eca_ffoK(VJ-ndV1VYK;MVMv<-Gq+%$_sa4Hw9XBw36oU5&$u}EjNe^OsOW>u|H z_4I?aoZ$UtOgFt~UZ|RC$-Ab=nO0$ECv^dv_dl7>)%I=nz}4+Kd`2hA?(-=L`;AUe z7@jZAVz8fn`kR*y6qfTG*=tnIxp{Y0+|Gn=`wvmHD2RA>ptTj2%`!zD1B6Yz3ji0*fSK zh0r6wQ*Kzu_1z4scF3^PHe1)#w9QzwCwh_^)z{J~C+4tVC-sX}7kVKh-H_hk0Je9w zuS{>Xhk~7Xw%DcqIkWYJB?vyZKTGt2T~@RvveAsau!e=+nLH=mqA6?@S^$mZ7BV-Ou}~wA z(A0>!Aw!fKSn_Zy)v?}55Hc8#YCWnq?x0*K3g9a%joe{I%hTG-c=MjWwZcVvd2H>?@fn(vsUuKAC>upxBmqw(7WBpK^C*nJ-d#7o?6BC=II+OCS5R zaSvc)?;cPZOQR)@)?-%ay%me~ZmkmeR`pdgmimW<3^sI9PEDI$D5?evzJ{mI^GItA zbZo}vl-WiCJF|5?^L{}%IVc&R2VlvNhxHvJ3RDe==FR$#=0>*A40$|4kJC5IW!gBb zT-w*znfzwPQhQ`3@q^Sq*p#YW^lK(`V(Ks_}Iuda13^pY<8-ouK;?i=>K zQ5!5ZQWEC9j_7e@9bW+$e*69m(grrt)v>e~J&QSHXYIxv(t<^9@q3|L?=50-XGa~o zep;-1gQ>3SI;X9+Q0}vlbIe2<+X!odJ+1cGWNQMRleUfx?c0bA?}zPN+rT4A3y;v> z(UX`#*jGOy4*PDG>E<|NMHW%bZ zf#B}}Tb)}qwr}2xNgIK!&NU{)F+BNM2V9{Nq0659=y&Lx=A3=|QP_0k%bp3^mHm^v z(-Roukb``}tGc@~M#-ucT`C$H*A=iZeNuHE7^8Lu2!jxs^_yl9|UJxG-$GP(1v&s83#PxhP=WXdzcBIZqKOi`GFJIX5Q=9 zxZf>fqui>*M(^<#uFR|G!*~(tsp$JiTWy8db!x0NC3b`Ntb_*=P3IYX_#d$-)}#Yl zxT}JCMc%F>cC5#d*k5XCW43MUtB&O~9+>c&R{hQFfr~bwtx`EkP$E3FtaHCJBR|;a zRakxXdB=3vZAumUnyP6T@i-5+E{Y0yjT63ZeR@jl0L^j&RUt)nELwv4 zu&>>Fk)pn~9`HdBgVa!D4P4zHYdJxN!sFVwLpHZCHd4mI&AXJp$7srH#BQr#Y5nX6 z&a#uO+(s;;VaB?KS7?PWhJ?+GH7BcS9KUo52b9c3U!yzH4}8SwQMye=uW}`Gr@{_jqM2 zeB35^rS$2sPbeI2R*?T7GM?N1rlU3ii(#p7Dnx~4iv4)H!+9?tG$=`K~kVA@ZM#;)h}lHlSKm06frUbP zf@>Rn2kXmN@A}?WljS(SntdR zSC?3@jJoI>zgya^a{?PXut^_b)W~U>cSVgNH)HdPiFd;yb;w#OBt7n@bSpV$+Hra; z>!I{3W3h;v_i&>L=|j_FvD_FHJ;#}Do&whX)T}3MBbh4n6IRD%MUAb^SPwKdymM&o z`b>p#y^q186#VKG#44>VWo9wtX{(&vYy}zXmT$IXjExl{TFB|mXL=``t4arL1&5L_ zXqAkmbowW<*Ni3a(2m9um$8BrjIoT}9z(;j3@r9~%xS7=(Q&?+0eb{0t620sRv#3` z?XLMAG&s+0=C~t`efo@5^gh}ESz>v0g@-cgpMUF=(nt8)xfi<3>%$eA)BC=w-PFCs9TV=bmrA zLpeEDZ(j?^aE%zd^C&=l(JPD++?qyxvtQ8C%Bey^}S5d_ha@|$5Jx-y^h7Ic3A9)vIOgE$whmycLQ3HOSicDQDC72kE-$8#9ySY zifv8{XBhk428@ysGNrVu|H>L)a~pXD5KYJ$U+kri9o)WajPFzLS?scBJuTmFo_A+? zXV)3Z;Uuk4HSVY1ODk;)iyhf{W$JY8zh`e(N_(kP@4!B(NJ*~V^~GL%?rw*w>YntI ziyi6RJFui?)lhqbiuJSDJHL04iu-x;J#5|=-lMeph$7!lme(G;6vF;<-wfYVtZ8Pf zsRFyNcChg+np_`N4^JyXd@tRp#i}MJ5>75^-Y+VAGaT!oXXpmH`O4jVrrz8e1fRK| zj#a$8gD%$zEZ>H!@`63`Cn|oI(jHjUbh*?xW{5{!INg14^j!I z6f2^~R%qrV!bwUy-91Qf*5Byq6wQ>H_w`k4^c>~PeSFZvDlswnRlP;;%px>oGT)?k zMCG0~r-v8ZZbyw+eXjD#H^cEA5MwztGLt;d6IC-yY$KNQ0G4M?5!6p?`1D0SvjKKy zc}6-H6#SY_VvlQ(Sn6zvrACcd`a_myPP8;jEbUL)I=1nAL!1wB3;48!Z(by=Ple>3 zkWY+&h1;}8mgkIbydjXBqg>L~v5i#Ku^}7gU`h)lbu;g0sAC)3sPU|fWy2a;E841Wb#DNv zy*B_}Ati1V>f2bOI<~P!UFu~s@1v+=8)?pWFq#u^hy4%kq3n{F-#Sy@ub<;-+=J1G zMY50xOMCS!&)nkFn6-B^w)yPTqMhoTDwf(>JEM`{GpB;;=h&+IpPRAOo&t8}(fKOf zN%@iDd=Xy?yF>R=&eONSuF~6=_0_P~?DnzU{(ZOGcKeb}&2Vz2Grd=5WxN_70$TueXr`7nqmEplPq94DKj!B&ZLaYSyqJ1E7I0)t6ZrQH4{p~*%xxI zpU43_P@JI|F0h=Yp)5|w_>>IqK0&i!4ySC+6c{(6w_(AQ;`7bv|9F$XI~M0%dWt>D zqcfg(xousXdGSti+w7gP6R|11p9}jc_L*aev%i9QfxYrrs_ZK1k=5$`0a(L%?W%fv z5jHnI0b{YrtE>Nn+cqCkocKaA>+tq1cy8tx{fgoFRj+JJW=r+7_Wn;5`PcCyid(&# zhxIG+WX9sWSy}QaTGEf}y*_goF05MYX67B;`pcZqX_pp$G5m(?tpPt)&eEfs9|L{7LhYqCLY`TlZ_l9)pDimj_#rpV)73 zq|(DLa-f!RdSyg3!D09_Qp^sK70PA(s#`T@CxmBwqv8a(de@(N`&f6ok&jo>b_kncFE zn#OV~)vEtp|&`#1eRq%CydU{RkqVTgWfzH_Wc ztx79c|BZ_W)q9Wl9rqBCzHy&`brow%PTzPR(V)0W|EB(Ejq0AU#@$$5g&fgeLO0aU zBazfVKr>*HDg!6S9`u~vd7ZoFycT`mC)YyJb!)ek; zgS>dmM!qMNqt_mzeR;;0SiJkeYiM|c8QUoho}2&Zg1qb1b%@rVQvM!QpgZ<-M1L^< zX<61PZ24G+;Jssh+>_lx6v(7FGRLZ4LVhqqTh2$7`Ja z0x23MMyD7*@T6Dw$a;mUdN#_uVsyzmn)-1f2>R>e7wsJ5m+QAlt;P5io=Dd(mv0}m zM;TKX8q#<6;$x)MXdAeS{}_#r#3k{97PKFlRin_BNDK5;*X8j`LajNpO?i2B-D_+f zKRm)fF;d-(Z>%2_<#naz69!&mN5V4qatkv)d$hv_%_DG@pN!8js`8b2RUO^4eyZZ} z$AA>Ms}lS_;qOk>mooRzDAE7Dk`SwF&Habg*_r%APhsAg z`wH#DDpR)4z~|LRw+?u;6ThdpC0=#uX5z|gsOeHUtwG3lTcWgdF8;Kf4svhANLjA=90A17N->qqj(2TF>LuS| z2<`AxK4SI8*xRLbg~~7b6!`kyMf7;o&UkbO-0?UUV{@z!cZn+FsT*U2ZKo>U_NX~q zot;Gf#z*?Pe*)Q|Rcv2kd83yY)!7yA`4RIQ+mH3xH~Du9Q=dOUZI-X@f={%3K9jJp z$j|dL@ZtZUcGc9#M-@*EOaUcOF8J(Cn$zTM0+0TrXX&Ga(C?r z7dzHW{f_^t|HAu|+?Mnv=8x0kGyR+p+}ZqXXD0}epFYVux&f)dM>8QR;VoEs7bSV;Sbg?K`s&zU)jmio{AnJa(Y|rs75vWUkNx5|5^Dc|y&|-NZxSaxtuwQK zI(%l{v3kCw3yI9*S2LcL&iDbf43+?Ggoa!zF46v+WSCO@2Fh@2XQUi$%3R#*GXvss zq|PI>HLla|e15xF)Wl65p`o&c!7V=-pU2PW)A;vxzWx*bzdX9s{maJFbFuxrss(o_ zf%OyogFBlaWBa*bqNXd**?-|Jo>xtAI0OzXtA~|#rA8QkRgA!y~m%R zA-on|AG8k#%~!uQ3i?LGM<~wzbxO-;c&EdMN0|1>_~S>8W}203_I9q(_c8-))S1ZbZ>!;<4{hxAIXK$vzo=?!XoDWtIqwgFL*@?j$Lx~4$Upn`rqACtL-kZ~ z^(Gp|ntZO<{0-~S^f&s)kkIg8P<|ucJhqQyIy^jbdgqUv=lw0D_FRckfb`aPw(qCo zA3Y8YmivFK9!wSK!J{!ff;67qXgvMw^7H-ztf(!O{OcMpX_VpggwL7Uf`vcmC)#m3 zJS7-U{TZduP|RTHA0C%IlF)w}@rC-bxA@S$~ zTD&oT_Z_bmMgH3r+da@6!qd93;NbQm{llUNZNloL#}dy4x2ZkIKjRxq$G$i>Jt8`| z=b`S2&h)c(Yu^R^vr+zB7yAd?$EzNKq~6Xc@;GCS?3m-B|G9uEWc~+#ku1hPmrXyiZQ(h2oP!QL=`$Yv zR!?8YqaTdV=cru*It?y?Z~R7L?(yK!<%ICkP>Te!;vKk&AYW=hXk8T|w9+P=c7 zm@3lO{X1TrL+b8QyO4ig`-|G;76fnq5B!Q&-;hw3PY?AOapZ#(gn0drUvWx2)9U^T|IICF z$QE*s{%H=-KW&rXV+4Pf^2f#{fBUEEc;qkRk-xwrPi~)#pDOXlwQU~azyUbS2upUx{8neh4uayau;XfLqhYZc*|wrV~l`K!pf1WpzK|wT zg~x$7;i04c;9Uk7@22HkLywTtl1Mfv$QF1YXZ zfGXsR)@C%WYY4^$`k?VU^Y2-b!vAOQ-}yz})%5VXQ~5RSRgL_O_e=|mi8+(oCuWMI zkGZ0$H9lyM@fSYi5h@jR^O^tY{d-}Fz&YD8@W;AzO7*Ye8{67=&-SDI>IjK`&Nm3r z{{zW?**Rv*YV+>BQ@B%eLzdQk0QgQ#g@T# zLu)`Ex`ei5$FwzIRldP*FY!^s;2HYeHx$^z6RCp(@aK~BN9BN(5G$PI(y8%;c1Q(1 zFDdiSK3w_;U(^F{3)d7nhWk(z@6jVhmq<UK?p7F7} zufBf{Jp1|bE$8{{r}zJH7I%Jef;;a3bez+)|BgEn*xBb3;Ls2^B)EL`56)K%cHspD z)pN&t3(GmvyhqPxVtu-v`wV#FYliFtWbb1Ao`roC>hsjzUkC-&{P$H_Xv=l<`EvHD z@D0OfY9AqIcTZ3)r=#zgDwjJNTz7J3cjW0s2>f}bQgH%1b}+gXxKqKWa%aNFncf3h z4{hC3x$fP%ubzh#)I(3)1#y7h+3DC6B5Cx^k?bGmmk?dI$i$H zQaCk5ionCwlZqCzeDQrH&OTK+P(6QqNKrO-{JUJY6*(?YSW1VerH)nWB7@QX)%~x} zQ7qqUu}J(P7tYvoCL4)LDc=K;<=cBsxeX$v!5Aca|?~l#0P5OHOwPZ&BZa&-1X|Q~+zsvXOd!*3&Yj?IknEkg^JS7DGkWbE; z(cbmjJ%R(qS8uHF$@S17;GrXbqrvj&Z#0;`o$D9USM?9{g?=!7P|J5Tvv$iIru-h| zzzP4{zHyHW<#T%lyPE@#gjCZv-)_N~{(Sqz34cX@HR2oT=U$MV>9_g~8O`?spj&+B zOV)7Ck(*zVzE4`mQ-0v#AGg8mOn)}w8|i1CckaDz-Ku`A<4K+MugkCNU(*+D%6%HN zOnjZKS-!#Ndp=w~x`cj7{lTxOw0~p!o-D~hlVs_s>)-lqALf6^ANr?$-v{MK-{9^G z?(}HB@gw@zbok&9`WyZ<*YUv}kKgd8emhBX|KL`m+_&kwd2}KF z`uPI#&*y8&pVow;dLG=;V)+VuT|XlAzJ;jq1{721J5VSe{LaR|`b{Ry^@Ea~jem{! z;9$rXROa!K_Q~TT^wsgr<7bcbAH2z@m+Sqf@irAoh?|tizkXv1*!uWczn#SR>iE`- zueUGX7M`o`0q>zN6Z0M6(`N6g@A~emZw4Qs_xw%cLn_}pu6}3O-w{5o_-3%bLQIY) zDD447`sRB|=FRER4I|uR;@d_V?=fk-jpRh#O~M@_@zvf1dgtB~?kkaf&~(!Yx1JDt zuD;0&zVWNRlf@k+d|}w>8}TcP+e%gzIgq~bP80568L8Z~(s&=rgl<}a!pOf7zpD5; zuy01u_@lVgjyqO-XUcK4{2Qs8CvI>*3;A=WN+bTnIg1reEWSvr{$JJ>s+~Wy@l9h& zO}fFwH_8NdRH?{evb@n{y6+G_G{N_bKl;wWB`Iyadiy0SH~nz^*()Yj?E0iJv(Df3 zb$so3_LKN$?dxP#+^Lyz_I47&`i;*Ig%_W@HSkE-18ID>ezUf1PYE;VG0j=+A0mBs zF^6Rq%SVKJ9&CHPU<6@hIq)G2!|Oewd=jW0gvPpK%Kc9IMBmrcmJZFj}swpo>s; zU%58jq75Gj{!Vip-zxM+jJo%;>hI0_mq-&|PqptW@8BV)s?P=w6+RZqL?)^p6r_eV zg1QeBS%VvKB5O)9kaAigb}A94Qz6k>jxniJmQ%1}!e-AcJ7qV@OB8a6k8D`{!hZ$N zI7=2X<(@Fu;=6X@tjv*$(XYBdGv!lL%HUV{kGx;`Le(gw$otpNEqLG+by^Buuwv0w zoC);#E$>LjX9uO$0C*Fltk~%`r5NMNpPI5SiF`uNxy9IWI<69-0zY5erV4kmXBKH9 z4_bj0oA|Z}Wx|nE$XjC!{Bw@6u8dJVeHQ*V%O-7$&lydEAI%a3-|9P{?1QVWU}p~) zbTmsLRD={l2fe7eivdlQcQKGhcDbzIf$K={p z^SDryl3(TrlvH;Fx}T6wm1EUBkiF;$nHJJn>gaRD`ceyf)97)O5ng4VduWUSM{^8# zidPf~u}_#B8f&{(Vc8v5Sh~l{4#tCm1%~zN*}*}@+X;m)#q(>=ub5Ne;h^6lP4Er6 z?4zeFLg-oSFps*2jv7&TtT_?GV`$#TNIsp#m;z6b!WboEryKo(IOE8@%5sbzwKe(- zZDo8O6CIq7^HE~J#|$Y(0t-tc}RGyPz%iTkjc;UI{ve0GxEW@hMi`&|!S=9iLruf? z?)4RS^}xQ(I)g8p1c0qwhjuEJ2izM=0;I@xBIZ z0al6XFH-bUlXjeMgSy{XO*?~O+y>1EU%TIm1L8yq9=3N=RpKUI`MFQM;7O&V9`V=p57 z4jt4;M_uzb*M+rwtl_XFgVN0Pyg!qAvIc~9MWT>FDD`R_QA*vzrU z`{0^ezi}jN&ZEAkZMr^(#L^4hvLPMSb9ME7VG+Yxo)%)~7P>b zHrK_ih5ce~H1|1TAf>UoMhqmE(Z+PJR#`m(Hys_#^Ovx=SiOT%>}%SUzJ`{opUVo% zpw6+n9&5G?$R{iVWXv&0mA|jRnC(5NQ`5wVQQa{jkG*#6ccHG;d+Q^Q9D^LHF`S3T zYUs)9zSUjd*qKPWt&eE^s(hf4nI|!C^1YPaql+|b6Cdk4M?ywy^@U~7YzILtV+%2$ zlsy{A*v#wWP)Q2v650hl9jCxzcH$itRcn^`v4?{9b5%BT9VD8b>{VUw5@BxZ?`)%W ztzE1OkwGjJX1YiYIyZV1vXrgQu+C^RsP(LBt>U`|Sbg=gPQ_KcVFA7;u|epk<(1UnDfXdH@BMC66~=?|18arv))Q z(`}BytP_b0j`KCb{Cx!Yk>{n+_D~vqe@Zd<4tjN;fP1cIqO<`k)%F^DbtA84u{!6q zzI?+!cdloTHS1Nr<)8cXtM~C>t#`}+e4KKaFPonAT>SB;X;lado?JQ;>rNmzK%w7M?9UKEny>lSeZmTPE^_5q9 z#_PUgJo)57Nz>0?SQ}skh@xJmt&zI-;|6}c4z&5+8I?wYK zl|YP4#B#OcaFlK%))qr5mhSzw>|pwe~*yocDVxm^|-S?|aTV z`?B`h>%R7RN_;>6v@5~~y*Yf)-_?7hBg*h&pL*Vnw_pBzpJTK&PBJ=sWox%N{@>c4 zV>D(*vF~I@L1XenO0z>#YHOioM@^rnBl~4%>;!4k>@Hg;@~Q~}3#C4@W>56T4zn$` zJHDgSmG81X95AZsWE}0e59O)LKpco&)K-oki8fyuvjt)`+LIK5V}OmcS$MNC93?$7 zoKZ<`sC_rc+vGWL2C_p-zBJ~UcpzYysck}V0lwh#(n+zBc+0!JER6K3_{9p^?%WqW z!{2!VPafk$k|EVJlhS7M z#|VhhA7lw8DTk)CE85pDG+579W5aGVMA|^DeyTHtB(dSCvOA$fX<@V>yEVNmv{HJV z@PyK<^jJ}H>fh)eB}8IO99Nc>{e^yxt1Izb>g!_=aPIPa9L|ETZH2Km@&sG@sLuf3 z-OrX2FR&VrN@%=LyCepl&7@>gkVl>8=%9n}oFpA}ZqN|$Yk`k!nG*`sGG~*4Y5K;W z46Q){!uDEJc{wv&zEAjo{JNY(E}t}>hV=9A33-g~%huX(W#svmRzyDXz1?G1cE-xe z10YGbC!VHF=Au3lLRs%E#KFE-wZd%6b8FD(fg;)0TASyFu6V?#Gl|C%RPDHiSR-@Yx=eR!N6T5>e zC531ltgb3B4B_XnqSNzb9fsX6D@(IY2(3za*AT2dqxETV@?UA6f)CD<0ax}awA|sU z{ytWcbIQ&4jrB1Icmb=RaUdJuQg8?F{hFUjdQf-hSXj;LEMM?%u_J`p(vkv#c>%$W zF{PU$;~(1}_!hqupSmsj^XWG5FCf_K(9o3sv^;^vy?`CAN^Vh7yQqeB0RlYe&5)K*z6!?lozwHc zmRIKX`EziG#SqyBypsAMG#pU_+&-gC@>rSgqY(kcRoXZd|JD^e>?!FDP^KW*4cZ;T z2K3|jlOdq0DbEDG$YM<`M|%zrvd57S!;^3n7hCJnGr>5@{j}DPH07N4ZLP6c+Kiv4 z!#GxBq>e5aXR?2#x6}~ht1r!ycq8iowqf#6-9gI3%(8f*=reTjyXrz#zZQM1$8LttEUPA=7o$$}TJrXPVJ@Hii4w=%P zJJPSdWRl}2mZzQzxWGGxY(V#yd{#^b3K~DjhN@pt_V`&e_-(Lebs9|>j~bJ7M68&* zz3j$1xUj}{LyU2;Pf2I6P?XFX4i)DY@JYs*}W zF~#`c?cjFI!&=7pkmBRxa1?NAF7)}bxiumhOA8r3mJz(+NWqh^4%g0glc&Fo1mM+Y z9@1YuQd<^^S0)7a9}Ei0`}BgQQl0_RVhnkb>nby$VkQA3E=^=)G3Fb=c}AQor3<<4NgmAgwLp^c=Ll~^TY ztKz+R>WOq&`HSR{vQFc1aHff3E?QkUYvP?=>WF4}ADPrbv@1tG8vb@hoRK2@30N`U zR2H|a=%g~%z#g;`LfRJVZwTn4gXAYMI>N4+@4bbE|SawqLV zDr{9N4g|B3O_x$#dJx(c`ito*tgR@1N-&993yd5!m{F~36z!G3X1>HSKGF(HL{_ed5$U(?(ec55`Eb56aQk5I&J$ z3?k3P5$C6G#q?`gZ z_lFP<^bnG+@Q4-yjHRv(#)faP(QM1yjm&qz?q}UaAJW0dFiQyTsD+dljHAqm(DTqh z!gM{395>P15Ev_cpi?kXu*j@<%G8k@W-)|lQEd>Btj`pwPt8FWH-ssqhG321V;)7B zJ&2AA4(u`FyQDUDD*j8(b}1pG!wYk=W{L8!N_jd@(mVP%EeYaP^EXGB)^j)Db)pT~ z2;foYG_AzH))#=NwPa$msqwRN!&7v`wZ(I#DM>eHj!?PmJ$tUe5^Z4NjC-zF86euT zcIYX25O9kvyBaYEs)%u>S66iqV@qz{^~_HEKxISxb6I;+O4ygAHBd{#rnwLvzj?{N7Yvdbb3@s1-esW>8X93jz0NArxy7pP;9d4oDBi zk>}xn@p2Skomh)b#L0ZidN%+8wV=1-bHe8aw~*%-&5<3Bmc$<{!=;80;6|Dj&&xI<7X@C4j56P3 zFF=WS3Y_sOyP<>tQ(zB1FCR0rg$sZiQH{lW7YRgLrLQlgy0nxb1ii3la&$m2 z3Y{>s*1v@k++$njI2a|PO{rf>OWH65J%HQt{#rj$G%raUdC=O~wh%9g*`+?#o;3p< z8t-ri&LpFka_z+RnU63wb{-Awlqb@l5$cSb5~K2abb%Z4KEaN4M`jEyb0!V5<*)D{ zIaKCX;0XW%NsFbFtuP9=k`U!wd{=Xk{ZD*OFf08YOHVg#h>z6}k6ocpo&$oJ!ZF#i zv;$8rwNLmS^ow175=g~`=0wb>r+;9v68Y>~Pnj^9t;7+Z~~Cd z11R(L_C(GaXMT`F#~D4tJhm8RpSi{vEC=QgSHu}CIwyzoO@cj_58UTWN{Q6Xox|ck+=e+*po`1G6DvDxcVEUOoP9GmF=J0Z;?LBdYGb#kZX+zXgWd>r7L=cDLZl3V8=LBsiBeOhX zCr<$Zd(I3!FTR1h&5_#){(Z&?qrak`?Rh=LZSAu!H*e&u8s&y&&gOaj+LA|F=Sn8T zlcOziNp+%%DJajw=(?vwtI!AMH{@(<2(7`D(UMy*Hgw_yYo90TIPcS=0H@4}H(=Hn zEq9de)tRB3jG$e`xeq`r-Y-Dp$vb1?(AheM zAhR7mp{Lw)!!vj^R(87Rmp0%v%-*ZQNg3ri9zc}m?2L^A$|9q-Y@pp(M_4a$+MfMGKa7#H z%~)H}`L6io^NoODXFoG|$T$RaYzQcMc!Ezm4)$W6;bZEkPw{~^*tvO95+mV?Mk?y5 zAsC4u7>78VPx4VOH6;T}pq%95|o^wBty zN6`kO;Z(Gg3_4jx@7+ZLab_4<_kL?G_uG?s7RwiKSDw9QjDsUlGP{kj;c^Xr$E@%CeX9bx)N;>5v zC!aPqE(u!*?-!_oxzr~DsTX+tWg$^^#J^og@Ex&VE{=2G%t54qSO!HlcHAjX^?5BIq-yIinLRxHCvnF4KhWv$d>`nvJ^{!a+7g+$_?o!3 ze;K0Xg~L;TG>-ZlAXTPJ*L&0_1*wI)-eX_Ps64BWk=FaRJ}t;?c->grv-&EHbNf?+ z_MNu1KQrk3sMa{|wEgjG^J!h29rWz@_t0tQG!-4&;+&!H35X}eou~IL?1*O$opx@( zuXI#_oOarV)6NTs^P@G|xcIbvrvaTO3vpJ_`8~v;xVkIuULMsVTTi>Hf3h6M=Kd5M zPPx&!H#!rC(|vS)5NG>vw$PUTq#wcD+~2z;uCDf{=Ln)aedthJ-%^~9(?W2f4o`2H zpP;ij&eP#koh#JmLtC7IRG#7U+_-jmKW2IXc5Qx2&*gCvk>|qsJp20-etb^P zN3Q+b=O4KCoR_#lW=rv=?=5|W%xCVsF z$`a)Y7PmZCWK-=9yHnmP<(m`9y{5lUR0D`T0a1J3h7i=V$Uh>l828C^!mFY-u8(ox z86fJ2XSMBR?EP6Qks;{YG>WY5JoLMCt7gE#du#kW6ets_INwj$5^t406M_SaqU-mc94BePH|%oAjs;+Nt)A65$=A=D#`+n)s-I4En6iAT`Ku=-a1 zRPcq5Z5Xov<7LcZEnwtx#+L;~5;a4 zmm!Ogguv7`yS1iLBO0%?M7LEXrA}bs1Tj|ASz6))SH=~-;rBI10&}di`Nb|9A4!-F15o5OUi@NhV7JZV+0S34V)@gu6D>DP4A}X z&preazTw=i@%%94!}$JU2eG@z9ijS!78Ut*FRW}vhpClNoc|T!`}B@tUS*_TdyusN zd*i3Ll=;2HT$Il&u3^5xx(O4kL*{U%M>YJZF$3{7B7NpQwI5qP{IZUbothqX=59Yf zu_LI;D?w(8<42O58Cg)aCs8$?Ao@T%&~cu%;;asHL&5N?JOPXGWTvHHwEMEEiGGr+ z0#oKAF>dHy5mji&S$*r%MtPPAv_M>v>=9ad(LC2pyHjyeBoSPvhzWPukTb{z^)v9l=OW(ifT$F$d|0+V98?X)!q(ljK}SW$15V0P{@Mec`2s(5<$#C!?V)tSyl22;d$t6b;XZi$~;8xN@#pae`W;W8eT8T@KapTUdHYbO-TwWhF$ad z7KU|~#_G(;jOI@Fl`x6JA^(xqXU+*6`zs|b_#tDJJy_~CYEf9n4y+@x(16Fq+%$J! zux-l7u6HvK^!0?$c-v?fUYslDv6QZRa-2Pa-AM#$%0o*eVLcriAKZF6HqpW|E;goP zkDmZi>)8L>=^sD+eW(Ba>F+)LzW96J>HqHZkHo(#-Orr<@omRPye-m z{P5`??C*Z$#8V$X{b%9|^?aokV2f{G;Lf{DFyfECe<<#w53#zktrk^c|YUv7|LaM3-5FyOMv+! z?X~YS4>C_z-W&JwOvdYCUXtmmon=*J$FN3s1;%#9U)DvojOd(53NgstbBmB)8DZgx zQh#PfwM`#>=K+lOaqf6v*4MFj_BvyIZY^92e6e2G%g`758ZIln8VsiPOpeyB9&^l+ zK23+_?5qYbNEduU@}lhRG48w!t^s2mo3>W^N_JNJ_0g_qvxHGUWWDEeTrC0;3Dim=AsoVcdgc|g?VnQGCZt2 z;W}*@_6Jfvc^1FvtAt@i-OdBi7HiKr9byYXld?=pG93pDK z=xbk(t;P1mRnev@L(mt!4s~_KdM86L_xiY!KR!uR$l+z!8xsUM-yzF$RP6q7?<^ zV9ck?xi;?+gy;v!SiZ5HQK4hQ%i#d%#=x+veYQ3b(&5I>Kk!N%4%}lYL-A`T+5yXG zLh1=l*TO9JLux$IV5e{hOl@BVH~F9M$BE>8+i4YOP?p}Uhf1rl=Ht?Ii5o& zITka8o))qunXhjYLy@g?n!{Y^d59X)5@3;^)vlNN6e2;1NC79zXBJ3BzU z$LEL~iJs{nJqW*X&DqSQlY)S$bAO?Uvd$mAF@(7z`h`!iu5ecMRcj9NQ>)GcZ4BCw zc44Ywtu*@dqXQ!=Vv+A1o#nN2ExX*!-~=6>9Pjli`dQP`UzhdxSU$=YCj0UFSS787 zXnAPu(9ZS2Jy}miZu%LX(s*M}W7^@Y4!a$^vgag2@%uqj;0Kx#)kDwFC2)*KV?pxJ zqhTc9usXnV4a2I_+j=l)QVBzDsCWZ^hqd+61(-W`%eo(7n%-+FPR7d9N9}`!t9$N-V7-opG%Pi;u^7lmAg&+XgwIX{t%}2 z&@emAD}7nXr5L|>2YZ?Eu)n}f?K1&G(n-=kFC2<*LnFCQhcL)X=mI<<8pi7hm_ULT8zWg`2gr8OF4}UOhZ(AiHzDig?9JSZSz`F(d8kSgw0b|3+!GK+~$Z zaU4}LWmxqt9Ey8Oi={90J+0W6qa9=uzjU26Hm`6s_P)sopx@;0@DWP!^s(rpa$ z@~AnPl7sL@Wz4`!SOa=x?&isLY)ki{kc41=Wo!#9qLHO7=Nc|(ygZqIY+nF_Mb8<( z)IfRMvYw=i0&{0@LUw~r31B?nQ@*mb7*7ksiY5%S(ZawrS{S&Mvoa)ek;72E)`C@X zO**jBBB3;U_vs5+x!BGHMx2Hv`_h=(H}1B!{BB4qSh2zasDi{Qg~k1{5~tqFgm7 zseT6pm?<^XuBR{XS)UP8%O=Yq_9XiqNo6SnFGKf}w$B|#JdY_S2-SF>baW>!e?Gr0`nRpa=zsR+={#sarj+i?zbp^IC#O^6;u%R1vpfC-uD=|$w z;$!75W$)&m17=tu4IS3>ld){*Tl}!>i7^k~2SO`DUz1^oVx(+GLq&p!R$CZaN*MM# z`yAfLSeP{{jXkGK7w)vx!NOo|7d#?jd6z_lnfgxhJYB^_g~X%gd7h7q7<3!Yc1?w< z0MCqEQDTHd2#E+@9nUKdlgp#~@G=r$746<0ZSi|cw0tn~PS1%J ziN`w@&giKxTIt^<&z-J&eEcpelekMfUb(AOCn?syHK1Krs8LfN$~V<5lMldrvZ}1D z9U0FVsPV&lP4Z3m&y3MfBT8)x6)KnY6|U#T73Nvi>}YNgM~&w%i!oE5WDJxQ zWaKBPI`5`vU6qc+X{k=3%J;ePbl08V=l0&T@yhs>n5@UlI8+aHu*dc0epOYO^{jq2 zs$`{}NpBN(U1eF-(pI}NnzDYJ@lcJl9&L=(#46vPl~turTNO)hnUPFi!;00hDx0=u zm3FdbRqe1Q;MDXCOkK}2tV$j0OV8I8qaL+#Ke~7$xoVb^HmHND=haqgsyFgXT(1cY zuD5r{)Hqq<1(2r#L7#QL2)>PuB_sy5XgE$beIA=fp!9r`Qr zQ|>^+)cHvCWhl`+ebq4Vs5)n99LDX4hqv{OEe_l2M9qt5SxLss4uFr<`vP7BztgD# zZG~dn7uYUq6xGw>Dn-M%3X$=&RfzPptLLa-PB829)i%$n9rNxba>I7_*zt~rhtp2Y zH#mO*+Q@SVTA1N`oq#CcQN_G~frn((Vms!m=DRCp0WhWw(O3)9%E6nWuPdTnBzcB- z6f18$-xMo4rEhHQ$J%vIKlRE}pL6QIQ&;+LSDku(e0$oddrrOZ)T>T?#;H$>yVN)y znAbs4hqXB>6dx1Si!1&0t@8@SZBe_pA!-{}y6y38Ykbb{Vahs3-gpH(b&luvb&flt z)@!AEN?h9-(9~156^2KmF7Ww%)#9NOHHK6iQd9V>s47$~<7!kf-WK(R)DiC6L_4Y# z^!=Or>cTw%b!k8xjoLzBo)_O$m#9{5iR)KyI@bRc3{{EG>Yq9??}@s^E%T~K+KRJd zu72B_K78y8uX)%DT`9P|+cK{<+#Z#Q7leNJ14ll4&*N_1ao3htf9glC`;ou8=ht5N z;bSlED+{lW{H5JJ%-f&$`RhJ;^h?iMJ?eHY?ce;hCF%~hM|C3Y{Kf5?{->>PecPM< z@HWF-+}AA%=Heda5AM9{h1dPaRo8xQ)i9St{o~myz-)^aY3C2_{N&M1H~!+$C%wTi zmquNrV75oCBrwnZvF$JYyB8+Rws_j}x^zCCA6M7hFko=vPK-vg*n>2$^SCsPbQv*@TTk4mAB_RslYI{H}N#$fL547#l`VyP|#k z`FMb36*^lOEBD^sE1)=s=5T$~Z0?V?oGB^KLAF=s3v~U-wv4j8uP5-f-~jBuCqquDN%!ir;fY_YQL1huu|OVx~pRzrB@6( zW@d^Tg2%OJi+FH7JN8AHcL>yYWQVbrCv@UHU=_0R%hqmL{UuM!&|}58=vkw~7l-#q z-bt|ImY{!ACtfQ>SmgH+K4=L{fGtLZ?M>_enpB&#z!TZl6cjBb6#G?qX6l1+;op#7 z09bmVDuxW^l6uJiGnKPznJKj@T1VZ@b<}$WwZdxaP`}>tklkA5x_BMwEhDEHv$w~OwJv=>YcYEHrQjRjL)4{+Ccnie1;tu{ zKlq+9mVg$27JVt+4(-~*NK2L>ju>Q?M-4Zu>w~XnKCw=L)chEQJcMNyM~;2i<1pqA zhEos^zQfIiIULjR|%- zBQ+lIqYmRk$c`F{-qPO+_adutOu~S#dh{g}97}#{LAg2uImC$Yk*~yO?2X>+G&pUU zCuKTRd>DQYzMK^a?X#b(U6t|#sFWAb9#3o6`WNe1Mq^lY_gK?c8%xl7*HGfs$ai!H zuTjle$4~r(Q`9_qszMC>vp!I~YQ)G2+?E{kMq4rAg zp6V+?lg6iv&({9hJilm1*yyUYRi+E$6=t>S%I#oWs)hnvL;0b6UdawaIrq`heNRuN zmfM0ti-8jmSv1_?_(cSY)dp(3-Xbj&K_TIl{k7K9I~<_x@v5Gx>Ni%7L7|ni7M30> zahiZ+iQaO;xDLkXsC&}h_2_j~5lEoW7TWCkJuybfWR3nvw51-kJI68uS%eCp+Ue?ZJDHBe^4U-=Y`t%%Zw0IMc3v zWwgWLe_#|0mv#V9rOgSRN}UEuM=u;g!7-KNT)}SkM#@QS#NY_*9@SiOHzXgL17W| z?qaATZ1aGZjf_u%tR8lhE1Ka6)<#R7DJZZn3B@~%kDaJoO7F&=s=A3)Z1-?`)`v%5 zXEKg^3-$%yK#OE&VM&{_yuSO}Sm$!BeTOWUef=|{RP6vuBI|`~J(Qy1=x)*ip)swF zGbON**}eJx30b|V?cLpNnT`G;ARwH*_Qopb4&H$rg98AyzKv|C=~Gk~m$@g_TJEvydfYK5@l`<$Iqwh(&I@%- z*DTSapxC2R6-kEDE`Xjz(a<8#Wp)&84K-1y+t`=BdMNOg929R{$!A?fS6@|S&q}OD z`RuUnDEVb-eC*oQ7}xkaAQ(M+Wi6ntj&JZUDA63#nj2IC_Y{<}qQ4SQ>}>Eb%rUs8 z?~yeW2ln2mF#!}*2v^Rt*Yu0)^0-|SJ@8z~M_S$2P`Qd@dNfdIV=D_h0{G?NdFy#< z4#%v^Tqa9|TAw(4V&_3E;Hs@X!pB$FS+zA(P+_Yj2>X(b)~whE!xO;Rn8boMQ6u{U1P(=cN& zZAeD~hKlL+tEIribE5~iA9TPLGX9_|J0&=>lMvR#EOC{OvWnm3ZDgvzW_L$#io zuoPlWsj-9?Hd-y~ouu0@u6UZ#bLzIS!)U$s7PbByRVyhEo4v4LJ7f`H`Y};2%9zWx4EI^jH(CWHJMga`|ZPTDern(}Ho@{1lO%hplwzCDT zr?r(uP_i<|B*XdLLV-7SS@LY4kV@<)csq21?orwxs!3q&*Voe0<7Q4Vrhg@rdVF2< zNU!WUM&}-fZ_|V#OkegY4&S-?V2|a51Gn9LUzewIiRPI%vJUM8DEN=xUXeV2(|Cw5 zXobeBV0IOh0>@Mx4E01MMdS{0Tf<5i@c?YE^yqrd&;~11QY9GFY7e1+hDWorrlDRJ zbE7?Gp15ac$dc1;G**cNLP6+?cqnTqXABRa>`kxR@_4mE*aTR}HNLW1M)+a}nSzB^ zXhL=xa!9fRs8T~#_G794l0n)+JrHe`P-~-54-TNREmz3sJS}N_=5j4mo{pDPL62Yn z?HjKTk{C`({dVS{L#t?q+B3*y*-Y6ZI3lAmp%zi0p~_mBmPgZ%_4~3qgh?Q zn(T3?v9?%ac9#7K(qP0Rq;=31JLToQwxD^6mccc?XPshOT82Q;8)IsrY#An0eOiTj zWL)_caVQ5(L6vfAu|i`|>eEnAG*CJx51D|xc~w7~TDlABjuHLo zUWI=FC5tufG->g0U{#+0MGKY;&<^blcP&uqFZ5ZEwpbY}-U75B_m>f#B* zSg%TZpLQj;!BrU*@hZ8p4GQiGjFw~1+AfWrw#H7_Vw72fipGF`U*jS5K(|#|ne=M; z?s=)6L;IktccC}QG|M4&GrI*Sa6oGb<-Oh3yomFzSM?&OT8f%m!?C1yu+N53@Dj>n zYNbLOAEK?H)}iyQ%(sx-^et^gb{IMnbTzCc0TUVtYi%g@fVt|pz3pAdnrkg-shp$Q z^2uq?Tf*@xr6{^FYee-nBNW_l9c44IBeIzspPEk{*A2xb#|YhtT(Wc?|N3;CF6KUe5VrQ(!Q;; z<0?7)j7k}C&e!#OlE|_>C*Wz9Y7OFj9$Ovft7|}<^AYIMee%q?0dPW&nw)#k$3&E0`zuypYg1mY*uhsTLN62DV>!gizp|doNrG{ z<)~Q4wtB=--SQ1AKn>qR*k(HG%@ouUd8HLcW^Uv|E3dk(Gf|K0RhkH@#)RlJcLy`9 zcZcT42oj3*G?d@YsQ0Z+LFG=PDs26oR@aU(DyU$0&;#{iyl;SUfvNR(+Bg(>sosy! zYFXu?{-_Y+oA1ygJVU!8cP%ivho+#wSwgXESxwsB8@mENkySIhq8H}NxPTf~*3e^C z*3jd4O^jB&tcrmq!QPe=G)7xBO|a+cx|lJF2CA%#p&e$C)pCrhtsw!ftTPc*S?MO) z2QKk71=V7;tw+Bvp0E@Pud z<_u2(rmcL_2BY7(6ek~t8t#sz&qC>}a)zP~!jj zCbBW9Fs$rROY7J6jM0}WfYy_>Q*}9DLUlRd{)>a}Esy%MM}@cJ?B9=H z|1G{<{HQx0wdqmc(%%a{(O1S?9W^SdU|EgoluP4tLwueWl`z!7L_96NQT0Mii{XxJ zx<0O{;zhMCpI^P}E$1A5;twCV*6+=tQX{K5R9*6CSO4tc3l9JE>N$tcxka@j)RgdM zENVV3?zZ-|Bj?`ui!c28i$CpuEg)p+TKI`!cA{_`{%EF^SjF$lS@w2 zm~5Z7rMj4p94jkhsE2V|s*HKu^Z)o2KfQY3+P}Kz^C#X5c1et1P+R70eeDHrdi#NE z?|A<=-to3Kd0f05%oQsd*BF#~RGp3LTE?MV*|NR6sGsA9-uIeo&;E(0|MN3Wyp4=% zo~`p9U2C)2+a-!+V1KD9gGi$6BfLmsr+x1Xh>Xh_YPwFwxi?tl@}FVBXAYulKmEo6 zBeP3!5NB-=89f+JWIl$VR(nswqMWTWX2*KZwQc3KINwOtj54I;0Uw9LzB1IYxusK9 zfjkiR>nafNMID7=(T8JnjG4SJ$MTsswpE_ny*qxBm&P2)OW?c{opw<|9SWOG7CSjX zKsl$vaRt08obZUZfj;HC!m3t}sq3$Vu77ajb;0%ERhy!gURD7b46junc1iL@2QQ$qLX&JVNf0KXJI9KU8E2JQ6F0cO0A9 z-*g%%r}>CV^%s0$CCjoGCGxbQM0ik=u8#z)a3naqD0RFSA6NJTVmwLR&iX5TJH!_m zTb=iJB(A-xk5=+-Ib~D;!Ad9+hzF_6^mgX2R*LzT*-f&x@%n)au!SE)V-zJYgRb}F z;cF}3vA{g^TV6Q&eOyTUl+$Rcsl%o&(sfVlwE}cJv}d67u4H6;Y7oN9q3D;fm03WC zdpx8+nB6>?LhkY9q8d!Qstg*Z}A;+uVY6TDA z-e}SO8mjildShSV%flaI`r8+4#mcocE}H_kcu*8yJs98FrEmr9Z}Lj&N-D+&PD-z@ zdTRZ?hUuJ=!xT|6S>~qF+TNnU$!7me>JhP9|`~IeikRBBa7Q`-nKUI2F;| z#2>U?X10?H)ZtUbj~V>CV2bYE6D2u@UrCvAFvfOoeCH_qryJ!i*n9PtLuv{jyf z#~$GxyBT^R>cTmCaBM}4UD4qdMStUPv}QPZmiHg3&6AcqSNV3uwFHNMoYu>=gGQbG z243J@=?^cnKI~tXpKz?c&^Prpwqdlz&~U4{OSNX>T>Yk@0$6z!JHmxA5RZ z4|$rl_avCjJb8XW`O-?)qCGemBV}JgS*#mxcpc{XmhG{BGh2x^p+GVMly!$BC337< zS<4Kay{-%_xX!&>CTE`fqFTF?CeB!)tkeR5W2dp3(3I#8 zoy3sn9bgMMBmmez;xJaC27H$k6K2R{zcS`rzU70sma^il!Cw&VAxYsKdIySH(fXDW zBQxWj1y3GMj@VbpRM%=VT4)JPi){5HF>WM+W;P9Hd*$`LW+=JO%Cd`V4e2$6~$nK+jjD6D*RK2V#9}w;YWA!8cXA`=Wn1EP4TWJ{bRsn>wmT9tAu> zIftz8i+Z>*`P<4>co*$K(ULiqGF}bIU&Bc^Eq8|K!ublokvR*mUkR!pqm78P#ta`~ zPf4$noR(B5ciWZy3g}I?*d*{s<%5mqma`tK0RxrNtE?GaAyyARaelyRe4`a0#S5Xl z+p70gs6D+EhxcBvhGdzP+4MdkbG5%$pQ2gL#nn#0agOGC_Qx`L=8P}l;KSBmT07-% z+=U{f*@FkI%#oN6Ya)3c{-wABp1_Or3uzp1rc&PkZW+AKV9Fyf%KC;RoXk1t4}Q<{W!|UOgm&vH#9=?s^AJk-E5~CF z*!pQ++3Pj**Bs9o_eu#1H+Or>#a+M{)RKC8Ei)zg=yzOihx4-kfz$Xhu2WKd$$13_PB+D~ z#wjzFoGJaHSko;W*z-!M`swZ-EBGT7qmpi;7VW22zhJM0qea6Zf5$UQfs%w{+~{F= zV%c-Z{F1JQa-q!^75^(UMxpzuvsDBwdxd%A$x?X#ojY#b*e6hp!{M)!zFfjV2lZJk zwisAjJT2^xTbK67A`N6Imv|ZOw>%M@e3U%RluQWcn2`%{W<*Da*@?u!GSiT}o;qhW za{%JqNAudbw%`iSC{HnOhsWkNa z_-N;u0YOeB8F*Lpd6taOC%fv@-zP*{#PP`EBf9Hs#Ub2z(GuA}SHvjCPK)>Htz>}S z67B4bPnin`{+RKWjW-7b=j;$cT;K0KmIXS7=W)0;Pbb$W=L*y?XK7J3rSl}2#}H0A zI9^@lN(!#bl>{5kO6EJ!ck+v9uYPkpV_QC7QoWl_w?%tU*X6MmmJ_Ldhgp$rzN6skc?@$I1=D6Tk~`V%59ZPRmHDTFtm$PeS8@z)EDus}nSH=|jORFdjJty#Ib|HU<@nWDHl$k1YzFlU zzi4w`ynERZi{Mzf%&}p7&?KBZJel#Y^6B}N`SfZJ-reRq4)Y?%G9GDd$k%{dhCffi zc?ZMC$p~um3xz%AT4wW)ogfbV4e9EtezwXiNg8A(NRQ+%KfU_Gn?8H=lJA|)=ewlO zb^GI+UvljW@A>4>e|`4_hyUuH%nsz#=&g~lw>k3hE(krs8GRrBp*p88PoSR8!@DSQ z=T_#~bC=9dvwp*CbO!fF2B&aebRx@6?LGU)cHH%~7hL{)vKJ3r>-@iqPUQbxGCz$P zopX2SJo2%UIV5ccKQGsnv!VE^{CH({+|UakIDGE1y;vye-1)$i#Q9I-aEUct&1 zihqU?u&j(%Xx3$EiOBJf$cgd4aO~u)yk=z*<1&YHHgAtWn5gjDR1F@j@a zgtUoGoY7A02>fzTF}TR=1ZJuyhW_L{;T0;wb0$c8rJysgf@jiPfHh?7iK*H)XZNHJ z4oG`+z$s7j7w-`GCwjpi!WW0#@BVFJ0&B=N?#DXG5(RE8Acvk6w>aioVMfP-F5obV zeK3xP&-is`-yS2P&4k2fi+5j;Si**cmTLUE&s+(<;qRFCBnb1RFTpmmX_Iwlw$QUM z2IqKvv^k#rqZZRoz>Lffr3aK8kt^2Z(FBkHV_71rJ(Z>BOpyBnqpXAD{^lv{Y^V_pF^qZDhBpRjmo8xJjS#l`)EsB{SO_za_0D zSBJT`&%pPYmWo{3v z!aBoaXfJsxy94?}=0UCG^4BNfLoIM7Ru^uwKi0_m63PUt$$i(N9)TDW`{+QxBlY1_ zP`|KCAHx{g!RY;Uaow4zl1q5YfW5Ns&)Fx8H_xv?ei=^drpmk9~_761iF-Aok0Uc~- zP;)7z(6+$EhUP0sq?b7pSJrw+#d+m{ z7lq32DjH@F%kxS^Lfi&k&)mo`mex>no1u1A`r&Jxf%qQl!K&GZoL*mPR_@)rPQ6d_ zI^wg-aYf~n(6=RgMv*Ox)H{&SqShm{^jV21q#Bx-@=sU+;F)O&l`}Uaql9-tiHjjw z@60y=)*ke{3b#o*AX)+(D_&mpx|i3yJ}so$L~61Zp~P~W)}TH2ItvXxXAeC5`0KGM zqSvm+O=g+ADq@&e2(OQS!7x3sCdvyL%QKN?RY%B&HiG!KY~x{$3n$Ad+PHW|s$zS^ ziBXla*NHIR9md6Nfp22w=FjYDSvjf_YHbACWXIPUEZk;jO#t~|1BpIg#`r}`ih-AY z0L7`GYbX&uQtlxleYK_vX4o5LbO*`x+Tg#zMGDEqySm39#rsRhm&fzu2(!jD=AkV( z61`GH`FFlmmQ7;-bK%))R)!|_SsEdX?{&Z zA{`7VD^hLdd+I&P@?G^Br!+-$z?vtj>OxjvLJqSAprtx%09vZ|qGHj^2%GAw{hHj- zb1gw?#?CM`g`yX+dO*sGls(GYL#yH=4=mB9Afe^5cUz|9rXp*gJaGd?07jFCVjCi7 zn3pw%DQ^sIO~tHPQN^s+0!z-Igci}N+_H35Xovm;nQ>-~PI9Y^Gi!~eBFHa~)^o>U z=_3iH!3^yq(H*k|A|YAp+LGc*8As+W6vN&k%OW$#5|-TD0P9jiNJ}KRQi;*En0uLjTh6D1(~O2OYF1DEr}UG)G=v0- zc?r%@YUpze5;|@np%%1cjggsH@8`Sku0@-?O`CWuF}pH`ijS0c%KF}-XfUv4Jec~< zi{cvRkZy$0f5CG@~LqtB5$umOl0oRzdjgdFFZX zA-+g-Ls8B1HlDfh(Qz%GM)%h2FY$EEv)f5xM1PX{u@sOx1C{DM-VrBIe>?0uY2MzuHE8VqmRUTrjTS2Y{yu3)(t`yO$buijQn?Y_>Qzr>nK4Q1$kts{ZfH53bE7Wi_|J>{{p4S|Ls z9{}}R_-+0&{@oPNXl)P1Gv(a(#8vr`@tl-x5@p1OLK8$+Lx*S1Sf1O>Z5@x1c zQqrkDPq;wa2H&Yw*L0YXQ^gDnPkiAEfhSeG$*T3tOpRD(=-sAUc2#1Q_mYx_XdedH zpNhD#lC0_(GuB0R%ge$xkk(aO4CwA@*<{R%J%ta$w#{1LYzh{Pl(5Ho*s0n$G`-Zb zX*Z)}^shCh|N49m*X~2ZX{$*S_nxC|e9U03>#<XwJ z=bVmq?2QpSHZ9(HDCREyBP=*7bah;XuQ=bIcBw5Mn;)2<9k5HZ#de(53;WOXD0(oL z0>6fZu7>L-TGP5gXNFa~$Q1b{)53sP$uCjE;_D(JQd%RxLW9fYR4``7urt~KNBp&Q z%-rPz&~=|>QA7`1y}P#v=>yKa_{^N$!5fI?g3ZJ64Nn|zF+{R@cbeAW z?d)tQTallg0S$IoOMDE>L_YhyJ#ENyt69PYEGZskSVhTMb5>O}f!2_*b6fA|89>?JX{%M(=(6(#8HvV8nD*G+{-OA6?-W=vmfvG874tYDYqM$RL zsiPxU2}BndBf8S2SOs?FT8v1wwCoT?O2?uj_Pw*VuC|rWP?41ST{MQyH5F{h2Ru%+ zGtom@Kgi9YeFP;+ljB>$t_3XmWy){3tF$xGBX_eNYaEy8lbN%|^T=3JvOL7Bt#S>J z$p1a=N<)x!!;S);xQy#6jR&Ne-nSt<01KUQY6ef2K4v_i$}uo(oqd$`xOL2e2!5@D zJHB9xw3I}^Dkp2D-!)}M8~DwY1HW1$Mmmf!Kxqk!zc=-DXcL~SwE$A|iX>p9Ev#vx zhEp64d%aC$1Iv+KPQyypP#rv3Ar zdA~e+#88T$X3L+#g}iU5cfYFN&aPd~*?F-u0j66;B{i#v>x z^~bj_?>hIvwJKY5W-8ZIDd^gvgspw{8n3E=Xg}N4__Bh?<1JySVB@KqVpJK)6UN!| zj2eo)GTP;=?jxHH^`~^}T<-mw*5b<5afK7T_itM5e_b7Cc;9&B!^b{(^t*4~e(YsG zzTRol)ZhHl8-9A#|Ni3-vE#Qy_01*y8Qh#=&9@7JN6C|lHAw!WypC{Ev>Y^IxE#OM z0ygFRm_}9WQR#EOGTMM+-WILlpG0p&M&3QwE3wIt$EugWBdr`2WGr%sJak5hZx>mJ zbfLwS_-mukPpE9thalON{Y8W^j}$GgMn6>c?2F&b5;{h1qqor~c9$tr^(xZw z9TD?gW)JkxGfp4l768y_08_qko=m+4=+t!CdyYQfV;lEPOMj+@Lu1a`4E=U>25nDk zd4f$pvY^NPtlnX@wXay&qTO4@%e;4?pCJd~T5=FHdbon=RoGO1@M{8cSFEXRCi$#( z#rkpuNc1o`2PX)!(s%?nRe99QdokG!dtxN)bok+cXc-FQw>3e0-uL$Vgws6C?_S?m zQk3H{Wf?+eRi>?&BWLfz_n_B zst@?Sx^IacQNHnhiU+dO#FevMEGR|r6s^)8U5mC$UX^*1nJff#S^qnt9SSFh8N2JSNe`N%~#j!TYHk=YRf>&msH9HFoDFfl{n1N z>Vj*@nxS?l`RW+H8TXBWTlSCU&#Z|2K_9NBD5>hknE6ZkbsfVBPb=q=yZ9KVe0Jgx z^`5sx8+s;u-4#o+bMZ$>MlHkb&2#PDDzkZ6ORRb61?)?-h{T+FnwBKcLB5?B-ipTr zJ`B$-y>rK+Z7kIK{jks=D+T6wD+c+}UyR>CgCQs=Pu8;C53Z50a3t|F!^A}2(&gqJ2sBzi#PdU3G*%_V)psY z1?+X%6taBDzIpPJ`o2y|I6v%pTeR32vQIDW?G`8(%VA$w{mRb+^1`qg=r=8&w6vZ% zw0E(piO9#7|YX% zZBy_y^e=ENy$U)}L)NK!t?g4?b5_|{2ACkMZ8+=8r-^)5WWn&(m{TJY=KOe9%rj2g z72nQ@{21OL^Njc#IW7G!-W-#Wzw`)d-{2ROl_>7ye5}2}BP6NNi{O7p<9}=4(xoJA zyNKji3qiBO%ZXI;>bLK2lIIW|1z$4~p@iSszgJ1tgWguPtLKbxawJ9SVrX)C4-FEI z3ip(CiB6MM;>Zbf8SCZ93Uss9f?!HM-FI>SmMy*WO86Ac+mnh@deyqZO7Jp! zY~Uz5k;?6FFW&W~lR=a%+6gYYv18Bi8X|}B%QExnW5=T@QX4S4g@^( zEDO=}z`8QC+79Mw+QDlT{UA@Fw;T&=Bl(`~@9z6T7e^0S>8TLfLM}n&=&ZpYn?THmoaRREfn zKj(rNzoO(&3%ElM&|Vh3wd)Ii00!DEzgs$RvP}6-wuIT#!+&M|>=Zm&TjudFBCILX zTYEALm{*krxsTR8rIX1*aXqCpJyzA!CtAVp^k4dZ_=ZkduGg@RPCCD+1DYgCg64(2 zS8KrFQyMVeJYU|+S9((v4PzChv6ebzZ9QuIizB`CY9lf_~ z_$GHzW~*;g3y8HKe$E_easB<6@T`I0`8KtG9kE+%?=*jz)R^Q<}Rp%0;?6Qd;;)d9C+?mi%XN#EvH&u_KN*7PTXGI35=TzSXROmtCVd zq@FE!^z!lOo!}Ldv+k^@oZoPLvXMFFNA$>%xpux-AUF3KlUHg-jL-De>SO3s)|Qsh zuMCepXn4Mho?Cq^trqY&W`|_W3iw={EleAA6j|_|!TS1M8(jm3!{{2PFk+iUtl=d0 zi}$AY3$5pV;g=!kGxV{O++UkFJtv}j`!`(?(Y?)^Zr=3#ct7u<_{}v%0I!bk7xvd~ zi>M#(@7)|%E}h@qyoopd?vMBR=DU3N$F<8NPIz;`BSAPR0c{mIAupkRmp)(l4wZc| z_J)!>!VW>+puI}d(J2_#hsBS_{6#6P*MeUSZ7igpWYX{savJ?%(+SCrL|TnmjKy#c z^c_Cow5Cpj0M@19?B`Mo>KezkQ!(#Xa;E~T^i>G)_N%O;Ov{*Lz>tE zXl;`+Ho_CN_TIuv`?oEFUclNg8nB0ci5x@MU~c&H&?m^w6LxpTSfq2v;$2_g-5o8+ zdyC$Q{YbCia|&0(6MyWF=RH$+K+zDT^(%I%w_#Zal$~n5I`zPEZmN?JR$cKd8v}is zm63;%d}hYJ7F1G3LRb~75|6BohTxgS-_F|jU5mt6$OPRNtxHo7<%pVf#sN_aRi&e) zgC${?)0u=T-i>W-Ty<`Tqdn_h(3LZ@{6x!-uZuA;0%uFDbWe@;uZx~pSFjiyD*oE$ z=;C_Xks230LiP06TAsC69qoM?t3q*HT7K}v6X1A?N{BRDuO-sH{vMpN6q4rYjaKoU zqbrq9EJs(i{-6-;6Rb~mlIC&IiJC^vQ@dFDYn$B-7v+^;rLB3<8jl8xbL2_E(~{xP&GN?f5C zmQf90zggQzBdo2Xv=)|K59|MG%@#neN4slx1(lG=W~(z!+zVV&8wj=8;>?^qbZ&4_ zXTS-gYG8hwNzG=UjX zB;yU}1j-~JN5W^!+}?dIoV51P{9dRNTYGdWI0F~BW( z8eokqANpbzj%k3m=R}KB7Jy|c>z%qDCw4-ks`UhGALmG=)?o904E+uOTQ-i{Bl2cYUGjQtfS99SoRsT9Y52q zJ+xG>JpS|29$>d%6}~LA4RHY77d4Ha(V0;R))v_`v_rre)vJ ze{J1CFVZ-%iOfULGu=-sJM~Pqucw4R@wfJwwAnSL#1Q?Md)9X3`g$^JlXF{Z6_ke#&!M7ElWMKNSC#IM`uajW7j<< zbY9-2lJE9Ff73}@Wc;smyir6?Y>VuBbhP#vX@L8BnL7T=dA-J~6MV+s%Yu)Sj2`*@ zc|X)s<2N!I{o=CtwoGJTSkr+9Rr-z>>w~(B=W;y_Jw3dPd+a?k?R?hP3Bg_Jgv)wj znWJMDJX305<$N<=YIz-u5ovWbwz6hpk=`~%Z&}|UuN@Id<>`qZ)U_6}hOp5&KNw3+ z=K-RR$%~g-AY4c%^x!Yp6VJGc)A_sdEW*dp8R1n20t)`;^OtX3$Kot)$Cc0xh~sy? z?qSc2G!g&G9o}kjNC0PE!$r|wB;&zE%6#}Bkhk};IH5|uTIRyQXAR{Xd~Pezt3dwDl^d z?DPn?cf5SPk~nWy|Z7h zaqSXpucu#@K3i9VFZSDxYjKQaxI0UlKiQ|mHy$0@fvS*^q)5>xg+^2QhRAH?YWjz| z?wo+&y>*-8gIBW5r$`L}T$Up|*{3u@>oSaOOqbF1Qa3}(SYMlw?vbPAsW$S9_L8w; zJ!2^64~+Y*1e=?Im<-pCA-oJmv4k9#&CYj-}B?U@j09y*+=C&BB2S@2w>4nKbP7E zvsZ7Wcg4KeCwguVE06gR!>{Le)l&1b-eMn6P;tK&wdTT`{-nA1J%7tR$LQ*4{Ibto zc;dN>`uXh+%_IF0xhkw^`ixp1<({}JAB{3RYZ|wI&NNPqBQ$QG77`39UcSF0(SmJx zbd?V6n{ACvSxtwXC{OE*x=6itEW(wE4o zs+;=t<FrvJ`PFvX^83LUhm*H!;&pG=VO%fr z$fWh5d(uLwt(^RGl7DA~rbM2jBDI|4@|~d}T@l`?i~Hyr9xTpu8Tz`O9CvvtE7Qt1 z&w76CK6-MrO_Z2+RZm9Cjw$-NcE1y|tH-%_sd4gF;PlB!%PBoz&mS69Fh%KE!4zO8QBGSBLplJE8{K!NBM z@KUnRlPlI&;bZJ0KZk`=L&$;}UX^?s`hyhVb5yU?A<+x89~1{ezsZ;u``b}Rv>iro zzm9%6?s%Z`|BGiQ57)jMUqQ0xN=SStb!$^NEoHShVe21(KMtce)NfmYkvD#%w>;tC ztV$^d+kM#bBt>G(x4aWu4n=;5bH9=YgHLkLgmokhIs{|k3et|u7$gH0XnB&Fvv5*6 zwYxv52c3S*6DAHx|K#_jFD!ke=+lgZh$T6C)`2XcGBZvRe`i3Ju^iLsP&a8YRIX>c zlFFijcH8xABcy2doKT400K0)1jKw@TtwH%>9%pM4uo|qLvwxJ4X&R+n=OdbqMgLQD zyZ)K7!gzc3#i5u5GtpTBctrHhH24U2Onuw?xS95~@)ZxwS6JR6WUKrq=t|Zj4#jsg zEJf~QZ+4+aK!2(mgeIjiQiJ4?m=e&z)u&{nY&PhH-O0*nm#$CoXsN`st*3fz*4I-R zm7~e_|4A2__Q=X2$|vbf?*Ypv%Z%ZnEwzXzl-hVp@o@Co3LCdFp|M)OD!ByXMJr#1 zzo3~tREn3(QbixJc=G~fTEb~X2^aTPfG9ycp*;&iV;+kzq=ey&73Kt2LU$|ATL2>& zao`vGwmf@b>Pg0#Px7mL5?ikH0^(a`tat#*iaM@o=kraNSpG?P2|GehQXRT}9N2lI zvH-w{{G-w$9?D)xt=twQQo`N}W;eybhEG1wKUZb|Ec+xLDeW>SI(J#C>9rAGDta!D zs41n3a;!U2k}?erM@lYl4#W#74T%t*}kt zon_YGbK}~2*^Q<4CjI9~a7eTZJQ0ilA2D2|^`0#&2W`(=BVCIT+a4jFhK^y6FS;}P zb3D#=ckd-kPnIKQ!&7d(!&^%rHRNl0Ud~MIm0PdIXjeSpxI26g++5kqIGwe4e(=O$ zMBJX~>tbH$Mm)!iSs6Gladzou*m+38lx^q+Yk{kb1S7qyA4#Ivr*wW?M>Z*69qsKU zCp_ZP0BBwB9|zJW^H^SxT?sdo{1-QDy=2%qrBBRwZe!j?ipyTwNOZ1GPu{X}w&!IQak8xonS&-Cj|@6cLkpOvJ-*Y&K>WccMV51(CDHyD!%!>qJ=w#-#;2_z~^wD*c$t3sA9 zFE`b1%0Hx-WGx=gvQlL^uV?GsL#wgZ6TfESYMA}IZ@#|PO@M9JS931cmoX2YMXE3J zEVMyfq>Le*49}_kHDmrhH1ztqb}bPoBsbM#L|eF8^GRFZ$^*w%BH}>x8`&dN>mo7o zy%khV?u=IO3&}HvjIsS+XItdB;bx4(7KLmrbO*0gn{$0bKL#?>iP%x?0FNibN~2U{ z_nscF@GWAGjy~b(to==?xu9vlPvH65QLVPUEAHACE1Z?s<%*xKvjTMj^RDRIHLFMm z>^fDC;hP~Y?Webg_j(xH+!J>#o7U5q;IPbEQFS!6*5@^>0$_bznI=w{`AiS>Y2`I> z-l#pOV3_qn(k6`ptMszun#4-}iir*~s^2I|XhA-*0JEIDppBUg3j& zr;hVX;mxVPvjVb3>$>x)Xt4Q%xx;u)#u;&98n|SX-rLJrDnxmPPa{i~fBLM@*e(m5 zwA8W63^s7KC+^}SBW9g&V6ChtcIC0FVlNI@BEh-dLpj!Z=4w9?npf6mN@q(+^iZFc zBzjEvXwaO|%gJcuZ4#=}XuUe}%>WOs@CUWJxHQ<*0$9>!JE_`@8D(R{zj>%TwEmYS(CEy{tzqwXczW zPKH_@>eHf@`e`h!x^J#bQ|d!~daQ5L+0e_X>-DIxNO()kvUCnk1rME{?9=TosVzrZ zFKwYkmLq*nd22P(^w%av?6KwP)_SD>(t6~#c4+IPYwbt%GPXlo&%`oTAlPbcNbJCa zAqS8boMq2>K(FjQDY~M!ccKjt3>s&^^%a9AU?& z%-qwXj7D@#ucKfeWkzOMnamoL7$|cZhO`5}Lna=KHsw*pqVC5L88ArYTK}@1oN-I^ zX?(3z)jQ{gH7kG1V$O(tTbl)?w0RWR|E0gswBO2?v=`7tq&G@~(k$#_ZngGfbFCd{ zG$Lm+}6YtcU%bo+e0{`tJF>v^sJuyV(i(=Zkz`YWrOw13vqWLZ(^&f~glsXH$6{oskm z4r52zbHx0|bz$%%TiKkf9lw13XZF5KP7UE5Z?}XT%2RFfBtg?}X+>!MkBaB?wyoX0 zrewVoA1J2{A`P#Y^ZqeQ|M3yKXlW{$`)}PP~(Pkd{_{X%vY3bAM z-&V`Y+7jzoDf?P2t=3k6Eb}+{J=8K-3-t0`{r-Qb&+m;W82h(=9?h!ke_Z#P?tl5` z$NLxN+Zivb?VZf?*7ugz*wlKhvr+%v(l6^aM!&kwY@QWQp*f8|FFRq(4jj^dt@UYy zC!_bZnw#2KR(B&q_mY@RR@^(ETC>!fCdP0f8)qy&yK^8@Ex)!!bjTSTm(Jz?$vjVW zs=YrxJz;N1C7s%$NHm`0ySlSymxh;sQ*H2r5&3#m_uVrx5Q(}$yN9FV^y=6@tNmU3 z-wHsXf?5&Aq%AmlNHDt zdeK4MM(Hb)ENo>N@aZ>ZC7=f4yvT6=t+jD+b4AeYJN{4(G}`ov6e~E#j}6Lf64}l<%Nj zj>BqiF7`Q2XM>?5Yz{3>^)S5il{_iwi0tRQm%F>&n^RgE&!m=_Ewp=c=t%?Co;3U6 zre?9cFK(&@$*OT#$4I;qn!%W~(->~sfT!S&?uHGV{|xP!x`_?J675M{lDsk-&HD01pJ4{^cqSP$3P8Dso@-0EWV)3PdO#9S9y zZc}Xxc_H<&NKYhoo~{bdCWZy4@TsZ%GS?qUp5;9d?YQWj9a6SI??`$}p7tqQ!*D>f z3}ovfPsXAaOeL~rr=ma}%VH_0EFnj3+c!ikuMgmn7?;JYM2@0dm#j+=_iZI1GN_!d zo=!gjI*@%6FP+Q6Z=OEZlZMu>QXaNe-a~1_nkq3zXbg#ncH&c69tw?(%cDFSLgZ`hslJ97VRVzQ&+uOPozhYha;MVvwbG>!GaexP?#O zQ)|mTk8?dQ!BiXaAV@C}eJp-+$Z~5tU5`6G8%C1Vxpl2iox#;SY;_P5q6ZEQtxCE@fv?QAgb@eJ+k;d((grJNj(ShwpnY===>KBY{M zRhFK$_1j_WYNwPfw(dNyww;G^zU3I6UmPm{mN~)PzESdSkyvOM&hXb2a!#NyW#%I9 zsY@b5aVYJ^DUMbb%RBs}MAmhVIjdF53!ayjQA-S{yXMJtJ7D>tw!{ANxd)7l3<-Ir zYoBhJvD-%M$Fe9Ttk_GE?qC>G` z(arF$B8OZX%!x4Qqj2)OLIR|n0Ix<44*dWrqsv`p&Vpo?w@Wg*%}vrNu}Ie`tyz*| zk&GW|&f`AkW!mw$@sX~@n35w2Q_QjEO3U)LT6>2FFFwC^oEL+q@_khBT3SYXnD(o& zqO5aSKQwH~7KU2l*O-THs-?%o-XwpAb6Ky5$dArR8`H~y;v{@BeZ;36C*lpRnHQTa z!P8E*B{W%OU;I;yX_1z{h}X87etC*M^HSbwo}oY98os15kD0YATOyYxTjJOG6B_?m zOH+1(q|5k-;JnC++IE1`m9=*zUm4z$9c`{+5B4RIb;0b0(Ag5X1;e}6*~cpSO1`)_ z=OKBi^wL(2lfg^h>+9~j18Pin$8M1B&VI}c0&6GMDy6GrCV{!AeHFDu+{!2XCYq1A z-m*IL7{`Mfl$zMGJa23VLNyO%H<$D-+DnRGr1gwZ{DGcM%gWlMFV1{GBDSYojn~m0DS6MDQ0vV`dlyyM)0i{>uUCC9l2YvxfpKfR`^w%dc?71Vd^tz2=KknA z{W-06UQ;Zi`DVs;^u#_wrnaXsV=GA7X5=$x>eGlF@gkcW5ApPgdc?qLDh9*67gUwU zuZx|@nwRJEvEq&r+W#iLbuz6zIb@W zQET);PP^%iZ^HLCv#Qx1ZH;+>PmY3@rxLuxa8_uf)fMgcHl5_kT7#mh9Gj8Kgykt^ zSM&+ZpchHHl$@m1*H@z#>flYut&B+wmQjK_HXt0HHCv7gw9-M+rIt1JklS|17k6D@X&Nd-SG(Y|T4__^^!e=KJ45LT{^d0@9jt{Gv3#pYxRz?vD)-##vA)%I zjVxuMDXge^4)t%S7%oy|mi;)byD(SV=6G>(_i(}icp8#YajdrH$gnUSw_fAX|P#|*k| zLwESt-Mco#w^{6Q|M$qQTX}f=I3qr1%|EmFmrva5_P^@xd)98h{n(2R-f`R7?Z+bI z#k;p=;d$Wi3UJrlSNu2Z?_t0d{ry(gtvuq)hj*vN_1~L+*5cod-I)*nsrYyMg~$K2 z>wY%AJ+FIa_rmaiJhOYj{1>_h5!QR=*EV#s*{3#c=>F}7`{Qpn`&|6}>+Xy3ch-H! zDI2=gjT__dM>qUoTsfut-T3>k?o09aTW4R7zehKIEdKubhR?*`k8Sv9{C)F=&&J;; z%>Fw5KD_&__+79=LjE z_oLl=yZ3cxcR$sg(|w@(`R;?=FLl4t{U6cZ}n*=e&gW@pVFGkfgpiL>)&-#NQr zwrRFy7Il=f?XzdicFy+B_RlWs4$ZEeT|c{d_JUcw*=P2$*(+z?JA3u)-q{;w-#>fX z?CrC6&VF?E-r2Le_sw>9KQ;TnY+q!*|NQKOv&*|rZ2Ux=&G(6okLkZ%5?K7i#-k5= zTL0@48^3M#iH&FV-=E#x9FW(>XlLdPwRdu z?$F9=|G6sqdHKdor#!MB$K(6Im&D3^V&lJwSq z$HnJ~@mYz_ljHN$_yi~Tk*CM!8S&W~pNr$OEk2jUXGeT?#%E7__QmHp@i`Qq4c%8~ z-?QPq`yM;%u33rCsXZ(fi*?so~&97V&d+6-A_wDg{dedBnHb-tfo9K4V^LnP*`yLQ7Zr||bD9>(7{Y~k-a z`oC9gIzk<20|NitIa^r`&`@4bjYd3tU|9gIa_sst97kikG^?%>d|NWYt?f(Wr z$5Xe&4hn7>pYBD6&fd@++;DB+CVt=l*{-`ah8^qDtpM|BVBY-CPQV1N@BfZdx?8z- z={Jra@6NpaYQBFdKF9ypXI%ZTzOCyvTpn=uJgmF*+3_#;|IgzAd(j8pdII)m-u~@| zjdi;JLmRqVW377FQ-S@`KYKc`{~zt%a?`nnJsdFK8tq;m|H95<-B)(SC)Rl7rumq^ zBd&L^`@$c2UPlA=J@a`5=KFd5H84N-)Q=e^B8T^XcBXm#&Ob)~Ke+ZL`v0%-IsU_^ zz1IClrs@5^75%?D{^fpf;g#3T+q|D~f8_Mfy3IES%p(F<;Pb5$FmEql-Z6*ybJ}_S zOFr#(-W@Pc3H;FC_1ydWZ}|k@fjjvcOFy{L!^EQ8z{y+A*zI~oM{))4I zz_7m&FdG9l_RamsoBN{gkH+WY^DzW%b=_zF_7NV#?*`mY#JbS$zvkYX4(HVci}cJb`C>9KGis{)NZ>ck#^U=J@;GxZi#4 zoj+i><6k-V7u?4`2HbmMJi#XW@f-#AJ&$@PusnDC>W{wNu%`vg=VG0|bq)(C{{hQ$ z$G@`e-G+U1z`P^Y`kXoJ>)4B*dFg&&`S1Aio_dO5&kdO9{MIMMzo*2#{~mJ-X0YA=H0$ISu%*U<-fxNr^=_^J58_JA=zcmcH0{qn!3tsy_SBH%6x zJnW8txqo@IcjdgzzvQ{!{!q}L_|R&=d}`kBwR4!*Z?WbddY55t44Cuh_yxZ^+mwG(?W_SXH|V!m&h_xpip#(V4|@%8xs{tM6d82{&hVUPXL9Cpzj zdw0NW4A}SbZ?yBe80TB!^UnDE#C*)ZMql?__+gLvUj*zubN&(gG1l*vzXVt4eaGK5 zJHzAnV8H!k;Qd4KFZX{wKHb-M9OOIC9skp}ebKNV4VW`y9KSXK8$2Uq!JogyupbYY zUx;@9-5fUfSrEXFf7N{)zwy|$hW)*O`BJp|`*Ya8U~Rwl=${0Z=Z^pQZ~nbuKOHcS zj&?s2|02(SKIR{yapnJt&+o+N599Nv@!{Dg#Hah&cmLnU$rs|8FV5F7`L^JW|Bqk) zf857^2{?H8-^9PP^Pi)=ug%;1Hrl-D=m|W3Jz!!iw*q%-Pt$MdWf*YBfAt4H>NaD8 z-T&xVk5l7cV4w2!nB)DQ{3Snk{M-+2G3>Vm%$H)0XT`tp)Z@|jX&btgc)p+4kcOWa zaNds(qutF{+(o;?{TTA({y&Z}JT3m^{`>z&z#cs1`}xju$A9?6CuH6;0_N`ncIzBA zK>GiH4Y}GKzwCRSQl19$w!Z~URh`{IE6 zOpM`W@h|t^2<$uFeVd;zGo+J$88D`kMY`E92i%7OkG~TCGSB;>y^qe@q}%SV zU-TR9H+)L`TsNbCV){CTibul^kiXQLk+j{#*UPc+qS1sjBipjvdlHXJjvY~C*09{NJqTZA-}$?d*+95j<_1Yi zzp<~#bo%4_o>xX@6L>3W$0ul+a$TxD8zRD$e9`j92O92aa3XM9Xzta*Z4!0v3C{K0 ze$NcUZ3pLFxO7O4tuuw2eBNUsSMo)tpZ>Ywc8600muuSLej#;nL)TY@EBT@mFMG;x zamGF_mYe~a+fBF!Pv$bAkCnRk=Darzmxqddv++SDA>%RC2w$B9S_8%u;d8)XFak*a zPej(H3i>klo;`tlZFRfM*PN5#sU7!}8O{_q3w0anDC3|a)zqYwkS2Yw$eu=ioa5+O zAbJ+o&zJb6Ao^0bps{%#c~()r1%%QRF4cKX7ujXauQRe4{Ozl+ZCj!_9pJ0Im%VH_ z4EpxvaLtRJCq?Iy`rG7Kc+pOkuNj@Uz}pFrcCb&40A0 zNn290``;?ZAA@M8^5>1rd*St>9QSLPcM4ZOD?BXR$$f4&+(+RohPy>`|7skw9Zm=? zik$1K5<9s;hG`(-7q!hi_bXNVOZsBB9`}fR>PYVYt!ZG7Z8n08AuZpgmCEPY#UEjdjO^o=&8Rv~VpIfV9&WJKU{y?57^H1;&QI1~; zCA|(%t1dp*&nfN@M%_`Bu$>2_+dv3mo&ak`w2+<}*lGHKNL zJ_h2BUw@MFZnPPSaed(b=)}gcG3(>-a$khEkoGCE zhD%!W+F5ek3PkJ8onw6TD!e?(y@ycJUq;?rTBdiub^ZSV96Da7ANWXf;`;&GNUR_D zQge8o#_www>bi2ig=5A^g<{)*&sKjKE}1j(2Fr*prQ`H*P6opX(! zPJmxQou5P~#W_Xii5~-UoyW?SEAkdDV3>8}vqF1#+bLTLp`^D#US}=S8N)95<8tG# zo^Yh@MQ<<7>B6yETp8=v`ok%uzJ)VLb9zX7TAY54kuwYq1c#HUIo@-cTQ{TOB7+lA%gO8IksVR)(dHG=wl=Zx5M z?oxO^P@mTkO8PpWnm3_OR7&pa(a&0O>lfRygDc>Sqa3#p%JqIVx^D!lv<>lN*0u0V z`*xo9^PXxVa-A{j-5;E7!ByJ~*Ir=~2!;Vk3&m9k`OPJ;Bq z$qyzN&RF5-zT!O1=_PVPKgO=LiE!llmNHx*`P+_dAjiUsjz59no7*-nfOi<)R6P^cg@@lBCzSL%fq70?FWju-`WPQ?gCoxg&uOl|FOhuy z-xOYf6N3Aygrsf4&L_bOV2`#r-skVb{X0JY1fKZ(0HN6YA@aV|GJlsb^k!?E@x%9` zU;FbX&EdB~ZX`Leam-;j-L$XzlB7moJ6q&BV})&NQcU@+BRyNZ3ni;lXEM?v=*=>#tfuM451w?|%gEi=9@dc*lUbukd0)Wr}jGYxq| zwaobTKN60#f6?6vsG>W$-}49yqPt3B&!guFk2aa3WsX7KL@o1U$(LGA|Lk5bQ{Wgo zm&kQ;Xs9zzi0`{f;HA?ZXK0zzkT+Y)>?Zxn^81-{ab=dlF>U5D&DkuR9mmF=6Rw1F z7QU3Gv_y0IiTuyNXx~aWQcmet)aX@A-RgVnt}&ZTIX{Cpk8*xNDCz#+CnR6=!RKPn zAm71}-zR?5+`syL;tx2DD62|#`>v0%^DFQRu#(;DJyrZu|LoYdaEHK= z>t-mSw7av=-5(6sHcTf@6}`p0yIap=;qAcBB5Saug{{lvSa{Lr|7dUI=E7SBFON{t zoo6Uj^J|kYI=3~qC6SpOEE1X6TTCc6oQLkophVk{CeO|L7BemE+AtTMxz;b%9Pf7> zm$MMgLEZKjX-@p}(?8*uYkisKeC)J?`&SxWH^DiJdJ(&ClC(o>oaYANML&4!PE&^4 z;H{$1Uq$%uxD{~3wsnM3-doUpH@H{Z@TKTkf65GF!z1u|>9+Bh=Gf#@ztr1fI9uTy z)@^yQel2$IEr7F%wj_R=qB%Q+Q*c`B9)2O5E%;x2 z;mkAc&cTh`yWmB)4T}9vG8^6v@a7Uqdb-HjzV=;{FWP2Ng7NWXaF)Zpf>8WcitdZS zmD+}a%)tvbHdI^rHuU9l@x%3$Y-^AMR9yn#X-rv%ko?_4TpKdd{-h;DI+p|w|;-3XS zg|kJ=`CN0J6q}vjRouS%8#p`Rh>x5yA3l%g9yjeL(vr2Wza#&zTE<{$NE=_g%kWf9 zukVp(Af;+vF7kvIz3;`lOr0dbqmVf@2_?N;sI`-wxnIc_J-5SEhT9MhzZv8ltGWK` zQ}RV8w~Ng)oCrs*Pkyj;o}H|k%>9EV;4~n*;`_@p;hO%^8Heup`Agx&kAqW%hwQF| zl5YOUvGW_E@11~i;B=$C_xT&#!Enxkn?WegdmXT|2j~ZEZF67o^TMXFXWg-Ijm?gq z8_mB#>=0h`vZh0f?{eX-!q0hxl1?AOGg5%|&Ra_$n$_*Z zA2i%qaKz6SNr;^DuyZmf0rR!ZwTV|{$N$5$jYV)PbQ`=%b2dpE+}|^H-7JGcd2+?++QZ4lPonE? zpwiC$MUI{E!jzYAi}*b|*ahA~>ZrTcn}WQvw9G=u*X)bWO zPqfX0+ljWXx#0^vIM-E}we6RxX&q?S2`Q0iy^x`%^t+Jx{4OhbQ&7Nz2@TyhpUm__@WW;F$aQGny0s+u9B|rYt{5T{LRW z81Km6)^@?$Nm*XgdY#|l_C8coxRNhgJosW`+J;}H?hbZK zH)a1E-X6*>b$3v6vN=|v_OlJ=J2<^)Gs5{%bCQKKx;XZG)$ee&YB_&u4*h$T-}6JY zdB)&c5xcj_^Y5xNo%@vVq9?o>HD#y;&!!A@38f54wNBPI)$H znfD-Xqn3F{uAPEfr<<~GhBI2rJVnMQ9a8#=od@KaY;)y>M&?uSWNzUZE%R~YJ*#EL z*UQUrOug*ZocQ-o-h{JB*WJI4!ui0*`ABn)#WuC%#@MsV0XSPJtJLq8n$uLuxaruB zOc}q0lc($VcuCvRE;jG<3u)3{OPPNl|LXHld_{E%OeI);uJ~k}rDMbMG2%BRKnMPsb6;wUTW@~zR`37*tZ7edk19(moh zOlK}~Z@qCwW^XtPX(Qs}G|kBo+qTQQ(e8CN7)~SIj=VWDzC4t6G%Mv=qjxwwX-C;w zZwB&4X_@iwypM;25l-Dq7kxL3J63Fs|9y25Jl@C3DbzA2Ag@TvjK3~R;h5{vX-fyM zcluE0y7c{)Hy7S|bYHAx&O+WLT4wz3n^(dyZF!02{3zGbj?gE@Ki9!A?aV)KD!k}v zZN4!6xdop52E9`2y%BkLXqoYIrsZ(VoGIVuD7Cr$2S(q$q{+OL`0JqfE^iX!CwFeu zKS%nI$Uxs_tc9SbK%*Udb!d-t3D zg%^JxZw7B6b#tX^Vbaw@PfY=-Ft0C~3>%Qksu|dCMDm?!?dztWLesTn%$Qg>f z(OTx4;t$`u@;Pv@(W%FYnsbS8!qG}o_Ch!j%_-8H?xH_^0WNXFmh+sv zdFLB)EWbNP?>=UM(R;JV!Y3=V-n*oXOBzRnyBkEm@ARVK-UX)#Wm%)S8>Fw<{37!b z%sY`U+BH8mFTVlKD)evs8{ExsWKR5X!USYpPnm8572rYeBoH0m*u(Yh3-HtRb+l7+ z;=dVq4bFDmHoUR#k>3pb3!aRF-z5}XZy@gjEpx8iyYo(*Z+!b1oOiYVzt9}HhSc&O z_}$mF?GPN(|2T7Usb8mwT&bt%9d%AKKK&WqVSM_V*84s3{?Ibx$63T{uRsGlt$;`J3n!UbOt~8;ss#;VJ6938AF>-zAiM{%4A?$fRwaMkv=~ z19YDNT4)>gN}JjDdF*+nJ-mJRN95+n7};+^c3Ws zrDeun<7seAxh!dS2fkt)&2KFrI{D(Cjm#nN_TtZ>TIK-c4c9WAIsDQOc=mJaXbc=P z)*q)ik4afpei|EJOn|eQVu+jbHRo53)#k@uF>dNz^C4Pcyd+j_tquwD&UJO zuP?x-Qtw&CEsYJ=!;^mDCPLvZMcyr1W;f2&_7$^Cx$cCsU6*~e<~$+(Im&N3mGDE9 zZv&y2w^8T$SmgTNmw1G9GbUN;JQuujqu3(6=+c*W8e5-)myEop2_^k88|WZkPdr*f>?Hp(?+ejm;bUFHup=U9<*Lq_b~ zr_bP+-|)WB92rjef5STj$BY%e*Bs}1^u441D;)DK)?v+wZ}-9aUb~lfrB(8wHsXu; zaX<}tG7hLsDCr6H8Pfwf_U2_=UmXX>wEN>V=VhsfWue%2FJU+lu6gm*X`1s9$Mnq8 zjIUY?N4NXOByIPi0isWM(UWiEa~JnI?*MN!_1K9}((eT39xeHzZSLi@7?=AGIC76Z zn^4+)TXc5;y|oST&vS#}nK5vN<~Vb>kq`J?+bwSv9Mj$$ALcc7=Ix#N-TN{R8Qo*y z(fD%CBNRK^09A0!b#fff&4<$se-{vnog>km1Ey#j;``-Nc&qjG>Hj7qzF(dTuN5|2 zOc?JgXO7$VO~@5+#8+2p?q6M-*TRu&^9BjAcNTVD0+xWAwapu(eKp(pt?}EPaOq#2 zHn3WAyfKXH+e$d4`nuboIe+Ej2jPp4A13^FK7JC8`1onfeH8iIwGNrXR=uv{T5#>y z38zT=ca5~=jf-igd~OCWI;HPrrjB2S_b$9Qwai_}`?4W!tYg z@#X&lj+t}#N^=TD&i+WEk@LOi)YsBan&Z6xw7>j-;T(o@So=DvIoq&btzYqj;UqL* zK3|v7=}XGySW?D&f&cfX+VGmAuO4B18*=XL@7zJR>RxZh!I3s}yypH@8#)z^w4u`_ zL}zjX6>bPl1g(JRS^(6-3vV$tr@;Mza!H!=?m^q{m{)Xp(GPBpy>HhY-ezQ|h7 z$?N+*a}K=Sx_!;ly5sx*OW~MtPfKnxYWvO;MR)vj?3M6j+_QvG(l1BeQY~|zv`63C zA~(Y^^Xn@#Cw_i?6`Vb~%+7lyjn3y%REjkp=&!$g$F!evc)QVCsrBBCybW4r1DS(b z-jiFddyPH>$MnNq+L7M?ZGk8E*Qd11&B%L3%Zz`Y=0z=2x`UTB$CSPdWf+wywJ`HRl=ebLyek zIN@73X5Q=v&56H%{RXEQ{uBHE(46?+C#{BF8~B&lv1idwV!zV{b}gQ7?5_!LJF@B! zN;=Q4v2VNNo*2C~F*YA|EF5{pZbB&6Kw?7`t`ANClJ`9+OL*Tgax8N^(cf#Cvio5#xLn-}X1PsTTC zgp%G|xOz@R@XNBnZW*5iMl zbB*Y^^{wZPo=I>H!Y$NX=N-tStT%BXoJO>*QbMsQ7h8(JEN#=1;&0zOBxUe+QU)oj z)1F7?ogl}LiVazRoMLQP1g`^fuOgK6%aHd^E%P5zIim}{H}!ENoMl?(w@#n%@N&r` zyy%11{97Q2_3D_vn9casZU+uy z)1QEEf$YR%RJblk<+v+o%yADw`c1nR=nHBF1_gTrMg`N=mc+5a!-+H1dBL3EJ%N{! zCI+`AP6`$Vi-Ow|cO>pkEDn|gX9Q;l=LRnhUJ_gwTok-2_|M?7;Pt_qg0}=$2JZ;o z6e8fpgZBqF1s@4M7JMSOHMlMKTyROk`AIJXCnW6*?h3vZd?R=$ac^*0 z!aKqDgG~}Y4DJtp7TllkMewWOq2S@rilpy@dlP>O{u(?Sj0WFL3|cJ$306rU+1ehe zW!1GBSnZNhlFkl1$r=F1Srv)LTPIp!>olu{)!J%n{ifPmDOM!0v(?S|ht)jsY^zV8 zx0PlMu$CkawlXZ+%CbgUW2|x3cx!@nRnm*BgqLp>SW~QN)`eE7HOo3FsU)eDS{1s; zns1d^mswX>KdCFNKh+XzsihLGv)&EeXf3yHwQjd|hVHahC9Jl}t;#^9wZYnGJ!m~_ zJ!-wFYA0;5K2lFv&sc5Mv(^slCF>Pyb>e9Cs

@%X-^-&)R1V4t#7KNDKx#s86kX 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%0AFLbYTZ*-ZuEM1tMr4QG0 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%0A5bgc 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


Ll4BP|E1Re(F0M7zTfER()!0W&! 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%0Dast_8EcSo6gip3a}Op>l)cxP9eqv%XUQ)wy4B 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�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 DQh2QI diff --git a/deps/icu-small/source/data/in/icudt58l.dat b/deps/icu-small/source/data/in/icudt58l.dat new file mode 100644 index 0000000000000000000000000000000000000000..458da3e69df37fc755a0a74cbed8bf20c0363629 GIT binary patch literal 2680800 zcmbT92Yggj*RKyDA=J=&3j`+g(CdWWd+#lf0D%xf3QeR6NKpZ)f)u5Lic*v!9YsL} z>nMbv2-1t7g0%bWb@t5c1MmBN_g?aQ*7~ot_t|^xGiTbFnZtbRm+(B6`WIj|85!R+ z9V$J9HW`&LJ~4Lau;kD(P0EH=tz4yMXjFW3Xk1isOk&;8Zt<~$M@7d}2yGQVxRNxC zN*)%Im{cjWZS3Hf_@tOnS127vCWVd~5}J|}Q#W*2a&ki5h={Rc$5u+QH?A})acIO~ z?=+Q$C69~?waPPhUy7I#WLXpN7w~W3J7%z~t@uOuBdYysdg~m%a?>o(;A@sqnuW<^2c*o3-K3z&Sh=H&+nYu+Jj${ zFR%3j-pZfXx`Ch4JFk^Fkbd|Q_=G-rt!ns=*YaAO@P|qjwBqms6AM~1@N1F^T5IqL zJHxE~_|y1rlwVuQx{9y-pp^9#pQCDND=+)Xn(eZx;1lpI@$=`ptZ4k2RW2)ba7uJ? zjoNV$gAzx?CMQND#v~1hjgO8QR|(~B9Xu*7E+QuWKP3OB4H8F_F)x-97ZpGB zzb!B>c0^3v_%11flB0$`SI5YhDrDcaZmK#50#NbNti6i|tfyxXRJmk4# z%E&>iIeuuD@kz-sBcGcwAuc5`D(?B@3pZHep!gyGZ9R6|3pZF|%+T0T@&9$B|9qIf zc))46NMaz`6A zHt9dyVydPWCYI!jcLquSmpg;q_QJlEbn=AgLG7bPKEH0&78^fgRL$ygtZw07sPTNz zIVPzw4~14b9$&owLU?KjCddXkG(7xT3finz@k!j_;$ouPjv5>l$HNL^T9|ZJD6LlL z|2BRW9tzd?nIWe}jjjHvxI0fW94n}*Rwb*7P)BTaa%z@zYD(X~|82hP)Z|@{IiH%7 zwinkEqvlS>%--3oj=sqd|J!`4AK3GSv;D>gHaw-tzjI$&R<|aNI;W`p=3S_IG>%GU z$w^jp%#f&*xMVA4dd>8wQpPS8)b6k=uIxsqJ4AUs7kM>FiYTVLJPY&Q2F!T4!I?*;!9{ zp4GWa+TYS`H^rCI*_k>!gDqO?+-2?W>9+gY|Ec|5@h;tKuFlTWevbCD#kbPEt~|2W zc2)a3y4P*yZK3;I*SQ(%O_$d8N|9W{EPPwx9y=Tg7KZZ4;FX^&Toc z{(bRE1)_rRABb0@Z5NdR^`WR>)JLM!=sQH^KE3 zs2EX0P(wuxL&fHdqTg_>)HWkTD;0-|&zX!GrIpGih*oMe4{^8CHU+Zx+eccbpIGf( zRvA%cP&Gx>L^TlA0M$!WFVqZCGf?wH%|opbwFb3U)LvABPHN-^ov2<^3~Gd^5vXaR zrlFRIT7udtYAfo3s0*mSME!-bI!mRUUDgUwD^L$bJw)a0qFVEIaan~#6++b(RU6ev zR3lVhQGHRdqGD0gL`_5O7PT97LevS=MNt<~KXq4g{M6lL74M-`@g6SgdQYXU_vCo( zrBpyKmz7ymW>j8Lc~Rk_!cj@0l29G{s4Y77aamJDO+h^n^#GN8F?_H$X6L|sDN6?GT&RMb;cVt>^yu|LO}+*%V*lO;D9bzjtd z)KgJUQCSA4EwT)7S-C~!Ms*a`5fvpW3Y8=(33XJ|QB=l3YTJy1IIcw1M70ss1{D#b zS|egyR&`O;QL{wNLM;`w6tzy&I@BIfdr%idT|iwDbqRH6h#K$C5at~!^A6?67F7ln zIzr__N4Ts(q6VSHiyDvGA!-Neq^Ogq??ru&IxFfdDtnw7C3~F9$|EWds=BD^s1XUO zbwq;8Dwn8KxkOejswS$QsCuXhvhN$95N2W8ipmv8;g}Uw992eC8B}Fal~Hp=%|$H~wGcIC zjM{e07?<_3sFzXii+Ue*P}D)xEm5~nXUD27&W?3izlr({bx+hiRNe8aweEPA^@*rY zPzOXEKqXI5t;rME`=U;w9*TO1N}8xzlO}Qx5%mDIdXmbmp2Ys0tW?d(E~}HMPN+Ge z=Ab?m^(iXd6xA=?6ds>NWkux@l?zo(R5jFOQIk=#Ma@QCoT|3HIMroc6Lk%BPt-ls zV^NP$S*NLfS*N+I!lDYJii;|aiWe1+N)(ld8YgNTs@+VrZM&HqMWRNa8osJ>4PSLx zZAG<34Hh*RHEFhLoy5ERxuWKx4vRXB`c~ApC~J=DXU*ZUdahDy=DMs}^OUMJ&t)|i z)g0ALR5#Q(QR7f=i+USX^fk3b(bqVaASxP_ASwa1L(~q`*4I_Pt*^VRFGYQc8uEt9 z4S9pdZ&52y+eK|h?Gm*MwP3#Lw_v`@YPCSARtsF#XQDnsof35lbw<<~)Qm-{-;6~r zYwTjB#xCX-6g3$&Mbs436;W4EMV6?3MV9c0FKRbxkElJUE26HTIxSWGIxTfs{YCXh z4H7j76)P$hbyCzx)MZhZQ8z{1MBNj050!428ZX^4mz5$a1+_`kCe+uWzDAuDbryAA z)Ol2zs5I2zfH9Z!w3cO(>5j4=PPm8mjaP)vxpl z9*spspsI?higJr`qk4<#jheVpZ832rkG!HTp^C3kx#Fu>o2V32lBdRbm5t`vbFyS7 zlU*-rJ!*rf4XAyh_Mwi7I*R&A)K{o8qRyZmih788BI*h1si>!@kkx9okkvd-iOP)% z6%~rAC#oK*wW!vpj-ooEI*aOznk;HE>NQcXp_YqUj#?>dC2F;()u=V1)~r^qs*Y#i z8Bt#MT1D0C-k1vZ>+re(%D*AGj-uVxDBadnvYm8xq|P>z?0m7Ebz6dNTTzrFQD#{# zEmP9jvow(?LbgdSHcspmv0d~iQ>FKGz0I_A98)q@p!9O>po?OrKi_na=if!?nEMjkC>^dRY#LF`DeQ^j`Iqs*2ud+2D6L<^+HJkf4zuJ{tt zW3-IFx|o{tHC7NKa|BEO7J7{4;ulJ8ob0(&J<{viSCzJxq^+0U>J8o2TH4&!qEI!* zVu||bKJ#^-;1c$l+equ1VtY!T-eUXe{;Q>Bk=Tr4-Bw%i{iH{Kv2O+NI4SF>EUSx` z9@E4w)H5y+-(JsKRs19N@le?=O3(L>Y%@qlXC=C%NBCX*bjc0WJ>Hbu3W>%_%Vd4~ zO%gv?_gkdLxFB(~*mrgA9d3nTQpHNi57FCf(Ib5*@i2V^4;4Q~M=9dNbx)W0q0&D_ zkMf#sdsnJ^U$P&tzhY&^D!PUmo^|KdEiznhwLyA6m2ESLc3bVm57RxC>Mhqv_9fkC zqxdCaV|C9Zy61YyPUIdqT;{H&+iQ5%%iNizy_L?k6#ur4Hc8t69j%q<6;?4qM#^Hx zVwdaLmWdy(_fxF+MtWZ~6yHQgjm0<9QB(1?W$RVU5GOON)-#`%Io#G(@h$W=&BbSx zTq~VxDgG^8O{8oerK=ezeuN%#kVJ73&Cug-5kFG**eucOGGcYfC5oP^=b9pZ1;^1y zsWzJ)B~AP&u`|Vv)+5I2O14S%iERH&Y?9bfy5CA&e{bpcue22xouGTX$L$#}v$m4H z$vXe5^m1F<#n%%XVs9xnQTKaW&+xuvSLrBJS{KNCZfm~yS<)j(Z})*jH6%)w_BMLk z*4lTXvQbi5cIlf_Y;Lh#^(ZrS-!78PAvTxTrDEIZ3fhX#Cpov(ReXLObrU~9_GpS8 zceNh(LuqTHM`-fJxgjIDLwO2bAr@dK;oChx~;)7dM7M4GWY|}<>*_!)CqHHroXMWSQ zZjc)K=xs0RY;TDRO4Lqo(N=t-MkJ428-IARocDdL&y5&PX`^S=<%rQGg z<_MK|fZnV9#m|%6T)pK-ddoeM9WCoj7W+i@qT6~bexB~%O#8jeF;?a%AzLQtJ(MW^ zHR*LwkNppigX5&{Yiu=M)Em;HgC4ED_?^1{4)M?Q{7=QdEMv75yeFcq%K1(PKx8AF87v+ykQYYr%A~U4U4()tr48ZP~T2XOw8m zu4f&3n7-W?>v{iX&&TQZc-lwl5y!|1@-R}eWxw{_L~Dv}9YNkaKh7sKJhG@yF4X5H z|LqJp=Zyn6R}8TmBduXD0*1p#h=Wn^ZP7?89-jc?U|+gOt319ORD=o;0hM4AZ5!cJ z*bg({6&m4taP7Z#KI9S*`_D8>Axp|A3^mx8tA-+?7?i181@ z5jYA<$t{Cz@E-eUM|$djQ-z0wCS@k`67$pZSIiV&rh3pUprJ)jibI>OOT@K1ab;wFSH~GToB2bjL6mc$e zZpZ_9p$Yk%`KWXAIaOz* zr!Ku~Lmj9GZis}2&;aV|3RSL8_?eE?eEyMQpBq`l=Ey2GM^>>pvWop9tD4=OH`AO|J2Pr@XGV?h%%~Zh z88wHUvFrD@stVM;ab}#ecvs=<GK(Gh?qsWxQ+g zw))p%W}LJ5*JAc@&f;H-J&Rh)lIM;kGgdR0v08;0tI^F^tw6e{ZXI1#XX-an9mhg|m-y7Vk>z zKK6at?MZrJEoR1^#mv}iF*EioX2xEN%6Qk}ZS}9k%s6N9uf^=+oW;Kudlq%O@aW5< zrJB?G$mGnZS)3WQ7H3Ay;>@VE*cp2*{#Nf=oEhgV-nBUUIA`&$#XF0AjNN?Ub}=*d z9y2rc?P6x^J!WR?+eKx(w~M#cyB4>{%s6N9uEp8MIg58Kb|3o~i}dX0xx;z8m>D&T zvyXkdn0@R$W@hZ$MPX6#wajJ*~! zW6xq{?6s(jcP-vl|60t9a~A(v%s$Rp{A;mivF|VYUbtP%j6I8)vDac|>{-l=y%v@6 zuEpExUyGS>&f;H-*~dAHe=YVb_Wfnu3-=c@qh@h?%#3}1F*9lwXCM3iqWXC6FW&y% zwfOt1jB^(6TAY2Hvv}8H_wha^Z+c-ZX2zby%-Cx&GxjWI#$Jocc-P`>^{>UuIA`&% z#q8sp#lIGN7InL140qo1%~;J~#%dL2tVTCuwE`8}^?O^q)tj+7vbS=x-5l9lwLP+Z zznH@7VKtBcdBn`9(Rl@K^s(<3W=756>|@_AR3GpC!rR}w0)Ky%an9mhg|m-y7Vk>z zKHkTxg+`s~6=|f$%-FM-8G9{e#-7E@*lST4?^?XA{_$tMRjiHhgYmGgc#;u^QQo)yQV7Mpm(^ zJw+bbQ&QDjp;jdCy;UyzQ-3Y=aI8he=2}#2u0_S>T2$;`i<+t7b2E8sQ$5vjV8-U! zyfc~Y=Gwe7dDk{gZkK7s?Lx+}78RRoQL(ue6`N~Ov41UUWN$61#jIV$X6-6AZx
Q5b#b)g)HfvY0S-XnO+LNUA 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%0A(ul{o4b3txU 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�KuFr#8-{>T(@+&L$RUcAo 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

WgapblQ_I7?IqKi)6bZmxtw|6Hl~9ZjP)t$J>y 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 xfR6n`cDw|G2} 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%0A1{pcz5!v7SsT2DJB7FQi&1W*Uv? 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

!s@7{0}E-=ar3zWgJJ> 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

o1)wq|cH^{+Aq-&yw#M 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 z%0D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 literal 0 HcmV?d00001 diff --git a/deps/icu-small/source/i18n/affixpatternparser.cpp b/deps/icu-small/source/i18n/affixpatternparser.cpp index fc98f7bf45684d..05e45dbb12bfc5 100644 --- a/deps/icu-small/source/i18n/affixpatternparser.cpp +++ b/deps/icu-small/source/i18n/affixpatternparser.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. @@ -44,7 +46,8 @@ nextToken(const UChar *buffer, int32_t idx, int32_t len, UChar *token) { *token = buffer[idx + 1]; if (buffer[idx + 1] == 0xA4) { int32_t i = 2; - for (; idx + i < len && i < 4 && buffer[idx + i] == buffer[idx + 1]; ++i); + for (; idx + i < len && i < 4 && buffer[idx + i] == buffer[idx + 1]; ++i) + ; return i; } return 2; @@ -66,7 +69,8 @@ nextUserToken(const UChar *buffer, int32_t idx, int32_t len, UChar *token) { break; } int32_t i = 1; - for (; idx + i < len && i < max && buffer[idx + i] == buffer[idx]; ++i); + for (; idx + i < len && i < max && buffer[idx + i] == buffer[idx]; ++i) + ; return i; } diff --git a/deps/icu-small/source/i18n/affixpatternparser.h b/deps/icu-small/source/i18n/affixpatternparser.h index 2105540a1aa7ba..07f84c53145d1d 100644 --- a/deps/icu-small/source/i18n/affixpatternparser.h +++ b/deps/icu-small/source/i18n/affixpatternparser.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/alphaindex.cpp b/deps/icu-small/source/i18n/alphaindex.cpp index 9159014f800596..8a2f0a3cb5c820 100644 --- a/deps/icu-small/source/i18n/alphaindex.cpp +++ b/deps/icu-small/source/i18n/alphaindex.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/anytrans.cpp b/deps/icu-small/source/i18n/anytrans.cpp index 695a9390b681c0..8ec6f837cfdffa 100644 --- a/deps/icu-small/source/i18n/anytrans.cpp +++ b/deps/icu-small/source/i18n/anytrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************** * Copyright (c) 2002-2014, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/anytrans.h b/deps/icu-small/source/i18n/anytrans.h index 228ccbe03affcc..d06d2baa57e202 100644 --- a/deps/icu-small/source/i18n/anytrans.h +++ b/deps/icu-small/source/i18n/anytrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *********************************************************************** * Copyright (c) 2002-2007, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/astro.cpp b/deps/icu-small/source/i18n/astro.cpp index 1b3bf58964b548..d657aaa20d751a 100644 --- a/deps/icu-small/source/i18n/astro.cpp +++ b/deps/icu-small/source/i18n/astro.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /************************************************************************ * Copyright (C) 1996-2012, International Business Machines Corporation * and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/astro.h b/deps/icu-small/source/i18n/astro.h index cd20b6cf2578b0..e8546617634e36 100644 --- a/deps/icu-small/source/i18n/astro.h +++ b/deps/icu-small/source/i18n/astro.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /************************************************************************ * Copyright (C) 1996-2008, International Business Machines Corporation * * and others. All Rights Reserved. * diff --git a/deps/icu-small/source/i18n/basictz.cpp b/deps/icu-small/source/i18n/basictz.cpp index 7fea290f169d06..b464f5cc5fbe64 100644 --- a/deps/icu-small/source/i18n/basictz.cpp +++ b/deps/icu-small/source/i18n/basictz.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/bocsu.cpp b/deps/icu-small/source/i18n/bocsu.cpp index cfc9816693bc9e..a2f94f239efcf7 100644 --- a/deps/icu-small/source/i18n/bocsu.cpp +++ b/deps/icu-small/source/i18n/bocsu.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/bocsu.h b/deps/icu-small/source/i18n/bocsu.h index 0f89a0fbeb06da..56b03500b143d2 100644 --- a/deps/icu-small/source/i18n/bocsu.h +++ b/deps/icu-small/source/i18n/bocsu.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/brktrans.cpp b/deps/icu-small/source/i18n/brktrans.cpp index dafac399f855e3..714a0a8720ad3f 100644 --- a/deps/icu-small/source/i18n/brktrans.cpp +++ b/deps/icu-small/source/i18n/brktrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2008-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/brktrans.h b/deps/icu-small/source/i18n/brktrans.h index 5a4c4b6d6b249a..27228321e67399 100644 --- a/deps/icu-small/source/i18n/brktrans.h +++ b/deps/icu-small/source/i18n/brktrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2008-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/buddhcal.cpp b/deps/icu-small/source/i18n/buddhcal.cpp index 5c9f80ed0ca092..c8a3a91a2cbd0d 100644 --- a/deps/icu-small/source/i18n/buddhcal.cpp +++ b/deps/icu-small/source/i18n/buddhcal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/buddhcal.h b/deps/icu-small/source/i18n/buddhcal.h index 441156d3d8fd52..95db980600d20f 100644 --- a/deps/icu-small/source/i18n/buddhcal.h +++ b/deps/icu-small/source/i18n/buddhcal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 5a1bef805f656f..9b0f5a0ad3e9e4 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2016, International Business Machines Corporation and * @@ -634,7 +636,9 @@ static const int32_t kCalendarLimits[UCAL_FIELD_COUNT][4] = { }; // Resource bundle tags read by this class +static const char gCalendar[] = "calendar"; static const char gMonthNames[] = "monthNames"; +static const char gGregorian[] = "gregorian"; // Data flow in Calendar // --------------------- @@ -3791,12 +3795,30 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& from the calendar data. The code used to use the dateTimeElements resource to get first day of week data, but this was moved to supplemental data under ticket 7755. (JCE) */ - CalendarData calData(useLocale,type,status); - UResourceBundle *monthNames = calData.getByKey(gMonthNames,status); + // Get the monthNames resource bundle for the calendar 'type'. Fallback to gregorian if the resource is not + // found. + LocalUResourceBundlePointer calData(ures_open(NULL, useLocale.getBaseName(), &status)); + ures_getByKey(calData.getAlias(), gCalendar, calData.getAlias(), &status); + + LocalUResourceBundlePointer monthNames; + if (type != NULL && *type != '\0' && uprv_strcmp(type, gGregorian) != 0) { + monthNames.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), type, NULL, &status)); + ures_getByKeyWithFallback(monthNames.getAlias(), gMonthNames, + monthNames.getAlias(), &status); + } + + if (monthNames.isNull() || status == U_MISSING_RESOURCE_ERROR) { + status = U_ZERO_ERROR; + monthNames.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), gGregorian, + monthNames.orphan(), &status)); + ures_getByKeyWithFallback(monthNames.getAlias(), gMonthNames, + monthNames.getAlias(), &status); + } + if (U_SUCCESS(status)) { U_LOCALE_BASED(locBased,*this); - locBased.setLocaleIDs(ures_getLocaleByType(monthNames, ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(monthNames, ULOC_ACTUAL_LOCALE, &status)); + locBased.setLocaleIDs(ures_getLocaleByType(monthNames.getAlias(), ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(monthNames.getAlias(), ULOC_ACTUAL_LOCALE, &status)); } else { status = U_USING_FALLBACK_WARNING; return; @@ -3815,9 +3837,6 @@ Calendar::setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& } if (U_FAILURE(status)) { -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, " Failure loading weekData from supplemental = %s\n", u_errorName(status)); -#endif status = U_USING_FALLBACK_WARNING; } else { int32_t arrLen; diff --git a/deps/icu-small/source/i18n/casetrn.cpp b/deps/icu-small/source/i18n/casetrn.cpp index 602c22914f913f..7f71362c334dce 100644 --- a/deps/icu-small/source/i18n/casetrn.cpp +++ b/deps/icu-small/source/i18n/casetrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/casetrn.h b/deps/icu-small/source/i18n/casetrn.h index b20cb8e9692c19..1067e0fc7b5638 100644 --- a/deps/icu-small/source/i18n/casetrn.h +++ b/deps/icu-small/source/i18n/casetrn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/cecal.cpp b/deps/icu-small/source/i18n/cecal.cpp index 9c2759ba757566..38c89799be7c4a 100644 --- a/deps/icu-small/source/i18n/cecal.cpp +++ b/deps/icu-small/source/i18n/cecal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003 - 2009, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/cecal.h b/deps/icu-small/source/i18n/cecal.h index 471d88933e83f8..ce6f4209ca5c74 100644 --- a/deps/icu-small/source/i18n/cecal.h +++ b/deps/icu-small/source/i18n/cecal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003 - 2008, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index d2c9e9ea0bec33..0cf88205cb6357 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2007-2014, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/chnsecal.h b/deps/icu-small/source/i18n/chnsecal.h index ba3f943066584c..e000df7158d51c 100644 --- a/deps/icu-small/source/i18n/chnsecal.h +++ b/deps/icu-small/source/i18n/chnsecal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 2007-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/choicfmt.cpp b/deps/icu-small/source/i18n/choicfmt.cpp index e739adde0ce628..3630157852514c 100644 --- a/deps/icu-small/source/i18n/choicfmt.cpp +++ b/deps/icu-small/source/i18n/choicfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/coleitr.cpp b/deps/icu-small/source/i18n/coleitr.cpp index c842663ba183cf..4825baebcd8c51 100644 --- a/deps/icu-small/source/i18n/coleitr.cpp +++ b/deps/icu-small/source/i18n/coleitr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 6a8dc1c0d06b3f..46e5324ffdfe81 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1996-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/collation.cpp b/deps/icu-small/source/i18n/collation.cpp index c01457e7386289..bac7498dfc35f7 100644 --- a/deps/icu-small/source/i18n/collation.cpp +++ b/deps/icu-small/source/i18n/collation.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collation.h b/deps/icu-small/source/i18n/collation.h index 53cffa983c1fae..c82d9a4778aa5f 100644 --- a/deps/icu-small/source/i18n/collation.h +++ b/deps/icu-small/source/i18n/collation.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 3465832d5a240b..0025cfc34fb39c 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationbuilder.h b/deps/icu-small/source/i18n/collationbuilder.h index cd499a4e927c02..7dda928a51a785 100644 --- a/deps/icu-small/source/i18n/collationbuilder.h +++ b/deps/icu-small/source/i18n/collationbuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationcompare.cpp b/deps/icu-small/source/i18n/collationcompare.cpp index 3b72d05d718a0f..5d8bd90d6c4781 100644 --- a/deps/icu-small/source/i18n/collationcompare.cpp +++ b/deps/icu-small/source/i18n/collationcompare.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationcompare.h b/deps/icu-small/source/i18n/collationcompare.h index 0185226d62fb4f..630b90b5564a7a 100644 --- a/deps/icu-small/source/i18n/collationcompare.h +++ b/deps/icu-small/source/i18n/collationcompare.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdata.cpp b/deps/icu-small/source/i18n/collationdata.cpp index 7f781f50f19737..d3a62e4fd0384f 100644 --- a/deps/icu-small/source/i18n/collationdata.cpp +++ b/deps/icu-small/source/i18n/collationdata.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdata.h b/deps/icu-small/source/i18n/collationdata.h index dd7fcebea46138..ab40bbd89e5a8f 100644 --- a/deps/icu-small/source/i18n/collationdata.h +++ b/deps/icu-small/source/i18n/collationdata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatabuilder.cpp b/deps/icu-small/source/i18n/collationdatabuilder.cpp index 7bdf184cc01375..4a9a67c7b0a189 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.cpp +++ b/deps/icu-small/source/i18n/collationdatabuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatabuilder.h b/deps/icu-small/source/i18n/collationdatabuilder.h index cfa46fd5506a0c..f2c9a820ad1ac8 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.h +++ b/deps/icu-small/source/i18n/collationdatabuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatareader.cpp b/deps/icu-small/source/i18n/collationdatareader.cpp index f7098f984199dd..df0b2a36809272 100644 --- a/deps/icu-small/source/i18n/collationdatareader.cpp +++ b/deps/icu-small/source/i18n/collationdatareader.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatareader.h b/deps/icu-small/source/i18n/collationdatareader.h index 4a9fa5eecadada..ff8ec3d406a8c0 100644 --- a/deps/icu-small/source/i18n/collationdatareader.h +++ b/deps/icu-small/source/i18n/collationdatareader.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatawriter.cpp b/deps/icu-small/source/i18n/collationdatawriter.cpp index 6943ed2c61f0b5..596236bc61b005 100644 --- a/deps/icu-small/source/i18n/collationdatawriter.cpp +++ b/deps/icu-small/source/i18n/collationdatawriter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationdatawriter.h b/deps/icu-small/source/i18n/collationdatawriter.h index 50e26524cec866..6169e0fd2640ed 100644 --- a/deps/icu-small/source/i18n/collationdatawriter.h +++ b/deps/icu-small/source/i18n/collationdatawriter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationfastlatin.cpp b/deps/icu-small/source/i18n/collationfastlatin.cpp index 70e393c4dfeaec..c3e8c98b3adb1a 100644 --- a/deps/icu-small/source/i18n/collationfastlatin.cpp +++ b/deps/icu-small/source/i18n/collationfastlatin.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationfastlatin.h b/deps/icu-small/source/i18n/collationfastlatin.h index 6a25c6692c901d..00a2d1b5105faf 100644 --- a/deps/icu-small/source/i18n/collationfastlatin.h +++ b/deps/icu-small/source/i18n/collationfastlatin.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp index d5acda15b01755..032e5e82aaef15 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines @@ -147,7 +149,7 @@ CollationFastLatinBuilder::loadGroups(const CollationData &data, UErrorCode &err // missing data return FALSE; } - result.append(0); // reserve a slot for this group + result.append((UChar)0); // reserve a slot for this group } firstDigitPrimary = data.getFirstPrimaryForGroup(UCOL_REORDER_CODE_DIGIT); @@ -564,7 +566,7 @@ CollationFastLatinBuilder::encodeCharCEs(UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return FALSE; } int32_t miniCEsStart = result.length(); for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) { - result.append(0); // initialize to completely ignorable + result.append((UChar)0); // initialize to completely ignorable } int32_t indexBase = result.length(); for(int32_t i = 0; i < CollationFastLatin::NUM_FAST_CHARS; ++i) { diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.h b/deps/icu-small/source/i18n/collationfastlatinbuilder.h index b9eedf985af515..9d380380b4e58c 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.h +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 153953cfc8671b..de1d9a2d1d8c5b 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -1,5 +1,7 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* - * Copyright (C) 1999-2015, International Business Machines + * Copyright (C) 1999-2016, International Business Machines * Corporation and others. All Rights Reserved. * * file name: collationfcd.cpp @@ -20,27 +22,27 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,1,1,2,3,0,0,0,0, 0,0,0,0,4,0,0,0,0,0,0,0,5,6,7,0, 8,0,9,0xa,0,0,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0x10, -0x11,0x12,0x13,0,0,0,0,0x14,0,0x15,0x16,0,0,0x15,0x17,0, -0,0x15,0x17,0,0,0x15,0x17,0,0,0x15,0x17,0,0,0,0x17,0, -0,0,0x18,0,0,0x15,0x17,0,0,0,0x17,0,0,0,0x19,0, -0,0x1a,0x1b,0,0,0x1c,0x1b,0,0x1c,0x1d,0,0x1e,0x1f,0,0x20,0, -0,0x21,0,0,0x17,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0,0, +0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0, +0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0, +0,0,0x19,0,0,0x16,0x18,0,0,0,0x18,0,0,0,0x1a,0, +0,0x1b,0x1c,0,0,0x1d,0x1c,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0, +0,0x22,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x23,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x23,0x23,0,0,0,0,0x24,0, -0,0,0,0,0,0x25,0,0,0,0x13,0,0,0,0,0,0, -0x26,0,0,0x27,0,0x28,0,0,0,0x23,0x29,0x10,0,0x2a,0,0x2b, -0,0x2c,0,0,0,0,0x2d,0x2e,0,0,0,0,0,0,1,0x2f, +0,0,0,0,0,0,0,0,0x24,0x24,0,0,0,0,0x25,0, +0,0,0,0,0,0x26,0,0,0,0x13,0,0,0,0,0,0, +0x27,0,0,0x28,0,0x29,0,0,0,0x24,0x2a,0x10,0,0x2b,0,0x2c, +0,0x2d,0,0,0,0,0x2e,0x2f,0,0,0,0,0,0,1,0x30, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x30,0x31,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x31,0x32,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x32,0,0,0,0x33,0,0,0,1, +0,0,0,0,0,0,0,0x33,0,0,0,0x34,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x34,0,0,0x35,0,0,0,0,0,0,0,0,0,0,0, +0,0x35,0,0,0x36,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -99,9 +101,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x36,0x37,0,0,0x38,0,0,0,0,0,0,0,0, -0x20,0,0,0,0,0,0x29,0x39,0,0x3a,0x3b,0,0,0x3b,0x3c,0, -0,0,0,0,0,0x3d,0x3e,0x3f,0,0,0,0,0,0,0,0x17, +0,0,0,0x37,0x38,0,0,0x39,0,0,0,0,0,0,0,0, +0x21,0,0,0,0,0,0x2a,0x3a,0,0x3b,0x3c,0,0,0x3c,0x3d,0, +0,0,0,0,0,0x3e,0x3f,0x40,0,0,0,0,0,0,0,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, @@ -124,7 +126,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x40,0x41,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x41,0x42,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -141,17 +143,17 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x42,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x43,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 }; -const uint32_t CollationFCD::lcccBits[67]={ +const uint32_t CollationFCD::lcccBits[68]={ 0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, -0xff800,0xfbc00000,0x3eef,0xe000000,0xfffffff8,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000,0xdf, -0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf03fffff, -0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000, -0x4000035,0x4108000,0x40000000 +0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000, +0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd, +0xf83fffff,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, +0x400000,0x40000b5,0x5108000,0x40000000 }; const uint8_t CollationFCD::tcccIndex[2048]={ @@ -159,27 +161,27 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0xb,0xc,0,0,0,0,0,0,1,1,0xd,0xe,0xf,0x10,0x11,0, 0x12,0x13,0x14,0x15,0x16,0,0x17,0x18,0,0,0,0,0x19,0x1a,0x1b,0, 0x1c,0x1d,0x1e,0x1f,0,0,0x20,0x21,0x22,0x23,0x24,0,0,0,0,0x25, -0x26,0x27,0x28,0,0,0,0,0x29,0,0x2a,0x2b,0,0,0x2c,0x2d,0, -0,0x2e,0x2f,0,0,0x2c,0x30,0,0,0x2c,0x31,0,0,0,0x30,0, -0,0,0x32,0,0,0x2c,0x30,0,0,0,0x30,0,0,0,0x33,0, -0,0x34,0x35,0,0,0x36,0x35,0,0x36,0x37,0,0x38,0x39,0,0x3a,0, -0,0x3b,0,0,0x30,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x3c,0,0,0,0,0, +0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0, +0,0x2f,0x30,0,0,0x2d,0x31,0,0,0x2d,0x32,0,0,0,0x31,0, +0,0,0x33,0,0,0x2d,0x31,0,0,0,0x31,0,0,0,0x34,0, +0,0x35,0x36,0,0,0x37,0x36,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0, +0,0x3c,0,0,0x31,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x3d,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3d,0x3d,0,0,0,0,0x3e,0, -0,0,0,0,0,0x3f,0,0,0,0x28,0,0,0,0,0,0, -0x40,0,0,0x41,0,0x42,0,0,0,0x3d,0x43,0x25,0,0x44,0,0x45, -0,0x46,0,0,0,0,0x47,0x48,0,0,0,0,0,0,1,0x49, -1,1,1,1,0x4a,1,1,0x4b,0x4c,1,0x4d,0x4e,1,0x4f,0x50,0x51, -0,0,0,0,0,0,0x52,0x53,0,0x54,0,0,0x55,0x56,0x57,0, -0x58,0x59,0x5a,0x5b,0x5c,0x5d,0,0x5e,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3e,0x3e,0,0,0,0,0x3f,0, +0,0,0,0,0,0x40,0,0,0,0x28,0,0,0,0,0,0, +0x41,0,0,0x42,0,0x43,0,0,0,0x3e,0x44,0x25,0,0x45,0,0x46, +0,0x47,0,0,0,0,0x48,0x49,0,0,0,0,0,0,1,0x4a, +1,1,1,1,0x4b,1,1,0x4c,0x4d,1,0x4e,0x4f,1,0x50,0x51,0x52, +0,0,0,0,0,0,0x53,0x54,0,0x55,0,0,0x56,0x57,0x58,0, +0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0,0x5f,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x2c,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x5f,0,0,0,0x60,0,0,0,1, +0,0,0,0,0,0,0x2d,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x60,0,0,0,0x61,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x61,0x62,0x63,0x64,0x62,0x63,0x65,0,0,0,0,0,0,0,0, +0,0x62,0x63,0x64,0x65,0x63,0x64,0x66,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -238,9 +240,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x66,0x67,0,0,0x68,0,0,0,0,0,0,0,0, -0x3a,0,0,0,0,0,0x43,0x69,0,0x6a,0x6b,0,0,0x6b,0x6c,0, -0,0,0,0,0,0x6d,0x6e,0x6f,0,0,0,0,0,0,0,0x30, +0,0,0,0x67,0x68,0,0,0x69,0,0,0,0,0,0,0,0, +0x3b,0,0,0,0,0,0x44,0x6a,0,0x6b,0x6c,0,0,0x6c,0x6d,0, +0,0,0,0,0,0x6e,0x6f,0x70,0,0,0,0,0,0,0,0x31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -263,7 +265,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x70,0x71,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x71,0x72,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -280,20 +282,20 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3c,0x72,0x73,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3d,0x73,0x74,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xe,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::tcccBits[116]={ +const uint32_t CollationFCD::tcccBits[117]={ 0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760, 0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000, -0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0xfffffff8,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000,0x4e002000, -0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200, -0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf03fffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff, -0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000, -0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000, -0x4000035,0x4108000,0x5f7ffc00,0x7fdb +0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000, +0x4e002000,0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000, +0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf83fffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff, +0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f, +0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, +0x400000,0x40000b5,0x5108000,0x5f7ffc00,0x7fdb }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/collationfcd.h b/deps/icu-small/source/i18n/collationfcd.h index f4cc8a170e8ed5..150f4880c90046 100644 --- a/deps/icu-small/source/i18n/collationfcd.h +++ b/deps/icu-small/source/i18n/collationfcd.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationiterator.cpp b/deps/icu-small/source/i18n/collationiterator.cpp index 86199bcd177216..e6e8f27e2f6b9d 100644 --- a/deps/icu-small/source/i18n/collationiterator.cpp +++ b/deps/icu-small/source/i18n/collationiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationiterator.h b/deps/icu-small/source/i18n/collationiterator.h index a7b2cbfbce76e0..0161f5a7b16e9a 100644 --- a/deps/icu-small/source/i18n/collationiterator.h +++ b/deps/icu-small/source/i18n/collationiterator.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationkeys.cpp b/deps/icu-small/source/i18n/collationkeys.cpp index 3fb1af1b36768d..91302285d6b78f 100644 --- a/deps/icu-small/source/i18n/collationkeys.cpp +++ b/deps/icu-small/source/i18n/collationkeys.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationkeys.h b/deps/icu-small/source/i18n/collationkeys.h index d1cc76f0283ac0..74b370e710991e 100644 --- a/deps/icu-small/source/i18n/collationkeys.h +++ b/deps/icu-small/source/i18n/collationkeys.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationroot.cpp b/deps/icu-small/source/i18n/collationroot.cpp index 749f05c51c3a2f..f862e410b81cd5 100644 --- a/deps/icu-small/source/i18n/collationroot.cpp +++ b/deps/icu-small/source/i18n/collationroot.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines @@ -45,7 +47,7 @@ static UBool U_CALLCONV uprv_collation_root_cleanup() { U_CDECL_END -void +void U_CALLCONV CollationRoot::load(UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; } LocalPointer t(new CollationTailoring(NULL)); diff --git a/deps/icu-small/source/i18n/collationroot.h b/deps/icu-small/source/i18n/collationroot.h index 345fbe77eb4128..26e5071fff8b7a 100644 --- a/deps/icu-small/source/i18n/collationroot.h +++ b/deps/icu-small/source/i18n/collationroot.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines @@ -34,7 +36,7 @@ class U_I18N_API CollationRoot { // purely static static const CollationSettings *getSettings(UErrorCode &errorCode); private: - static void load(UErrorCode &errorCode); + static void U_CALLCONV load(UErrorCode &errorCode); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/collationrootelements.cpp b/deps/icu-small/source/i18n/collationrootelements.cpp index c8fd0a09ffd37e..638a2456c82958 100644 --- a/deps/icu-small/source/i18n/collationrootelements.cpp +++ b/deps/icu-small/source/i18n/collationrootelements.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationrootelements.h b/deps/icu-small/source/i18n/collationrootelements.h index df2a13df243cef..518a24fe4e0e5f 100644 --- a/deps/icu-small/source/i18n/collationrootelements.h +++ b/deps/icu-small/source/i18n/collationrootelements.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationruleparser.cpp b/deps/icu-small/source/i18n/collationruleparser.cpp index 2d2e25fcb0e1d4..ea3ea66bc08cf5 100644 --- a/deps/icu-small/source/i18n/collationruleparser.cpp +++ b/deps/icu-small/source/i18n/collationruleparser.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines @@ -788,7 +790,7 @@ CollationRuleParser::readWords(int32_t i, UnicodeString &raw) const { return i; } if(PatternProps::isWhiteSpace(c)) { - raw.append(0x20); + raw.append(sp); i = skipWhiteSpace(i + 1); } else { raw.append(c); diff --git a/deps/icu-small/source/i18n/collationruleparser.h b/deps/icu-small/source/i18n/collationruleparser.h index 3c2b22c9dc455d..bd393c2b6ad143 100644 --- a/deps/icu-small/source/i18n/collationruleparser.h +++ b/deps/icu-small/source/i18n/collationruleparser.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationsets.cpp b/deps/icu-small/source/i18n/collationsets.cpp index ab282d89c6a95c..1188f310620e84 100644 --- a/deps/icu-small/source/i18n/collationsets.cpp +++ b/deps/icu-small/source/i18n/collationsets.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationsets.h b/deps/icu-small/source/i18n/collationsets.h index 4f0a2b6dceac13..070d507ebdc318 100644 --- a/deps/icu-small/source/i18n/collationsets.h +++ b/deps/icu-small/source/i18n/collationsets.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationsettings.cpp b/deps/icu-small/source/i18n/collationsettings.cpp index e3e76a476588b9..bc1d4e63f8a2a7 100644 --- a/deps/icu-small/source/i18n/collationsettings.cpp +++ b/deps/icu-small/source/i18n/collationsettings.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationsettings.h b/deps/icu-small/source/i18n/collationsettings.h index d839de7e541e3f..1522dd58be6603 100644 --- a/deps/icu-small/source/i18n/collationsettings.h +++ b/deps/icu-small/source/i18n/collationsettings.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationtailoring.cpp b/deps/icu-small/source/i18n/collationtailoring.cpp index ba20cc871ac57e..d1ffa306f1290d 100644 --- a/deps/icu-small/source/i18n/collationtailoring.cpp +++ b/deps/icu-small/source/i18n/collationtailoring.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/collationtailoring.h b/deps/icu-small/source/i18n/collationtailoring.h index 2a9b3d566f687a..e463005e08f54a 100644 --- a/deps/icu-small/source/i18n/collationtailoring.h +++ b/deps/icu-small/source/i18n/collationtailoring.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/collationweights.cpp b/deps/icu-small/source/i18n/collationweights.cpp index dba362255e4850..9a7b9a9973c127 100644 --- a/deps/icu-small/source/i18n/collationweights.cpp +++ b/deps/icu-small/source/i18n/collationweights.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/collationweights.h b/deps/icu-small/source/i18n/collationweights.h index a32274b876b7b8..8f3f328547a1af 100644 --- a/deps/icu-small/source/i18n/collationweights.h +++ b/deps/icu-small/source/i18n/collationweights.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/collunsafe.h b/deps/icu-small/source/i18n/collunsafe.h index 97a766db26f729..4819ad195a6921 100644 --- a/deps/icu-small/source/i18n/collunsafe.h +++ b/deps/icu-small/source/i18n/collunsafe.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // collunsafe.h // Copyright (C) 2015-2016, International Business Machines Corporation and others. // All Rights Reserved. diff --git a/deps/icu-small/source/i18n/compactdecimalformat.cpp b/deps/icu-small/source/i18n/compactdecimalformat.cpp index 2004356e700b8a..31a5123cb10317 100644 --- a/deps/icu-small/source/i18n/compactdecimalformat.cpp +++ b/deps/icu-small/source/i18n/compactdecimalformat.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and * @@ -39,7 +41,7 @@ static const char gNumberElementsTag[] = "NumberElements"; static const char gDecimalFormatTag[] = "decimalFormat"; static const char gPatternsShort[] = "patternsShort"; static const char gPatternsLong[] = "patternsLong"; -static const char gRoot[] = "root"; +static const char gLatnPath[] = "NumberElements/latn"; static const UChar u_0 = 0x30; static const UChar u_apos = 0x27; @@ -94,7 +96,13 @@ class CDFLocaleStyleData : public UMemory { // Compute cdfUnits = unitsByVariant[pluralVariant]. // Prefix and suffix to use at cdfUnits[log10(x)] UHashtable* unitsByVariant; - inline CDFLocaleStyleData() : unitsByVariant(NULL) {} + // A flag for whether or not this CDFLocaleStyleData was loaded from the + // Latin numbering system as a fallback from the locale numbering system. + // This value is meaningless if the object is bogus or empty. + UBool fromFallback; + inline CDFLocaleStyleData() : unitsByVariant(NULL), fromFallback(FALSE) { + uprv_memset(divisors, 0, sizeof(divisors)); + } ~CDFLocaleStyleData(); // Init initializes this object. void Init(UErrorCode& status); @@ -102,6 +110,9 @@ class CDFLocaleStyleData : public UMemory { return unitsByVariant == NULL; } void setToBogus(); + UBool isEmpty() { + return unitsByVariant == NULL || unitsByVariant->count == 0; + } private: CDFLocaleStyleData(const CDFLocaleStyleData&); CDFLocaleStyleData& operator=(const CDFLocaleStyleData&); @@ -146,15 +157,12 @@ static const CDFLocaleStyleData* getCDFLocaleStyleData(const Locale& inLocale, U static const CDFLocaleStyleData* extractDataByStyleEnum(const CDFLocaleData& data, UNumberCompactStyle style, UErrorCode& status); static CDFLocaleData* loadCDFLocaleData(const Locale& inLocale, UErrorCode& status); -static void initCDFLocaleData(const Locale& inLocale, CDFLocaleData* result, UErrorCode& status); -static UResourceBundle* tryGetDecimalFallback(const UResourceBundle* numberSystemResource, const char* style, UResourceBundle** fillIn, FallbackFlags flags, UErrorCode& status); -static UResourceBundle* tryGetByKeyWithFallback(const UResourceBundle* rb, const char* path, UResourceBundle** fillIn, FallbackFlags flags, UErrorCode& status); -static UBool isRoot(const UResourceBundle* rb, UErrorCode& status); -static void initCDFLocaleStyleData(const UResourceBundle* decimalFormatBundle, CDFLocaleStyleData* result, UErrorCode& status); -static void populatePower10(const UResourceBundle* power10Bundle, CDFLocaleStyleData* result, UErrorCode& status); -static int32_t populatePrefixSuffix(const char* variant, int32_t log10Value, const UnicodeString& formatStr, UHashtable* result, UErrorCode& status); +static void load(const Locale& inLocale, CDFLocaleData* result, UErrorCode& status); +static int32_t populatePrefixSuffix(const char* variant, int32_t log10Value, const UnicodeString& formatStr, UHashtable* result, UBool overwrite, UErrorCode& status); +static double calculateDivisor(double power10, int32_t numZeros); static UBool onlySpaces(UnicodeString u); static void fixQuotes(UnicodeString& s); +static void checkForOtherVariants(CDFLocaleStyleData* result, UErrorCode& status); static void fillInMissing(CDFLocaleStyleData* result); static int32_t computeLog10(double x, UBool inRange); static CDFUnit* createCDFUnit(const char* variant, int32_t log10Value, UHashtable* table, UErrorCode& status); @@ -345,7 +353,7 @@ CompactDecimalFormat::format( UnicodeString& CompactDecimalFormat::format( - const StringPiece& /* number */, + StringPiece /* number */, UnicodeString& appendTo, FieldPositionIterator* /* posIter */, UErrorCode& status) const { @@ -518,7 +526,8 @@ static CDFLocaleData* loadCDFLocaleData(const Locale& inLocale, UErrorCode& stat return NULL; } - initCDFLocaleData(inLocale, result, status); + load(inLocale, result, status); + if (U_FAILURE(status)) { delete result; return NULL; @@ -526,278 +535,226 @@ static CDFLocaleData* loadCDFLocaleData(const Locale& inLocale, UErrorCode& stat return result; } -// initCDFLocaleData initializes result with data from CLDR. -// inLocale is the locale, the CLDR data is stored in result. -// We load the UNUM_SHORT and UNUM_LONG data looking first in local numbering -// system and not including root locale in fallback. Next we try in the latn -// numbering system where we fallback all the way to root. If we don't find -// UNUM_SHORT data in these three places, we report an error. If we find -// UNUM_SHORT data before finding UNUM_LONG data we make UNUM_LONG data fall -// back to UNUM_SHORT data. -static void initCDFLocaleData(const Locale& inLocale, CDFLocaleData* result, UErrorCode& status) { - LocalPointer ns(NumberingSystem::createInstance(inLocale, status)); - if (U_FAILURE(status)) { - return; - } - const char* numberingSystemName = ns->getName(); - UResourceBundle* rb = ures_open(NULL, inLocale.getName(), &status); - rb = ures_getByKeyWithFallback(rb, gNumberElementsTag, rb, &status); - if (U_FAILURE(status)) { - ures_close(rb); - return; - } - UResourceBundle* shortDataFillIn = NULL; - UResourceBundle* longDataFillIn = NULL; - UResourceBundle* shortData = NULL; - UResourceBundle* longData = NULL; +namespace { - if (uprv_strcmp(numberingSystemName, gLatnTag) != 0) { - LocalUResourceBundlePointer localResource( - tryGetByKeyWithFallback(rb, numberingSystemName, NULL, NOT_ROOT, status)); - shortData = tryGetDecimalFallback( - localResource.getAlias(), gPatternsShort, &shortDataFillIn, NOT_ROOT, status); - longData = tryGetDecimalFallback( - localResource.getAlias(), gPatternsLong, &longDataFillIn, NOT_ROOT, status); - } - if (U_FAILURE(status)) { - ures_close(shortDataFillIn); - ures_close(longDataFillIn); - ures_close(rb); - return; - } +struct CmptDecDataSink : public ResourceSink { + + CDFLocaleData& dataBundle; // Where to save values when they are read + UBool isLatin; // Whether or not we are traversing the Latin tree + UBool isFallback; // Whether or not we are traversing the Latin tree as fallback + + enum EPatternsTableKey { PATTERNS_SHORT, PATTERNS_LONG }; + enum EFormatsTableKey { DECIMAL_FORMAT, CURRENCY_FORMAT }; - // If we haven't found UNUM_SHORT look in latn numbering system. We must - // succeed at finding UNUM_SHORT here. - if (shortData == NULL) { - LocalUResourceBundlePointer latnResource(tryGetByKeyWithFallback(rb, gLatnTag, NULL, MUST, status)); - shortData = tryGetDecimalFallback(latnResource.getAlias(), gPatternsShort, &shortDataFillIn, MUST, status); - if (longData == NULL) { - longData = tryGetDecimalFallback(latnResource.getAlias(), gPatternsLong, &longDataFillIn, ANY, status); - if (longData != NULL && isRoot(longData, status) && !isRoot(shortData, status)) { - longData = NULL; + /* + * NumberElements{ <-- top (numbering system table) + * latn{ <-- patternsTable (one per numbering system) + * patternsLong{ <-- formatsTable (one per pattern) + * decimalFormat{ <-- powersOfTenTable (one per format) + * 1000{ <-- pluralVariantsTable (one per power of ten) + * one{"0 thousand"} <-- plural variant and template + */ + + CmptDecDataSink(CDFLocaleData& _dataBundle) + : dataBundle(_dataBundle), isLatin(FALSE), isFallback(FALSE) {} + virtual ~CmptDecDataSink(); + + virtual void put(const char *key, ResourceValue &value, UBool isRoot, UErrorCode &errorCode) { + // SPECIAL CASE: Don't consume root in the non-Latin numbering system + if (isRoot && !isLatin) { return; } + + ResourceTable patternsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i1 = 0; patternsTable.getKeyAndValue(i1, key, value); ++i1) { + + // Check for patternsShort or patternsLong + EPatternsTableKey patternsTableKey; + if (uprv_strcmp(key, gPatternsShort) == 0) { + patternsTableKey = PATTERNS_SHORT; + } else if (uprv_strcmp(key, gPatternsLong) == 0) { + patternsTableKey = PATTERNS_LONG; + } else { + continue; } - } - } - initCDFLocaleStyleData(shortData, &result->shortData, status); - ures_close(shortDataFillIn); - if (U_FAILURE(status)) { - ures_close(longDataFillIn); - ures_close(rb); - } - if (longData == NULL) { - result->longData.setToBogus(); - } else { - initCDFLocaleStyleData(longData, &result->longData, status); - } - ures_close(longDataFillIn); - ures_close(rb); -} - -/** - * tryGetDecimalFallback attempts to fetch the "decimalFormat" resource bundle - * with a particular style. style is either "patternsShort" or "patternsLong." - * FillIn, flags, and status work in the same way as in tryGetByKeyWithFallback. - */ -static UResourceBundle* tryGetDecimalFallback(const UResourceBundle* numberSystemResource, const char* style, UResourceBundle** fillIn, FallbackFlags flags, UErrorCode& status) { - UResourceBundle* first = tryGetByKeyWithFallback(numberSystemResource, style, fillIn, flags, status); - UResourceBundle* second = tryGetByKeyWithFallback(first, gDecimalFormatTag, fillIn, flags, status); - if (fillIn == NULL) { - ures_close(first); - } - return second; -} - -// tryGetByKeyWithFallback returns a sub-resource bundle that matches given -// criteria or NULL if none found. rb is the resource bundle that we are -// searching. If rb == NULL then this function behaves as if no sub-resource -// is found; path is the key of the sub-resource, -// (i.e "foo" but not "foo/bar"); If fillIn is NULL, caller must always call -// ures_close() on returned resource. See below for example when fillIn is -// not NULL. flags is ANY or NOT_ROOT. Optionally, these values -// can be ored with MUST. MUST by itself is the same as ANY | MUST. -// The locale of the returned sub-resource will either match the -// flags or the returned sub-resouce will be NULL. If MUST is included in -// flags, and not suitable sub-resource is found then in addition to returning -// NULL, this function also sets status to U_MISSING_RESOURCE_ERROR. If MUST -// is not included in flags, then this function just returns NULL if no -// such sub-resource is found and will never set status to -// U_MISSING_RESOURCE_ERROR. -// -// Example: This code first searches for "foo/bar" sub-resource without falling -// back to ROOT. Then searches for "baz" sub-resource as last resort. -// -// UResourcebundle* fillIn = NULL; -// UResourceBundle* data = tryGetByKeyWithFallback(rb, "foo", &fillIn, NON_ROOT, status); -// data = tryGetByKeyWithFallback(data, "bar", &fillIn, NON_ROOT, status); -// if (!data) { -// data = tryGetbyKeyWithFallback(rb, "baz", &fillIn, MUST, status); -// } -// if (U_FAILURE(status)) { -// ures_close(fillIn); -// return; -// } -// doStuffWithNonNullSubresource(data); -// -// /* Wrong! don't do the following as it can leak memory if fillIn gets set -// to NULL. */ -// fillIn = tryGetByKeyWithFallback(rb, "wrong", &fillIn, ANY, status); -// -// ures_close(fillIn); -// -static UResourceBundle* tryGetByKeyWithFallback(const UResourceBundle* rb, const char* path, UResourceBundle** fillIn, FallbackFlags flags, UErrorCode& status) { - if (U_FAILURE(status)) { - return NULL; - } - UBool must = (flags & MUST); - if (rb == NULL) { - if (must) { - status = U_MISSING_RESOURCE_ERROR; - } - return NULL; - } - UResourceBundle* result = NULL; - UResourceBundle* ownedByUs = NULL; - if (fillIn == NULL) { - ownedByUs = ures_getByKeyWithFallback(rb, path, NULL, &status); - result = ownedByUs; - } else { - *fillIn = ures_getByKeyWithFallback(rb, path, *fillIn, &status); - result = *fillIn; - } - if (U_FAILURE(status)) { - ures_close(ownedByUs); - if (status == U_MISSING_RESOURCE_ERROR && !must) { - status = U_ZERO_ERROR; - } - return NULL; - } - flags = (FallbackFlags) (flags & ~MUST); - switch (flags) { - case NOT_ROOT: - { - UBool bRoot = isRoot(result, status); - if (bRoot || U_FAILURE(status)) { - ures_close(ownedByUs); - if (must && (status == U_ZERO_ERROR)) { - status = U_MISSING_RESOURCE_ERROR; + // Traverse into the formats table + ResourceTable formatsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i2 = 0; formatsTable.getKeyAndValue(i2, key, value); ++i2) { + + // Check for decimalFormat or currencyFormat + EFormatsTableKey formatsTableKey; + if (uprv_strcmp(key, gDecimalFormatTag) == 0) { + formatsTableKey = DECIMAL_FORMAT; + // TODO: Enable this statement when currency support is added + // } else if (uprv_strcmp(key, gCurrencyFormat) == 0) { + // formatsTableKey = CURRENCY_FORMAT; + } else { + continue; + } + + // Set the current style and destination based on the two keys + UNumberCompactStyle style; + CDFLocaleStyleData* destination = NULL; + if (patternsTableKey == PATTERNS_LONG + && formatsTableKey == DECIMAL_FORMAT) { + style = UNUM_LONG; + destination = &dataBundle.longData; + } else if (patternsTableKey == PATTERNS_SHORT + && formatsTableKey == DECIMAL_FORMAT) { + style = UNUM_SHORT; + destination = &dataBundle.shortData; + // TODO: Enable the following statements when currency support is added + // } else if (patternsTableKey == PATTERNS_SHORT + // && formatsTableKey == CURRENCY_FORMAT) { + // style = UNUM_SHORT_CURRENCY; // or whatever the enum gets named + // destination = &dataBundle.shortCurrencyData; + // } else { + // // Silently ignore this case + // continue; + } + + // SPECIAL CASE: RULES FOR WHETHER OR NOT TO CONSUME THIS TABLE: + // 1) Don't consume longData if shortData was consumed from the non-Latin + // locale numbering system + // 2) Don't consume longData for the first time if this is the root bundle and + // shortData is already populated from a more specific locale. Note that if + // both longData and shortData are both only in root, longData will be + // consumed since it is alphabetically before shortData in the bundle. + if (isFallback + && style == UNUM_LONG + && !dataBundle.shortData.isEmpty() + && !dataBundle.shortData.fromFallback) { + continue; + } + if (isRoot + && style == UNUM_LONG + && dataBundle.longData.isEmpty() + && !dataBundle.shortData.isEmpty()) { + continue; + } + + // Set the "fromFallback" flag on the data object + destination->fromFallback = isFallback; + + // Traverse into the powers of ten table + ResourceTable powersOfTenTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) { + + // The key will always be some even power of 10. e.g 10000. + char* endPtr = NULL; + double power10 = uprv_strtod(key, &endPtr); + if (*endPtr != 0) { + errorCode = U_INTERNAL_PROGRAM_ERROR; + return; + } + int32_t log10Value = computeLog10(power10, FALSE); + + // Silently ignore divisors that are too big. + if (log10Value >= MAX_DIGITS) continue; + + // Iterate over the plural variants ("one", "other", etc) + ResourceTable pluralVariantsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i4 = 0; pluralVariantsTable.getKeyAndValue(i4, key, value); ++i4) { + const char* pluralVariant = key; + const UnicodeString formatStr = value.getUnicodeString(errorCode); + + // Copy the data into the in-memory data bundle (do not overwrite + // existing values) + int32_t numZeros = populatePrefixSuffix( + pluralVariant, log10Value, formatStr, + destination->unitsByVariant, FALSE, errorCode); + + // If populatePrefixSuffix returns -1, it means that this key has been + // encountered already. + if (numZeros < 0) { + continue; + } + + // Set the divisor, which is based on the number of zeros in the template + // string. If the divisor from here is different from the one previously + // stored, it means that the number of zeros in different plural variants + // differs; throw an exception. + // TODO: How should I check for floating-point errors here? + // Is there a good reason why "divisor" is double and not long like Java? + double divisor = calculateDivisor(power10, numZeros); + if (destination->divisors[log10Value] != 0.0 + && destination->divisors[log10Value] != divisor) { + errorCode = U_INTERNAL_PROGRAM_ERROR; + return; + } + destination->divisors[log10Value] = divisor; } - return NULL; } - return result; } - case ANY: - return result; - default: - ures_close(ownedByUs); - status = U_ILLEGAL_ARGUMENT_ERROR; - return NULL; + } } -} +}; -static UBool isRoot(const UResourceBundle* rb, UErrorCode& status) { - const char* actualLocale = ures_getLocaleByType( - rb, ULOC_ACTUAL_LOCALE, &status); - if (U_FAILURE(status)) { - return FALSE; - } - return uprv_strcmp(actualLocale, gRoot) == 0; -} +// Virtual destructors must be defined out of line. +CmptDecDataSink::~CmptDecDataSink() {} +} // namespace -// initCDFLocaleStyleData loads formatting data for a particular style. -// decimalFormatBundle is the "decimalFormat" resource bundle in CLDR. -// Loaded data stored in result. -static void initCDFLocaleStyleData(const UResourceBundle* decimalFormatBundle, CDFLocaleStyleData* result, UErrorCode& status) { +static void load(const Locale& inLocale, CDFLocaleData* result, UErrorCode& status) { + LocalPointer ns(NumberingSystem::createInstance(inLocale, status)); if (U_FAILURE(status)) { return; } - // Iterate through all the powers of 10. - int32_t size = ures_getSize(decimalFormatBundle); - UResourceBundle* power10 = NULL; - for (int32_t i = 0; i < size; ++i) { - power10 = ures_getByIndex(decimalFormatBundle, i, power10, &status); - if (U_FAILURE(status)) { - ures_close(power10); - return; - } - populatePower10(power10, result, status); - if (U_FAILURE(status)) { - ures_close(power10); - return; - } - } - ures_close(power10); - fillInMissing(result); -} + const char* nsName = ns->getName(); -// populatePower10 grabs data for a particular power of 10 from CLDR. -// The loaded data is stored in result. -static void populatePower10(const UResourceBundle* power10Bundle, CDFLocaleStyleData* result, UErrorCode& status) { + LocalUResourceBundlePointer resource(ures_open(NULL, inLocale.getName(), &status)); if (U_FAILURE(status)) { return; } - char* endPtr = NULL; - double power10 = uprv_strtod(ures_getKey(power10Bundle), &endPtr); - if (*endPtr != 0) { - status = U_INTERNAL_PROGRAM_ERROR; - return; - } - int32_t log10Value = computeLog10(power10, FALSE); - // Silently ignore divisors that are too big. - if (log10Value == MAX_DIGITS) { - return; - } - int32_t size = ures_getSize(power10Bundle); - int32_t numZeros = 0; - UBool otherVariantDefined = FALSE; - UResourceBundle* variantBundle = NULL; - // Iterate over all the plural variants for the power of 10 - for (int32_t i = 0; i < size; ++i) { - variantBundle = ures_getByIndex(power10Bundle, i, variantBundle, &status); - if (U_FAILURE(status)) { - ures_close(variantBundle); - return; - } - const char* variant = ures_getKey(variantBundle); - int32_t resLen; - const UChar* formatStrP = ures_getString(variantBundle, &resLen, &status); - if (U_FAILURE(status)) { - ures_close(variantBundle); - return; - } - UnicodeString formatStr(false, formatStrP, resLen); - if (uprv_strcmp(variant, gOther) == 0) { - otherVariantDefined = TRUE; - } - int32_t nz = populatePrefixSuffix( - variant, log10Value, formatStr, result->unitsByVariant, status); - if (U_FAILURE(status)) { - ures_close(variantBundle); + CmptDecDataSink sink(*result); + sink.isFallback = FALSE; + + // First load the number elements data if nsName is not Latin. + if (uprv_strcmp(nsName, gLatnTag) != 0) { + sink.isLatin = FALSE; + CharString path; + path.append(gNumberElementsTag, status) + .append('/', status) + .append(nsName, status); + ures_getAllItemsWithFallback(resource.getAlias(), path.data(), sink, status); + if (status == U_MISSING_RESOURCE_ERROR) { + // Silently ignore and use Latin + status = U_ZERO_ERROR; + } else if (U_FAILURE(status)) { return; } - if (nz != numZeros) { - // We expect all format strings to have the same number of 0's - // left of the decimal point. - if (numZeros != 0) { - status = U_INTERNAL_PROGRAM_ERROR; - ures_close(variantBundle); - return; - } - numZeros = nz; - } + sink.isFallback = TRUE; } - ures_close(variantBundle); - // We expect to find an OTHER variant for each power of 10. - if (!otherVariantDefined) { - status = U_INTERNAL_PROGRAM_ERROR; - return; + + // Now load Latin. + sink.isLatin = TRUE; + ures_getAllItemsWithFallback(resource.getAlias(), gLatnPath, sink, status); + if (U_FAILURE(status)) return; + + // If longData is empty, default it to be equal to shortData + if (result->longData.isEmpty()) { + result->longData.setToBogus(); } - double divisor = power10; - for (int32_t i = 1; i < numZeros; ++i) { - divisor /= 10.0; + + // Check for "other" variants in each of the three data classes, and resolve missing elements. + + if (!result->longData.isBogus()) { + checkForOtherVariants(&result->longData, status); + if (U_FAILURE(status)) return; + fillInMissing(&result->longData); } - result->divisors[log10Value] = divisor; + + checkForOtherVariants(&result->shortData, status); + if (U_FAILURE(status)) return; + fillInMissing(&result->shortData); + + // TODO: Enable this statement when currency support is added + // checkForOtherVariants(&result->shortCurrencyData, status); + // if (U_FAILURE(status)) return; + // fillInMissing(&result->shortCurrencyData); } // populatePrefixSuffix Adds a specific prefix-suffix pair to result for a @@ -810,7 +767,7 @@ static void populatePower10(const UResourceBundle* power10Bundle, CDFLocaleStyle // In the special case that formatStr contains only spaces for prefix // and suffix, populatePrefixSuffix returns log10Value + 1. static int32_t populatePrefixSuffix( - const char* variant, int32_t log10Value, const UnicodeString& formatStr, UHashtable* result, UErrorCode& status) { + const char* variant, int32_t log10Value, const UnicodeString& formatStr, UHashtable* result, UBool overwrite, UErrorCode& status) { if (U_FAILURE(status)) { return 0; } @@ -825,6 +782,13 @@ static int32_t populatePrefixSuffix( if (U_FAILURE(status)) { return 0; } + + // Return -1 if we are not overwriting an existing value + if (unit->isSet() && !overwrite) { + return -1; + } + unit->markAsSet(); + // Everything up to first 0 is the prefix unit->prefix = formatStr.tempSubString(0, firstIdx); fixQuotes(unit->prefix); @@ -846,6 +810,16 @@ static int32_t populatePrefixSuffix( return (idx - firstIdx); } +// Calculate a divisor based on the magnitude and number of zeros in the +// template string. +static double calculateDivisor(double power10, int32_t numZeros) { + double divisor = power10; + for (int32_t i = 1; i < numZeros; ++i) { + divisor /= 10.0; + } + return divisor; +} + static UBool onlySpaces(UnicodeString u) { return u.trim().length() == 0; } @@ -884,6 +858,38 @@ static void fixQuotes(UnicodeString& s) { s.truncate(dest); } +// Checks to make sure that an "other" variant is present in all +// powers of 10. +static void checkForOtherVariants(CDFLocaleStyleData* result, + UErrorCode& status) { + if (result == NULL || result->unitsByVariant == NULL) { + return; + } + + const CDFUnit* otherByBase = + (const CDFUnit*) uhash_get(result->unitsByVariant, gOther); + if (otherByBase == NULL) { + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + + // Check all other plural variants, and make sure that if + // any of them are populated, then other is also populated + int32_t pos = UHASH_FIRST; + const UHashElement* element; + while ((element = uhash_nextElement(result->unitsByVariant, &pos)) != NULL) { + CDFUnit* variantsByBase = (CDFUnit*) element->value.pointer; + if (variantsByBase == otherByBase) continue; + for (int32_t log10Value = 0; log10Value < MAX_DIGITS; ++log10Value) { + if (variantsByBase[log10Value].isSet() + && !otherByBase[log10Value].isSet()) { + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + } + } +} + // fillInMissing ensures that the data in result is complete. // result data is complete if for each variant in result, there exists // a prefix-suffix pair for each log10 value and there also exists @@ -973,7 +979,6 @@ static CDFUnit* createCDFUnit(const char* variant, int32_t log10Value, UHashtabl } } CDFUnit* result = &cdfUnit[log10Value]; - result->markAsSet(); return result; } diff --git a/deps/icu-small/source/i18n/coptccal.cpp b/deps/icu-small/source/i18n/coptccal.cpp index 1996327a6f21a8..ce531ca0e851bd 100644 --- a/deps/icu-small/source/i18n/coptccal.cpp +++ b/deps/icu-small/source/i18n/coptccal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003 - 2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/coptccal.h b/deps/icu-small/source/i18n/coptccal.h index 47c952868b10ae..523769fabe57f0 100644 --- a/deps/icu-small/source/i18n/coptccal.h +++ b/deps/icu-small/source/i18n/coptccal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003 - 2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/cpdtrans.cpp b/deps/icu-small/source/i18n/cpdtrans.cpp index 3798a6de021df9..b6e328f92c223c 100644 --- a/deps/icu-small/source/i18n/cpdtrans.cpp +++ b/deps/icu-small/source/i18n/cpdtrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/cpdtrans.h b/deps/icu-small/source/i18n/cpdtrans.h index 004f04fd63c305..6f832df883cb85 100644 --- a/deps/icu-small/source/i18n/cpdtrans.h +++ b/deps/icu-small/source/i18n/cpdtrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 94d440090cd14a..8ddbe8129b68d7 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/csdetect.h b/deps/icu-small/source/i18n/csdetect.h index bbe81c801669b5..d0dc0d20777d44 100644 --- a/deps/icu-small/source/i18n/csdetect.h +++ b/deps/icu-small/source/i18n/csdetect.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/csmatch.cpp b/deps/icu-small/source/i18n/csmatch.cpp index b2c8544fc559ac..ea8d37cd202703 100644 --- a/deps/icu-small/source/i18n/csmatch.cpp +++ b/deps/icu-small/source/i18n/csmatch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/csmatch.h b/deps/icu-small/source/i18n/csmatch.h index 19a285262d399d..a94b86ae7c0ca4 100644 --- a/deps/icu-small/source/i18n/csmatch.h +++ b/deps/icu-small/source/i18n/csmatch.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/csr2022.cpp b/deps/icu-small/source/i18n/csr2022.cpp index 5ba30d53c44994..9566ee479612be 100644 --- a/deps/icu-small/source/i18n/csr2022.cpp +++ b/deps/icu-small/source/i18n/csr2022.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/csr2022.h b/deps/icu-small/source/i18n/csr2022.h index ba5e5e011e59e0..9ff2648505f141 100644 --- a/deps/icu-small/source/i18n/csr2022.h +++ b/deps/icu-small/source/i18n/csr2022.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/csrecog.cpp b/deps/icu-small/source/i18n/csrecog.cpp index 7535e9aa66016e..7ae7765399f20a 100644 --- a/deps/icu-small/source/i18n/csrecog.cpp +++ b/deps/icu-small/source/i18n/csrecog.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2006, International Business Machines diff --git a/deps/icu-small/source/i18n/csrecog.h b/deps/icu-small/source/i18n/csrecog.h index 97d3af7ad1a528..1759ca561b363a 100644 --- a/deps/icu-small/source/i18n/csrecog.h +++ b/deps/icu-small/source/i18n/csrecog.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/csrmbcs.cpp b/deps/icu-small/source/i18n/csrmbcs.cpp index 1963bf85abe649..d61269f5e33770 100644 --- a/deps/icu-small/source/i18n/csrmbcs.cpp +++ b/deps/icu-small/source/i18n/csrmbcs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/csrmbcs.h b/deps/icu-small/source/i18n/csrmbcs.h index 9ea9d8f8ee0338..6a49a859724be8 100644 --- a/deps/icu-small/source/i18n/csrmbcs.h +++ b/deps/icu-small/source/i18n/csrmbcs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/csrsbcs.cpp b/deps/icu-small/source/i18n/csrsbcs.cpp index 803105c24a7da0..48e7dc51233c53 100644 --- a/deps/icu-small/source/i18n/csrsbcs.cpp +++ b/deps/icu-small/source/i18n/csrsbcs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/csrsbcs.h b/deps/icu-small/source/i18n/csrsbcs.h index b4897b1ceec91a..2f967dd9c2888d 100644 --- a/deps/icu-small/source/i18n/csrsbcs.h +++ b/deps/icu-small/source/i18n/csrsbcs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/csrucode.cpp b/deps/icu-small/source/i18n/csrucode.cpp index 3780c3b3e684e6..201b2996c78cab 100644 --- a/deps/icu-small/source/i18n/csrucode.cpp +++ b/deps/icu-small/source/i18n/csrucode.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/csrucode.h b/deps/icu-small/source/i18n/csrucode.h index 458b2c96ad9d53..10e5fafe66febd 100644 --- a/deps/icu-small/source/i18n/csrucode.h +++ b/deps/icu-small/source/i18n/csrucode.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/csrutf8.cpp b/deps/icu-small/source/i18n/csrutf8.cpp index 6dd874e0ba6bf0..4f29fa2af7fe28 100644 --- a/deps/icu-small/source/i18n/csrutf8.cpp +++ b/deps/icu-small/source/i18n/csrutf8.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/csrutf8.h b/deps/icu-small/source/i18n/csrutf8.h index 79a424b7c0cda7..71309eade75657 100644 --- a/deps/icu-small/source/i18n/csrutf8.h +++ b/deps/icu-small/source/i18n/csrutf8.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/curramt.cpp b/deps/icu-small/source/i18n/curramt.cpp index 195d5f30f4808f..4475ff611eeec0 100644 --- a/deps/icu-small/source/i18n/curramt.cpp +++ b/deps/icu-small/source/i18n/curramt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004, International Business Machines diff --git a/deps/icu-small/source/i18n/currfmt.cpp b/deps/icu-small/source/i18n/currfmt.cpp index 23a7d52acac157..b92aa00e5cb8b5 100644 --- a/deps/icu-small/source/i18n/currfmt.cpp +++ b/deps/icu-small/source/i18n/currfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014 International Business Machines diff --git a/deps/icu-small/source/i18n/currfmt.h b/deps/icu-small/source/i18n/currfmt.h index b3f23e56f9676b..83e027246562eb 100644 --- a/deps/icu-small/source/i18n/currfmt.h +++ b/deps/icu-small/source/i18n/currfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/currpinf.cpp b/deps/icu-small/source/i18n/currpinf.cpp index 9d8d524a0fb5a4..7c16fff961dc40 100644 --- a/deps/icu-small/source/i18n/currpinf.cpp +++ b/deps/icu-small/source/i18n/currpinf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/currunit.cpp b/deps/icu-small/source/i18n/currunit.cpp index 64233aee7cf55a..f538d65ada657d 100644 --- a/deps/icu-small/source/i18n/currunit.cpp +++ b/deps/icu-small/source/i18n/currunit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/dangical.cpp b/deps/icu-small/source/i18n/dangical.cpp index bfe15b59edbf26..3a7b2ebb8fca2d 100644 --- a/deps/icu-small/source/i18n/dangical.cpp +++ b/deps/icu-small/source/i18n/dangical.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/dangical.h b/deps/icu-small/source/i18n/dangical.h index cc35ca3f07b3f4..17a5004bdc6d32 100644 --- a/deps/icu-small/source/i18n/dangical.h +++ b/deps/icu-small/source/i18n/dangical.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 048a4723ef6c91..00f46cfdfdf2c0 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and * @@ -317,7 +319,7 @@ DateFormat::format(UDate date, UnicodeString& appendTo) const { // Note that any error information is just lost. That's okay // for this convenience method. - FieldPosition fpos(0); + FieldPosition fpos(FieldPosition::DONT_CARE); return format(date, appendTo, fpos); } diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index fb8ae8147f8d56..30414823efdfe3 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2016, International Business Machines @@ -42,129 +44,90 @@ enum CutoffType { } // namespace -struct DayPeriodRulesDataSink : public ResourceTableSink { - // Initialize sub-sinks. - DayPeriodRulesDataSink() : - rulesSink(*this), ruleSetSink(*this), periodSink(*this), cutoffSink(*this) { +struct DayPeriodRulesDataSink : public ResourceSink { + DayPeriodRulesDataSink() { for (int32_t i = 0; i < UPRV_LENGTHOF(cutoffs); ++i) { cutoffs[i] = 0; } } virtual ~DayPeriodRulesDataSink(); - // Entry point. - virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - - if (uprv_strcmp(key, "locales") == 0) { - return &localesSink; - } else if (uprv_strcmp(key, "rules") == 0) { - // Allocate one more than needed to skip [0]. See comment in parseSetNum(). - data->rules = new DayPeriodRules[data->maxRuleSetNum + 1]; - if (data->rules == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } else { - return &rulesSink; + virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) { + ResourceTable dayPeriodData = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t i = 0; dayPeriodData.getKeyAndValue(i, key, value); ++i) { + if (uprv_strcmp(key, "locales") == 0) { + ResourceTable locales = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t j = 0; locales.getKeyAndValue(j, key, value); ++j) { + UnicodeString setNum_str = value.getUnicodeString(errorCode); + int32_t setNum = parseSetNum(setNum_str, errorCode); + uhash_puti(data->localeToRuleSetNumMap, const_cast(key), setNum, &errorCode); + } + } else if (uprv_strcmp(key, "rules") == 0) { + // Allocate one more than needed to skip [0]. See comment in parseSetNum(). + data->rules = new DayPeriodRules[data->maxRuleSetNum + 1]; + if (data->rules == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + ResourceTable rules = value.getTable(errorCode); + processRules(rules, key, value, errorCode); + if (U_FAILURE(errorCode)) { return; } } } - return NULL; } - // Data root -> locales. - struct LocalesSink : public ResourceTableSink { - virtual ~LocalesSink(); + void processRules(const ResourceTable &rules, const char *key, + ResourceValue &value, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { + for (int32_t i = 0; rules.getKeyAndValue(i, key, value); ++i) { + ruleSetNum = parseSetNum(key, errorCode); + ResourceTable ruleSet = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } - UnicodeString setNum_str = value.getUnicodeString(errorCode); - int32_t setNum = parseSetNum(setNum_str, errorCode); - uhash_puti(data->localeToRuleSetNumMap, const_cast(key), setNum, &errorCode); - } - } localesSink; - - // Data root -> rules. - struct RulesSink : public ResourceTableSink { - DayPeriodRulesDataSink &outer; - RulesSink(DayPeriodRulesDataSink &outer) : outer(outer) {} - virtual ~RulesSink(); - - virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - - outer.ruleSetNum = parseSetNum(key, errorCode); - return &outer.ruleSetSink; - } - } rulesSink; - - // Data root -> rules -> a rule set. - struct RuleSetSink : public ResourceTableSink { - DayPeriodRulesDataSink &outer; - RuleSetSink(DayPeriodRulesDataSink &outer) : outer(outer) {} - virtual ~RuleSetSink(); - - virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - - outer.period = DayPeriodRules::getDayPeriodFromString(key); - if (outer.period == DayPeriodRules::DAYPERIOD_UNKNOWN) { - errorCode = U_INVALID_FORMAT_ERROR; - return NULL; + for (int32_t j = 0; ruleSet.getKeyAndValue(j, key, value); ++j) { + period = DayPeriodRules::getDayPeriodFromString(key); + if (period == DayPeriodRules::DAYPERIOD_UNKNOWN) { + errorCode = U_INVALID_FORMAT_ERROR; + return; + } + ResourceTable periodDefinition = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t k = 0; periodDefinition.getKeyAndValue(k, key, value); ++k) { + if (value.getType() == URES_STRING) { + // Key-value pairs (e.g. before{6:00}). + CutoffType type = getCutoffTypeFromString(key); + addCutoff(type, value.getUnicodeString(errorCode), errorCode); + if (U_FAILURE(errorCode)) { return; } + } else { + // Arrays (e.g. before{6:00, 24:00}). + cutoffType = getCutoffTypeFromString(key); + ResourceArray cutoffArray = value.getArray(errorCode); + if (U_FAILURE(errorCode)) { return; } + + int32_t length = cutoffArray.getSize(); + for (int32_t l = 0; l < length; ++l) { + cutoffArray.getValue(l, value); + addCutoff(cutoffType, value.getUnicodeString(errorCode), errorCode); + if (U_FAILURE(errorCode)) { return; } + } + } + } + setDayPeriodForHoursFromCutoffs(errorCode); + for (int32_t k = 0; k < UPRV_LENGTHOF(cutoffs); ++k) { + cutoffs[k] = 0; + } } - return &outer.periodSink; - } - - virtual void leave(UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - - if (!data->rules[outer.ruleSetNum].allHoursAreSet()) { + if (!data->rules[ruleSetNum].allHoursAreSet()) { errorCode = U_INVALID_FORMAT_ERROR; + return; } } - } ruleSetSink; - - // Data root -> rules -> a rule set -> a period (e.g. "morning1"). - // Key-value pairs (e.g. before{6:00}) will be captured here. - // Arrays (e.g. before{6:00, 24:00}) will be redirected to the next sink. - struct PeriodSink : public ResourceTableSink { - DayPeriodRulesDataSink &outer; - PeriodSink(DayPeriodRulesDataSink &outer) : outer(outer) {} - virtual ~PeriodSink(); - - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - - CutoffType type = getCutoffTypeFromString(key); - outer.addCutoff(type, value.getUnicodeString(errorCode), errorCode); - } - - virtual ResourceArraySink *getOrCreateArraySink(const char *key, int32_t, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - outer.cutoffType = getCutoffTypeFromString(key); - return &outer.cutoffSink; - } - - virtual void leave(UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - - outer.setDayPeriodForHoursFromCutoffs(errorCode); - for (int32_t i = 0; i < UPRV_LENGTHOF(outer.cutoffs); ++i) { - outer.cutoffs[i] = 0; - } - } - } periodSink; - - // Data root -> rules -> a rule set -> a period -> a cutoff type. - // Will enter this sink if 2+ times appear in a single cutoff type (e.g. before{6:00, 24:00}). - struct CutoffSink : public ResourceArraySink { - DayPeriodRulesDataSink &outer; - CutoffSink(DayPeriodRulesDataSink &outer) : outer(outer) {} - virtual ~CutoffSink(); - - virtual void put(int32_t, const ResourceValue &value, UErrorCode &errorCode) { - outer.addCutoff(outer.cutoffType, value.getUnicodeString(errorCode), errorCode); - } - } cutoffSink; + } // Members. int32_t cutoffs[25]; // [0] thru [24]: 24 is allowed in "before 24". @@ -316,35 +279,31 @@ struct DayPeriodRulesDataSink : public ResourceTableSink { } }; // struct DayPeriodRulesDataSink -struct DayPeriodRulesCountSink : public ResourceTableSink { +struct DayPeriodRulesCountSink : public ResourceSink { virtual ~DayPeriodRulesCountSink(); - virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - int32_t setNum = DayPeriodRulesDataSink::parseSetNum(key, errorCode); - if (setNum > data->maxRuleSetNum) { - data->maxRuleSetNum = setNum; - } + virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) { + ResourceTable rules = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } - return NULL; + for (int32_t i = 0; rules.getKeyAndValue(i, key, value); ++i) { + int32_t setNum = DayPeriodRulesDataSink::parseSetNum(key, errorCode); + if (setNum > data->maxRuleSetNum) { + data->maxRuleSetNum = setNum; + } + } } }; // Out-of-line virtual destructors. -DayPeriodRulesDataSink::LocalesSink::~LocalesSink() {} -DayPeriodRulesDataSink::CutoffSink::~CutoffSink() {} -DayPeriodRulesDataSink::PeriodSink::~PeriodSink() {} -DayPeriodRulesDataSink::RuleSetSink::~RuleSetSink() {} -DayPeriodRulesDataSink::RulesSink::~RulesSink() {} DayPeriodRulesDataSink::~DayPeriodRulesDataSink() {} - DayPeriodRulesCountSink::~DayPeriodRulesCountSink() {} namespace { UInitOnce initOnce = U_INITONCE_INITIALIZER; -UBool dayPeriodRulesCleanup() { +U_CFUNC UBool U_CALLCONV dayPeriodRulesCleanup() { delete[] data->rules; uhash_close(data->localeToRuleSetNumMap); delete data; @@ -354,7 +313,7 @@ UBool dayPeriodRulesCleanup() { } // namespace -void DayPeriodRules::load(UErrorCode &errorCode) { +void U_CALLCONV DayPeriodRules::load(UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } @@ -365,11 +324,11 @@ void DayPeriodRules::load(UErrorCode &errorCode) { // Get the largest rule set number (so we allocate enough objects). DayPeriodRulesCountSink countSink; - ures_getAllTableItemsWithFallback(rb_dayPeriods.getAlias(), "rules", countSink, errorCode); + ures_getAllItemsWithFallback(rb_dayPeriods.getAlias(), "rules", countSink, errorCode); // Populate rules. DayPeriodRulesDataSink sink; - ures_getAllTableItemsWithFallback(rb_dayPeriods.getAlias(), "", sink, errorCode); + ures_getAllItemsWithFallback(rb_dayPeriods.getAlias(), "", sink, errorCode); ucln_i18n_registerCleanup(UCLN_I18N_DAYPERIODRULES, dayPeriodRulesCleanup); } diff --git a/deps/icu-small/source/i18n/dayperiodrules.h b/deps/icu-small/source/i18n/dayperiodrules.h index 5491f7c1ff013f..3c006cdc2f59dd 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.h +++ b/deps/icu-small/source/i18n/dayperiodrules.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2016, International Business Machines @@ -59,7 +61,7 @@ class DayPeriodRules : public UMemory { // Translates "morning1" to DAYPERIOD_MORNING1, for example. static DayPeriod getDayPeriodFromString(const char *type_str); - static void load(UErrorCode &errorCode); + static void U_CALLCONV load(UErrorCode &errorCode); // Sets period type for all hours in [startHour, limitHour). void add(int32_t startHour, int32_t limitHour, DayPeriod period); diff --git a/deps/icu-small/source/i18n/dcfmtimp.h b/deps/icu-small/source/i18n/dcfmtimp.h index a8279479608ddc..58858728419641 100644 --- a/deps/icu-small/source/i18n/dcfmtimp.h +++ b/deps/icu-small/source/i18n/dcfmtimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index fee9b319ba0bcf..b8b9c32a42fa25 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 1997-2015, International Business Machines Corporation and +* Copyright (C) 1997-2016, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* * @@ -35,6 +37,7 @@ #include "locbased.h" #include "uresimp.h" #include "ureslocs.h" +#include "charstr.h" // ***************************************************************************** // class DecimalFormatSymbols @@ -51,10 +54,45 @@ static const char gAfterCurrencyTag[] = "afterCurrency"; static const char gCurrencyMatchTag[] = "currencyMatch"; static const char gCurrencySudMatchTag[] = "surroundingMatch"; static const char gCurrencyInsertBtnTag[] = "insertBetween"; - +static const char gLatn[] = "latn"; +static const char gSymbols[] = "symbols"; +static const char gNumberElementsLatnSymbols[] = "NumberElements/latn/symbols"; static const UChar INTL_CURRENCY_SYMBOL_STR[] = {0xa4, 0xa4, 0}; +// List of field names to be loaded from the data files. +// These are parallel with the enum ENumberFormatSymbol in unicode/dcfmtsym.h. +static const char *gNumberElementKeys[DecimalFormatSymbols::kFormatSymbolCount] = { + "decimal", + "group", + "list", + "percentSign", + NULL, /* Native zero digit is deprecated from CLDR - get it from the numbering system */ + NULL, /* Pattern digit character is deprecated from CLDR - use # by default always */ + "minusSign", + "plusSign", + NULL, /* currency symbol - Wait until we know the currency before loading from CLDR */ + NULL, /* intl currency symbol - Wait until we know the currency before loading from CLDR */ + "currencyDecimal", + "exponential", + "perMille", + NULL, /* Escape padding character - not in CLDR */ + "infinity", + "nan", + NULL, /* Significant digit symbol - not in CLDR */ + "currencyGroup", + NULL, /* one digit - get it from the numbering system */ + NULL, /* two digit - get it from the numbering system */ + NULL, /* three digit - get it from the numbering system */ + NULL, /* four digit - get it from the numbering system */ + NULL, /* five digit - get it from the numbering system */ + NULL, /* six digit - get it from the numbering system */ + NULL, /* seven digit - get it from the numbering system */ + NULL, /* eight digit - get it from the numbering system */ + NULL, /* nine digit - get it from the numbering system */ + "superscriptingExponent", /* Multiplication (x) symbol for exponents */ +}; + // ------------------------------------- // Initializes this with the decimal format symbols in the default locale. @@ -166,63 +204,149 @@ DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const // ------------------------------------- -void -DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) -{ - static const char *gNumberElementKeys[kFormatSymbolCount] = { - "decimal", - "group", - "list", - "percentSign", - NULL, /* Native zero digit is deprecated from CLDR - get it from the numbering system */ - NULL, /* Pattern digit character is deprecated from CLDR - use # by default always */ - "minusSign", - "plusSign", - NULL, /* currency symbol - We don't really try to load this directly from CLDR until we know the currency */ - NULL, /* intl currency symbol - We don't really try to load this directly from CLDR until we know the currency */ - "currencyDecimal", - "exponential", - "perMille", - NULL, /* Escape padding character - not in CLDR */ - "infinity", - "nan", - NULL, /* Significant digit symbol - not in CLDR */ - "currencyGroup", - NULL, /* one digit - get it from the numbering system */ - NULL, /* two digit - get it from the numbering system */ - NULL, /* three digit - get it from the numbering system */ - NULL, /* four digit - get it from the numbering system */ - NULL, /* five digit - get it from the numbering system */ - NULL, /* six digit - get it from the numbering system */ - NULL, /* seven digit - get it from the numbering system */ - NULL, /* eight digit - get it from the numbering system */ - NULL, /* nine digit - get it from the numbering system */ - "superscriptingExponent", /* Multiplication (x) symbol for exponents */ - }; - - static const char *gLatn = "latn"; - static const char *gSymbols = "symbols"; - const char *nsName; - const UChar *sym = NULL; - int32_t len = 0; +namespace { + +/** + * Sink for enumerating all of the decimal format symbols (more specifically, anything + * under the "NumberElements.symbols" tree). + * + * 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. + */ +struct DecFmtSymDataSink : public ResourceSink { + + // Destination for data, modified via setters. + DecimalFormatSymbols& dfs; + // Boolean array of whether or not we have seen a particular symbol yet. + // Can't simpy check fSymbols because it is pre-populated with defaults. + UBool seenSymbol[DecimalFormatSymbols::kFormatSymbolCount]; + + // Constructor/Destructor + DecFmtSymDataSink(DecimalFormatSymbols& _dfs) : dfs(_dfs) { + uprv_memset(seenSymbol, FALSE, sizeof(seenSymbol)); + } + virtual ~DecFmtSymDataSink(); + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable symbolsTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t j = 0; symbolsTable.getKeyAndValue(j, key, value); ++j) { + for (int32_t i=0; i ns(NumberingSystem::createInstance(loc, status)); + const char *nsName; if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { nsName = ns->getName(); UnicodeString digitString(ns->getDescription()); @@ -248,61 +372,61 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us nsName = gLatn; } - UBool isLatn = !uprv_strcmp(nsName,gLatn); + // Open resource bundles + const char* locStr = loc.getName(); + LocalUResourceBundlePointer resource(ures_open(NULL, locStr, &status)); + LocalUResourceBundlePointer numberElementsRes( + ures_getByKeyWithFallback(resource.getAlias(), gNumberElements, NULL, &status)); - UErrorCode nlStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer nonLatnSymbols; - if ( !isLatn ) { - nonLatnSymbols.adoptInstead( - ures_getByKeyWithFallback(numberElementsRes.getAlias(), nsName, NULL, &nlStatus)); - ures_getByKeyWithFallback(nonLatnSymbols.getAlias(), gSymbols, nonLatnSymbols.getAlias(), &nlStatus); + if (U_FAILURE(status)) { + if ( useLastResortData ) { + status = U_USING_DEFAULT_WARNING; + initialize(); + } + return; } - LocalUResourceBundlePointer latnSymbols( - ures_getByKeyWithFallback(numberElementsRes.getAlias(), gLatn, NULL, &status)); - ures_getByKeyWithFallback(latnSymbols.getAlias(), gSymbols, latnSymbols.getAlias(), &status); - - UBool kMonetaryDecimalSet = FALSE; - UBool kMonetaryGroupingSet = FALSE; - for(int32_t i = 0; iindexOf(kCurrencySign) != -1) { // initialize for currency, not only for plural format, // but also for mix parsing - if (fCurrencyPluralInfo == NULL) { - fCurrencyPluralInfo = new CurrencyPluralInfo(fImpl->fSymbols->getLocale(), status); - if (U_FAILURE(status)) { - return; - } - } - // need it for mix parsing + handleCurrencySignInPattern(status); + } +} + +void +DecimalFormat::handleCurrencySignInPattern(UErrorCode& status) { + // initialize for currency, not only for plural format, + // but also for mix parsing + if (U_FAILURE(status)) { + return; + } + if (fCurrencyPluralInfo == NULL) { + fCurrencyPluralInfo = new CurrencyPluralInfo(fImpl->fSymbols->getLocale(), status); + if (U_FAILURE(status)) { + return; + } + } + // need it for mix parsing + if (fAffixPatternsForCurrency == NULL) { setupCurrencyAffixPatterns(status); } } @@ -828,7 +842,7 @@ DecimalFormat::format( double number, UnicodeString& -DecimalFormat::format(const StringPiece &number, +DecimalFormat::format(StringPiece number, UnicodeString &toAppendTo, FieldPositionIterator *posIter, UErrorCode &status) const @@ -1643,7 +1657,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, // if we didn't see a decimal and it is required, check to see if the pattern had one if(!sawDecimal && isDecimalPatternMatchRequired()) { - if(formatPattern.indexOf(DecimalFormatSymbols::kDecimalSeparatorSymbol) != 0) + if(formatPattern.indexOf(kPatternDecimalSeparator) != -1) { parsePosition.setIndex(oldStart); parsePosition.setErrorIndex(position); @@ -1769,7 +1783,7 @@ printf("PP -> %d, SLOW = [%s]! pp=%d, os=%d, err=%s\n", position, parsedNum.d // check if we missed a required decimal point if(fastParseOk && isDecimalPatternMatchRequired()) { - if(formatPattern.indexOf(DecimalFormatSymbols::kDecimalSeparatorSymbol) != 0) + if(formatPattern.indexOf(kPatternDecimalSeparator) != -1) { parsePosition.setIndex(oldStart); parsePosition.setErrorIndex(position); @@ -2815,6 +2829,9 @@ DecimalFormat::toLocalizedPattern(UnicodeString& result) const void DecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) { + if (pattern.indexOf(kCurrencySign) != -1) { + handleCurrencySignInPattern(status); + } fImpl->applyPattern(pattern, status); } @@ -2825,6 +2842,9 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status) { + if (pattern.indexOf(kCurrencySign) != -1) { + handleCurrencySignInPattern(status); + } fImpl->applyPattern(pattern, parseError, status); } //------------------------------------------------------------------------------ @@ -2832,6 +2852,9 @@ DecimalFormat::applyPattern(const UnicodeString& pattern, void DecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status) { + if (pattern.indexOf(kCurrencySign) != -1) { + handleCurrencySignInPattern(status); + } fImpl->applyLocalizedPattern(pattern, status); } @@ -2842,6 +2865,9 @@ DecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status) { + if (pattern.indexOf(kCurrencySign) != -1) { + handleCurrencySignInPattern(status); + } fImpl->applyLocalizedPattern(pattern, parseError, status); } diff --git a/deps/icu-small/source/i18n/decimfmtimpl.cpp b/deps/icu-small/source/i18n/decimfmtimpl.cpp index d0c96493a902be..342ce5b5e4ed1f 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.cpp +++ b/deps/icu-small/source/i18n/decimfmtimpl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. @@ -241,9 +243,9 @@ DecimalFormatImpl::setMultiplierScale(int32_t scale) { if (scale == 0) { // Needed to preserve equality. fMultiplier == 0 means // multiplier is 1. - fMultiplier.set(0); + fMultiplier.set((int32_t)0); } else { - fMultiplier.set(1); + fMultiplier.set((int32_t)1); fMultiplier.shiftDecimalRight(scale); } } @@ -425,7 +427,7 @@ DecimalFormatImpl::format( UnicodeString & DecimalFormatImpl::format( - const StringPiece &number, + StringPiece number, UnicodeString &appendTo, FieldPositionIterator *posIter, UErrorCode &status) const { @@ -706,7 +708,7 @@ DecimalFormatImpl::getMultiplier() const { void DecimalFormatImpl::setMultiplier(int32_t m) { if (m == 0 || m == 1) { - fMultiplier.set(0); + fMultiplier.set((int32_t)0); } else { fMultiplier.set(m); } @@ -1481,7 +1483,7 @@ DecimalFormatImpl::toNumberPattern( } } else { if (i < roundingIncrementUpperExp && i >= roundingIncrementLowerExp) { - result.append(fEffPrecision.fMantissa.fRoundingIncrement.getDigitByExponent(i) + kPatternZeroDigit); + result.append((UChar)(fEffPrecision.fMantissa.fRoundingIncrement.getDigitByExponent(i) + kPatternZeroDigit)); } else if (minInterval.contains(i)) { result.append(kPatternZeroDigit); } else { diff --git a/deps/icu-small/source/i18n/decimfmtimpl.h b/deps/icu-small/source/i18n/decimfmtimpl.h index d55a4eca2f2f33..537107c6f74de4 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.h +++ b/deps/icu-small/source/i18n/decimfmtimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2015, International Business Machines @@ -217,7 +219,7 @@ UnicodeString &format( FieldPositionIterator *posIter, UErrorCode &status) const; UnicodeString &format( - const StringPiece &number, + StringPiece number, UnicodeString &appendTo, FieldPositionIterator *posIter, UErrorCode &status) const; diff --git a/deps/icu-small/source/i18n/digitaffix.cpp b/deps/icu-small/source/i18n/digitaffix.cpp index d73d40121a843f..262bc49427062a 100644 --- a/deps/icu-small/source/i18n/digitaffix.cpp +++ b/deps/icu-small/source/i18n/digitaffix.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/digitaffix.h b/deps/icu-small/source/i18n/digitaffix.h index d5b545a3d7509f..a1a100654f4e84 100644 --- a/deps/icu-small/source/i18n/digitaffix.h +++ b/deps/icu-small/source/i18n/digitaffix.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitaffixesandpadding.cpp b/deps/icu-small/source/i18n/digitaffixesandpadding.cpp index d941a573de8ff4..716ab4a32ebfb3 100644 --- a/deps/icu-small/source/i18n/digitaffixesandpadding.cpp +++ b/deps/icu-small/source/i18n/digitaffixesandpadding.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/digitaffixesandpadding.h b/deps/icu-small/source/i18n/digitaffixesandpadding.h index 3586371094b97a..e837e07c8fbe0e 100644 --- a/deps/icu-small/source/i18n/digitaffixesandpadding.h +++ b/deps/icu-small/source/i18n/digitaffixesandpadding.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitformatter.cpp b/deps/icu-small/source/i18n/digitformatter.cpp index 837dcb4d9edb7b..d1a88f95eee80f 100644 --- a/deps/icu-small/source/i18n/digitformatter.cpp +++ b/deps/icu-small/source/i18n/digitformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/digitformatter.h b/deps/icu-small/source/i18n/digitformatter.h index cf339f598d627e..d92d4251513f38 100644 --- a/deps/icu-small/source/i18n/digitformatter.h +++ b/deps/icu-small/source/i18n/digitformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitgrouping.cpp b/deps/icu-small/source/i18n/digitgrouping.cpp index 0a340cdc4a1300..0d96b407c5039f 100644 --- a/deps/icu-small/source/i18n/digitgrouping.cpp +++ b/deps/icu-small/source/i18n/digitgrouping.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/digitgrouping.h b/deps/icu-small/source/i18n/digitgrouping.h index e075ae204bd71f..33835ff665cfb1 100644 --- a/deps/icu-small/source/i18n/digitgrouping.h +++ b/deps/icu-small/source/i18n/digitgrouping.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitinterval.cpp b/deps/icu-small/source/i18n/digitinterval.cpp index bf78c19aab2a9d..b1ba811606b371 100644 --- a/deps/icu-small/source/i18n/digitinterval.cpp +++ b/deps/icu-small/source/i18n/digitinterval.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/digitinterval.h b/deps/icu-small/source/i18n/digitinterval.h index 174f797fa4209c..5dbf3f9a296f8b 100644 --- a/deps/icu-small/source/i18n/digitinterval.h +++ b/deps/icu-small/source/i18n/digitinterval.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitlst.cpp b/deps/icu-small/source/i18n/digitlst.cpp index 54aebbb6323ebd..8bb470c8f08535 100644 --- a/deps/icu-small/source/i18n/digitlst.cpp +++ b/deps/icu-small/source/i18n/digitlst.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1997-2015, International Business Machines @@ -24,9 +26,14 @@ ****************************************************************************** */ +#if defined(__CYGWIN__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif + #include "digitlst.h" #if !UCONFIG_NO_FORMATTING + #include "unicode/putil.h" #include "charstr.h" #include "cmemory.h" @@ -35,12 +42,32 @@ #include "putilimp.h" #include "uassert.h" #include "digitinterval.h" +#include "ucln_in.h" +#include "umutex.h" #include #include #include #include #include +#if !defined(U_USE_STRTOD_L) +# if U_PLATFORM_USES_ONLY_WIN32_API +# define U_USE_STRTOD_L 1 +# elif defined(U_HAVE_STRTOD_L) +# define U_USE_STRTOD_L U_HAVE_STRTOD_L +# else +# define U_USE_STRTOD_L 0 +# endif +#endif + +#if U_USE_STRTOD_L && !U_PLATFORM_USES_ONLY_WIN32_API +# if U_PLATFORM == U_PF_CYGWIN +# include +# else +# include +# endif +#endif + // *************************************************************************** // class DigitList // A wrapper onto decNumber. @@ -395,27 +422,6 @@ DigitList::append(char digit) internalClear(); } -char DigitList::getStrtodDecimalSeparator() { - // TODO: maybe use andy's pthread once. - static char gDecimal = 0; - char result; - { - Mutex mutex; - result = gDecimal;; - if (result == 0) { - // We need to know the decimal separator character that will be used with strtod(). - // Depends on the C runtime global locale. - // Most commonly is '.' - // TODO: caching could fail if the global locale is changed on the fly. - char rep[MAX_DIGITS]; - sprintf(rep, "%+1.1f", 1.0); - result = rep[2]; - gDecimal = result;; - } - } - return result; -} - // ------------------------------------- /** @@ -428,24 +434,11 @@ char DigitList::getStrtodDecimalSeparator() { double DigitList::getDouble() const { - static char gDecimal = 0; - char decimalSeparator; { Mutex mutex; if (fHave == kDouble) { return fUnion.fDouble; } - decimalSeparator = gDecimal; - } - - if (decimalSeparator == 0) { - // We need to know the decimal separator character that will be used with strtod(). - // Depends on the C runtime global locale. - // Most commonly is '.' - // TODO: caching could fail if the global locale is changed on the fly. - char rep[MAX_DIGITS]; - sprintf(rep, "%+1.1f", 1.0); - decimalSeparator = rep[2]; } double tDouble = 0.0; @@ -483,24 +476,71 @@ DigitList::getDouble() const } U_ASSERT(uprv_strlen(&s[0]) < MAX_DBL_DIGITS+18); - if (decimalSeparator != '.') { - char *decimalPt = strchr(s.getAlias(), '.'); - if (decimalPt != NULL) { - *decimalPt = decimalSeparator; - } - } char *end = NULL; - tDouble = uprv_strtod(s.getAlias(), &end); + tDouble = decimalStrToDouble(s.getAlias(), &end); } { Mutex mutex; DigitList *nonConstThis = const_cast(this); nonConstThis->internalSetDouble(tDouble); - gDecimal = decimalSeparator; } return tDouble; } +#if U_USE_STRTOD_L && U_PLATFORM_USES_ONLY_WIN32_API +# define locale_t _locale_t +# define freelocale _free_locale +# define strtod_l _strtod_l +#endif + +#if U_USE_STRTOD_L +static locale_t gCLocale = (locale_t)0; +#endif +static icu::UInitOnce gCLocaleInitOnce = U_INITONCE_INITIALIZER; + +U_CDECL_BEGIN +// Cleanup callback func +static UBool U_CALLCONV digitList_cleanup(void) +{ +#if U_USE_STRTOD_L + if (gCLocale != (locale_t)0) { + freelocale(gCLocale); + } +#endif + return TRUE; +} +// C Locale initialization func +static void U_CALLCONV initCLocale(void) { + ucln_i18n_registerCleanup(UCLN_I18N_DIGITLIST, digitList_cleanup); +#if U_USE_STRTOD_L +# if U_PLATFORM_USES_ONLY_WIN32_API + gCLocale = _create_locale(LC_ALL, "C"); +# else + gCLocale = newlocale(LC_ALL_MASK, "C", (locale_t)0); +# endif +#endif +} +U_CDECL_END + +double +DigitList::decimalStrToDouble(char *decstr, char **end) { + umtx_initOnce(gCLocaleInitOnce, &initCLocale); +#if U_USE_STRTOD_L + return strtod_l(decstr, end, gCLocale); +#else + char *decimalPt = strchr(decstr, '.'); + if (decimalPt) { + // We need to know the decimal separator character that will be used with strtod(). + // Depends on the C runtime global locale. + // Most commonly is '.' + char rep[MAX_DIGITS]; + sprintf(rep, "%+1.1f", 1.0); + *decimalPt = rep[2]; + } + return uprv_strtod(decstr, end); +#endif +} + // ------------------------------------- /** @@ -734,7 +774,7 @@ DigitList::set(int64_t source) * be acceptable for a public API. */ void -DigitList::set(const StringPiece &source, UErrorCode &status, uint32_t /*fastpathBits*/) { +DigitList::set(StringPiece source, UErrorCode &status, uint32_t /*fastpathBits*/) { if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/digitlst.h b/deps/icu-small/source/i18n/digitlst.h index 6cea007cb88306..27e6e8c410b4ad 100644 --- a/deps/icu-small/source/i18n/digitlst.h +++ b/deps/icu-small/source/i18n/digitlst.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -267,7 +269,7 @@ class U_I18N_API DigitList : public UMemory { // Declare external to make compil * @param source The value to be set. The string must be nul-terminated. * @param fastpathBits special flags for fast parsing */ - void set(const StringPiece &source, UErrorCode &status, uint32_t fastpathBits = 0); + void set(StringPiece source, UErrorCode &status, uint32_t fastpathBits = 0); /** * Multiply this = this * arg @@ -493,7 +495,8 @@ class U_I18N_API DigitList : public UMemory { // Declare external to make compil static inline void * U_EXPORT2 operator new(size_t size) U_NO_THROW { return ::operator new(size); }; static inline void U_EXPORT2 operator delete(void *ptr ) U_NO_THROW { ::operator delete(ptr); }; #endif - static char U_EXPORT2 getStrtodDecimalSeparator(); + + static double U_EXPORT2 decimalStrToDouble(char *decstr, char **end); /** * Placement new for stack usage diff --git a/deps/icu-small/source/i18n/dt_impl.h b/deps/icu-small/source/i18n/dt_impl.h new file mode 100644 index 00000000000000..9b01bad79edd9b --- /dev/null +++ b/deps/icu-small/source/i18n/dt_impl.h @@ -0,0 +1,92 @@ +// Copyright (C) 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 dt_impl.h +* +******************************************************************************* +*/ + + +#ifndef DT_IMPL_H__ +#define DT_IMPL_H__ + +/** + * \file + * \brief C++ API: Defines macros for interval format implementation + */ + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/unistr.h" + + +#define QUOTE ((UChar)0x0027) +#define LOW_LINE ((UChar)0x005F) +#define COLON ((UChar)0x003A) +#define LEFT_CURLY_BRACKET ((UChar)0x007B) +#define RIGHT_CURLY_BRACKET ((UChar)0x007D) +#define SPACE ((UChar)0x0020) +#define EN_DASH ((UChar)0x2013) +#define SOLIDUS ((UChar)0x002F) +#define PERCENT ((UChar)0x0025) + +#define DIGIT_ZERO ((UChar)0x0030) +#define DIGIT_ONE ((UChar)0x0031) + +#define LOW_A ((UChar)0x0061) +#define LOW_B ((UChar)0x0062) +#define LOW_C ((UChar)0x0063) +#define LOW_D ((UChar)0x0064) +#define LOW_E ((UChar)0x0065) +#define LOW_F ((UChar)0x0066) +#define LOW_G ((UChar)0x0067) +#define LOW_H ((UChar)0x0068) +#define LOW_I ((UChar)0x0069) +#define LOW_J ((UChar)0x006a) +#define LOW_K ((UChar)0x006B) +#define LOW_L ((UChar)0x006C) +#define LOW_M ((UChar)0x006D) +#define LOW_N ((UChar)0x006E) +#define LOW_O ((UChar)0x006F) +#define LOW_P ((UChar)0x0070) +#define LOW_Q ((UChar)0x0071) +#define LOW_R ((UChar)0x0072) +#define LOW_S ((UChar)0x0073) +#define LOW_T ((UChar)0x0074) +#define LOW_U ((UChar)0x0075) +#define LOW_V ((UChar)0x0076) +#define LOW_W ((UChar)0x0077) +#define LOW_Y ((UChar)0x0079) +#define LOW_Z ((UChar)0x007A) + +#define CAP_A ((UChar)0x0041) +#define CAP_C ((UChar)0x0043) +#define CAP_D ((UChar)0x0044) +#define CAP_E ((UChar)0x0045) +#define CAP_F ((UChar)0x0046) +#define CAP_G ((UChar)0x0047) +#define CAP_H ((UChar)0x0048) +#define CAP_K ((UChar)0x004B) +#define CAP_L ((UChar)0x004C) +#define CAP_M ((UChar)0x004D) +#define CAP_N ((UChar)0x004E) +#define CAP_O ((UChar)0x004F) +#define CAP_P ((UChar)0x0050) +#define CAP_Q ((UChar)0x0051) +#define CAP_S ((UChar)0x0053) +#define CAP_T ((UChar)0x0054) +#define CAP_U ((UChar)0x0055) +#define CAP_V ((UChar)0x0056) +#define CAP_W ((UChar)0x0057) +#define CAP_Y ((UChar)0x0059) +#define CAP_Z ((UChar)0x005A) + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif +//eof diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index 206d7a26a9ee6f..c412c5be05242b 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2016, International Business Machines Corporation and * @@ -33,11 +35,15 @@ #include "umutex.h" #include "cmemory.h" #include "cstring.h" +#include "charstr.h" +#include "dt_impl.h" #include "locbased.h" #include "gregoimp.h" #include "hash.h" +#include "uassert.h" #include "uresimp.h" #include "ureslocs.h" +#include "uvector.h" #include "shareddateformatsymbols.h" #include "unicode/calendar.h" #include "unifiedcache.h" @@ -194,6 +200,8 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(DateFormatSymbols) * These are the tags we expect to see in normal resource bundle files associated * with a locale and calendar */ +static const char gCalendarTag[]="calendar"; +static const char gGregorianTag[]="gregorian"; static const char gErasTag[]="eras"; static const char gCyclicNameSetsTag[]="cyclicNameSets"; static const char gNameSetYearsTag[]="years"; @@ -206,11 +214,11 @@ static const char gNamesAbbrTag[]="abbreviated"; static const char gNamesShortTag[]="short"; static const char gNamesNarrowTag[]="narrow"; static const char gNamesAllTag[]="all"; -static const char gNamesLeapTag[]="leap"; static const char gNamesFormatTag[]="format"; static const char gNamesStandaloneTag[]="stand-alone"; static const char gNamesNumericTag[]="numeric"; static const char gAmPmMarkersTag[]="AmPmMarkers"; +static const char gAmPmMarkersAbbrTag[]="AmPmMarkersAbbr"; static const char gAmPmMarkersNarrowTag[]="AmPmMarkersNarrow"; static const char gQuartersTag[]="quarters"; static const char gNumberElementsTag[]="NumberElements"; @@ -293,8 +301,8 @@ DateFormatSymbols::assignArray(UnicodeString*& dstArray, const UnicodeString* srcArray, int32_t srcCount) { - // assignArray() is only called by copyData(), which in turn implements the - // copy constructor and the assignment operator. + // assignArray() is only called by copyData() and initializeData(), which in turn + // implements the copy constructor and the assignment operator. // All strings in a DateFormatSymbols object are created in one of the following // three ways that all allow to safely use UnicodeString::fastCopyFrom(): // - readonly-aliases from resource bundles @@ -1271,6 +1279,12 @@ DateFormatSymbols::initZoneStringsArray(void) { TimeZoneNames *tzNames = NULL; int32_t rows = 0; + static const UTimeZoneNameType TYPES[] = { + UTZNM_LONG_STANDARD, UTZNM_SHORT_STANDARD, + UTZNM_LONG_DAYLIGHT, UTZNM_SHORT_DAYLIGHT + }; + static const int32_t NUM_TYPES = 4; + do { // dummy do-while tzids = TimeZone::createTimeZoneIDEnumeration(ZONE_SET, NULL, NULL, status); @@ -1289,6 +1303,8 @@ DateFormatSymbols::initZoneStringsArray(void) { uprv_memset(zarray, 0, size); tzNames = TimeZoneNames::createInstance(fZSFLocale, status); + tzNames->loadAllDisplayNames(status); + if (U_FAILURE(status)) { break; } const UnicodeString *tzid; int32_t i = 0; @@ -1307,10 +1323,7 @@ DateFormatSymbols::initZoneStringsArray(void) { } zarray[i][0].setTo(*tzid); - zarray[i][1].setTo(tzNames->getDisplayName(*tzid, UTZNM_LONG_STANDARD, now, tzDispName)); - zarray[i][2].setTo(tzNames->getDisplayName(*tzid, UTZNM_SHORT_STANDARD, now, tzDispName)); - zarray[i][3].setTo(tzNames->getDisplayName(*tzid, UTZNM_LONG_DAYLIGHT, now, tzDispName)); - zarray[i][4].setTo(tzNames->getDisplayName(*tzid, UTZNM_SHORT_DAYLIGHT, now, tzDispName)); + tzNames->getDisplayNames(*tzid, TYPES, NUM_TYPES, now, zarray[i]+1, status); i++; } @@ -1324,6 +1337,7 @@ DateFormatSymbols::initZoneStringsArray(void) { } } uprv_free(zarray); + zarray = NULL; } } @@ -1336,7 +1350,7 @@ DateFormatSymbols::initZoneStringsArray(void) { fLocaleZoneStrings = zarray; fZoneStringsRowCount = rows; - fZoneStringsColCount = 5; + fZoneStringsColCount = 1 + NUM_TYPES; } void @@ -1431,25 +1445,409 @@ DateFormatSymbols::setLocalPatternChars(const UnicodeString& newLocalPatternChar //------------------------------------------------------ -static void -initField(UnicodeString **field, int32_t& length, const UResourceBundle *data, UErrorCode &status) { - if (U_SUCCESS(status)) { - int32_t strLen = 0; - length = ures_getSize(data); - *field = newUnicodeStringArray(length); - if (*field) { - for(int32_t i = 0; isetTo(TRUE, resStr, strLen); +namespace { + +// Constants declarations +static const UChar kCalendarAliasPrefixUChar[] = { + SOLIDUS, CAP_L, CAP_O, CAP_C, CAP_A, CAP_L, CAP_E, SOLIDUS, + LOW_C, LOW_A, LOW_L, LOW_E, LOW_N, LOW_D, LOW_A, LOW_R, SOLIDUS +}; +static const UChar kGregorianTagUChar[] = { + LOW_G, LOW_R, LOW_E, LOW_G, LOW_O, LOW_R, LOW_I, LOW_A, LOW_N +}; +static const UChar kVariantTagUChar[] = { + PERCENT, LOW_V, LOW_A, LOW_R, LOW_I, LOW_A, LOW_N, LOW_T +}; +static const UChar kLeapTagUChar[] = { + LOW_L, LOW_E, LOW_A, LOW_P +}; +static const UChar kCyclicNameSetsTagUChar[] = { + LOW_C, LOW_Y, LOW_C, LOW_L, LOW_I, LOW_C, CAP_N, LOW_A, LOW_M, LOW_E, CAP_S, LOW_E, LOW_T, LOW_S +}; +static const UChar kYearsTagUChar[] = { + SOLIDUS, LOW_Y, LOW_E, LOW_A, LOW_R, LOW_S +}; +static const UChar kZodiacsUChar[] = { + SOLIDUS, LOW_Z, LOW_O, LOW_D, LOW_I, LOW_A, LOW_C, LOW_S +}; +static const UChar kDayPartsTagUChar[] = { + SOLIDUS, LOW_D, LOW_A, LOW_Y, CAP_P, LOW_A, LOW_R, LOW_T, LOW_S +}; +static const UChar kFormatTagUChar[] = { + SOLIDUS, LOW_F, LOW_O, LOW_R, LOW_M, LOW_A, LOW_T +}; +static const UChar kAbbrTagUChar[] = { + SOLIDUS, LOW_A, LOW_B, LOW_B, LOW_R, LOW_E, LOW_V, LOW_I, LOW_A, LOW_T, LOW_E, LOW_D +}; + +// ResourceSink to enumerate all calendar resources +struct CalendarDataSink : public ResourceSink { + + // Enum which specifies the type of alias received, or no alias + enum AliasType { + SAME_CALENDAR, + DIFFERENT_CALENDAR, + GREGORIAN, + NONE + }; + + // Data structures to store resources from the current resource bundle + Hashtable arrays; + Hashtable arraySizes; + Hashtable maps; + /** + * Whenever there are aliases, the same object will be added twice to 'map'. + * 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; + + // Paths and the aliases they point to + UVector aliasPathPairs; + + // Current and next calendar resource table which should be loaded + UnicodeString currentCalendarType; + UnicodeString nextCalendarType; + + // Resources to visit when enumerating fallback calendars + LocalPointer resourcesToVisit; + + // Alias' relative path populated whenever an alias is read + UnicodeString aliasRelativePath; + + // Initializes CalendarDataSink with default values + CalendarDataSink(UErrorCode& status) + : arrays(FALSE, status), arraySizes(FALSE, status), maps(FALSE, status), + mapRefs(deleteHashtable, NULL, 10, status), + aliasPathPairs(uprv_deleteUObject, uhash_compareUnicodeString, status), + currentCalendarType(), nextCalendarType(), + resourcesToVisit(NULL), aliasRelativePath() { + if (U_FAILURE(status)) { return; } + } + virtual ~CalendarDataSink(); + + // Configure the CalendarSink to visit all the resources + void visitAllResources() { + resourcesToVisit.adoptInstead(NULL); + } + + // Actions to be done before enumerating + void preEnumerate(const UnicodeString &calendarType) { + currentCalendarType = calendarType; + nextCalendarType.setToBogus(); + aliasPathPairs.removeAllElements(); + } + + virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } + U_ASSERT(!currentCalendarType.isEmpty()); + + // Stores the resources to visit on the next calendar. + LocalPointer resourcesToVisitNext(NULL); + ResourceTable calendarData = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + // Enumerate all resources for this calendar + for (int i = 0; calendarData.getKeyAndValue(i, key, value); i++) { + UnicodeString keyUString(key, -1, US_INV); + + // == Handle aliases == + AliasType aliasType = processAliasFromValue(keyUString, value, errorCode); + if (U_FAILURE(errorCode)) { return; } + if (aliasType == GREGORIAN) { + // Ignore aliases to the gregorian calendar, all of its resources will be loaded anyway. + continue; + + } else if (aliasType == DIFFERENT_CALENDAR) { + // Whenever an alias to the next calendar (except gregorian) is encountered, register the + // calendar type it's pointing to + if (resourcesToVisitNext.isNull()) { + resourcesToVisitNext + .adoptInsteadAndCheckErrorCode(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, errorCode), + errorCode); + if (U_FAILURE(errorCode)) { return; } + } + LocalPointer aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode); + resourcesToVisitNext->addElement(aliasRelativePathCopy.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { return; } + // Only release ownership after resourcesToVisitNext takes it (no error happened): + aliasRelativePathCopy.orphan(); + continue; + + } else if (aliasType == SAME_CALENDAR) { + // Register same-calendar alias + if (arrays.get(aliasRelativePath) == NULL && maps.get(aliasRelativePath) == NULL) { + LocalPointer aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode); + aliasPathPairs.addElement(aliasRelativePathCopy.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { return; } + // Only release ownership after aliasPathPairs takes it (no error happened): + aliasRelativePathCopy.orphan(); + LocalPointer keyUStringCopy(new UnicodeString(keyUString), errorCode); + aliasPathPairs.addElement(keyUStringCopy.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { return; } + // Only release ownership after aliasPathPairs takes it (no error happened): + keyUStringCopy.orphan(); + } + continue; + } + + // Only visit the resources that were referenced by an alias on the previous calendar + // (AmPmMarkersAbbr is an exception). + if (!resourcesToVisit.isNull() && !resourcesToVisit->isEmpty() && !resourcesToVisit->contains(&keyUString) + && uprv_strcmp(key, gAmPmMarkersAbbrTag) != 0) { continue; } + + // == Handle data == + if (uprv_strcmp(key, gAmPmMarkersTag) == 0 + || uprv_strcmp(key, gAmPmMarkersAbbrTag) == 0 + || uprv_strcmp(key, gAmPmMarkersNarrowTag) == 0) { + if (arrays.get(keyUString) == NULL) { + ResourceArray resourceArray = value.getArray(errorCode); + int32_t arraySize = resourceArray.getSize(); + LocalArray stringArray(new UnicodeString[arraySize], errorCode); + value.getStringArray(stringArray.getAlias(), arraySize, errorCode); + arrays.put(keyUString, stringArray.orphan(), errorCode); + arraySizes.puti(keyUString, arraySize, errorCode); + if (U_FAILURE(errorCode)) { return; } + } + } else if (uprv_strcmp(key, gErasTag) == 0 + || uprv_strcmp(key, gDayNamesTag) == 0 + || uprv_strcmp(key, gMonthNamesTag) == 0 + || uprv_strcmp(key, gQuartersTag) == 0 + || uprv_strcmp(key, gDayPeriodTag) == 0 + || uprv_strcmp(key, gMonthPatternsTag) == 0 + || uprv_strcmp(key, gCyclicNameSetsTag) == 0) { + processResource(keyUString, key, value, errorCode); } } - else { - length = 0; - status = U_MEMORY_ALLOCATION_ERROR; + + // Apply same-calendar aliases + UBool modified; + do { + modified = false; + for (int32_t i = 0; i < aliasPathPairs.size();) { + UBool mod = false; + UnicodeString *alias = (UnicodeString*)aliasPathPairs[i]; + UnicodeString *aliasArray; + Hashtable *aliasMap; + if ((aliasArray = (UnicodeString*)arrays.get(*alias)) != NULL) { + // Clone the array + int32_t aliasArraySize = arraySizes.geti(*alias); + LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); + if (U_FAILURE(errorCode)) { return; } + uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); + // Put the array on the 'arrays' map + UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; + arrays.put(*path, aliasArrayCopy.orphan(), errorCode); + arraySizes.puti(*path, aliasArraySize, errorCode); + if (U_FAILURE(errorCode)) { return; } + mod = true; + } else if ((aliasMap = (Hashtable*)maps.get(*alias)) != NULL) { + UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; + maps.put(*path, aliasMap, errorCode); + if (U_FAILURE(errorCode)) { return; } + mod = true; + } + if (mod) { + aliasPathPairs.removeElementAt(i + 1); + aliasPathPairs.removeElementAt(i); + modified = true; + } else { + i += 2; + } + } + } while (modified && !aliasPathPairs.isEmpty()); + + // Set the resources to visit on the next calendar + if (!resourcesToVisitNext.isNull()) { + resourcesToVisit.moveFrom(resourcesToVisitNext); + } + } + + // Process the nested resource bundle tables + void processResource(UnicodeString &path, const char *key, ResourceValue &value, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) return; + + ResourceTable table = value.getTable(errorCode); + if (U_FAILURE(errorCode)) return; + Hashtable* stringMap = NULL; + + // Iterate over all the elements of the table and add them to the map + for (int i = 0; table.getKeyAndValue(i, key, value); i++) { + UnicodeString keyUString(key, -1, US_INV); + + // Ignore '%variant' keys + if (keyUString.endsWith(kVariantTagUChar, UPRV_LENGTHOF(kVariantTagUChar))) { + continue; + } + + // == Handle String elements == + 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(); + 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); + int32_t valueStringSize; + const UChar *valueString = value.getString(valueStringSize, errorCode); + if (U_FAILURE(errorCode)) { return; } + LocalPointer valueUString(new UnicodeString(TRUE, valueString, valueStringSize), errorCode); + stringMap->put(keyUString, valueUString.orphan(), errorCode); + if (U_FAILURE(errorCode)) { return; } + continue; + } + U_ASSERT(stringMap == NULL); + + // Store the current path's length and append the current key to the path. + int32_t pathLength = path.length(); + path.append(SOLIDUS).append(keyUString); + + // In cyclicNameSets ignore everything but years/format/abbreviated + // and zodiacs/format/abbreviated + if (path.startsWith(kCyclicNameSetsTagUChar, UPRV_LENGTHOF(kCyclicNameSetsTagUChar))) { + UBool skip = TRUE; + int32_t startIndex = UPRV_LENGTHOF(kCyclicNameSetsTagUChar); + int32_t length = 0; + if (startIndex == path.length() + || path.compare(startIndex, (length = UPRV_LENGTHOF(kZodiacsUChar)), kZodiacsUChar, 0, UPRV_LENGTHOF(kZodiacsUChar)) == 0 + || path.compare(startIndex, (length = UPRV_LENGTHOF(kYearsTagUChar)), kYearsTagUChar, 0, UPRV_LENGTHOF(kYearsTagUChar)) == 0 + || path.compare(startIndex, (length = UPRV_LENGTHOF(kDayPartsTagUChar)), kDayPartsTagUChar, 0, UPRV_LENGTHOF(kDayPartsTagUChar)) == 0) { + startIndex += length; + length = 0; + if (startIndex == path.length() + || path.compare(startIndex, (length = UPRV_LENGTHOF(kFormatTagUChar)), kFormatTagUChar, 0, UPRV_LENGTHOF(kFormatTagUChar)) == 0) { + startIndex += length; + length = 0; + if (startIndex == path.length() + || path.compare(startIndex, (length = UPRV_LENGTHOF(kAbbrTagUChar)), kAbbrTagUChar, 0, UPRV_LENGTHOF(kAbbrTagUChar)) == 0) { + skip = FALSE; + } + } + } + if (skip) { + // Drop the latest key on the path and continue + path.retainBetween(0, pathLength); + continue; + } + } + + // == Handle aliases == + if (arrays.get(path) != NULL || maps.get(path) != NULL) { + // Drop the latest key on the path and continue + path.retainBetween(0, pathLength); + continue; + } + + AliasType aliasType = processAliasFromValue(path, value, errorCode); + if (U_FAILURE(errorCode)) { return; } + if (aliasType == SAME_CALENDAR) { + // Store the alias path and the current path on aliasPathPairs + LocalPointer aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode); + aliasPathPairs.addElement(aliasRelativePathCopy.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { return; } + // Only release ownership after aliasPathPairs takes it (no error happened): + aliasRelativePathCopy.orphan(); + LocalPointer pathCopy(new UnicodeString(path), errorCode); + aliasPathPairs.addElement(pathCopy.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { return; } + // Only release ownership after aliasPathPairs takes it (no error happened): + pathCopy.orphan(); + + // Drop the latest key on the path and continue + path.retainBetween(0, pathLength); + continue; + } + U_ASSERT(aliasType == NONE); + + // == Handle data == + if (value.getType() == URES_ARRAY) { + // We are on a leaf, store the array + ResourceArray rDataArray = value.getArray(errorCode); + int32_t dataArraySize = rDataArray.getSize(); + LocalArray dataArray(new UnicodeString[dataArraySize], errorCode); + value.getStringArray(dataArray.getAlias(), dataArraySize, errorCode); + arrays.put(path, dataArray.orphan(), errorCode); + arraySizes.puti(path, dataArraySize, errorCode); + if (U_FAILURE(errorCode)) { return; } + } else if (value.getType() == URES_TABLE) { + // We are not on a leaf, recursively process the subtable. + processResource(path, key, value, errorCode); + if (U_FAILURE(errorCode)) { return; } + } + + // Drop the latest key on the path + path.retainBetween(0, pathLength); } } + + // Populates an AliasIdentifier with the alias information contained on the UResource.Value. + AliasType processAliasFromValue(UnicodeString ¤tRelativePath, ResourceValue &value, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return NONE; } + + if (value.getType() == URES_ALIAS) { + int32_t aliasPathSize; + const UChar* aliasPathUChar = value.getAliasString(aliasPathSize, errorCode); + if (U_FAILURE(errorCode)) { return NONE; } + UnicodeString aliasPath(aliasPathUChar, aliasPathSize); + const int32_t aliasPrefixLength = UPRV_LENGTHOF(kCalendarAliasPrefixUChar); + if (aliasPath.startsWith(kCalendarAliasPrefixUChar, aliasPrefixLength) + && aliasPath.length() > aliasPrefixLength) { + int32_t typeLimit = aliasPath.indexOf(SOLIDUS, aliasPrefixLength); + if (typeLimit > aliasPrefixLength) { + const UnicodeString aliasCalendarType = + aliasPath.tempSubStringBetween(aliasPrefixLength, typeLimit); + aliasRelativePath.setTo(aliasPath, typeLimit + 1, aliasPath.length()); + + if (currentCalendarType == aliasCalendarType + && currentRelativePath != aliasRelativePath) { + // If we have an alias to the same calendar, the path to the resource must be different + return SAME_CALENDAR; + + } else if (currentCalendarType != aliasCalendarType + && currentRelativePath == aliasRelativePath) { + // If we have an alias to a different calendar, the path to the resource must be the same + if (aliasCalendarType.compare(kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)) == 0) { + return GREGORIAN; + } else if (nextCalendarType.isBogus()) { + nextCalendarType = aliasCalendarType; + return DIFFERENT_CALENDAR; + } else if (nextCalendarType == aliasCalendarType) { + return DIFFERENT_CALENDAR; + } + } + } + } + errorCode = U_INTERNAL_PROGRAM_ERROR; + return NONE; + } + return NONE; + } + + // Deleter function to be used by 'arrays' + 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() { + arrays.setValueDeleter(deleteUnicodeStringArray); } +} + +//------------------------------------------------------ static void initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status) { @@ -1471,16 +1869,89 @@ initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortS } static void -initLeapMonthPattern(UnicodeString *field, int32_t index, const UResourceBundle *data, UErrorCode &status) { +initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, UErrorCode &status) { + if (U_SUCCESS(status)) { + UnicodeString keyUString(key.data(), -1, US_INV); + UnicodeString* array = static_cast(sink.arrays.get(keyUString)); + + if (array != NULL) { + length = sink.arraySizes.geti(keyUString); + *field = array; + // DateFormatSymbols takes ownership of the array: + sink.arrays.remove(keyUString); + } else { + length = 0; + status = U_MISSING_RESOURCE_ERROR; + } + } +} + +static void +initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, int32_t arrayOffset, UErrorCode &status) { + if (U_SUCCESS(status)) { + UnicodeString keyUString(key.data(), -1, US_INV); + UnicodeString* array = static_cast(sink.arrays.get(keyUString)); + + if (array != NULL) { + int32_t arrayLength = sink.arraySizes.geti(keyUString); + length = arrayLength + arrayOffset; + *field = new UnicodeString[length]; + if (*field == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + uprv_arrayCopy(array, 0, *field, arrayOffset, arrayLength); + } else { + length = 0; + status = U_MISSING_RESOURCE_ERROR; + } + } +} + +static void +initLeapMonthPattern(UnicodeString *field, int32_t index, CalendarDataSink &sink, CharString &path, UErrorCode &status) { field[index].remove(); if (U_SUCCESS(status)) { - int32_t strLen = 0; - const UChar *resStr = ures_getStringByKey(data, gNamesLeapTag, &strLen, &status); - if (U_SUCCESS(status)) { - field[index].setTo(TRUE, resStr, strLen); + UnicodeString pathUString(path.data(), -1, US_INV); + Hashtable *leapMonthTable = static_cast(sink.maps.get(pathUString)); + if (leapMonthTable != NULL) { + UnicodeString leapLabel(FALSE, kLeapTagUChar, UPRV_LENGTHOF(kLeapTagUChar)); + UnicodeString *leapMonthPattern = static_cast(leapMonthTable->get(leapLabel)); + if (leapMonthPattern != NULL) { + field[index].fastCopyFrom(*leapMonthPattern); + } else { + field[index].setToBogus(); + } + return; } + status = U_MISSING_RESOURCE_ERROR; } - status = U_ZERO_ERROR; +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, UErrorCode &errorCode) { + return path.clear().append(segment1, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + UErrorCode &errorCode) { + return buildResourcePath(path, segment1, errorCode).append('/', errorCode) + .append(segment2, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + const char* segment3, UErrorCode &errorCode) { + return buildResourcePath(path, segment1, segment2, errorCode).append('/', errorCode) + .append(segment3, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + const char* segment3, const char* segment4, UErrorCode &errorCode) { + return buildResourcePath(path, segment1, segment2, segment3, errorCode).append('/', errorCode) + .append(segment4, -1, errorCode); } typedef struct { @@ -1513,41 +1984,43 @@ static const char *dayPeriodKeys[] = {"midnight", "noon", "morning1", "afternoon1", "evening1", "night1", "morning2", "afternoon2", "evening2", "night2"}; -UnicodeString* loadDayPeriodStrings(CalendarData &calData, const char *tag, UBool standalone, +UnicodeString* loadDayPeriodStrings(CalendarDataSink &sink, CharString &path, int32_t &stringCount, UErrorCode &status) { - if (U_FAILURE(status)) { - return NULL; - } - - UResourceBundle *dayPeriodData; + if (U_FAILURE(status)) { return NULL; } - if (standalone) { - dayPeriodData = calData.getByKey3(gDayPeriodTag, gNamesStandaloneTag, tag, status); - } else { - dayPeriodData = calData.getByKey2(gDayPeriodTag, tag, status); - } + UnicodeString pathUString(path.data(), -1, US_INV); + Hashtable* map = static_cast(sink.maps.get(pathUString)); stringCount = UPRV_LENGTHOF(dayPeriodKeys); UnicodeString *strings = new UnicodeString[stringCount]; - for (int32_t i = 0; i < stringCount; ++i) { - //TODO: Check if there are fallbacks/aliases defined in the data; e.g., if there - //is no wide string, then use the narrow one? - strings[i].fastCopyFrom(ures_getUnicodeStringByKey(dayPeriodData, dayPeriodKeys[i], &status)); - if (U_FAILURE(status)) { - // string[i] will be bogus if ures_getUnicodeString() returns with an error, - // which is just the behavior we want. Simply reset the error code. - status = U_ZERO_ERROR; + if (strings == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + + if (map != NULL) { + for (int32_t i = 0; i < stringCount; ++i) { + UnicodeString dayPeriodKey(dayPeriodKeys[i], -1, US_INV); + UnicodeString *dayPeriod = static_cast(map->get(dayPeriodKey)); + if (dayPeriod != NULL) { + strings[i].fastCopyFrom(*dayPeriod); + } else { + strings[i].setToBogus(); + } + } + } else { + for (int32_t i = 0; i < stringCount; i++) { + strings[i].setToBogus(); } } return strings; } + void DateFormatSymbols::initializeData(const Locale& locale, const char *type, UErrorCode& status, UBool useLastResortData) { - int32_t i; int32_t len = 0; - const UChar *resStr; /* In case something goes wrong, initialize all of the data to NULL. */ fEras = NULL; fErasCount = 0; @@ -1628,97 +2101,107 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError if (U_FAILURE(status)) return; - /** - * Retrieve the string arrays we need from the resource bundle file. - * We cast away const here, but that's okay; we won't delete any of - * these. - */ - CalendarData calData(locale, type, status); + // Create a CalendarDataSink to process this data and the resouce bundles + CalendarDataSink calendarSink(status); + UResourceBundle *rb = ures_open(NULL, locale.getBaseName(), &status); + UResourceBundle *cb = ures_getByKey(rb, gCalendarTag, NULL, &status); - // load the first data item - UResourceBundle *erasMain = calData.getByKey(gErasTag, status); - UResourceBundle *eras = ures_getByKeyWithFallback(erasMain, gNamesAbbrTag, NULL, &status); - UErrorCode oldStatus = status; - UResourceBundle *eraNames = ures_getByKeyWithFallback(erasMain, gNamesWideTag, NULL, &status); - if ( status == U_MISSING_RESOURCE_ERROR ) { // Workaround because eras/wide was omitted from CLDR 1.3 - status = oldStatus; - eraNames = ures_getByKeyWithFallback(erasMain, gNamesAbbrTag, NULL, &status); - } - // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too - oldStatus = status; - UResourceBundle *narrowEras = ures_getByKeyWithFallback(erasMain, gNamesNarrowTag, NULL, &status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = oldStatus; - narrowEras = ures_getByKeyWithFallback(erasMain, gNamesAbbrTag, NULL, &status); - } - - UErrorCode tempStatus = U_ZERO_ERROR; - UResourceBundle *monthPatterns = calData.getByKey(gMonthPatternsTag, tempStatus); - if (U_SUCCESS(tempStatus) && monthPatterns != NULL) { - fLeapMonthPatterns = newUnicodeStringArray(kMonthPatternsCount); - if (fLeapMonthPatterns) { - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatWide, calData.getByKey2(gMonthPatternsTag, gNamesWideTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatAbbrev, calData.getByKey2(gMonthPatternsTag, gNamesAbbrTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatNarrow, calData.getByKey2(gMonthPatternsTag, gNamesNarrowTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneWide, calData.getByKey3(gMonthPatternsTag, gNamesStandaloneTag, gNamesWideTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneAbbrev, calData.getByKey3(gMonthPatternsTag, gNamesStandaloneTag, gNamesAbbrTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneNarrow, calData.getByKey3(gMonthPatternsTag, gNamesStandaloneTag, gNamesNarrowTag, tempStatus), tempStatus); - initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternNumeric, calData.getByKey3(gMonthPatternsTag, gNamesNumericTag, gNamesAllTag, tempStatus), tempStatus); - if (U_SUCCESS(tempStatus)) { - // Hack to fix bad C inheritance for dangi monthPatterns (OK in J); this should be handled by aliases in root, but isn't. - // The ordering of the following statements is important. - if (fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); - }; - if (fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].setTo(fLeapMonthPatterns[kLeapMonthPatternStandaloneNarrow]); - }; - if (fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); - }; - if (fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].isEmpty()) { - fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev]); - }; - // end of hack - fLeapMonthPatternsCount = kMonthPatternsCount; - } else { - delete[] fLeapMonthPatterns; - fLeapMonthPatterns = NULL; + if (U_FAILURE(status)) return; + + // Iterate over the resource bundle data following the fallbacks through different calendar types + UnicodeString calendarType((type != NULL && *type != '\0')? type : gGregorianTag, -1, US_INV); + while (!calendarType.isBogus()) { + CharString calendarTypeBuffer; + calendarTypeBuffer.appendInvariantChars(calendarType, status); + if (U_FAILURE(status)) { return; } + const char *calendarTypeCArray = calendarTypeBuffer.data(); + + // Enumerate this calendar type. If the calendar is not found fallback to gregorian + UErrorCode oldStatus = status; + UResourceBundle *ctb = ures_getByKeyWithFallback(cb, calendarTypeCArray, NULL, &status); + if (status == U_MISSING_RESOURCE_ERROR) { + ures_close(ctb); + if (uprv_strcmp(calendarTypeCArray, gGregorianTag) != 0) { + calendarType.setTo(FALSE, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); + calendarSink.visitAllResources(); + status = oldStatus; + continue; } + return; } - } - tempStatus = U_ZERO_ERROR; - UResourceBundle *cyclicNameSets= calData.getByKey(gCyclicNameSetsTag, tempStatus); - if (U_SUCCESS(tempStatus) && cyclicNameSets != NULL) { - UResourceBundle *nameSetYears = ures_getByKeyWithFallback(cyclicNameSets, gNameSetYearsTag, NULL, &tempStatus); - if (U_SUCCESS(tempStatus)) { - UResourceBundle *nameSetYearsFmt = ures_getByKeyWithFallback(nameSetYears, gNamesFormatTag, NULL, &tempStatus); - if (U_SUCCESS(tempStatus)) { - UResourceBundle *nameSetYearsFmtAbbrev = ures_getByKeyWithFallback(nameSetYearsFmt, gNamesAbbrTag, NULL, &tempStatus); - if (U_SUCCESS(tempStatus)) { - initField(&fShortYearNames, fShortYearNamesCount, nameSetYearsFmtAbbrev, tempStatus); - ures_close(nameSetYearsFmtAbbrev); - } - ures_close(nameSetYearsFmt); - } - ures_close(nameSetYears); + calendarSink.preEnumerate(calendarType); + ures_getAllItemsWithFallback(ctb, "", calendarSink, status); + ures_close(ctb); + if (U_FAILURE(status)) break; + + // Stop loading when gregorian was loaded + if (uprv_strcmp(calendarTypeCArray, gGregorianTag) == 0) { + break; } - UResourceBundle *nameSetZodiacs = ures_getByKeyWithFallback(cyclicNameSets, gNameSetZodiacsTag, NULL, &tempStatus); + + // Get the next calendar type to process from the sink + calendarType = calendarSink.nextCalendarType; + + // Gregorian is always the last fallback + if (calendarType.isBogus()) { + calendarType.setTo(FALSE, kGregorianTagUChar, UPRV_LENGTHOF(kGregorianTagUChar)); + calendarSink.visitAllResources(); + } + } + + // CharString object to build paths + CharString path; + + // Load Leap Month Patterns + UErrorCode tempStatus = status; + fLeapMonthPatterns = newUnicodeStringArray(kMonthPatternsCount); + if (fLeapMonthPatterns) { + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatWide, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesWideTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatAbbrev, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternFormatNarrow, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesFormatTag, gNamesNarrowTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneWide, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesWideTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneAbbrev, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesAbbrTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternStandaloneNarrow, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesStandaloneTag, gNamesNarrowTag, tempStatus), tempStatus); + initLeapMonthPattern(fLeapMonthPatterns, kLeapMonthPatternNumeric, calendarSink, + buildResourcePath(path, gMonthPatternsTag, gNamesNumericTag, gNamesAllTag, tempStatus), tempStatus); if (U_SUCCESS(tempStatus)) { - UResourceBundle *nameSetZodiacsFmt = ures_getByKeyWithFallback(nameSetZodiacs, gNamesFormatTag, NULL, &tempStatus); - if (U_SUCCESS(tempStatus)) { - UResourceBundle *nameSetZodiacsFmtAbbrev = ures_getByKeyWithFallback(nameSetZodiacsFmt, gNamesAbbrTag, NULL, &tempStatus); - if (U_SUCCESS(tempStatus)) { - initField(&fShortZodiacNames, fShortZodiacNamesCount, nameSetZodiacsFmtAbbrev, tempStatus); - ures_close(nameSetZodiacsFmtAbbrev); - } - ures_close(nameSetZodiacsFmt); - } - ures_close(nameSetZodiacs); + // Hack to fix bad C inheritance for dangi monthPatterns (OK in J); this should be handled by aliases in root, but isn't. + // The ordering of the following statements is important. + if (fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].isEmpty()) { + fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); + }; + if (fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].isEmpty()) { + fLeapMonthPatterns[kLeapMonthPatternFormatNarrow].setTo(fLeapMonthPatterns[kLeapMonthPatternStandaloneNarrow]); + }; + if (fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].isEmpty()) { + fLeapMonthPatterns[kLeapMonthPatternStandaloneWide].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatWide]); + }; + if (fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].isEmpty()) { + fLeapMonthPatterns[kLeapMonthPatternStandaloneAbbrev].setTo(fLeapMonthPatterns[kLeapMonthPatternFormatAbbrev]); + }; + // end of hack + fLeapMonthPatternsCount = kMonthPatternsCount; + } else { + delete[] fLeapMonthPatterns; + fLeapMonthPatterns = NULL; } } + // Load cyclic names sets + tempStatus = status; + initField(&fShortYearNames, fShortYearNamesCount, calendarSink, + buildResourcePath(path, gCyclicNameSetsTag, gNameSetYearsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); + initField(&fShortZodiacNames, fShortZodiacNamesCount, calendarSink, + buildResourcePath(path, gCyclicNameSetsTag, gNameSetZodiacsTag, gNamesFormatTag, gNamesAbbrTag, tempStatus), tempStatus); + + // Load context transforms and capitalization tempStatus = U_ZERO_ERROR; UResourceBundle *localeBundle = ures_open(NULL, locale.getName(), &tempStatus); if (U_SUCCESS(tempStatus)) { @@ -1775,126 +2258,108 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError fTimeSeparator.setTo(DateFormatSymbols::DEFAULT_TIME_SEPARATOR); } - fWideDayPeriods = loadDayPeriodStrings(calData, gNamesWideTag, FALSE, - fWideDayPeriodsCount, status); - fNarrowDayPeriods = loadDayPeriodStrings(calData, gNamesNarrowTag, FALSE, - fNarrowDayPeriodsCount, status); - fAbbreviatedDayPeriods = loadDayPeriodStrings(calData, gNamesAbbrTag, FALSE, - fAbbreviatedDayPeriodsCount, status); - fStandaloneWideDayPeriods = loadDayPeriodStrings(calData, gNamesWideTag, TRUE, - fStandaloneWideDayPeriodsCount, status); - fStandaloneNarrowDayPeriods = loadDayPeriodStrings(calData, gNamesNarrowTag, TRUE, - fStandaloneNarrowDayPeriodsCount, status); - fStandaloneAbbreviatedDayPeriods = loadDayPeriodStrings(calData, gNamesAbbrTag, TRUE, - fStandaloneAbbreviatedDayPeriodsCount, status); - - UResourceBundle *weekdaysData = NULL; // Data closed by calData - UResourceBundle *abbrWeekdaysData = NULL; // Data closed by calData - UResourceBundle *shorterWeekdaysData = NULL; // Data closed by calData - UResourceBundle *narrowWeekdaysData = NULL; // Data closed by calData - UResourceBundle *standaloneWeekdaysData = NULL; // Data closed by calData - UResourceBundle *standaloneAbbrWeekdaysData = NULL; // Data closed by calData - UResourceBundle *standaloneShorterWeekdaysData = NULL; // Data closed by calData - UResourceBundle *standaloneNarrowWeekdaysData = NULL; // Data closed by calData + // Load day periods + fWideDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesWideTag, status), + fWideDayPeriodsCount, status); + fNarrowDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesNarrowTag, status), + fNarrowDayPeriodsCount, status); + fAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesFormatTag, gNamesAbbrTag, status), + fAbbreviatedDayPeriodsCount, status); + fStandaloneWideDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesWideTag, status), + fStandaloneWideDayPeriodsCount, status); + fStandaloneNarrowDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesNarrowTag, status), + fStandaloneNarrowDayPeriodsCount, status); + fStandaloneAbbreviatedDayPeriods = loadDayPeriodStrings(calendarSink, + buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesAbbrTag, status), + fStandaloneAbbreviatedDayPeriodsCount, status); U_LOCALE_BASED(locBased, *this); - if (U_FAILURE(status)) - { - if (useLastResortData) - { - // Handle the case in which there is no resource data present. - // We don't have to generate usable patterns in this situation; - // we just need to produce something that will be semi-intelligible - // in most locales. - - status = U_USING_FALLBACK_WARNING; - - initField(&fEras, fErasCount, (const UChar *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fEraNames, fEraNamesCount, (const UChar *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fNarrowEras, fNarrowErasCount, (const UChar *)gLastResortEras, kEraNum, kEraLen, status); - initField(&fMonths, fMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fShortMonths, fShortMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fNarrowMonths, fNarrowMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneMonths, fStandaloneMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, (const UChar *)gLastResortMonthNames, kMonthNum, kMonthLen, status); - initField(&fWeekdays, fWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fShortWeekdays, fShortWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fShorterWeekdays, fShorterWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fNarrowWeekdays, fNarrowWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneShorterWeekdays, fStandaloneShorterWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fStandaloneNarrowWeekdays, fStandaloneNarrowWeekdaysCount, (const UChar *)gLastResortDayNames, kDayNum, kDayLen, status); - initField(&fAmPms, fAmPmsCount, (const UChar *)gLastResortAmPmMarkers, kAmPmNum, kAmPmLen, status); - initField(&fNarrowAmPms, fNarrowAmPmsCount, (const UChar *)gLastResortAmPmMarkers, kAmPmNum, kAmPmLen, status); - initField(&fQuarters, fQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fShortQuarters, fShortQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fStandaloneQuarters, fStandaloneQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, (const UChar *)gLastResortQuarters, kQuarterNum, kQuarterLen, status); - fLocalPatternChars.setTo(TRUE, gPatternChars, PATTERN_CHARS_LEN); - } - goto cleanup; - } - // if we make it to here, the resource data is cool, and we can get everything out // of it that we need except for the time-zone and localized-pattern data, which // are stored in a separate file - locBased.setLocaleIDs(ures_getLocaleByType(eras, ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(eras, ULOC_ACTUAL_LOCALE, &status)); + locBased.setLocaleIDs(ures_getLocaleByType(cb, ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(cb, ULOC_ACTUAL_LOCALE, &status)); - initField(&fEras, fErasCount, eras, status); - initField(&fEraNames, fEraNamesCount, eraNames, status); - initField(&fNarrowEras, fNarrowErasCount, narrowEras, status); - - initField(&fMonths, fMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesWideTag, status), status); - initField(&fShortMonths, fShortMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesAbbrTag, status), status); - - initField(&fNarrowMonths, fNarrowMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesNarrowTag, status), status); - if(status == U_MISSING_RESOURCE_ERROR) { - status = U_ZERO_ERROR; - initField(&fNarrowMonths, fNarrowMonthsCount, calData.getByKey3(gMonthNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status), status); - } - if ( status == U_MISSING_RESOURCE_ERROR ) { /* If format/narrow not available, use format/abbreviated */ - status = U_ZERO_ERROR; - initField(&fNarrowMonths, fNarrowMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesAbbrTag, status), status); - } - - initField(&fStandaloneMonths, fStandaloneMonthsCount, calData.getByKey3(gMonthNamesTag, gNamesStandaloneTag, gNamesWideTag, status), status); - if ( status == U_MISSING_RESOURCE_ERROR ) { /* If standalone/wide not available, use format/wide */ - status = U_ZERO_ERROR; - initField(&fStandaloneMonths, fStandaloneMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesWideTag, status), status); - } - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, calData.getByKey3(gMonthNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); - if ( status == U_MISSING_RESOURCE_ERROR ) { /* If standalone/abbreviated not available, use format/abbreviated */ - status = U_ZERO_ERROR; - initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesAbbrTag, status), status); + // Load eras + initField(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), status); + UErrorCode oldStatus = status; + initField(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), status); + if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 + status = oldStatus; + assignArray(fEraNames, fEraNamesCount, fEras, fErasCount); } - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calData.getByKey3(gMonthNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status), status); - if ( status == U_MISSING_RESOURCE_ERROR ) { /* if standalone/narrow not availabe, try format/narrow */ - status = U_ZERO_ERROR; - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesNarrowTag, status), status); - if ( status == U_MISSING_RESOURCE_ERROR ) { /* if still not there, use format/abbreviated */ - status = U_ZERO_ERROR; - initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calData.getByKey2(gMonthNamesTag, gNamesAbbrTag, status), status); - } + // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too + oldStatus = status; + initField(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), status); + if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 + status = oldStatus; + assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount); + } + + // Load month names + initField(&fMonths, fMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesWideTag, status), status); + initField(&fShortMonths, fShortMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesAbbrTag, status), status); + initField(&fStandaloneMonths, fStandaloneMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesWideTag, status), status); + if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide not available, use format/wide */ + status = U_ZERO_ERROR; + assignArray(fStandaloneMonths, fStandaloneMonthsCount, fMonths, fMonthsCount); } - initField(&fAmPms, fAmPmsCount, calData.getByKey(gAmPmMarkersTag, status), status); - initField(&fNarrowAmPms, fNarrowAmPmsCount, calData.getByKey(gAmPmMarkersNarrowTag, status), status); - - initField(&fQuarters, fQuartersCount, calData.getByKey2(gQuartersTag, gNamesWideTag, status), status); - initField(&fShortQuarters, fShortQuartersCount, calData.getByKey2(gQuartersTag, gNamesAbbrTag, status), status); - - initField(&fStandaloneQuarters, fStandaloneQuartersCount, calData.getByKey3(gQuartersTag, gNamesStandaloneTag, gNamesWideTag, status), status); + initField(&fStandaloneShortMonths, fStandaloneShortMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); + if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated not available, use format/abbreviated */ + status = U_ZERO_ERROR; + assignArray(fStandaloneShortMonths, fStandaloneShortMonthsCount, fShortMonths, fShortMonthsCount); + } + + UErrorCode narrowMonthsEC = status; + UErrorCode standaloneNarrowMonthsEC = status; + initField(&fNarrowMonths, fNarrowMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesFormatTag, gNamesNarrowTag, narrowMonthsEC), narrowMonthsEC); + initField(&fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, calendarSink, + buildResourcePath(path, gMonthNamesTag, gNamesStandaloneTag, gNamesNarrowTag, narrowMonthsEC), standaloneNarrowMonthsEC); + if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC != U_MISSING_RESOURCE_ERROR) { + // If format/narrow not available, use standalone/narrow + assignArray(fNarrowMonths, fNarrowMonthsCount, fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount); + } else if (narrowMonthsEC != U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) { + // If standalone/narrow not availabe, use format/narrow + assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fNarrowMonths, fNarrowMonthsCount); + } else if (narrowMonthsEC == U_MISSING_RESOURCE_ERROR && standaloneNarrowMonthsEC == U_MISSING_RESOURCE_ERROR) { + // If neither is available, use format/abbreviated + assignArray(fNarrowMonths, fNarrowMonthsCount, fShortMonths, fShortMonthsCount); + assignArray(fStandaloneNarrowMonths, fStandaloneNarrowMonthsCount, fShortMonths, fShortMonthsCount); + } + + // Load AM/PM markers + initField(&fAmPms, fAmPmsCount, calendarSink, + buildResourcePath(path, gAmPmMarkersTag, status), status); + initField(&fNarrowAmPms, fNarrowAmPmsCount, calendarSink, + buildResourcePath(path, gAmPmMarkersNarrowTag, status), status); + + // Load quarters + initField(&fQuarters, fQuartersCount, calendarSink, + buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesWideTag, status), status); + initField(&fShortQuarters, fShortQuartersCount, calendarSink, + buildResourcePath(path, gQuartersTag, gNamesFormatTag, gNamesAbbrTag, status), status); + + initField(&fStandaloneQuarters, fStandaloneQuartersCount, calendarSink, + buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesWideTag, status), status); if(status == U_MISSING_RESOURCE_ERROR) { status = U_ZERO_ERROR; - initField(&fStandaloneQuarters, fStandaloneQuartersCount, calData.getByKey2(gQuartersTag, gNamesWideTag, status), status); + assignArray(fStandaloneQuarters, fStandaloneQuartersCount, fQuarters, fQuartersCount); } - - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calData.getByKey3(gQuartersTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); + initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calendarSink, + buildResourcePath(path, gQuartersTag, gNamesStandaloneTag, gNamesAbbrTag, status), status); if(status == U_MISSING_RESOURCE_ERROR) { status = U_ZERO_ERROR; - initField(&fStandaloneShortQuarters, fStandaloneShortQuartersCount, calData.getByKey2(gQuartersTag, gNamesAbbrTag, status), status); + assignArray(fStandaloneShortQuarters, fStandaloneShortQuartersCount, fShortQuarters, fShortQuartersCount); } // ICU 3.8 or later version no longer uses localized date-time pattern characters by default (ticket#5597) @@ -1912,177 +2377,108 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError // Format wide weekdays -> fWeekdays // {sfb} fixed to handle 1-based weekdays - weekdaysData = calData.getByKey2(gDayNamesTag, gNamesWideTag, status); - fWeekdaysCount = ures_getSize(weekdaysData); - fWeekdays = new UnicodeString[fWeekdaysCount+1]; - /* pin the blame on system. If we cannot get a chunk of memory .. the system is dying!*/ - if (fWeekdays == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fWeekdays[0] empty - for(i = 0; i fShortWeekdays - abbrWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); - fShortWeekdaysCount = ures_getSize(abbrWeekdaysData); - fShortWeekdays = new UnicodeString[fShortWeekdaysCount+1]; - /* test for NULL */ - if (fShortWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fShortWeekdays[0] empty - for(i = 0; i fShorterWeekdays (fall back to abbreviated) - shorterWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesShortTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - shorterWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); - } - fShorterWeekdaysCount = ures_getSize(shorterWeekdaysData); - fShorterWeekdays = new UnicodeString[fShorterWeekdaysCount+1]; - /* test for NULL */ - if (fShorterWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fShorterWeekdays[0] empty - for(i = 0; i fNarrowWeekdays - narrowWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesNarrowTag, status); - if(status == U_MISSING_RESOURCE_ERROR) { + // Format short weekdays -> fShorterWeekdays (fall back to abbreviated) + initField(&fShorterWeekdays, fShorterWeekdaysCount, calendarSink, + buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesShortTag, status), 1, status); + if (status == U_MISSING_RESOURCE_ERROR) { status = U_ZERO_ERROR; - narrowWeekdaysData = calData.getByKey3(gDayNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status); - } - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - narrowWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); + assignArray(fShorterWeekdays, fShorterWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); } - fNarrowWeekdaysCount = ures_getSize(narrowWeekdaysData); - fNarrowWeekdays = new UnicodeString[fNarrowWeekdaysCount+1]; - /* test for NULL */ - if (fNarrowWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fNarrowWeekdays[0] empty - for(i = 0; i fStandaloneWeekdays - standaloneWeekdaysData = calData.getByKey3(gDayNamesTag, gNamesStandaloneTag, gNamesWideTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - standaloneWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesWideTag, status); - } - fStandaloneWeekdaysCount = ures_getSize(standaloneWeekdaysData); - fStandaloneWeekdays = new UnicodeString[fStandaloneWeekdaysCount+1]; - /* test for NULL */ - if (fStandaloneWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fStandaloneWeekdays[0] empty - for(i = 0; i fStandaloneShortWeekdays - standaloneAbbrWeekdaysData = calData.getByKey3(gDayNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - standaloneAbbrWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); - } - fStandaloneShortWeekdaysCount = ures_getSize(standaloneAbbrWeekdaysData); - fStandaloneShortWeekdays = new UnicodeString[fStandaloneShortWeekdaysCount+1]; - /* test for NULL */ - if (fStandaloneShortWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; + + // Stand-alone wide weekdays -> fStandaloneWeekdays + initField(&fStandaloneWeekdays, fStandaloneWeekdaysCount, calendarSink, + buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesWideTag, status), 1, status); + if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/wide is not available, use format/wide */ + status = U_ZERO_ERROR; + assignArray(fStandaloneWeekdays, fStandaloneWeekdaysCount, fWeekdays, fWeekdaysCount); } - // leave fStandaloneShortWeekdays[0] empty - for(i = 0; i fStandaloneShortWeekdays + initField(&fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, calendarSink, + buildResourcePath(path, gDayNamesTag, gNamesStandaloneTag, gNamesAbbrTag, status), 1, status); + if (status == U_MISSING_RESOURCE_ERROR) { /* If standalone/abbreviated is not available, use format/abbreviated */ + status = U_ZERO_ERROR; + assignArray(fStandaloneShortWeekdays, fStandaloneShortWeekdaysCount, fShortWeekdays, fShortWeekdaysCount); } - fStandaloneShortWeekdaysCount++; // Stand-alone short weekdays -> fStandaloneShorterWeekdays (fall back to format abbreviated) - standaloneShorterWeekdaysData = calData.getByKey3(gDayNamesTag, gNamesStandaloneTag, gNamesShortTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - standaloneShorterWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); - } - fStandaloneShorterWeekdaysCount = ures_getSize(standaloneShorterWeekdaysData); - fStandaloneShorterWeekdays = new UnicodeString[fStandaloneShorterWeekdaysCount+1]; - /* test for NULL */ - if (fStandaloneShorterWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fStandaloneShorterWeekdays[0] empty - for(i = 0; i fNarrowWeekdays + UErrorCode narrowWeeksEC = status; + initField(&fNarrowWeekdays, fNarrowWeekdaysCount, calendarSink, + buildResourcePath(path, gDayNamesTag, gNamesFormatTag, gNamesNarrowTag, status), 1, narrowWeeksEC); // Stand-alone narrow weekdays -> fStandaloneNarrowWeekdays - standaloneNarrowWeekdaysData = calData.getByKey3(gDayNamesTag, gNamesStandaloneTag, gNamesNarrowTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - standaloneNarrowWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesNarrowTag, status); - if ( status == U_MISSING_RESOURCE_ERROR ) { - status = U_ZERO_ERROR; - standaloneNarrowWeekdaysData = calData.getByKey2(gDayNamesTag, gNamesAbbrTag, status); - } - } - fStandaloneNarrowWeekdaysCount = ures_getSize(standaloneNarrowWeekdaysData); - fStandaloneNarrowWeekdays = new UnicodeString[fStandaloneNarrowWeekdaysCount+1]; - /* test for NULL */ - if (fStandaloneNarrowWeekdays == 0) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - // leave fStandaloneNarrowWeekdays[0] empty - for(i = 0; i @@ -51,7 +53,9 @@ static const UChar gDateFormatSkeleton[][11] = { {LOW_Y, CAP_M, LOW_D, 0} }; -static const char gDateTimePatternsTag[]="DateTimePatterns"; +static const char gCalendarTag[] = "calendar"; +static const char gGregorianTag[] = "gregorian"; +static const char gDateTimePatternsTag[] = "DateTimePatterns"; // latestFirst: @@ -217,15 +221,9 @@ DateIntervalFormat::operator==(const Format& other) const { Mutex lock(&gFormatterMutex); if (fDateFormat != fmt->fDateFormat && (fDateFormat == NULL || fmt->fDateFormat == NULL)) {return FALSE;} if (fDateFormat && fmt->fDateFormat && (*fDateFormat != *fmt->fDateFormat)) {return FALSE;} - - // TODO: should operator == ignore the From and ToCalendar? They hold transient values during - // formatting of a DateInterval. - if (fFromCalendar != fmt->fFromCalendar && (fFromCalendar == NULL || fmt->fFromCalendar == NULL)) {return FALSE;} - if (fFromCalendar && fmt->fFromCalendar && !fFromCalendar->isEquivalentTo(*fmt->fFromCalendar)) {return FALSE;} - - if (fToCalendar != fmt->fToCalendar && (fToCalendar == NULL || fmt->fToCalendar == NULL)) {return FALSE;} - if (fToCalendar && fmt->fToCalendar && !fToCalendar->isEquivalentTo(*fmt->fToCalendar)) {return FALSE;} } + // note: fFromCalendar and fToCalendar hold no persistent state, and therefore do not participate in operator ==. + // fDateFormat has the master calendar for the DateIntervalFormat. if (fSkeleton != fmt->fSkeleton) {return FALSE;} if (fDatePattern != fmt->fDatePattern && (fDatePattern == NULL || fmt->fDatePattern == NULL)) {return FALSE;} if (fDatePattern && fmt->fDatePattern && (*fDatePattern != *fmt->fDatePattern)) {return FALSE;} @@ -657,27 +655,22 @@ DateIntervalFormat::initializePattern(UErrorCode& status) { // with the time interval. // The date/time pattern ( such as {0} {1} ) is saved in // calendar, that is why need to get the CalendarData here. - CalendarData* calData = new CalendarData(locale, NULL, status); - if ( U_FAILURE(status) ) { - delete calData; - return; - } - if ( calData == NULL ) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } + LocalUResourceBundlePointer dateTimePatternsRes(ures_open(NULL, locale.getBaseName(), &status)); + ures_getByKey(dateTimePatternsRes.getAlias(), gCalendarTag, + dateTimePatternsRes.getAlias(), &status); + ures_getByKeyWithFallback(dateTimePatternsRes.getAlias(), gGregorianTag, + dateTimePatternsRes.getAlias(), &status); + ures_getByKeyWithFallback(dateTimePatternsRes.getAlias(), gDateTimePatternsTag, + dateTimePatternsRes.getAlias(), &status); - const UResourceBundle* dateTimePatternsRes = calData->getByKey( - gDateTimePatternsTag, status); int32_t dateTimeFormatLength; const UChar* dateTimeFormat = ures_getStringByIndex( - dateTimePatternsRes, + dateTimePatternsRes.getAlias(), (int32_t)DateFormat::kDateTime, &dateTimeFormatLength, &status); if ( U_SUCCESS(status) && dateTimeFormatLength >= 3 ) { fDateTimeFormat = new UnicodeString(dateTimeFormat, dateTimeFormatLength); } - delete calData; } UBool found = setSeparateDateTimePtn(normalizedDateSkeleton, @@ -1274,11 +1267,11 @@ DateIntervalFormat::splitPatternInto2Part(const UnicodeString& intervalPattern) } count = 0; } - if (ch == '\'') { + if (ch == 0x0027 /*'*/) { // Consecutive single quotes are a single quote literal, // either outside of quotes or between quotes if ((i+1) < intervalPattern.length() && - intervalPattern.charAt(i+1) == '\'') { + intervalPattern.charAt(i+1) == 0x0027 /*'*/) { ++i; } else { inQuote = ! inQuote; @@ -1478,10 +1471,10 @@ DateIntervalFormat::adjustFieldWidth(const UnicodeString& inputSkeleton, } count = 0; } - if (ch == '\'') { + if (ch == 0x0027 /*'*/) { // Consecutive single quotes are a single quote literal, // either outside of quotes or between quotes - if ((i+1) < adjustedPtn.length() && adjustedPtn.charAt(i+1) == '\'') { + if ((i+1) < adjustedPtn.length() && adjustedPtn.charAt(i+1) == 0x0027 /* ' */) { ++i; } else { inQuote = ! inQuote; diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index 4553159e6c5d81..07129db928b31a 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************* * Copyright (C) 2008-2016, International Business Machines Corporation and * others. All Rights Reserved. @@ -222,131 +224,83 @@ static const UChar PATH_SUFFIX[] = {SOLIDUS, LOW_I, LOW_N, LOW_T, LOW_E, LOW_R, /** * Sink for enumerating all of the date interval skeletons. - * Contains inner sink structs, each one corresponding to a type of resource table. - * The outer struct finds the dateInterval table or an alias. */ -struct DateIntervalSink : public ResourceTableSink { +struct DateIntervalInfo::DateIntervalSink : public ResourceSink { - /** - * Sink to handle each skeleton table. - */ - struct SkeletonSink : public ResourceTableSink { - SkeletonSink(DateIntervalSink &sink) : outer(sink) {} - virtual ~SkeletonSink(); - - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode)) { - outer.currentSkeleton = key; - return &outer.patternSink; - } - return NULL; - } - - DateIntervalSink &outer; - } skeletonSink; - - /** - * Sink to store the date interval pattern for each skeleton pattern character. - */ - struct PatternSink : public ResourceTableSink { - PatternSink(DateIntervalSink &sink) : outer(sink) {} - virtual ~PatternSink(); - - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - - // Process the key - UCalendarDateFields calendarField = validateAndProcessPatternLetter(key); - - // If the calendar field has a valid value - if (calendarField < UCAL_FIELD_COUNT) { - // Set the interval pattern - setIntervalPatternIfAbsent(calendarField, value, errorCode); - } else { - errorCode = U_INVALID_FORMAT_ERROR; - } - } - - UCalendarDateFields validateAndProcessPatternLetter(const char *patternLetter) { - // Check that patternLetter is just one letter - char c0; - if ((c0 = patternLetter[0]) != 0 && patternLetter[1] == 0) { - // Check that the pattern letter is accepted - if (c0 == 'y') { - return UCAL_YEAR; - } else if (c0 == 'M') { - return UCAL_MONTH; - } else if (c0 == 'd') { - return UCAL_DATE; - } else if (c0 == 'a') { - return UCAL_AM_PM; - } else if (c0 == 'h' || c0 == 'H') { - return UCAL_HOUR; - } else if (c0 == 'm') { - return UCAL_MINUTE; - }// TODO(ticket:12190): Why icu4c doesn't accept the calendar field "s" but icu4j does? - } - return UCAL_FIELD_COUNT; - } - - /** - * Stores the interval pattern for the current skeleton in the internal data structure - * if it's not present. - */ - void setIntervalPatternIfAbsent(UCalendarDateFields lrgDiffCalUnit, - const ResourceValue &value, UErrorCode &errorCode) { - // Check if the pattern has already been stored on the data structure - DateIntervalInfo::IntervalPatternIndex index = - outer.dateIntervalInfo.calendarFieldToIntervalIndex(lrgDiffCalUnit, errorCode); - if (U_FAILURE(errorCode)) { return; } - - UnicodeString skeleton(outer.currentSkeleton, -1, US_INV); - UnicodeString* patternsOfOneSkeleton = - (UnicodeString*)(outer.dateIntervalInfo.fIntervalPatterns->get(skeleton)); - - if (patternsOfOneSkeleton == NULL || patternsOfOneSkeleton[index].isEmpty()) { - UnicodeString pattern = value.getUnicodeString(errorCode); - outer.dateIntervalInfo.setIntervalPatternInternally(skeleton, lrgDiffCalUnit, - pattern, errorCode); - } - } - - DateIntervalSink &outer; - } patternSink; + // Output data + DateIntervalInfo &dateIntervalInfo; + // Next calendar type + UnicodeString nextCalendarType; DateIntervalSink(DateIntervalInfo &diInfo, const char *currentCalendarType) - : skeletonSink(*this), patternSink(*this), dateIntervalInfo(diInfo), - nextCalendarType(currentCalendarType, -1, US_INV), currentSkeleton(NULL) { } + : dateIntervalInfo(diInfo), nextCalendarType(currentCalendarType, -1, US_INV) { } virtual ~DateIntervalSink(); - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - // Check if it's an alias of intervalFormats - if (U_FAILURE(errorCode) || value.getType() != URES_ALIAS - || uprv_strcmp(key, gIntervalDateTimePatternTag) != 0) { - return; - } + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } - // Get the calendar type for the alias path. - const UnicodeString &aliasPath = value.getAliasUnicodeString(errorCode); + // Iterate over all the calendar entries and only pick the 'intervalFormats' table. + ResourceTable dateIntervalData = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; dateIntervalData.getKeyAndValue(i, key, value); i++) { + if (uprv_strcmp(key, gIntervalDateTimePatternTag) != 0) { + continue; + } - nextCalendarType.remove(); - getCalendarTypeFromPath(aliasPath, nextCalendarType, errorCode); + // Handle aliases and tables. Ignore the rest. + if (value.getType() == URES_ALIAS) { + // Get the calendar type for the alias path. + const UnicodeString &aliasPath = value.getAliasUnicodeString(errorCode); + if (U_FAILURE(errorCode)) { return; } - if (U_FAILURE(errorCode)) { - resetNextCalendarType(); + nextCalendarType.remove(); + getCalendarTypeFromPath(aliasPath, nextCalendarType, errorCode); + + if (U_FAILURE(errorCode)) { + resetNextCalendarType(); + } + break; + + } else if (value.getType() == URES_TABLE) { + // Iterate over all the skeletons in the 'intervalFormat' table. + ResourceTable skeletonData = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t j = 0; skeletonData.getKeyAndValue(j, key, value); j++) { + if (value.getType() == URES_TABLE) { + // Process the skeleton + processSkeletonTable(key, value, errorCode); + if (U_FAILURE(errorCode)) { return; } + } + } + break; + } } } - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t, UErrorCode &errorCode) { - // Check if it's the intervalFormat table - if (U_SUCCESS(errorCode) && uprv_strcmp(key, gIntervalDateTimePatternTag) == 0) { - return &skeletonSink; + /** + * Processes the patterns for a skeleton table + */ + void processSkeletonTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } + + // Iterate over all the patterns in the current skeleton table + const char *currentSkeleton = key; + ResourceTable patternData = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t k = 0; patternData.getKeyAndValue(k, key, value); k++) { + if (value.getType() == URES_STRING) { + // Process the key + UCalendarDateFields calendarField = validateAndProcessPatternLetter(key); + + // If the calendar field has a valid value + if (calendarField < UCAL_FIELD_COUNT) { + // Set the interval pattern + setIntervalPatternIfAbsent(currentSkeleton, calendarField, value, errorCode); + if (U_FAILURE(errorCode)) { return; } + } + } } - return NULL; } /** @@ -364,6 +318,53 @@ struct DateIntervalSink : public ResourceTableSink { path.extractBetween(PATH_PREFIX_LENGTH, path.length() - PATH_SUFFIX_LENGTH, calendarType); } + /** + * Validates and processes the pattern letter + */ + UCalendarDateFields validateAndProcessPatternLetter(const char *patternLetter) { + // Check that patternLetter is just one letter + char c0; + if ((c0 = patternLetter[0]) != 0 && patternLetter[1] == 0) { + // Check that the pattern letter is accepted + if (c0 == 'y') { + return UCAL_YEAR; + } else if (c0 == 'M') { + return UCAL_MONTH; + } else if (c0 == 'd') { + return UCAL_DATE; + } else if (c0 == 'a') { + return UCAL_AM_PM; + } else if (c0 == 'h' || c0 == 'H') { + return UCAL_HOUR; + } else if (c0 == 'm') { + return UCAL_MINUTE; + }// TODO(ticket:12190): Why icu4c doesn't accept the calendar field "s" but icu4j does? + } + return UCAL_FIELD_COUNT; + } + + /** + * Stores the interval pattern for the current skeleton in the internal data structure + * if it's not present. + */ + void setIntervalPatternIfAbsent(const char *currentSkeleton, UCalendarDateFields lrgDiffCalUnit, + const ResourceValue &value, UErrorCode &errorCode) { + // Check if the pattern has already been stored on the data structure + IntervalPatternIndex index = + dateIntervalInfo.calendarFieldToIntervalIndex(lrgDiffCalUnit, errorCode); + if (U_FAILURE(errorCode)) { return; } + + UnicodeString skeleton(currentSkeleton, -1, US_INV); + UnicodeString* patternsOfOneSkeleton = + (UnicodeString*)(dateIntervalInfo.fIntervalPatterns->get(skeleton)); + + if (patternsOfOneSkeleton == NULL || patternsOfOneSkeleton[index].isEmpty()) { + UnicodeString pattern = value.getUnicodeString(errorCode); + dateIntervalInfo.setIntervalPatternInternally(skeleton, lrgDiffCalUnit, + pattern, errorCode); + } + } + const UnicodeString &getNextCalendarType() { return nextCalendarType; } @@ -371,22 +372,10 @@ struct DateIntervalSink : public ResourceTableSink { void resetNextCalendarType() { nextCalendarType.setToBogus(); } - - - // Output data - DateIntervalInfo &dateIntervalInfo; - - // Next calendar type - UnicodeString nextCalendarType; - - // Current skeleton table being enumerated - const char *currentSkeleton; }; // Virtual destructors must be defined out of line. -DateIntervalSink::SkeletonSink::~SkeletonSink() {} -DateIntervalSink::PatternSink::~PatternSink() {} -DateIntervalSink::~DateIntervalSink() {} +DateIntervalInfo::DateIntervalSink::~DateIntervalSink() {} @@ -472,7 +461,7 @@ DateIntervalInfo::initializeData(const Locale& locale, UErrorCode& status) sink.resetNextCalendarType(); // Get all resources for this calendar type - ures_getAllTableItemsWithFallback(calBundle, calType, sink, status); + ures_getAllItemsWithFallback(calBundle, calType, sink, status); } } } diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index 2a6b35b51182cc..17e7ec7cde8a21 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 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 @@ -31,13 +33,13 @@ #include "cmemory.h" #include "cstring.h" #include "locbased.h" -#include "gregoimp.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 /** @@ -221,10 +223,6 @@ static const char* const CLDR_FIELD_NAME[] = { "hour", "minute", "second", "*", "zone" }; -static const char* const Resource_Fields[] = { - "day", "dayperiod", "era", "hour", "minute", "month", "second", "week", - "weekday", "year", "zone", "quarter" }; - // 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 @@ -392,12 +390,12 @@ UInitOnce initOnce = U_INITONCE_INITIALIZER; UHashtable *localeToAllowedHourFormatsMap = NULL; // Value deleter for hashmap. -void deleteAllowedHourFormats(void *ptr) { +U_CFUNC void U_CALLCONV deleteAllowedHourFormats(void *ptr) { uprv_free(ptr); } // Close hashmap at cleanup. -UBool allowedHourFormatsCleanup() { +U_CFUNC UBool U_CALLCONV allowedHourFormatsCleanup() { uhash_close(localeToAllowedHourFormatsMap); return TRUE; } @@ -420,11 +418,8 @@ DateTimePatternGenerator::initData(const Locale& locale, UErrorCode &status) { skipMatcher = NULL; fAvailableFormatKeyHash=NULL; - addCanonicalItems(); + addCanonicalItems(status); addICUPatterns(locale, status); - if (U_FAILURE(status)) { - return; - } addCLDRData(locale, status); setDateTimeFromCalendar(locale, status); setDecimalSymbols(locale, status); @@ -434,80 +429,51 @@ DateTimePatternGenerator::initData(const Locale& locale, UErrorCode &status) { namespace { -struct AllowedHourFormatsSink : public ResourceTableSink { +struct AllowedHourFormatsSink : public ResourceSink { // Initialize sub-sinks. - AllowedHourFormatsSink() : localeSink(*this), allowedListSink(*this) {} + AllowedHourFormatsSink() {} virtual ~AllowedHourFormatsSink(); - // Entry point. - virtual ResourceTableSink *getOrCreateTableSink(const char *key, int32_t, UErrorCode &status) { - if (U_FAILURE(status)) { return NULL; } - - locale = key; - return &localeSink; - } - - struct LocaleSink : public ResourceTableSink { - AllowedHourFormatsSink &outer; - LocaleSink(AllowedHourFormatsSink &outer) : outer(outer) {} - virtual ~LocaleSink(); - - virtual void put(const char *key, const ResourceValue &value, UErrorCode &status) { - if (U_FAILURE(status)) { return; } - - if (uprv_strcmp(key, "allowed") == 0) { - outer.allowedFormats = static_cast(uprv_malloc(2 * sizeof(int32_t))); - outer.allowedFormatsLength = 1; - if (outer.allowedFormats == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - outer.allowedFormats[0] = outer.getHourFormatFromUnicodeString( - value.getUnicodeString(status)); - } - } - - virtual ResourceArraySink *getOrCreateArraySink(const char *key, int32_t size, UErrorCode &status) { - if (U_FAILURE(status)) { return NULL; } - - if (uprv_strcmp(key, "allowed") == 0) { - outer.allowedFormats = static_cast(uprv_malloc((size + 1) * sizeof(int32_t))); - outer.allowedFormatsLength = size; - if (outer.allowedFormats == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; - } else { - return &outer.allowedListSink; + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable timeData = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; timeData.getKeyAndValue(i, key, value); ++i) { + const char *regionOrLocale = key; + ResourceTable formatList = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + 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 (value.getType() == URES_STRING) { + if (list.allocateInsteadAndReset(2) == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + list[0] = getHourFormatFromUnicodeString(value.getUnicodeString(errorCode)); + length = 1; + } + else { + ResourceArray allowedFormats = value.getArray(errorCode); + length = allowedFormats.getSize(); + if (list.allocateInsteadAndReset(length + 1) == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + for (int32_t k = 0; k < length; ++k) { + allowedFormats.getValue(k, 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; } } } - return NULL; - } - - virtual void leave(UErrorCode &status) { - if (U_FAILURE(status) || outer.allowedFormats == NULL) { return; } - - outer.allowedFormats[outer.allowedFormatsLength] = ALLOWED_HOUR_FORMAT_UNKNOWN; - uhash_put(localeToAllowedHourFormatsMap, const_cast(outer.locale), outer.allowedFormats, &status); - outer.allowedFormats = NULL; } - } localeSink; - - struct AllowedListSink : public ResourceArraySink { - AllowedHourFormatsSink &outer; - AllowedListSink(AllowedHourFormatsSink &outer) : outer(outer) {} - virtual ~AllowedListSink(); - - virtual void put(int32_t index, const ResourceValue &value, UErrorCode &status) { - if (U_FAILURE(status)) { return; } - - outer.allowedFormats[index] = outer.getHourFormatFromUnicodeString( - value.getUnicodeString(status)); - } - } allowedListSink; - - const char *locale; - int32_t *allowedFormats; - int32_t allowedFormatsLength; + } AllowedHourFormat getHourFormatFromUnicodeString(UnicodeString s) { if (s.length() == 1) { @@ -527,10 +493,8 @@ struct AllowedHourFormatsSink : public ResourceTableSink { } // namespace AllowedHourFormatsSink::~AllowedHourFormatsSink() {} -AllowedHourFormatsSink::LocaleSink::~LocaleSink() {} -AllowedHourFormatsSink::AllowedListSink::~AllowedListSink() {} -void DateTimePatternGenerator::loadAllowedHourFormatsData(UErrorCode &status) { +U_CFUNC void U_CALLCONV DateTimePatternGenerator::loadAllowedHourFormatsData(UErrorCode &status) { if (U_FAILURE(status)) { return; } localeToAllowedHourFormatsMap = uhash_open( uhash_hashChars, uhash_compareChars, NULL, &status); @@ -544,14 +508,13 @@ void DateTimePatternGenerator::loadAllowedHourFormatsData(UErrorCode &status) { // 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_getAllTableItemsWithFallback(rb.getAlias(), "timeData", sink, status); + ures_getAllItemsWithFallback(rb.getAlias(), "timeData", sink, status); ucln_i18n_registerCleanup(UCLN_I18N_ALLOWED_HOUR_FORMATS, allowedHourFormatsCleanup); } 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); @@ -632,41 +595,38 @@ DateTimePatternGenerator::staticGetBaseSkeleton( void DateTimePatternGenerator::addICUPatterns(const Locale& locale, UErrorCode& status) { + if (U_FAILURE(status)) { return; } UnicodeString dfPattern; UnicodeString conflictingString; DateFormat* df; - if (U_FAILURE(status)) { - return; - } - // 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 != NULL && (sdf = dynamic_cast(df)) != NULL) { - addPattern(sdf->toPattern(dfPattern), FALSE, conflictingString, status); + 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; - } + if (U_FAILURE(status)) { return; } df = DateFormat::createTimeInstance(style, locale); if (df != NULL && (sdf = dynamic_cast(df)) != NULL) { - addPattern(sdf->toPattern(dfPattern), FALSE, conflictingString, status); - // HACK for hh:ss - if ( i==DateFormat::kMedium ) { - hackPattern = dfPattern; + 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; - } + if (U_FAILURE(status)) { return; } } } @@ -721,221 +681,223 @@ DateTimePatternGenerator::hackTimes(const UnicodeString& hackPattern, UErrorCode static const UChar hourFormatChars[] = { CAP_H, LOW_H, CAP_K, LOW_K, 0 }; // HhKk, the hour format characters void -DateTimePatternGenerator::addCLDRData(const Locale& locale, UErrorCode& err) { - UResourceBundle *rb, *calTypeBundle, *calBundle; - UResourceBundle *patBundle, *fieldBundle, *fBundle; - UnicodeString rbPattern, value, field; - UnicodeString conflictingPattern; - const char *key=NULL; - int32_t i; - - UnicodeString defaultItemFormat(TRUE, UDATPG_ItemFormat, UPRV_LENGTHOF(UDATPG_ItemFormat)-1); // Read-only alias. - - err = U_ZERO_ERROR; - - fDefaultHourFormatChar = 0; - for (i=0; i0) { - hackTimes(hackPattern, err); - } +// 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(NULL, 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 @@ -949,7 +911,6 @@ DateTimePatternGenerator::initHashtable(UErrorCode& err) { } } - void DateTimePatternGenerator::setAppendItemFormat(UDateTimePatternField field, const UnicodeString& value) { appendItemFormats[field] = value; @@ -970,7 +931,12 @@ DateTimePatternGenerator::setAppendItemName(UDateTimePatternField field, const U } const UnicodeString& -DateTimePatternGenerator:: getAppendItemName(UDateTimePatternField field) const { +DateTimePatternGenerator::getAppendItemName(UDateTimePatternField field) const { + return appendItemNames[field]; +} + +UnicodeString& +DateTimePatternGenerator::getMutableAppendItemName(UDateTimePatternField field) { return appendItemNames[field]; } @@ -1096,12 +1062,15 @@ DateTimePatternGenerator::getDecimal() const { } void -DateTimePatternGenerator::addCanonicalItems() { +DateTimePatternGenerator::addCanonicalItems(UErrorCode& status) { + if (U_FAILURE(status)) { return; } UnicodeString conflictingPattern; - UErrorCode status = U_ZERO_ERROR; for (int32_t i=0; i 0) { + addPattern(UnicodeString(Canonical_Items[i]), FALSE, conflictingPattern, status); + } + if (U_FAILURE(status)) { return; } } } @@ -1123,16 +1092,35 @@ DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCo int32_t resStrLen = 0; Calendar* fCalendar = Calendar::createInstance(locale, status); - CalendarData calData(locale, fCalendar?fCalendar->getType():NULL, status); - UResourceBundle *dateTimePatterns = calData.getByKey(DT_DateTimePatternsTag, status); - if (U_FAILURE(status)) return; + if (U_FAILURE(status)) { return; } + + LocalUResourceBundlePointer calData(ures_open(NULL, locale.getBaseName(), &status)); + ures_getByKey(calData.getAlias(), DT_DateTimeCalendarTag, calData.getAlias(), &status); - if (ures_getSize(dateTimePatterns) <= DateFormat::kDateTime) + LocalUResourceBundlePointer dateTimePatterns; + if (fCalendar != NULL && fCalendar->getType() != NULL && *fCalendar->getType() != '\0' + && uprv_strcmp(fCalendar->getType(), DT_DateTimeGregorianTag) != 0) { + dateTimePatterns.adoptInstead(ures_getByKeyWithFallback(calData.getAlias(), fCalendar->getType(), + NULL, &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, (int32_t)DateFormat::kDateTime, &resStrLen, &status); + resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), (int32_t)DateFormat::kDateTime, &resStrLen, &status); setDateTimeFormat(UnicodeString(TRUE, resStr, resStrLen)); delete fCalendar; @@ -1324,8 +1312,8 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, } if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) { - UnicodeString newField=dtMatcher->skeleton.original[UDATPG_FRACTIONAL_SECOND_FIELD]; - field = field + decimal + newField; + 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 @@ -1349,9 +1337,9 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, // 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. - UnicodeString reqField = dtMatcher->skeleton.original[typeValue]; - int32_t reqFieldLen = reqField.length(); - if (reqField.charAt(0) == CAP_E && reqFieldLen < 3) + 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) || @@ -1359,8 +1347,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, (typeValue==UDATPG_SECOND_FIELD && (options & UDATPG_MATCH_SECOND_FIELD_LENGTH)==0) ) { adjFieldLen = field.length(); } else if (specifiedSkeleton) { - UnicodeString skelField = specifiedSkeleton->original[typeValue]; - int32_t skelFieldLen = skelField.length(); + 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)) { @@ -1368,9 +1355,12 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, adjFieldLen = field.length(); } } - UChar c = (typeValue!= UDATPG_HOUR_FIELD && typeValue!= UDATPG_MONTH_FIELD && - typeValue!= UDATPG_WEEKDAY_FIELD && (typeValue!= UDATPG_YEAR_FIELD || reqField.charAt(0)==CAP_Y))? - reqField.charAt(0): field.charAt(0); + 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; } @@ -1733,36 +1723,19 @@ PatternMap::getPatternFromSkeleton(PtnSkeleton& skeleton, const PtnSkeleton** sp } // find boot entry - UChar baseChar='\0'; - for (int32_t i=0; iskeleton->original[i].compare(skeleton.original[i]) != 0 ) - { - break; - } - } + equal = curElem->skeleton->original == skeleton.original; } else { // called from DateTimePatternGenerator::getRedundants, use baseOriginal - for (i=0; iskeleton->baseOriginal[i].compare(skeleton.baseOriginal[i]) != 0 ) - { - break; - } - } + equal = curElem->skeleton->baseOriginal == skeleton.baseOriginal; } - if (i == UDATPG_FIELD_COUNT) { + if (equal) { if (specifiedSkeletonPtr && curElem->skeletonWasSpecified) { *specifiedSkeletonPtr = curElem->skeleton; } @@ -1866,37 +1839,35 @@ 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++) { - UnicodeString field = fp->items[i]; - if ( field.charAt(0) == LOW_A ) { + const UnicodeString& value = fp->items[i]; + if ( value.charAt(0) == LOW_A ) { continue; // skip 'a' } - if ( fp->isQuoteLiteral(field) ) { + if ( fp->isQuoteLiteral(value) ) { UnicodeString quoteLiteral; fp->getQuoteLiteral(quoteLiteral, &i); continue; } - int32_t canonicalIndex = fp->getCanonicalIndex(field); + int32_t canonicalIndex = fp->getCanonicalIndex(value); if (canonicalIndex < 0 ) { continue; } const dtTypeElem *row = &dtTypes[canonicalIndex]; - int32_t typeValue = row->field; - skeletonResult.original[typeValue]=field; + int32_t field = row->field; + skeletonResult.original.populate(field, value); UChar repeatChar = row->patternChar; int32_t repeatCount = row->minLen; // #7930 removes cap at 3 - while (repeatCount-- > 0) { - skeletonResult.baseOriginal[typeValue] += repeatChar; - } - int16_t subTypeValue = row->type; + skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount); + int16_t subField = row->type; if ( row->type > 0) { - subTypeValue += field.length(); + subField += value.length(); } - skeletonResult.type[typeValue] = subTypeValue; + skeletonResult.type[field] = subField; } copyFrom(skeletonResult); } @@ -1904,23 +1875,13 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton void DateTimeMatcher::getBasePattern(UnicodeString &result ) { result.remove(); // Reset the result first. - for (int32_t i=0; iskeleton.type[i]=newSkeleton.type[i]; - this->skeleton.original[i]=newSkeleton.original[i]; - this->skeleton.baseOriginal[i]=newSkeleton.baseOriginal[i]; - } + skeleton.copyFrom(newSkeleton); } void DateTimeMatcher::copyFrom() { // same as clear - for (int32_t i=0; iskeleton.type[i]=0; - this->skeleton.original[i].remove(); - this->skeleton.baseOriginal[i].remove(); - } + skeleton.clear(); } UBool DateTimeMatcher::equals(const DateTimeMatcher* other) const { - if (other==NULL) { - return FALSE; - } - for (int32_t i=0; iskeleton.original[i]!=other->skeleton.original[i] ) { - return FALSE; - } - } - return TRUE; + if (other==NULL) { return FALSE; } + return skeleton.original == other->skeleton.original; } int32_t @@ -2074,7 +2020,7 @@ FormatParser::getCanonicalIndex(const UnicodeString& s, UBool strict) { } int32_t i = 0; int32_t bestRow = -1; - while (dtTypes[i].patternChar != '\0') { + while (dtTypes[i].patternChar != 0x0000) { if ( dtTypes[i].patternChar != ch ) { ++i; continue; @@ -2246,52 +2192,116 @@ PatternMapIterator::next() { return *matcher; } -PtnSkeleton::PtnSkeleton() { + +SkeletonFields::SkeletonFields() { + // Set initial values to zero + clear(); } +void SkeletonFields::clear() { + uprv_memset(chars, 0, sizeof(chars)); + uprv_memset(lengths, 0, sizeof(lengths)); +} -PtnSkeleton::PtnSkeleton(const PtnSkeleton& other) { - for (int32_t i=0; itype[i]=other.type[i]; - this->original[i]=other.original[i]; - this->baseOriginal[i]=other.baseOriginal[i]; +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; } -UBool -PtnSkeleton::equals(const PtnSkeleton& other) { - for (int32_t i=0; isize() % 3) != 0) { + if (adopt->size() == 0) { + delete adopt; + adopt = NULL; + } else if ((adopt->size() % 3) != 0) { status = U_ILLEGAL_ARGUMENT_ERROR; } else { for (int i = 1; i < adopt->size(); i += 3) { diff --git a/deps/icu-small/source/i18n/funcrepl.cpp b/deps/icu-small/source/i18n/funcrepl.cpp index 7ad5fc20bf5172..683e00a2c8db51 100644 --- a/deps/icu-small/source/i18n/funcrepl.cpp +++ b/deps/icu-small/source/i18n/funcrepl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2012, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/funcrepl.h b/deps/icu-small/source/i18n/funcrepl.h index ff00b55abfbb52..954150cf002c40 100644 --- a/deps/icu-small/source/i18n/funcrepl.h +++ b/deps/icu-small/source/i18n/funcrepl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2011, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index 0c2fca576f2982..4847ce95848e1d 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/gregocal.cpp b/deps/icu-small/source/i18n/gregocal.cpp index b8bd8e293de9ce..959228ab49b31b 100644 --- a/deps/icu-small/source/i18n/gregocal.cpp +++ b/deps/icu-small/source/i18n/gregocal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index 6b3277107f5217..fa886f5a6fa037 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2008, International Business Machines @@ -18,10 +20,6 @@ #include "cstring.h" #include "uassert.h" -#if defined(U_DEBUG_CALDATA) -#include -#endif - U_NAMESPACE_BEGIN int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) { @@ -157,171 +155,6 @@ int32_t Grego::dayOfWeekInMonth(int32_t year, int32_t month, int32_t dom) { return weekInMonth; } -/* ---- CalendarData ------ */ - -#define U_CALENDAR_KEY "calendar" -#define U_GREGORIAN_KEY "gregorian" -#define U_FORMAT_KEY "format" -#define U_DEFAULT_KEY "default" -#define U_CALENDAR_DATA ((char*)0) - - -// CalendarData::CalendarData(const Locale& loc, UErrorCode& status) -// : fFillin(NULL), fBundle(NULL), fFallback(NULL) { -// initData(loc.getBaseName(), (char*) "???", status); -// } - -CalendarData::CalendarData(const Locale& loc, const char *type, UErrorCode& status) - : fFillin(NULL), fOtherFillin(NULL), fBundle(NULL), fFallback(NULL) { - initData(loc.getBaseName(), type, status); -} - -void CalendarData::initData(const char *locale, const char *type, UErrorCode& status) { - fOtherFillin = ures_open(U_CALENDAR_DATA, locale, &status); - fFillin = ures_getByKey(fOtherFillin, U_CALENDAR_KEY, fFillin, &status); - - if((type != NULL) && - (*type != '\0') && - (uprv_strcmp(type, U_GREGORIAN_KEY))) - { - fBundle = ures_getByKeyWithFallback(fFillin, type, NULL, &status); - fFallback = ures_getByKeyWithFallback(fFillin, U_GREGORIAN_KEY, NULL, &status); - -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: CalendarData(%s, %s, %s) -> main(%p, %s)=%s, fallback(%p, %s)=%s\n", - this, locale, type, u_errorName(status), fBundle, type, fBundle?ures_getLocale(fBundle, &status):"", - fFallback, U_GREGORIAN_KEY, fFallback?ures_getLocale(fFallback, &status):""); -#endif - - } else { - fBundle = ures_getByKeyWithFallback(fFillin, U_GREGORIAN_KEY, NULL, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: CalendarData(%s, %s, %s) -> main(%p, %s)=%s, fallback = NULL\n", - this, locale, type, u_errorName(status), fBundle, U_GREGORIAN_KEY, fBundle?ures_getLocale(fBundle, &status):"" ); -#endif - } -} - -CalendarData::~CalendarData() { - ures_close(fFillin); - ures_close(fBundle); - ures_close(fFallback); - ures_close(fOtherFillin); -} - -UResourceBundle* -CalendarData::getByKey(const char *key, UErrorCode& status) { - if(U_FAILURE(status)) { - return NULL; - } - - if(fBundle) { - fFillin = ures_getByKeyWithFallback(fBundle, key, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s -> %s - from MAIN %s\n",this, key, u_errorName(status), ures_getLocale(fFillin, &status)); -#endif - } - if(fFallback && (status == U_MISSING_RESOURCE_ERROR)) { - status = U_ZERO_ERROR; // retry with fallback (gregorian) - fFillin = ures_getByKeyWithFallback(fFallback, key, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s -> %s - from FALLBACK %s\n",this, key, u_errorName(status), ures_getLocale(fFillin, &status)); -#endif - } - return fFillin; -} - -UResourceBundle* CalendarData::getByKey2(const char *key, const char *subKey, UErrorCode& status) { - if(U_FAILURE(status)) { - return NULL; - } - - if(fBundle) { -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: //\n"); -#endif - fFillin = ures_getByKeyWithFallback(fBundle, key, fFillin, &status); - fOtherFillin = ures_getByKeyWithFallback(fFillin, U_FORMAT_KEY, fOtherFillin, &status); - fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s/format/%s -> %s - from MAIN %s\n", this, key, subKey, u_errorName(status), ures_getLocale(fFillin, &status)); -#endif - } - if(fFallback && (status == U_MISSING_RESOURCE_ERROR)) { - status = U_ZERO_ERROR; // retry with fallback (gregorian) - fFillin = ures_getByKeyWithFallback(fFallback, key, fFillin, &status); - fOtherFillin = ures_getByKeyWithFallback(fFillin, U_FORMAT_KEY, fOtherFillin, &status); - fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s/format/%s -> %s - from FALLBACK %s\n",this, key, subKey, u_errorName(status), ures_getLocale(fFillin,&status)); -#endif - } - -//// handling of 'default' keyword on failure: Commented out for 3.0. -// if((status == U_MISSING_RESOURCE_ERROR) && -// uprv_strcmp(subKey,U_DEFAULT_KEY)) { // avoid recursion -// #if defined (U_DEBUG_CALDATA) -// fprintf(stderr, "%p: - attempting fallback -\n", this); -// fflush(stderr); -// #endif -// UErrorCode subStatus = U_ZERO_ERROR; -// int32_t len; -// char kwBuf[128] = ""; -// const UChar *kw; -// /* fFillin = */ getByKey2(key, U_DEFAULT_KEY, subStatus); -// kw = ures_getString(fFillin, &len, &subStatus); -// if(len>126) { // too big -// len = 0; -// } -// if(U_SUCCESS(subStatus) && (len>0)) { -// u_UCharsToChars(kw, kwBuf, len+1); -// if(*kwBuf && uprv_strcmp(kwBuf,subKey)) { -// #if defined (U_DEBUG_CALDATA) -// fprintf(stderr, "%p: trying %s/format/default -> \"%s\"\n",this, key, kwBuf); -// #endif -// // now try again with the default -// status = U_ZERO_ERROR; -// /* fFillin = */ getByKey2(key, kwBuf, status); -// } -// #if defined (U_DEBUG_CALDATA) -// } else { -// fprintf(stderr, "%p: could not load %s/format/default - fail out (%s)\n",this, key, kwBuf, u_errorName(status)); -// #endif -// } -// } - - return fFillin; -} - -UResourceBundle* CalendarData::getByKey3(const char *key, const char *contextKey, const char *subKey, UErrorCode& status) { - if(U_FAILURE(status)) { - return NULL; - } - - if(fBundle) { -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: //\n"); -#endif - fFillin = ures_getByKeyWithFallback(fBundle, key, fFillin, &status); - fOtherFillin = ures_getByKeyWithFallback(fFillin, contextKey, fOtherFillin, &status); - fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s/%s/%s -> %s - from MAIN %s\n", this, key, contextKey, subKey, u_errorName(status), ures_getLocale(fFillin, &status)); -#endif - } - if(fFallback && (status == U_MISSING_RESOURCE_ERROR)) { - status = U_ZERO_ERROR; // retry with fallback (gregorian) - fFillin = ures_getByKeyWithFallback(fFallback, key, fFillin, &status); - fOtherFillin = ures_getByKeyWithFallback(fFillin, contextKey, fOtherFillin, &status); - fFillin = ures_getByKeyWithFallback(fOtherFillin, subKey, fFillin, &status); -#if defined (U_DEBUG_CALDATA) - fprintf(stderr, "%p: get %s/%s/%s -> %s - from FALLBACK %s\n",this, key, contextKey, subKey, u_errorName(status), ures_getLocale(fFillin,&status)); -#endif - } - - return fFillin; -} - U_NAMESPACE_END #endif diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index b3048946c705db..19e44c7a5a01d2 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2008, International Business Machines @@ -291,71 +293,6 @@ inline int32_t Grego::gregorianShift(int32_t eyear) { return gregShift; } -/** - * This utility class provides convenient access to the data needed for a calendar. - * @internal ICU 3.0 - */ -class CalendarData : public UMemory { -public: - /** - * Construct a CalendarData from the given locale. - * @param loc locale to use. The 'calendar' keyword will be ignored. - * @param type calendar type. NULL indicates the gregorian calendar. - * No default lookup is done. - * @param status error code - */ - CalendarData(const Locale& loc, const char *type, UErrorCode& status); - - /** - * Load data for calendar. Note, this object owns the resources, do NOT call ures_close()! - * The ResourceBundle C++ API should NOT be used because it is too slow for a low level API. - * - * @param key Resource key to data - * @param status Error Status - * @internal - */ - UResourceBundle* getByKey(const char *key, UErrorCode& status); - - /** - * Load data for calendar. Note, this object owns the resources, do NOT call ures_close()! - * There is an implicit key of 'format' - * data is located in: "calendar/key/format/subKey" - * for example, calendar/dayNames/format/abbreviated - * The ResourceBundle C++ API should NOT be used because it is too slow for a low level API. - * - * @param key Resource key to data - * @param subKey Resource key to data - * @param status Error Status - * @internal - */ - UResourceBundle* getByKey2(const char *key, const char *subKey, UErrorCode& status); - - /** - * Load data for calendar. Note, this object owns the resources, do NOT call ures_close()! - * data is located in: "calendar/key/contextKey/subKey" - * for example, calendar/dayNames/standalone/narrow - * The ResourceBundle C++ API should NOT be used because it is too slow for a low level API. - * - * @param key Resource key to data - * @param contextKey Resource key to data - * @param subKey Resource key to data - * @param status Error Status - * @internal - */ - UResourceBundle* getByKey3(const char *key, const char *contextKey, const char *subKey, UErrorCode& status); - - ~CalendarData(); - -private: - void initData(const char *locale, const char *type, UErrorCode& status); - - UResourceBundle *fFillin; - UResourceBundle *fOtherFillin; - UResourceBundle *fBundle; - UResourceBundle *fFallback; - CalendarData(); // Not implemented. -}; - U_NAMESPACE_END #endif // !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/hebrwcal.cpp b/deps/icu-small/source/i18n/hebrwcal.cpp index 96673e5788d85b..0b329a87158733 100644 --- a/deps/icu-small/source/i18n/hebrwcal.cpp +++ b/deps/icu-small/source/i18n/hebrwcal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2003-2016, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/hebrwcal.h b/deps/icu-small/source/i18n/hebrwcal.h index 4cb2d3ebbfe9d9..0824fb7c784e9e 100644 --- a/deps/icu-small/source/i18n/hebrwcal.h +++ b/deps/icu-small/source/i18n/hebrwcal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/i18n.rc b/deps/icu-small/source/i18n/i18n.rc index cc516ee0a0589e..62fcbc738dd6f3 100644 --- a/deps/icu-small/source/i18n/i18n.rc +++ b/deps/icu-small/source/i18n/i18n.rc @@ -1,6 +1,8 @@ // Do not edit with Microsoft Developer Studio Resource Editor. // It will permanently substitute version numbers that are intended to be // picked up by the pre-processor during each build. +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (c) 2001-2010 International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/i18n/identifier_info.cpp b/deps/icu-small/source/i18n/identifier_info.cpp deleted file mode 100644 index 05882830a5baae..00000000000000 --- a/deps/icu-small/source/i18n/identifier_info.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 2012-2014, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -*/ - -#include "unicode/utypes.h" - -#include "unicode/uchar.h" -#include "unicode/utf16.h" - -#include "identifier_info.h" -#include "mutex.h" -#include "scriptset.h" -#include "ucln_in.h" -#include "uvector.h" - -U_NAMESPACE_BEGIN - -static UnicodeSet *ASCII; -static ScriptSet *JAPANESE; -static ScriptSet *CHINESE; -static ScriptSet *KOREAN; -static ScriptSet *CONFUSABLE_WITH_LATIN; -static UInitOnce gIdentifierInfoInitOnce = U_INITONCE_INITIALIZER; - - -U_CDECL_BEGIN -static UBool U_CALLCONV -IdentifierInfo_cleanup(void) { - delete ASCII; - ASCII = NULL; - delete JAPANESE; - JAPANESE = NULL; - delete CHINESE; - CHINESE = NULL; - delete KOREAN; - KOREAN = NULL; - delete CONFUSABLE_WITH_LATIN; - CONFUSABLE_WITH_LATIN = NULL; - gIdentifierInfoInitOnce.reset(); - return TRUE; -} - -static void U_CALLCONV -IdentifierInfo_init(UErrorCode &status) { - ASCII = new UnicodeSet(0, 0x7f); - JAPANESE = new ScriptSet(); - CHINESE = new ScriptSet(); - KOREAN = new ScriptSet(); - CONFUSABLE_WITH_LATIN = new ScriptSet(); - if (ASCII == NULL || JAPANESE == NULL || CHINESE == NULL || KOREAN == NULL - || CONFUSABLE_WITH_LATIN == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - ASCII->freeze(); - JAPANESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HIRAGANA, status) - .set(USCRIPT_KATAKANA, status); - CHINESE->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_BOPOMOFO, status); - KOREAN->set(USCRIPT_LATIN, status).set(USCRIPT_HAN, status).set(USCRIPT_HANGUL, status); - CONFUSABLE_WITH_LATIN->set(USCRIPT_CYRILLIC, status).set(USCRIPT_GREEK, status) - .set(USCRIPT_CHEROKEE, status); - ucln_i18n_registerCleanup(UCLN_I18N_IDENTIFIER_INFO, IdentifierInfo_cleanup); -} -U_CDECL_END - - -IdentifierInfo::IdentifierInfo(UErrorCode &status): - fIdentifier(NULL), fRequiredScripts(NULL), fScriptSetSet(NULL), - fCommonAmongAlternates(NULL), fNumerics(NULL), fIdentifierProfile(NULL) { - umtx_initOnce(gIdentifierInfoInitOnce, &IdentifierInfo_init, status); - if (U_FAILURE(status)) { - return; - } - - fIdentifier = new UnicodeString(); - fRequiredScripts = new ScriptSet(); - fScriptSetSet = uhash_open(uhash_hashScriptSet, uhash_compareScriptSet, NULL, &status); - uhash_setKeyDeleter(fScriptSetSet, uhash_deleteScriptSet); - fCommonAmongAlternates = new ScriptSet(); - fNumerics = new UnicodeSet(); - fIdentifierProfile = new UnicodeSet(0, 0x10FFFF); - - if (U_SUCCESS(status) && (fIdentifier == NULL || fRequiredScripts == NULL || fScriptSetSet == NULL || - fCommonAmongAlternates == NULL || fNumerics == NULL || fIdentifierProfile == NULL)) { - status = U_MEMORY_ALLOCATION_ERROR; - } -} - -IdentifierInfo::~IdentifierInfo() { - delete fIdentifier; - delete fRequiredScripts; - uhash_close(fScriptSetSet); - delete fCommonAmongAlternates; - delete fNumerics; - delete fIdentifierProfile; -} - - -IdentifierInfo &IdentifierInfo::clear() { - fRequiredScripts->resetAll(); - uhash_removeAll(fScriptSetSet); - fNumerics->clear(); - fCommonAmongAlternates->resetAll(); - return *this; -} - - -IdentifierInfo &IdentifierInfo::setIdentifierProfile(const UnicodeSet &identifierProfile) { - *fIdentifierProfile = identifierProfile; - return *this; -} - - -const UnicodeSet &IdentifierInfo::getIdentifierProfile() const { - return *fIdentifierProfile; -} - - -IdentifierInfo &IdentifierInfo::setIdentifier(const UnicodeString &identifier, UErrorCode &status) { - if (U_FAILURE(status)) { - return *this; - } - *fIdentifier = identifier; - clear(); - ScriptSet scriptsForCP; - UChar32 cp; - for (int32_t i = 0; i < identifier.length(); i += U16_LENGTH(cp)) { - cp = identifier.char32At(i); - // Store a representative character for each kind of decimal digit - if (u_charType(cp) == U_DECIMAL_DIGIT_NUMBER) { - // Just store the zero character as a representative for comparison. Unicode guarantees it is cp - value - fNumerics->add(cp - (UChar32)u_getNumericValue(cp)); - } - UScriptCode extensions[500]; - int32_t extensionsCount = uscript_getScriptExtensions(cp, extensions, UPRV_LENGTHOF(extensions), &status); - if (U_FAILURE(status)) { - return *this; - } - scriptsForCP.resetAll(); - for (int32_t j=0; jUnion(scriptsForCP); - break; - default: - if (!fRequiredScripts->intersects(scriptsForCP) - && !uhash_geti(fScriptSetSet, &scriptsForCP)) { - // If the set hasn't been added already, add it - // (Add a copy, fScriptSetSet takes ownership of the copy.) - uhash_puti(fScriptSetSet, new ScriptSet(scriptsForCP), 1, &status); - } - break; - } - } - // Now make a final pass through ScriptSetSet to remove alternates that came before singles. - // [Kana], [Kana Hira] => [Kana] - // This is relatively infrequent, so doesn't have to be optimized. - // We also compute any commonalities among the alternates. - if (uhash_count(fScriptSetSet) > 0) { - fCommonAmongAlternates->setAll(); - for (int32_t it = UHASH_FIRST;;) { - const UHashElement *nextHashEl = uhash_nextElement(fScriptSetSet, &it); - if (nextHashEl == NULL) { - break; - } - ScriptSet *next = static_cast(nextHashEl->key.pointer); - // [Kana], [Kana Hira] => [Kana] - if (fRequiredScripts->intersects(*next)) { - uhash_removeElement(fScriptSetSet, nextHashEl); - } else { - fCommonAmongAlternates->intersect(*next); - // [[Arab Syrc Thaa]; [Arab Syrc]] => [[Arab Syrc]] - for (int32_t otherIt = UHASH_FIRST;;) { - const UHashElement *otherHashEl = uhash_nextElement(fScriptSetSet, &otherIt); - if (otherHashEl == NULL) { - break; - } - ScriptSet *other = static_cast(otherHashEl->key.pointer); - if (next != other && next->contains(*other)) { - uhash_removeElement(fScriptSetSet, nextHashEl); - break; - } - } - } - } - } - if (uhash_count(fScriptSetSet) == 0) { - fCommonAmongAlternates->resetAll(); - } - return *this; -} - - -const UnicodeString *IdentifierInfo::getIdentifier() const { - return fIdentifier; -} - -const ScriptSet *IdentifierInfo::getScripts() const { - return fRequiredScripts; -} - -const UHashtable *IdentifierInfo::getAlternates() const { - return fScriptSetSet; -} - - -const UnicodeSet *IdentifierInfo::getNumerics() const { - return fNumerics; -} - -const ScriptSet *IdentifierInfo::getCommonAmongAlternates() const { - return fCommonAmongAlternates; -} - -#if !UCONFIG_NO_NORMALIZATION - -URestrictionLevel IdentifierInfo::getRestrictionLevel(UErrorCode &status) const { - if (!fIdentifierProfile->containsAll(*fIdentifier) || getNumerics()->size() > 1) { - return USPOOF_UNRESTRICTIVE; - } - if (ASCII->containsAll(*fIdentifier)) { - return USPOOF_ASCII; - } - // This is a bit tricky. We look at a number of factors. - // The number of scripts in the text. - // Plus 1 if there is some commonality among the alternates (eg [Arab Thaa]; [Arab Syrc]) - // Plus number of alternates otherwise (this only works because we only test cardinality up to 2.) - - // Note: the requiredScripts set omits COMMON and INHERITED; they are taken out at the - // time it is created, in setIdentifier(). - int32_t cardinalityPlus = fRequiredScripts->countMembers() + - (fCommonAmongAlternates->countMembers() == 0 ? uhash_count(fScriptSetSet) : 1); - if (cardinalityPlus < 2) { - return USPOOF_SINGLE_SCRIPT_RESTRICTIVE; - } - if (containsWithAlternates(*JAPANESE, *fRequiredScripts) || containsWithAlternates(*CHINESE, *fRequiredScripts) - || containsWithAlternates(*KOREAN, *fRequiredScripts)) { - return USPOOF_HIGHLY_RESTRICTIVE; - } - if (cardinalityPlus == 2 && - fRequiredScripts->test(USCRIPT_LATIN, status) && - !fRequiredScripts->intersects(*CONFUSABLE_WITH_LATIN)) { - return USPOOF_MODERATELY_RESTRICTIVE; - } - return USPOOF_MINIMALLY_RESTRICTIVE; -} - -#endif /* !UCONFIG_NO_NORMALIZATION */ - -int32_t IdentifierInfo::getScriptCount() const { - // Note: Common and Inherited scripts were removed by setIdentifier(), and do not appear in fRequiredScripts. - int32_t count = fRequiredScripts->countMembers() + - (fCommonAmongAlternates->countMembers() == 0 ? uhash_count(fScriptSetSet) : 1); - return count; -} - - - -UBool IdentifierInfo::containsWithAlternates(const ScriptSet &container, const ScriptSet &containee) const { - if (!container.contains(containee)) { - return FALSE; - } - for (int32_t iter = UHASH_FIRST; ;) { - const UHashElement *hashEl = uhash_nextElement(fScriptSetSet, &iter); - if (hashEl == NULL) { - break; - } - ScriptSet *alternatives = static_cast(hashEl->key.pointer); - if (!container.intersects(*alternatives)) { - return false; - } - } - return true; -} - -UnicodeString &IdentifierInfo::displayAlternates(UnicodeString &dest, const UHashtable *alternates, UErrorCode &status) { - UVector sorted(status); - if (U_FAILURE(status)) { - return dest; - } - for (int32_t pos = UHASH_FIRST; ;) { - const UHashElement *el = uhash_nextElement(alternates, &pos); - if (el == NULL) { - break; - } - ScriptSet *ss = static_cast(el->key.pointer); - sorted.addElement(ss, status); - } - sorted.sort(uhash_compareScriptSet, status); - UnicodeString separator = UNICODE_STRING_SIMPLE("; "); - for (int32_t i=0; i0) { - dest.append(separator); - } - ScriptSet *ss = static_cast(sorted.elementAt(i)); - ss->displayScripts(dest); - } - return dest; -} - -U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/identifier_info.h b/deps/icu-small/source/i18n/identifier_info.h deleted file mode 100644 index 1dee627e1c57bf..00000000000000 --- a/deps/icu-small/source/i18n/identifier_info.h +++ /dev/null @@ -1,189 +0,0 @@ -/* -********************************************************************** -* Copyright (C) 2014, International Business Machines -* Corporation and others. All Rights Reserved. -********************************************************************** -* -* indentifier_info.h -* -* created on: 2013 Jan 7 -* created by: Andy Heninger -*/ - -#ifndef __IDENTIFIER_INFO_H__ -#define __IDENTIFIER_INFO_H__ - -#include "unicode/utypes.h" - -#include "unicode/uniset.h" -#include "unicode/uspoof.h" -#include "uhash.h" - -U_NAMESPACE_BEGIN - -class ScriptSet; - -// TODO(andy): review consistency of reference vs pointer arguments to the funcions. - -/** - * This class analyzes a possible identifier for script and identifier status. Use it by calling setIdentifierProfile - * then setIdentifier. Available methods include: - *
    - *
  1. call getScripts for the specific scripts in the identifier. The identifier contains at least one character in - * each of these. - *
  2. call getAlternates to get cases where a character is not limited to a single script. For example, it could be - * either Katakana or Hiragana. - *
  3. call getCommonAmongAlternates to find out if any scripts are common to all the alternates. - *
  4. call getNumerics to get a representative character (with value zero) for each of the decimal number systems in - * the identifier. - *
  5. call getRestrictionLevel to see what the UTS36 restriction level is. - *
- * - * This is a port from ICU4J of class com.ibm.icu.text.IdentifierInfo - */ -class U_I18N_API IdentifierInfo : public UMemory { - - public: - /** - * Create an identifier info object. Subsequently, call setIdentifier(), etc. - * @internal - */ - IdentifierInfo(UErrorCode &status); - - /** - * Destructor - */ - virtual ~IdentifierInfo(); - - private: - /* Disallow copying for now. Can be added if there's a need. */ - IdentifierInfo(const IdentifierInfo &other); - - public: - - /** - * Set the identifier profile: the characters that are to be allowed in the identifier. - * - * @param identifierProfile the characters that are to be allowed in the identifier - * @return this - * @internal - */ - IdentifierInfo &setIdentifierProfile(const UnicodeSet &identifierProfile); - - /** - * Get the identifier profile: the characters that are to be allowed in the identifier. - * - * @return The characters that are to be allowed in the identifier. - * @internal - */ - const UnicodeSet &getIdentifierProfile() const; - - - /** - * Set an identifier to analyze. Afterwards, call methods like getScripts() - * - * @param identifier the identifier to analyze - * @param status Errorcode, set if errors occur. - * @return this - * @internal - */ - IdentifierInfo &setIdentifier(const UnicodeString &identifier, UErrorCode &status); - - - /** - * Get the identifier that was analyzed. The returned string is owned by the ICU library, - * and must not be deleted by the caller. - * - * @return the identifier that was analyzed. - * @internal - */ - const UnicodeString *getIdentifier() const; - - - /** - * Get the scripts found in the identifiers. - * - * @return the set of explicit scripts. - * @internal - */ - const ScriptSet *getScripts() const; - - /** - * Get the set of alternate scripts found in the identifiers. That is, when a character can be in two scripts, then - * the set consisting of those scripts will be returned. - * - * @return a uhash, with each key being of type (ScriptSet *). - * This is a set, not a map, so the value stored in the uhash is not relevant. - * (It is, in fact, 1). - * Ownership of the uhash and its contents remains with the IndetifierInfo object, - * and remains valid until a new identifer is set or until the object is deleted. - * @internal - */ - const UHashtable *getAlternates() const; - - /** - * Get the representative characters (zeros) for the numerics found in the identifier. - * - * @return the set of explicit scripts. - * @internal - */ - const UnicodeSet *getNumerics() const; - - /** - * Find out which scripts are in common among the alternates. - * - * @return the set of scripts that are in common among the alternates. - * @internal - */ - const ScriptSet *getCommonAmongAlternates() const; - - /** - * Get the number of scripts appearing in the identifier. - * Note: Common and Inherited scripts are omitted from the count. - * Note: Result may be high when the identifier contains characters - * with alternate scripts. The distinction between - * 0, 1 and > 1 will remain valid, however. - * @return the number of scripts. - */ - int32_t getScriptCount() const; - -#if !UCONFIG_NO_NORMALIZATION - - /** - * Find the "tightest" restriction level that the identifier satisfies. - * - * @return the restriction level. - * @internal - */ - URestrictionLevel getRestrictionLevel(UErrorCode &status) const; - -#endif /*!UCONFIG_NO_NORMALIZATION */ - - UnicodeString toString() const; - - /** - * Produce a readable string of alternates. - * - * @param alternates a UHashtable of UScriptSets. - * Keys only, no meaningful values in the UHash. - * @return display form - * @internal - */ - static UnicodeString &displayAlternates(UnicodeString &dest, const UHashtable *alternates, UErrorCode &status); - - private: - - IdentifierInfo & clear(); - UBool containsWithAlternates(const ScriptSet &container, const ScriptSet &containee) const; - - UnicodeString *fIdentifier; - ScriptSet *fRequiredScripts; - UHashtable *fScriptSetSet; - ScriptSet *fCommonAmongAlternates; - UnicodeSet *fNumerics; - UnicodeSet *fIdentifierProfile; -}; - -U_NAMESPACE_END - -#endif // __IDENTIFIER_INFO_H__ diff --git a/deps/icu-small/source/i18n/indiancal.cpp b/deps/icu-small/source/i18n/indiancal.cpp index 722d3adcdc0acf..7964d45312ea4d 100644 --- a/deps/icu-small/source/i18n/indiancal.cpp +++ b/deps/icu-small/source/i18n/indiancal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2003-2014, International Business Machines Corporation * and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/indiancal.h b/deps/icu-small/source/i18n/indiancal.h index 62ff1c78e744b9..fcc21d729bf0aa 100644 --- a/deps/icu-small/source/i18n/indiancal.h +++ b/deps/icu-small/source/i18n/indiancal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 2003-2008, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/inputext.cpp b/deps/icu-small/source/i18n/inputext.cpp index 5c75d5d42cbf8a..4e053aef2ea1ee 100644 --- a/deps/icu-small/source/i18n/inputext.cpp +++ b/deps/icu-small/source/i18n/inputext.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/inputext.h b/deps/icu-small/source/i18n/inputext.h index 12b915a0bdecfa..6a5d253e0568c2 100644 --- a/deps/icu-small/source/i18n/inputext.h +++ b/deps/icu-small/source/i18n/inputext.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2008, International Business Machines diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index f343ebd88b69c7..7c2d1b6b98e74c 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2003-2015, International Business Machines Corporation @@ -734,7 +736,7 @@ int32_t IslamicCalendar::defaultCenturyStartYear() const } -void U_CALLCONV +U_CFUNC void U_CALLCONV IslamicCalendar::initializeSystemDefaultCentury() { // initialize systemDefaultCentury and systemDefaultCenturyYear based diff --git a/deps/icu-small/source/i18n/islamcal.h b/deps/icu-small/source/i18n/islamcal.h index 8597ace92930b6..4e2a1e3d52fe1b 100644 --- a/deps/icu-small/source/i18n/islamcal.h +++ b/deps/icu-small/source/i18n/islamcal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation @@ -417,7 +419,7 @@ class U_I18N_API IslamicCalendar : public Calendar { * are considered to fall within so that its start date is 80 years * before the current time. */ - static void initializeSystemDefaultCentury(void); + static void U_CALLCONV initializeSystemDefaultCentury(void); }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index e9b5483620ea7d..0c8396f6f8c620 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2009,2012,2016 International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index f4c405eba9805a..ab267f81f17271 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2003-2008, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index f8f46a9a95d654..4ac2f7d5ebe768 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2016, International Business Machines @@ -39,7 +41,7 @@ #include "standardplural.h" #include "unifiedcache.h" -#define MEAS_UNIT_COUNT 134 +#define MEAS_UNIT_COUNT 138 #define WIDTH_INDEX_COUNT (UMEASFMT_WIDTH_NARROW + 1) U_NAMESPACE_BEGIN @@ -108,6 +110,7 @@ class MeasureFormatCacheData : public SharedObject { 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(); @@ -157,6 +160,7 @@ MeasureFormatCacheData::MeasureFormatCacheData() { currencyFormats[i] = NULL; } uprv_memset(patterns, 0, sizeof(patterns)); + uprv_memset(dnams, 0, sizeof(dnams)); integerFormat = NULL; numericDateFormatters = NULL; } @@ -172,6 +176,7 @@ MeasureFormatCacheData::~MeasureFormatCacheData() { } } } + // Note: the contents of 'dnams' are pointers into the resource bundle delete integerFormat; delete numericDateFormatters; } @@ -213,117 +218,135 @@ static const UChar gNarrow[] = { 0x4E, 0x61, 0x72, 0x72, 0x6F, 0x77 }; * C++: Each inner sink class has a reference to the main outer sink. * Java: Use non-static inner classes instead. */ -struct UnitDataSink : public ResourceTableSink { - /** - * Sink for a table of display patterns. For example, - * unitsShort/duration/hour contains other{"{0} hrs"}. - */ - struct UnitPatternSink : public ResourceTableSink { - UnitPatternSink(UnitDataSink &sink) : outer(sink) {} - ~UnitPatternSink(); - - void setFormatterIfAbsent(int32_t index, const ResourceValue &value, - int32_t minPlaceholders, UErrorCode &errorCode) { - SimpleFormatter **patterns = - &outer.cacheData.patterns[outer.unitIndex][outer.width][0]; - if (U_SUCCESS(errorCode) && patterns[index] == NULL) { +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) { + 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; - } + value.getUnicodeString(errorCode), minPlaceholders, 1, errorCode); + } + if (U_SUCCESS(errorCode) && patterns[index] == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; } } + } - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "dnam") == 0) { - // Skip the unit display name for now. - } else if (uprv_strcmp(key, "per") == 0) { - // For example, "{0}/h". - setFormatterIfAbsent(MeasureFormatCacheData::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); - } + void setDnamIfAbsent(const ResourceValue &value, UErrorCode& errorCode) { + if (cacheData.dnams[unitIndex][width] == NULL) { + int32_t length; + cacheData.dnams[unitIndex][width] = value.getString(length, errorCode); } - UnitDataSink &outer; - } patternSink; + } /** - * Sink for a table of per-unit tables. For example, + * 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(MeasureFormatCacheData::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. */ - struct UnitSubtypeSink : public ResourceTableSink { - UnitSubtypeSink(UnitDataSink &sink) : outer(sink) {} - ~UnitSubtypeSink(); - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - outer.unitIndex = MeasureUnit::internalGetIndexForTypeAndSubtype(outer.type, key); - if (outer.unitIndex >= 0) { - return &outer.patternSink; + 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; + } + + if (value.getType() == URES_STRING) { + // Units like "coordinate" that don't have plural variants + setFormatterIfAbsent(StandardPlural::OTHER, value, 0, errorCode); + } else 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); } - return NULL; + } else { + // TODO: How to handle unexpected data? + // See http://bugs.icu-project.org/trac/ticket/12597 + return; } - UnitDataSink &outer; - } subtypeSink; + } /** - * Sink for compound x-per-y display pattern. For example, + * Consume compound x-per-y display pattern. For example, * unitsShort/compound/per may be "{0}/{1}". */ - struct UnitCompoundSink : public ResourceTableSink { - UnitCompoundSink(UnitDataSink &sink) : outer(sink) {} - ~UnitCompoundSink(); - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode) && uprv_strcmp(key, "per") == 0) { - outer.cacheData.perFormatters[outer.width]. - applyPatternMinMaxArguments(value.getUnicodeString(errorCode), 2, 2, errorCode); - } + 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); } - UnitDataSink &outer; - } compoundSink; + } /** - * Sink for a table of unit type tables. For example, + * 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. */ - struct UnitTypeSink : public ResourceTableSink { - UnitTypeSink(UnitDataSink &sink) : outer(sink) {} - ~UnitTypeSink(); - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - if (uprv_strcmp(key, "currency") == 0) { - // Skip. - } else if (uprv_strcmp(key, "compound") == 0) { - if (!outer.cacheData.hasPerFormatter(outer.width)) { - return &outer.compoundSink; + 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 { - outer.type = key; - return &outer.subtypeSink; } - return NULL; + } 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); + } } - UnitDataSink &outer; - } typeSink; + } - UnitDataSink(MeasureFormatCacheData &outputData) - : patternSink(*this), subtypeSink(*this), compoundSink(*this), typeSink(*this), - cacheData(outputData), - width(UMEASFMT_WIDTH_COUNT), type(NULL), unitIndex(0) {} - ~UnitDataSink(); - virtual void put(const char *key, const ResourceValue &value, UErrorCode &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. - if (U_FAILURE(errorCode) || value.getType() != URES_ALIAS) { return; } UMeasureFormatWidth sourceWidth = widthFromKey(key); if (sourceWidth == UMEASFMT_WIDTH_COUNT) { // Alias from something we don't care about. @@ -342,12 +365,15 @@ struct UnitDataSink : public ResourceTableSink { } cacheData.widthFallback[sourceWidth] = targetWidth; } - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode &errorCode) { + + void consumeTable(const char *key, ResourceValue &value, UErrorCode &errorCode) { if (U_SUCCESS(errorCode) && (width = widthFromKey(key)) != UMEASFMT_WIDTH_COUNT) { - return &typeSink; + ResourceTable unitTypesTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { + consumeUnitTypesTable(key, value, errorCode); + } } - return NULL; } static UMeasureFormatWidth widthFromKey(const char *key) { @@ -382,20 +408,22 @@ struct UnitDataSink : public ResourceTableSink { return UMEASFMT_WIDTH_COUNT; } - // Output data. - MeasureFormatCacheData &cacheData; - - // Path to current data. - UMeasureFormatWidth width; - const char *type; - int32_t unitIndex; + 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::UnitPatternSink::~UnitPatternSink() {} -UnitDataSink::UnitSubtypeSink::~UnitSubtypeSink() {} -UnitDataSink::UnitCompoundSink::~UnitCompoundSink() {} -UnitDataSink::UnitTypeSink::~UnitTypeSink() {} UnitDataSink::~UnitDataSink() {} } // namespace @@ -405,7 +433,7 @@ static UBool loadMeasureUnitData( MeasureFormatCacheData &cacheData, UErrorCode &status) { UnitDataSink sink(cacheData); - ures_getAllTableItemsWithFallback(resource, "", sink, status); + ures_getAllItemsWithFallback(resource, "", sink, status); return U_SUCCESS(status); } @@ -484,8 +512,14 @@ const MeasureFormatCacheData *LocaleCacheKey::createObje } for (int32_t i = 0; i < WIDTH_INDEX_COUNT; ++i) { + // NumberFormat::createInstance can erase warning codes from status, so pass it + // a separate status instance + UErrorCode localStatus = U_ZERO_ERROR; result->adoptCurrencyFormat(i, NumberFormat::createInstance( - localeId, currencyStyles[i], status)); + localeId, currencyStyles[i], localStatus)); + if (localStatus != U_ZERO_ERROR) { + status = localStatus; + } if (U_FAILURE(status)) { return NULL; } @@ -795,6 +829,24 @@ UnicodeString &MeasureFormat::formatMeasures( return appendTo; } +UnicodeString MeasureFormat::getUnitDisplayName(const MeasureUnit& unit, UErrorCode& /*status*/) const { + UMeasureFormatWidth width = getRegularWidth(this->width); + 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; +} + void MeasureFormat::initMeasureFormat( const Locale &locale, UMeasureFormatWidth w, diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index ad540b5085e36e..a3021b740521fd 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2016, International Business Machines @@ -38,20 +40,21 @@ static const int32_t gOffsets[] = { 16, 20, 24, - 284, - 294, - 305, + 28, + 288, + 298, 309, - 315, + 313, 319, - 338, - 339, - 350, - 356, - 361, + 323, + 342, + 343, + 354, + 360, 365, 369, - 394 + 373, + 398 }; static const int32_t gIndexes[] = { @@ -61,20 +64,21 @@ static const int32_t gIndexes[] = { 16, 20, 24, - 24, - 34, - 45, + 28, + 28, + 38, 49, - 55, + 53, 59, - 78, - 79, - 90, - 96, - 101, + 63, + 82, + 83, + 94, + 100, 105, 109, - 134 + 113, + 138 }; // Must be sorted alphabetically. @@ -84,6 +88,7 @@ static const char * const gTypes[] = { "area", "concentr", "consumption", + "coordinate", "currency", "digital", "duration", @@ -126,6 +131,10 @@ static const char * const gSubTypes[] = { "liter-per-kilometer", "mile-per-gallon", "mile-per-gallon-imperial", + "east", + "north", + "south", + "west", "ADP", "AED", "AFA", @@ -500,14 +509,14 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {326, 296, 16, 0}, - {328, 302, 16, 2}, - {330, 296, 16, 3}, - {330, 383, 4, 2}, - {330, 384, 4, 3}, - {344, 381, 3, 1}, - {347, 11, 15, 4}, - {386, 326, 4, 1} + {330, 300, 17, 0}, + {332, 306, 17, 2}, + {334, 300, 17, 3}, + {334, 387, 4, 2}, + {334, 388, 4, 3}, + {348, 385, 3, 1}, + {351, 11, 16, 4}, + {390, 330, 4, 1} }; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { @@ -606,444 +615,460 @@ MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } +MeasureUnit *MeasureUnit::createEast(UErrorCode &status) { + return MeasureUnit::create(5, 0, status); +} + +MeasureUnit *MeasureUnit::createNorth(UErrorCode &status) { + return MeasureUnit::create(5, 1, status); +} + +MeasureUnit *MeasureUnit::createSouth(UErrorCode &status) { + return MeasureUnit::create(5, 2, status); +} + +MeasureUnit *MeasureUnit::createWest(UErrorCode &status) { + return MeasureUnit::create(5, 3, status); +} + MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { - return MeasureUnit::create(6, 0, status); + return MeasureUnit::create(7, 0, status); } MeasureUnit *MeasureUnit::createByte(UErrorCode &status) { - return MeasureUnit::create(6, 1, status); + return MeasureUnit::create(7, 1, status); } MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) { - return MeasureUnit::create(6, 2, status); + return MeasureUnit::create(7, 2, status); } MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) { - return MeasureUnit::create(6, 3, status); + return MeasureUnit::create(7, 3, status); } MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) { - return MeasureUnit::create(6, 4, status); + return MeasureUnit::create(7, 4, status); } MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) { - return MeasureUnit::create(6, 5, status); + return MeasureUnit::create(7, 5, status); } MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) { - return MeasureUnit::create(6, 6, status); + return MeasureUnit::create(7, 6, status); } MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) { - return MeasureUnit::create(6, 7, status); + return MeasureUnit::create(7, 7, status); } MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) { - return MeasureUnit::create(6, 8, status); + return MeasureUnit::create(7, 8, status); } MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) { - return MeasureUnit::create(6, 9, status); + return MeasureUnit::create(7, 9, status); } MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) { - return MeasureUnit::create(7, 0, status); + return MeasureUnit::create(8, 0, status); } MeasureUnit *MeasureUnit::createDay(UErrorCode &status) { - return MeasureUnit::create(7, 1, status); + return MeasureUnit::create(8, 1, status); } MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { - return MeasureUnit::create(7, 2, status); + return MeasureUnit::create(8, 2, status); } MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { - return MeasureUnit::create(7, 3, status); + return MeasureUnit::create(8, 3, status); } MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { - return MeasureUnit::create(7, 4, status); + return MeasureUnit::create(8, 4, status); } MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { - return MeasureUnit::create(7, 5, status); + return MeasureUnit::create(8, 5, status); } MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { - return MeasureUnit::create(7, 6, status); + return MeasureUnit::create(8, 6, status); } MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { - return MeasureUnit::create(7, 7, status); + return MeasureUnit::create(8, 7, status); } MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { - return MeasureUnit::create(7, 8, status); + return MeasureUnit::create(8, 8, status); } MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { - return MeasureUnit::create(7, 9, status); + return MeasureUnit::create(8, 9, status); } MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { - return MeasureUnit::create(7, 10, status); + return MeasureUnit::create(8, 10, status); } MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) { - return MeasureUnit::create(8, 0, status); + return MeasureUnit::create(9, 0, status); } MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { - return MeasureUnit::create(8, 1, status); + return MeasureUnit::create(9, 1, status); } MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { - return MeasureUnit::create(8, 2, status); + return MeasureUnit::create(9, 2, status); } MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { - return MeasureUnit::create(8, 3, status); + return MeasureUnit::create(9, 3, status); } MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { - return MeasureUnit::create(9, 0, status); + return MeasureUnit::create(10, 0, status); } MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { - return MeasureUnit::create(9, 1, status); + return MeasureUnit::create(10, 1, status); } MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { - return MeasureUnit::create(9, 2, status); + return MeasureUnit::create(10, 2, status); } MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { - return MeasureUnit::create(9, 3, status); + return MeasureUnit::create(10, 3, status); } MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { - return MeasureUnit::create(9, 4, status); + return MeasureUnit::create(10, 4, status); } MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { - return MeasureUnit::create(9, 5, status); + return MeasureUnit::create(10, 5, status); } MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { - return MeasureUnit::create(10, 0, status); + return MeasureUnit::create(11, 0, status); } MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { - return MeasureUnit::create(10, 1, status); + return MeasureUnit::create(11, 1, status); } MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) { - return MeasureUnit::create(10, 2, status); + return MeasureUnit::create(11, 2, status); } MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) { - return MeasureUnit::create(10, 3, status); + return MeasureUnit::create(11, 3, status); } MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) { - return MeasureUnit::create(11, 0, status); + return MeasureUnit::create(12, 0, status); } MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) { - return MeasureUnit::create(11, 1, status); + return MeasureUnit::create(12, 1, status); } MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { - return MeasureUnit::create(11, 2, status); + return MeasureUnit::create(12, 2, status); } MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { - return MeasureUnit::create(11, 3, status); + return MeasureUnit::create(12, 3, status); } MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { - return MeasureUnit::create(11, 4, status); + return MeasureUnit::create(12, 4, status); } MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { - return MeasureUnit::create(11, 5, status); + return MeasureUnit::create(12, 5, status); } MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { - return MeasureUnit::create(11, 6, status); + return MeasureUnit::create(12, 6, status); } MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) { - return MeasureUnit::create(11, 7, status); + return MeasureUnit::create(12, 7, status); } MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) { - return MeasureUnit::create(11, 8, status); + return MeasureUnit::create(12, 8, status); } MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) { - return MeasureUnit::create(11, 9, status); + return MeasureUnit::create(12, 9, status); } MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) { - return MeasureUnit::create(11, 10, status); + return MeasureUnit::create(12, 10, status); } MeasureUnit *MeasureUnit::createMile(UErrorCode &status) { - return MeasureUnit::create(11, 11, status); + return MeasureUnit::create(12, 11, status); } MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) { - return MeasureUnit::create(11, 12, status); + return MeasureUnit::create(12, 12, status); } MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { - return MeasureUnit::create(11, 13, status); + return MeasureUnit::create(12, 13, status); } MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { - return MeasureUnit::create(11, 14, status); + return MeasureUnit::create(12, 14, status); } MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { - return MeasureUnit::create(11, 15, status); + return MeasureUnit::create(12, 15, status); } MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { - return MeasureUnit::create(11, 16, status); + return MeasureUnit::create(12, 16, status); } MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { - return MeasureUnit::create(11, 17, status); + return MeasureUnit::create(12, 17, status); } MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { - return MeasureUnit::create(11, 18, status); + return MeasureUnit::create(12, 18, status); } MeasureUnit *MeasureUnit::createLux(UErrorCode &status) { - return MeasureUnit::create(12, 0, status); + return MeasureUnit::create(13, 0, status); } MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { - return MeasureUnit::create(13, 0, status); + return MeasureUnit::create(14, 0, status); } MeasureUnit *MeasureUnit::createGram(UErrorCode &status) { - return MeasureUnit::create(13, 1, status); + return MeasureUnit::create(14, 1, status); } MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) { - return MeasureUnit::create(13, 2, status); + return MeasureUnit::create(14, 2, status); } MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { - return MeasureUnit::create(13, 3, status); + return MeasureUnit::create(14, 3, status); } MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) { - return MeasureUnit::create(13, 4, status); + return MeasureUnit::create(14, 4, status); } MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) { - return MeasureUnit::create(13, 5, status); + return MeasureUnit::create(14, 5, status); } MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) { - return MeasureUnit::create(13, 6, status); + return MeasureUnit::create(14, 6, status); } MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) { - return MeasureUnit::create(13, 7, status); + return MeasureUnit::create(14, 7, status); } MeasureUnit *MeasureUnit::createPound(UErrorCode &status) { - return MeasureUnit::create(13, 8, status); + return MeasureUnit::create(14, 8, status); } MeasureUnit *MeasureUnit::createStone(UErrorCode &status) { - return MeasureUnit::create(13, 9, status); + return MeasureUnit::create(14, 9, status); } MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { - return MeasureUnit::create(13, 10, status); + return MeasureUnit::create(14, 10, status); } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(14, 0, status); + return MeasureUnit::create(15, 0, status); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(14, 1, status); + return MeasureUnit::create(15, 1, status); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(14, 2, status); + return MeasureUnit::create(15, 2, status); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(14, 3, status); + return MeasureUnit::create(15, 3, status); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(14, 4, status); + return MeasureUnit::create(15, 4, status); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(14, 5, status); + return MeasureUnit::create(15, 5, status); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(16, 0, status); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(16, 1, status); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 3, status); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 4, status); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(17, 0, status); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(17, 1, status); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(17, 2, status); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(17, 3, status); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(18, 4, status); + return MeasureUnit::create(19, 4, status); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(18, 5, status); + return MeasureUnit::create(19, 5, status); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(18, 6, status); + return MeasureUnit::create(19, 6, status); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(18, 7, status); + return MeasureUnit::create(19, 7, status); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(18, 8, status); + return MeasureUnit::create(19, 8, status); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(18, 9, status); + return MeasureUnit::create(19, 9, status); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(18, 10, status); + return MeasureUnit::create(19, 10, status); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(18, 11, status); + return MeasureUnit::create(19, 11, status); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(18, 12, status); + return MeasureUnit::create(19, 12, status); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(18, 13, status); + return MeasureUnit::create(19, 13, status); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(18, 14, status); + return MeasureUnit::create(19, 14, status); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(18, 15, status); + return MeasureUnit::create(19, 15, status); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(18, 16, status); + return MeasureUnit::create(19, 16, status); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(18, 17, status); + return MeasureUnit::create(19, 17, status); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(18, 18, status); + return MeasureUnit::create(19, 18, status); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(18, 19, status); + return MeasureUnit::create(19, 19, status); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(18, 20, status); + return MeasureUnit::create(19, 20, status); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(18, 21, status); + return MeasureUnit::create(19, 21, status); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(18, 22, status); + return MeasureUnit::create(19, 22, status); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(18, 23, status); + return MeasureUnit::create(19, 23, status); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(18, 24, status); + return MeasureUnit::create(19, 24, status); } // End generated code diff --git a/deps/icu-small/source/i18n/measure.cpp b/deps/icu-small/source/i18n/measure.cpp index eb610e6f8fde46..3459e71b8077ca 100644 --- a/deps/icu-small/source/i18n/measure.cpp +++ b/deps/icu-small/source/i18n/measure.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 1fe2c8d622e04b..4658528050cfe1 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/msgfmt_impl.h b/deps/icu-small/source/i18n/msgfmt_impl.h index 0f56dee885ad53..80a07dc1ea28f6 100644 --- a/deps/icu-small/source/i18n/msgfmt_impl.h +++ b/deps/icu-small/source/i18n/msgfmt_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2008, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/name2uni.cpp b/deps/icu-small/source/i18n/name2uni.cpp index 45705e676a4014..acd9c0af997ada 100644 --- a/deps/icu-small/source/i18n/name2uni.cpp +++ b/deps/icu-small/source/i18n/name2uni.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/name2uni.h b/deps/icu-small/source/i18n/name2uni.h index 1324ec3e8d273d..2ba4c8f792b357 100644 --- a/deps/icu-small/source/i18n/name2uni.h +++ b/deps/icu-small/source/i18n/name2uni.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/nfrlist.h b/deps/icu-small/source/i18n/nfrlist.h index 95e837883851ca..65b21c6b1dbaac 100644 --- a/deps/icu-small/source/i18n/nfrlist.h +++ b/deps/icu-small/source/i18n/nfrlist.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 88f903cf201b76..5cbd33d0e2ef8b 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index 47c17e6fb5f502..b06c2b2215ad54 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nfrule.cpp b/deps/icu-small/source/i18n/nfrule.cpp index b162b197abe866..100a46490daca0 100644 --- a/deps/icu-small/source/i18n/nfrule.cpp +++ b/deps/icu-small/source/i18n/nfrule.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nfrule.h b/deps/icu-small/source/i18n/nfrule.h index b4bc2cf28fbb7c..5424b968a1fd90 100644 --- a/deps/icu-small/source/i18n/nfrule.h +++ b/deps/icu-small/source/i18n/nfrule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index ea570dc453c8f2..58039c8bacd570 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nfsubs.h b/deps/icu-small/source/i18n/nfsubs.h index e7a950a2dd0127..4fb0c06caf600e 100644 --- a/deps/icu-small/source/i18n/nfsubs.h +++ b/deps/icu-small/source/i18n/nfsubs.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/nortrans.cpp b/deps/icu-small/source/i18n/nortrans.cpp index 038a6836c3bca2..da0206776ced93 100644 --- a/deps/icu-small/source/i18n/nortrans.cpp +++ b/deps/icu-small/source/i18n/nortrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/nortrans.h b/deps/icu-small/source/i18n/nortrans.h index 634f534f7d410e..79d1be3b072179 100644 --- a/deps/icu-small/source/i18n/nortrans.h +++ b/deps/icu-small/source/i18n/nortrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2010, International Business Machines diff --git a/deps/icu-small/source/i18n/nultrans.cpp b/deps/icu-small/source/i18n/nultrans.cpp index 820c43d07e9fe4..600873e3735f41 100644 --- a/deps/icu-small/source/i18n/nultrans.cpp +++ b/deps/icu-small/source/i18n/nultrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2000-2005, International Business Machines diff --git a/deps/icu-small/source/i18n/nultrans.h b/deps/icu-small/source/i18n/nultrans.h index 699c323f8c6e06..a9856bde5b2b2e 100644 --- a/deps/icu-small/source/i18n/nultrans.h +++ b/deps/icu-small/source/i18n/nultrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2000-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index 3f10bbf1b44e40..c00955a781a22e 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and @@ -450,7 +452,7 @@ NumberFormat::format(int64_t number, // XXXFormat::format(double UnicodeString& -NumberFormat::format(const StringPiece &decimalNum, +NumberFormat::format(StringPiece decimalNum, UnicodeString& toAppendTo, FieldPositionIterator* fpi, UErrorCode& status) const @@ -683,7 +685,7 @@ NumberFormat::parseObject(const UnicodeString& source, UnicodeString& NumberFormat::format(double number, UnicodeString& appendTo) const { - FieldPosition pos(0); + FieldPosition pos(FieldPosition::DONT_CARE); return format(number, appendTo, pos); } @@ -693,7 +695,7 @@ NumberFormat::format(double number, UnicodeString& appendTo) const UnicodeString& NumberFormat::format(int32_t number, UnicodeString& appendTo) const { - FieldPosition pos(0); + FieldPosition pos(FieldPosition::DONT_CARE); return format(number, appendTo, pos); } @@ -703,7 +705,7 @@ NumberFormat::format(int32_t number, UnicodeString& appendTo) const UnicodeString& NumberFormat::format(int64_t number, UnicodeString& appendTo) const { - FieldPosition pos(0); + FieldPosition pos(FieldPosition::DONT_CARE); return format(number, appendTo, pos); } diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 498a8b38914393..442ad7f255abe3 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/numsys_impl.h b/deps/icu-small/source/i18n/numsys_impl.h index 5b7f4f3f3a25b8..d39faba5afa3a9 100644 --- a/deps/icu-small/source/i18n/numsys_impl.h +++ b/deps/icu-small/source/i18n/numsys_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index 56b36c36662aef..f4c3dd24c9273f 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/olsontz.h b/deps/icu-small/source/i18n/olsontz.h index 115a0773c5b3c3..7dbc303a05fa68 100644 --- a/deps/icu-small/source/i18n/olsontz.h +++ b/deps/icu-small/source/i18n/olsontz.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2003-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/persncal.cpp b/deps/icu-small/source/i18n/persncal.cpp index e1b30b8aee6959..210646ca8c22ca 100644 --- a/deps/icu-small/source/i18n/persncal.cpp +++ b/deps/icu-small/source/i18n/persncal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/persncal.h b/deps/icu-small/source/i18n/persncal.h index ff18f6158cd68f..3fe5a614643416 100644 --- a/deps/icu-small/source/i18n/persncal.h +++ b/deps/icu-small/source/i18n/persncal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/pluralaffix.cpp b/deps/icu-small/source/i18n/pluralaffix.cpp index b541f120df51b6..f6a51a79ef9ab7 100644 --- a/deps/icu-small/source/i18n/pluralaffix.cpp +++ b/deps/icu-small/source/i18n/pluralaffix.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/pluralaffix.h b/deps/icu-small/source/i18n/pluralaffix.h index 5212fc714bcccf..a08f2131d96ee6 100644 --- a/deps/icu-small/source/i18n/pluralaffix.h +++ b/deps/icu-small/source/i18n/pluralaffix.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 9ff2bffc9d99ca..8a000ce6e97bd9 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2015, International Business Machines Corporation and @@ -216,14 +218,14 @@ PluralFormat::format(const Formattable& obj, UnicodeString PluralFormat::format(int32_t number, UErrorCode& status) const { - FieldPosition fpos(0); + FieldPosition fpos(FieldPosition::DONT_CARE); UnicodeString result; return format(Formattable(number), number, result, fpos, status); } UnicodeString PluralFormat::format(double number, UErrorCode& status) const { - FieldPosition fpos(0); + FieldPosition fpos(FieldPosition::DONT_CARE); UnicodeString result; return format(Formattable(number), number, result, fpos, status); } diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 9d5fa5bee29248..7b5063455169ce 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 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 diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index d829110cd03a9e..c6e4767a096a72 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 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 diff --git a/deps/icu-small/source/i18n/precision.cpp b/deps/icu-small/source/i18n/precision.cpp index c7765748adab84..5d07e0f9ee3d78 100644 --- a/deps/icu-small/source/i18n/precision.cpp +++ b/deps/icu-small/source/i18n/precision.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/precision.h b/deps/icu-small/source/i18n/precision.h index 4543108cef7596..f002fd228bf77d 100644 --- a/deps/icu-small/source/i18n/precision.h +++ b/deps/icu-small/source/i18n/precision.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/quant.cpp b/deps/icu-small/source/i18n/quant.cpp index 4bfdf2a1813d63..6e08e628fc2e10 100644 --- a/deps/icu-small/source/i18n/quant.cpp +++ b/deps/icu-small/source/i18n/quant.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/quant.h b/deps/icu-small/source/i18n/quant.h index f84c43133254ec..21adf19e70d87a 100644 --- a/deps/icu-small/source/i18n/quant.h +++ b/deps/icu-small/source/i18n/quant.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/quantityformatter.cpp b/deps/icu-small/source/i18n/quantityformatter.cpp index 3b04c86d46f196..c44357a53b6908 100644 --- a/deps/icu-small/source/i18n/quantityformatter.cpp +++ b/deps/icu-small/source/i18n/quantityformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/quantityformatter.h b/deps/icu-small/source/i18n/quantityformatter.h index 7f61c0dc039a70..0f61022666531b 100644 --- a/deps/icu-small/source/i18n/quantityformatter.h +++ b/deps/icu-small/source/i18n/quantityformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index 5f78f73b86f614..5e32d804441dbf 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp index e38aabc832d1ec..62aae52f18eb4d 100644 --- a/deps/icu-small/source/i18n/rbt.cpp +++ b/deps/icu-small/source/i18n/rbt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/rbt.h b/deps/icu-small/source/i18n/rbt.h index f8a6f3cbc41116..9add715acabcb9 100644 --- a/deps/icu-small/source/i18n/rbt.h +++ b/deps/icu-small/source/i18n/rbt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/rbt_data.cpp b/deps/icu-small/source/i18n/rbt_data.cpp index 579c681de0e35c..1b6163956c61fe 100644 --- a/deps/icu-small/source/i18n/rbt_data.cpp +++ b/deps/icu-small/source/i18n/rbt_data.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/rbt_data.h b/deps/icu-small/source/i18n/rbt_data.h index ce833dc26dd509..29e39a59ef076c 100644 --- a/deps/icu-small/source/i18n/rbt_data.h +++ b/deps/icu-small/source/i18n/rbt_data.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2007, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/rbt_pars.cpp b/deps/icu-small/source/i18n/rbt_pars.cpp index c6840456ddef1a..5e7c0ff5f9c5dc 100644 --- a/deps/icu-small/source/i18n/rbt_pars.cpp +++ b/deps/icu-small/source/i18n/rbt_pars.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/rbt_pars.h b/deps/icu-small/source/i18n/rbt_pars.h index 497c1e31820938..48067905b9c819 100644 --- a/deps/icu-small/source/i18n/rbt_pars.h +++ b/deps/icu-small/source/i18n/rbt_pars.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/rbt_rule.cpp b/deps/icu-small/source/i18n/rbt_rule.cpp index e88df7e5aec65a..a04a535f0e9508 100644 --- a/deps/icu-small/source/i18n/rbt_rule.cpp +++ b/deps/icu-small/source/i18n/rbt_rule.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines @@ -174,7 +176,7 @@ TransliterationRule::TransliterationRule(TransliterationRule& other) : segmentsCount = 0; if (other.segmentsCount > 0) { segments = (UnicodeFunctor **)uprv_malloc(other.segmentsCount * sizeof(UnicodeFunctor *)); - uprv_memcpy(segments, other.segments, other.segmentsCount*sizeof(segments[0])); + uprv_memcpy(segments, other.segments, (size_t)other.segmentsCount*sizeof(segments[0])); } if (other.anteContext != NULL) { diff --git a/deps/icu-small/source/i18n/rbt_rule.h b/deps/icu-small/source/i18n/rbt_rule.h index ffbd25c6a8c55a..b25afd6ef07651 100644 --- a/deps/icu-small/source/i18n/rbt_rule.h +++ b/deps/icu-small/source/i18n/rbt_rule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) {1999-2001}, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_set.cpp b/deps/icu-small/source/i18n/rbt_set.cpp index 425e3e72581233..f2c78ca9c8d46b 100644 --- a/deps/icu-small/source/i18n/rbt_set.cpp +++ b/deps/icu-small/source/i18n/rbt_set.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/rbt_set.h b/deps/icu-small/source/i18n/rbt_set.h index cbf3419a970558..ed76e6ddf7d71e 100644 --- a/deps/icu-small/source/i18n/rbt_set.h +++ b/deps/icu-small/source/i18n/rbt_set.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2007, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp index 73fc480e1d3ebd..fb458dd5020b73 100644 --- a/deps/icu-small/source/i18n/rbtz.cpp +++ b/deps/icu-small/source/i18n/rbtz.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp index 8262cfaed45c13..d0e166cfa446d9 100644 --- a/deps/icu-small/source/i18n/regexcmp.cpp +++ b/deps/icu-small/source/i18n/regexcmp.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // file: regexcmp.cpp // @@ -2603,7 +2605,11 @@ void RegexCompile::findCaseInsensitiveStarters(UChar32 c, UnicodeSet *starterCh // End of machine generated data. - if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) { + 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(); + } else if (u_hasBinaryProperty(c, UCHAR_CASE_SENSITIVE)) { UChar32 caseFoldedC = u_foldCase(c, U_FOLD_CASE_DEFAULT); starterChars->set(caseFoldedC, caseFoldedC); diff --git a/deps/icu-small/source/i18n/regexcmp.h b/deps/icu-small/source/i18n/regexcmp.h index 896de17f58ead0..931f2387b5169b 100644 --- a/deps/icu-small/source/i18n/regexcmp.h +++ b/deps/icu-small/source/i18n/regexcmp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // regexcmp.h // diff --git a/deps/icu-small/source/i18n/regexcst.h b/deps/icu-small/source/i18n/regexcst.h index 8e572e21207591..259b44f5dd734e 100644 --- a/deps/icu-small/source/i18n/regexcst.h +++ b/deps/icu-small/source/i18n/regexcst.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------------------------------- // // Generated Header File. Do not edit by hand. diff --git a/deps/icu-small/source/i18n/regexcst.pl b/deps/icu-small/source/i18n/regexcst.pl old mode 100644 new mode 100755 index c15d2868b28530..6c06b4eb5fc56a --- a/deps/icu-small/source/i18n/regexcst.pl +++ b/deps/icu-small/source/i18n/regexcst.pl @@ -1,4 +1,6 @@ #!/usr/bin/perl +# Copyright (C) 2016 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html # ******************************************************************** # * COPYRIGHT: # * Copyright (c) 2002-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/regeximp.cpp b/deps/icu-small/source/i18n/regeximp.cpp index d923deb9e835e1..c1360ebf6cd943 100644 --- a/deps/icu-small/source/i18n/regeximp.cpp +++ b/deps/icu-small/source/i18n/regeximp.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 2012 International Business Machines Corporation // and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/regeximp.h b/deps/icu-small/source/i18n/regeximp.h index c6c3b0d6ca312b..0261c58c637a25 100644 --- a/deps/icu-small/source/i18n/regeximp.h +++ b/deps/icu-small/source/i18n/regeximp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 2002-2015 International Business Machines Corporation // and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/regexst.cpp b/deps/icu-small/source/i18n/regexst.cpp index 1ef879e39913e9..a8feffa1bd2009 100644 --- a/deps/icu-small/source/i18n/regexst.cpp +++ b/deps/icu-small/source/i18n/regexst.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // regexst.h // diff --git a/deps/icu-small/source/i18n/regexst.h b/deps/icu-small/source/i18n/regexst.h index 59faa4846b2d09..21f7ec945c748a 100644 --- a/deps/icu-small/source/i18n/regexst.h +++ b/deps/icu-small/source/i18n/regexst.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // regexst.h // diff --git a/deps/icu-small/source/i18n/regextxt.cpp b/deps/icu-small/source/i18n/regextxt.cpp index 2156756a491411..d6157f5ed6d02e 100644 --- a/deps/icu-small/source/i18n/regextxt.cpp +++ b/deps/icu-small/source/i18n/regextxt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2008-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/regextxt.h b/deps/icu-small/source/i18n/regextxt.h index 5b59838a92bf3c..c5651aefd4f74c 100644 --- a/deps/icu-small/source/i18n/regextxt.h +++ b/deps/icu-small/source/i18n/regextxt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2008-2010, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/region.cpp b/deps/icu-small/source/i18n/region.cpp index 551960bfe839ad..fdd467fc98a411 100644 --- a/deps/icu-small/source/i18n/region.cpp +++ b/deps/icu-small/source/i18n/region.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 2014-2015, International Business Machines Corporation and +* Copyright (C) 2014-2016, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* * @@ -67,8 +69,7 @@ static UVector *allRegions = NULL; static const UChar UNKNOWN_REGION_ID [] = { 0x5A, 0x5A, 0 }; /* "ZZ" */ static const UChar OUTLYING_OCEANIA_REGION_ID [] = { 0x51, 0x4F, 0 }; /* "QO" */ static const UChar WORLD_ID [] = { 0x30, 0x30, 0x31, 0 }; /* "001" */ -static const UChar RANGE_MARKER [] = { 0x7e, 0 }; /* "~" */ -static const UnicodeString RANGE_MARKER_STRING(RANGE_MARKER); +static const UChar RANGE_MARKER = 0x7E; /* '~' */ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RegionNameEnumeration) @@ -80,7 +81,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RegionNameEnumeration) * If the region data has already loaded, then this method simply returns without doing * anything meaningful. */ -void Region::loadRegionData(UErrorCode &status) { +void U_CALLCONV Region::loadRegionData(UErrorCode &status) { // Construct service objs first LocalUHashtablePointer newRegionIDMap(uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, NULL, &status)); @@ -121,7 +122,7 @@ void Region::loadRegionData(UErrorCode &status) { while ( ures_hasNext(regionRegular.getAlias()) ) { UnicodeString regionName = ures_getNextUnicodeString(regionRegular.getAlias(),NULL,&status); - int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER_STRING); + int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); UChar buf[6]; regionName.extract(buf,6,status); if ( rangeMarkerLocation > 0 ) { @@ -140,7 +141,7 @@ void Region::loadRegionData(UErrorCode &status) { while ( ures_hasNext(regionMacro.getAlias()) ) { UnicodeString regionName = ures_getNextUnicodeString(regionMacro.getAlias(),NULL,&status); - int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER_STRING); + int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER); UChar buf[6]; regionName.extract(buf,6,status); if ( rangeMarkerLocation > 0 ) { diff --git a/deps/icu-small/source/i18n/region_impl.h b/deps/icu-small/source/i18n/region_impl.h index 2bd97f61052e2b..852209603b116a 100644 --- a/deps/icu-small/source/i18n/region_impl.h +++ b/deps/icu-small/source/i18n/region_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index 29f760e0e8dd19..7009b190a25cb9 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014-2016, International Business Machines Corporation and @@ -178,14 +180,11 @@ namespace { /** * Sink for enumerating all of the measurement unit display names. - * Contains inner sink classes, each one corresponding to a level of the resource table. * * 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. */ -struct RelDateTimeFmtDataSink : public ResourceTableSink { +struct RelDateTimeFmtDataSink : public ResourceSink { /** * Sink for patterns for relative dates and times. For example, @@ -291,188 +290,16 @@ struct RelDateTimeFmtDataSink : public ResourceTableSink { return -1; } - // Sinks for additional levels under /fields/*/relative/ and /fields/*/relativeTime/ - - /** - * Make list of simplePatternFmtList, for past and for future. - * Set a SimpleFormatter for the - * - * Fill in values for the particular plural given, e.g., ONE, FEW, OTHER, etc. - */ - struct RelDateTimeDetailSink : public ResourceTableSink { - RelDateTimeDetailSink(RelDateTimeFmtDataSink &sink) : outer(sink) {} - ~RelDateTimeDetailSink(); - - virtual void put(const char *key, const ResourceValue &value, - UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - - outer.relUnitIndex = relUnitFromGeneric(outer.genericUnit); - if (outer.relUnitIndex < 0) { - return; - } - - /* Make two lists of simplePatternFmtList, one for past and one for future. - * Set a SimpleFormatter pattern for the - * - * Fill in values for the particular plural given, e.g., ONE, FEW, OTHER, etc. - */ - int32_t pluralIndex = StandardPlural::indexOrNegativeFromString(key); - if (pluralIndex >= 0) { - SimpleFormatter **patterns = - outer.outputData.relativeUnitsFormatters[outer.style][outer.relUnitIndex] - [outer.pastFutureIndex]; - // Only set if not already established. - if (patterns[pluralIndex] == NULL) { - patterns[pluralIndex] = new SimpleFormatter( - value.getUnicodeString(errorCode), 0, 1, errorCode); - if (patterns[pluralIndex] == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - } - } - } - - RelDateTimeFmtDataSink &outer; - } relDateTimeDetailSink; - - /* - * Handles "relativeTime" entries, e.g., under "day", "hour", "minute", - * "minute-short", etc. - */ - struct RelativeTimeSink : public ResourceTableSink { - RelativeTimeSink(RelDateTimeFmtDataSink &sink) : outer(sink) {} - ~RelativeTimeSink(); - - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode& errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - outer.relUnitIndex = relUnitFromGeneric(outer.genericUnit); - if (outer.relUnitIndex < 0) { - return NULL; - } - - if (uprv_strcmp(key, "past") == 0) { - outer.pastFutureIndex = 0; - } else if (uprv_strcmp(key, "future") == 0) { - outer.pastFutureIndex = 1; - } else { - // Unknown key. - return NULL; - } - return &outer.relDateTimeDetailSink; - } - - RelDateTimeFmtDataSink &outer; - } relativeTimeSink; - - /* - * Handles "relative" entries, e.g., under "day", "day-short", "fri", - * "fri-narrow", "fri-short", etc. - */ - struct RelativeSink : public ResourceTableSink { - RelativeSink(RelDateTimeFmtDataSink &sink) : outer(sink) {} - ~RelativeSink(); - - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - int32_t direction = keyToDirection(key); - if (direction < 0) { - return; - } - - int32_t relUnitIndex = relUnitFromGeneric(outer.genericUnit); - if (relUnitIndex == UDAT_RELATIVE_SECONDS && - direction == UDAT_DIRECTION_THIS && - outer.outputData.absoluteUnits[outer.style][UDAT_ABSOLUTE_NOW] - [UDAT_DIRECTION_PLAIN].isEmpty()) { - // Handle "NOW" - outer.outputData.absoluteUnits[outer.style][UDAT_ABSOLUTE_NOW] - [UDAT_DIRECTION_PLAIN].fastCopyFrom(value.getUnicodeString(errorCode)); - } - - int32_t absUnitIndex = absUnitFromGeneric(outer.genericUnit); - if (absUnitIndex < 0) { - return; - } - // Only reset if slot is empty. - if (outer.outputData.absoluteUnits[outer.style][absUnitIndex][direction].isEmpty()) { - outer.outputData.absoluteUnits[outer.style][absUnitIndex] - [direction].fastCopyFrom(value.getUnicodeString(errorCode)); - } - } - - RelDateTimeFmtDataSink &outer; - } relativeSink; - - /* - * Handles entries under "fields", recognizing "relative" and "relativeTime" entries. - */ - struct UnitSink : public ResourceTableSink { - UnitSink(RelDateTimeFmtDataSink &sink) : outer(sink) {} - ~UnitSink(); - - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return; } - if (uprv_strcmp(key, "dn") != 0) { - return; - } - - // Handle Display Name for PLAIN direction for some units. - int32_t absUnit = absUnitFromGeneric(outer.genericUnit); - if (absUnit < 0) { - return; // Not interesting. - } - - // TODO(Travis Keep): This is a hack to get around CLDR bug 6818. - UnicodeString displayName = value.getUnicodeString(errorCode); - if (U_SUCCESS(errorCode)) { - if (uprv_strcmp("en", outer.sinkLocaleId) == 0) { - displayName.toLower(); - } - } - // end hack - - // Store displayname if not set. - if (outer.outputData.absoluteUnits[outer.style] - [absUnit][UDAT_DIRECTION_PLAIN].isEmpty()) { - outer.outputData.absoluteUnits[outer.style] - [absUnit][UDAT_DIRECTION_PLAIN].fastCopyFrom(displayName); - return; - } - } - - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode &errorCode) { - if (U_FAILURE(errorCode)) { return NULL; } - if (uprv_strcmp(key, "relative") == 0) { - return &outer.relativeSink; - } else if (uprv_strcmp(key, "relativeTime") == 0) { - return &outer.relativeTimeSink; - } - return NULL; - } - - RelDateTimeFmtDataSink &outer; - } unitSink; - - // For hack for locale "en". - // TODO(Travis Keep): This is a hack to get around CLDR bug 6818. - const char* sinkLocaleId; - // Values kept between levels of parsing the CLDR data. int32_t pastFutureIndex; // 0 == past or 1 == future UDateRelativeDateTimeFormatterStyle style; // {LONG, SHORT, NARROW} RelAbsUnit genericUnit; - int32_t relUnitIndex; - int32_t absUnitIndex; RelativeDateTimeCacheData &outputData; // Constructor - RelDateTimeFmtDataSink(RelativeDateTimeCacheData& cacheData, const char* localeId) - : relDateTimeDetailSink(*this), relativeTimeSink(*this), relativeSink(*this), - unitSink(*this), sinkLocaleId(localeId), outputData(cacheData) { + RelDateTimeFmtDataSink(RelativeDateTimeCacheData& cacheData) + : outputData(cacheData) { // Clear cacheData.fallBackCache cacheData.fallBackCache[UDAT_STYLE_LONG] = -1; cacheData.fallBackCache[UDAT_STYLE_SHORT] = -1; @@ -571,55 +398,165 @@ struct RelDateTimeFmtDataSink : public ResourceTableSink { return INVALID_UNIT; } - // Member functions of top level sink. - virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode) { - // Only handle aliases, storing information about alias fallback. + void handlePlainDirection(ResourceValue &value, UErrorCode &errorCode) { + // Handle Display Name for PLAIN direction for some units. + if (U_FAILURE(errorCode)) { return; } + + int32_t absUnit = absUnitFromGeneric(genericUnit); + if (absUnit < 0) { + return; // Not interesting. + } + + // Store displayname if not set. + if (outputData.absoluteUnits[style] + [absUnit][UDAT_DIRECTION_PLAIN].isEmpty()) { + outputData.absoluteUnits[style] + [absUnit][UDAT_DIRECTION_PLAIN].fastCopyFrom(value.getUnicodeString(errorCode)); + return; + } + } + + void consumeTableRelative(const char *key, ResourceValue &value, UErrorCode &errorCode) { + ResourceTable unitTypesTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { + if (value.getType() == URES_STRING) { + int32_t direction = keyToDirection(key); + if (direction < 0) { + continue; + } - if (U_SUCCESS(errorCode)) { - if (value.getType() != URES_ALIAS) { - return; + int32_t relUnitIndex = relUnitFromGeneric(genericUnit); + if (relUnitIndex == UDAT_RELATIVE_SECONDS && uprv_strcmp(key, "0") == 0 && + outputData.absoluteUnits[style][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN].isEmpty()) { + // Handle "NOW" + outputData.absoluteUnits[style][UDAT_ABSOLUTE_NOW] + [UDAT_DIRECTION_PLAIN].fastCopyFrom(value.getUnicodeString(errorCode)); + } + + int32_t absUnitIndex = absUnitFromGeneric(genericUnit); + if (absUnitIndex < 0) { + continue; + } + // Only reset if slot is empty. + if (outputData.absoluteUnits[style][absUnitIndex][direction].isEmpty()) { + outputData.absoluteUnits[style][absUnitIndex] + [direction].fastCopyFrom(value.getUnicodeString(errorCode)); + } } - const UnicodeString valueStr = value.getAliasUnicodeString(errorCode); - if (U_SUCCESS(errorCode)) { - UDateRelativeDateTimeFormatterStyle sourceStyle= styleFromString(key); - UDateRelativeDateTimeFormatterStyle targetStyle = - styleFromAliasUnicodeString(valueStr); - - if (sourceStyle == targetStyle) { - errorCode = U_INVALID_FORMAT_ERROR; - return; + } + } + + void consumeTimeDetail(int32_t relUnitIndex, + const char *key, ResourceValue &value, UErrorCode &errorCode) { + ResourceTable unitTypesTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { + if (value.getType() == URES_STRING) { + int32_t pluralIndex = StandardPlural::indexOrNegativeFromString(key); + if (pluralIndex >= 0) { + SimpleFormatter **patterns = + outputData.relativeUnitsFormatters[style][relUnitIndex] + [pastFutureIndex]; + // Only set if not already established. + if (patterns[pluralIndex] == NULL) { + patterns[pluralIndex] = new SimpleFormatter( + value.getUnicodeString(errorCode), 0, 1, errorCode); + if (patterns[pluralIndex] == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + } } - if (outputData.fallBackCache[sourceStyle] != -1 && - outputData.fallBackCache[sourceStyle] != targetStyle) { - errorCode = U_INVALID_FORMAT_ERROR; - return; + } + } + } + + void consumeTableRelativeTime(const char *key, ResourceValue &value, UErrorCode &errorCode) { + ResourceTable relativeTimeTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + int32_t relUnitIndex = relUnitFromGeneric(genericUnit); + if (relUnitIndex < 0) { + return; + } + for (int32_t i = 0; relativeTimeTable.getKeyAndValue(i, key, value); ++i) { + if (uprv_strcmp(key, "past") == 0) { + pastFutureIndex = 0; + } else if (uprv_strcmp(key, "future") == 0) { + pastFutureIndex = 1; + } else { + // Unknown key. + continue; + } + consumeTimeDetail(relUnitIndex, key, value, errorCode); + } + } + + void consumeAlias(const char *key, const ResourceValue &value, UErrorCode &errorCode) { + + UDateRelativeDateTimeFormatterStyle sourceStyle = styleFromString(key); + const UnicodeString valueStr = value.getAliasUnicodeString(errorCode); + if (U_FAILURE(errorCode)) { return; } + + UDateRelativeDateTimeFormatterStyle targetStyle = + styleFromAliasUnicodeString(valueStr); + + if (sourceStyle == targetStyle) { + errorCode = U_INVALID_FORMAT_ERROR; + return; + } + if (outputData.fallBackCache[sourceStyle] != -1 && + outputData.fallBackCache[sourceStyle] != targetStyle) { + errorCode = U_INVALID_FORMAT_ERROR; + return; + } + outputData.fallBackCache[sourceStyle] = targetStyle; + } + + void consumeTimeUnit(const char *key, ResourceValue &value, UErrorCode &errorCode) { + ResourceTable unitTypesTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t i = 0; unitTypesTable.getKeyAndValue(i, key, value); ++i) { + // Handle display name. + if (uprv_strcmp(key, "dn") == 0 && value.getType() == URES_STRING) { + handlePlainDirection(value, errorCode); + } + if (value.getType() == URES_TABLE) { + if (uprv_strcmp(key, "relative") == 0) { + consumeTableRelative(key, value, errorCode); + } else if (uprv_strcmp(key, "relativeTime") == 0) { + consumeTableRelativeTime(key, value, errorCode); } - outputData.fallBackCache[sourceStyle] = targetStyle; } } - return; } - // Top level sink - virtual ResourceTableSink *getOrCreateTableSink( - const char *key, int32_t /* initialSize */, UErrorCode& /* errorCode */) { - style= styleFromString(key); - int32_t unitSize = uprv_strlen(key) - styleSuffixLength(style); - genericUnit = unitOrNegativeFromString(key, unitSize); - if (style < 0 || genericUnit == INVALID_UNIT) { - return NULL; - } - return &unitSink; + virtual void put(const char *key, ResourceValue &value, + UBool /*noFallback*/, UErrorCode &errorCode) { + // Main entry point to sink + ResourceTable table = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; table.getKeyAndValue(i, key, value); ++i) { + if (value.getType() == URES_ALIAS) { + consumeAlias(key, value, errorCode); + } else { + style = styleFromString(key); + int32_t unitSize = uprv_strlen(key) - styleSuffixLength(style); + genericUnit = unitOrNegativeFromString(key, unitSize); + if (style >= 0 && genericUnit != INVALID_UNIT) { + consumeTimeUnit(key, value, errorCode); + } + } + } } + }; // Virtual destructors must be defined out of line. -RelDateTimeFmtDataSink::RelDateTimeDetailSink::~RelDateTimeDetailSink() {} -RelDateTimeFmtDataSink::RelativeTimeSink::~RelativeTimeSink() {} -RelDateTimeFmtDataSink::RelativeSink::~RelativeSink() {} -RelDateTimeFmtDataSink::UnitSink::~UnitSink() {} RelDateTimeFmtDataSink::~RelDateTimeFmtDataSink() {} - } // namespace DateFormatSymbols::DtWidthType styleToDateFormatSymbolWidth[UDAT_STYLE_COUNT] = { @@ -652,8 +589,10 @@ static UBool loadUnitData( RelativeDateTimeCacheData &cacheData, const char* localeId, UErrorCode &status) { - RelDateTimeFmtDataSink sink(cacheData, localeId); - ures_getAllTableItemsWithFallback(resource, "fields", sink, status); + + RelDateTimeFmtDataSink sink(cacheData); + + ures_getAllItemsWithFallback(resource, "fields", sink, status); // Get the weekday names from DateFormatSymbols. loadWeekdayNames(cacheData.absoluteUnits, localeId, status); diff --git a/deps/icu-small/source/i18n/reldtfmt.cpp b/deps/icu-small/source/i18n/reldtfmt.cpp index 7055e724bbe7e5..4a928695356b0c 100644 --- a/deps/icu-small/source/i18n/reldtfmt.cpp +++ b/deps/icu-small/source/i18n/reldtfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 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 @@ -11,15 +13,15 @@ #include -#include "reldtfmt.h" #include "unicode/datefmt.h" +#include "unicode/reldatefmt.h" #include "unicode/simpleformatter.h" #include "unicode/smpdtfmt.h" #include "unicode/udisplaycontext.h" #include "unicode/uchar.h" #include "unicode/brkiter.h" -#include "gregoimp.h" // for CalendarData +#include "reldtfmt.h" #include "cmemory.h" #include "uresimp.h" @@ -35,16 +37,12 @@ struct URelativeString { const UChar* string; /** string, or NULL if not set **/ }; -static const char DT_DateTimePatternsTag[]="DateTimePatterns"; - - UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RelativeDateFormat) RelativeDateFormat::RelativeDateFormat(const RelativeDateFormat& other) : DateFormat(other), fDateTimeFormatter(NULL), fDatePattern(other.fDatePattern), fTimePattern(other.fTimePattern), fCombinedFormat(NULL), fDateStyle(other.fDateStyle), fLocale(other.fLocale), - fDayMin(other.fDayMin), fDayMax(other.fDayMax), fDatesLen(other.fDatesLen), fDates(NULL), fCombinedHasDateAtStart(other.fCombinedHasDateAtStart), fCapitalizationInfoSet(other.fCapitalizationInfoSet), @@ -59,8 +57,8 @@ RelativeDateFormat::RelativeDateFormat(const RelativeDateFormat& other) : fCombinedFormat = new SimpleFormatter(*other.fCombinedFormat); } if (fDatesLen > 0) { - fDates = (URelativeString*) uprv_malloc(sizeof(fDates[0])*fDatesLen); - uprv_memcpy(fDates, other.fDates, sizeof(fDates[0])*fDatesLen); + fDates = (URelativeString*) uprv_malloc(sizeof(fDates[0])*(size_t)fDatesLen); + uprv_memcpy(fDates, other.fDates, sizeof(fDates[0])*(size_t)fDatesLen); } #if !UCONFIG_NO_BREAK_ITERATION if (other.fCapitalizationBrkIter != NULL) { @@ -72,7 +70,7 @@ RelativeDateFormat::RelativeDateFormat(const RelativeDateFormat& other) : RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const Locale& locale, UErrorCode& status) : DateFormat(), fDateTimeFormatter(NULL), fDatePattern(), fTimePattern(), fCombinedFormat(NULL), - fDateStyle(dateStyle), fLocale(locale), fDayMin(0), fDayMax(0), fDatesLen(0), fDates(NULL), + fDateStyle(dateStyle), fLocale(locale), fDatesLen(0), fDates(NULL), fCombinedHasDateAtStart(FALSE), fCapitalizationInfoSet(FALSE), fCapitalizationOfRelativeUnitsForUIListMenu(FALSE), fCapitalizationOfRelativeUnitsForStandAlone(FALSE), fCapitalizationBrkIter(NULL) @@ -112,6 +110,7 @@ RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatS fDateTimeFormatter=dynamic_cast(df); if (fDateTimeFormatter == NULL) { status = U_UNSUPPORTED_ERROR; + delete df; return; } fDateTimeFormatter->toPattern(fTimePattern); @@ -353,19 +352,14 @@ const UChar *RelativeDateFormat::getStringForDay(int32_t day, int32_t &len, UErr return NULL; } - // Is it outside the resource bundle's range? - if(day < fDayMin || day > fDayMax) { - return NULL; // don't have it. - } - - // Linear search the held strings - for(int n=0;n= 0 && n < fDatesLen) { + if (fDates[n].offset == day && fDates[n].string != NULL) { len = fDates[n].len; return fDates[n].string; } } - return NULL; // not found. } @@ -453,125 +447,114 @@ RelativeDateFormat::initCapitalizationContextInfo(const Locale& thelocale) #if !UCONFIG_NO_BREAK_ITERATION const char * localeID = (thelocale != NULL)? thelocale.getBaseName(): NULL; UErrorCode status = U_ZERO_ERROR; - UResourceBundle *rb = ures_open(NULL, localeID, &status); - rb = ures_getByKeyWithFallback(rb, "contextTransforms", rb, &status); - rb = ures_getByKeyWithFallback(rb, "relative", rb, &status); + LocalUResourceBundlePointer rb(ures_open(NULL, localeID, &status)); + ures_getByKeyWithFallback(rb.getAlias(), + "contextTransforms/relative", + rb.getAlias(), &status); if (U_SUCCESS(status) && rb != NULL) { int32_t len = 0; - const int32_t * intVector = ures_getIntVector(rb, &len, &status); + const int32_t * intVector = ures_getIntVector(rb.getAlias(), + &len, &status); if (U_SUCCESS(status) && intVector != NULL && len >= 2) { fCapitalizationOfRelativeUnitsForUIListMenu = intVector[0]; fCapitalizationOfRelativeUnitsForStandAlone = intVector[1]; } } - ures_close(rb); #endif } +namespace { + +/** + * Sink for getting data from fields/day/relative data. + * For loading relative day names, e.g., "yesterday", "today". + */ + +struct RelDateFmtDataSink : public ResourceSink { + URelativeString *fDatesPtr; + int32_t fDatesLen; + + RelDateFmtDataSink(URelativeString* fDates, int32_t len) : fDatesPtr(fDates), fDatesLen(len) { + for (int32_t i = 0; i < fDatesLen; ++i) { + fDatesPtr[i].offset = 0; + fDatesPtr[i].string = NULL; + fDatesPtr[i].len = -1; + } + } + + virtual ~RelDateFmtDataSink(); + + virtual void put(const char *key, ResourceValue &value, + UBool /*noFallback*/, UErrorCode &errorCode) { + ResourceTable relDayTable = value.getTable(errorCode); + int32_t n = 0; + int32_t len = 0; + for (int32_t i = 0; relDayTable.getKeyAndValue(i, key, value); ++i) { + // Find the relative offset. + int32_t offset = atoi(key); + + // Put in the proper spot, but don't override existing data. + n = offset + UDAT_DIRECTION_THIS; // Converts to index in UDAT_R + if (n < fDatesLen && fDatesPtr[n].string == NULL) { + // Not found and n is an empty slot. + fDatesPtr[n].offset = offset; + fDatesPtr[n].string = value.getString(len, errorCode); + fDatesPtr[n].len = len; + } + } + } +}; + + +// Virtual destructors must be defined out of line. +RelDateFmtDataSink::~RelDateFmtDataSink() {} + +} // Namespace + + static const UChar patItem1[] = {0x7B,0x31,0x7D}; // "{1}" static const int32_t patItem1Len = 3; void RelativeDateFormat::loadDates(UErrorCode &status) { - CalendarData calData(fLocale, "gregorian", status); - - UErrorCode tempStatus = status; - UResourceBundle *dateTimePatterns = calData.getByKey(DT_DateTimePatternsTag, tempStatus); - if(U_SUCCESS(tempStatus)) { - int32_t patternsSize = ures_getSize(dateTimePatterns); + UResourceBundle *rb = ures_open(NULL, fLocale.getBaseName(), &status); + LocalUResourceBundlePointer dateTimePatterns( + ures_getByKeyWithFallback(rb, + "calendar/gregorian/DateTimePatterns", + (UResourceBundle*)NULL, &status)); + if(U_SUCCESS(status)) { + int32_t patternsSize = ures_getSize(dateTimePatterns.getAlias()); if (patternsSize > kDateTime) { int32_t resStrLen = 0; - int32_t glueIndex = kDateTime; - if (patternsSize >= (DateFormat::kDateTimeOffset + DateFormat::kShort + 1)) { - // Get proper date time format - switch (fDateStyle) { - case kFullRelative: - case kFull: - glueIndex = kDateTimeOffset + kFull; - break; - case kLongRelative: - case kLong: - glueIndex = kDateTimeOffset + kLong; - break; - case kMediumRelative: - case kMedium: - glueIndex = kDateTimeOffset + kMedium; - break; - case kShortRelative: - case kShort: - glueIndex = kDateTimeOffset + kShort; - break; - default: - break; + if (patternsSize >= (kDateTimeOffset + kShort + 1)) { + int32_t offsetIncrement = (fDateStyle & ~kRelative); // Remove relative bit. + if (offsetIncrement >= (int32_t)kFull && + offsetIncrement <= (int32_t)kShortRelative) { + glueIndex = kDateTimeOffset + offsetIncrement; } } - const UChar *resStr = ures_getStringByIndex(dateTimePatterns, glueIndex, &resStrLen, &tempStatus); - if (U_SUCCESS(tempStatus) && resStrLen >= patItem1Len && u_strncmp(resStr,patItem1,patItem1Len)==0) { + const UChar *resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), glueIndex, &resStrLen, &status); + if (U_SUCCESS(status) && resStrLen >= patItem1Len && u_strncmp(resStr,patItem1,patItem1Len)==0) { fCombinedHasDateAtStart = TRUE; } - fCombinedFormat = new SimpleFormatter(UnicodeString(TRUE, resStr, resStrLen), 2, 2, tempStatus); + fCombinedFormat = new SimpleFormatter(UnicodeString(TRUE, resStr, resStrLen), 2, 2, status); } } - UResourceBundle *rb = ures_open(NULL, fLocale.getBaseName(), &status); - rb = ures_getByKeyWithFallback(rb, "fields", rb, &status); - rb = ures_getByKeyWithFallback(rb, "day", rb, &status); - rb = ures_getByKeyWithFallback(rb, "relative", rb, &status); - // set up min/max - fDayMin=-1; - fDayMax=1; - - if(U_FAILURE(status)) { - fDatesLen=0; - ures_close(rb); - return; - } - - fDatesLen = ures_getSize(rb); + // Data loading for relative names, e.g., "yesterday", "today", "tomorrow". + fDatesLen = UDAT_DIRECTION_COUNT; // Maximum defined by data. fDates = (URelativeString*) uprv_malloc(sizeof(fDates[0])*fDatesLen); - // Load in each item into the array... - int n = 0; - - UResourceBundle *subString = NULL; - - while(ures_hasNext(rb) && U_SUCCESS(status)) { // iterate over items - subString = ures_getNextResource(rb, subString, &status); - - if(U_FAILURE(status) || (subString==NULL)) break; - - // key = offset # - const char *key = ures_getKey(subString); - - // load the string and length - int32_t aLen; - const UChar* aString = ures_getString(subString, &aLen, &status); + RelDateFmtDataSink sink(fDates, fDatesLen); + ures_getAllItemsWithFallback(rb, "fields/day/relative", sink, status); - if(U_FAILURE(status) || aString == NULL) break; - - // calculate the offset - int32_t offset = atoi(key); - - // set min/max - if(offset < fDayMin) { - fDayMin = offset; - } - if(offset > fDayMax) { - fDayMax = offset; - } - - // copy the string pointer - fDates[n].offset = offset; - fDates[n].string = aString; - fDates[n].len = aLen; - - n++; - } - ures_close(subString); ures_close(rb); - // the fDates[] array could be sorted here, for direct access. + if(U_FAILURE(status)) { + fDatesLen=0; + return; + } } //---------------------------------------------------------------------- @@ -609,4 +592,4 @@ int32_t RelativeDateFormat::dayDifference(Calendar &cal, UErrorCode &status) { U_NAMESPACE_END -#endif +#endif /* !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/reldtfmt.h b/deps/icu-small/source/i18n/reldtfmt.h index f82855c357f1fc..ea091a91c393d5 100644 --- a/deps/icu-small/source/i18n/reldtfmt.h +++ b/deps/icu-small/source/i18n/reldtfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 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 * @@ -255,8 +257,6 @@ class RelativeDateFormat : public DateFormat { UDateFormatStyle fDateStyle; Locale fLocale; - int32_t fDayMin; // day id of lowest # - int32_t fDayMax; // day id of highest # int32_t fDatesLen; // Length of array URelativeString *fDates; // array of strings @@ -264,7 +264,11 @@ class RelativeDateFormat : public DateFormat { UBool fCapitalizationInfoSet; UBool fCapitalizationOfRelativeUnitsForUIListMenu; UBool fCapitalizationOfRelativeUnitsForStandAlone; +#if !UCONFIG_NO_BREAK_ITERATION BreakIterator* fCapitalizationBrkIter; +#else + UObject* fCapitalizationBrkIter; +#endif /** * Get the string at a specific offset. @@ -333,4 +337,3 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // RELDTFMT_H -//eof diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index 348fd45d22ad58..5a5bb80e05e642 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** * Copyright (C) 2002-2016 International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/remtrans.cpp b/deps/icu-small/source/i18n/remtrans.cpp index 4ee98f7d3cc10a..89837f991d6f30 100644 --- a/deps/icu-small/source/i18n/remtrans.cpp +++ b/deps/icu-small/source/i18n/remtrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/remtrans.h b/deps/icu-small/source/i18n/remtrans.h index 25a5609dffeec8..a5635781f979c7 100644 --- a/deps/icu-small/source/i18n/remtrans.h +++ b/deps/icu-small/source/i18n/remtrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/repattrn.cpp b/deps/icu-small/source/i18n/repattrn.cpp index bf69dbb66f4295..b792ca048445b5 100644 --- a/deps/icu-small/source/i18n/repattrn.cpp +++ b/deps/icu-small/source/i18n/repattrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // // file: repattrn.cpp // diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index 758c65769cc52e..4852667ada8079 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines @@ -1609,7 +1611,7 @@ RuleBasedCollator::isUnsafe(UChar32 c) const { return data->isUnsafeBackward(c, settings->isNumeric()); } -void +void U_CALLCONV RuleBasedCollator::computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode) { t->maxExpansions = CollationElementIterator::computeMaxExpansions(t->data, errorCode); } diff --git a/deps/icu-small/source/i18n/scientificnumberformatter.cpp b/deps/icu-small/source/i18n/scientificnumberformatter.cpp index b3bc09939ceb9f..56a43f9b7fa45e 100644 --- a/deps/icu-small/source/i18n/scientificnumberformatter.cpp +++ b/deps/icu-small/source/i18n/scientificnumberformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/scriptset.cpp b/deps/icu-small/source/i18n/scriptset.cpp index c20a55d00baad5..ab7cb1e68ec449 100644 --- a/deps/icu-small/source/i18n/scriptset.cpp +++ b/deps/icu-small/source/i18n/scriptset.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2014, International Business Machines @@ -191,6 +193,15 @@ int32_t ScriptSet::nextSetBit(int32_t fromIndex) const { return -1; } +UBool ScriptSet::isEmpty() const { + for (uint32_t i=0; i= 0; i = nextSetBit(i + 1)) { @@ -238,6 +249,41 @@ ScriptSet &ScriptSet::parseScripts(const UnicodeString &scriptString, UErrorCode return *this; } +void ScriptSet::setScriptExtensions(UChar32 codePoint, UErrorCode& status) { + if (U_FAILURE(status)) { return; } + static const int32_t FIRST_GUESS_SCRIPT_CAPACITY = 5; + MaybeStackArray scripts; + UErrorCode internalStatus = U_ZERO_ERROR; + int32_t script_count = -1; + + while (TRUE) { + script_count = uscript_getScriptExtensions( + codePoint, scripts.getAlias(), FIRST_GUESS_SCRIPT_CAPACITY, &internalStatus); + if (internalStatus == U_BUFFER_OVERFLOW_ERROR) { + // Need to allocate more space + if (scripts.resize(script_count) == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + internalStatus = U_ZERO_ERROR; + } else { + break; + } + } + + // Check if we failed for some reason other than buffer overflow + if (U_FAILURE(internalStatus)) { + status = internalStatus; + return; + } + + // Load the scripts into the ScriptSet and return + for (int32_t i = 0; i < script_count; i++) { + this->set(scripts[i], status); + if (U_FAILURE(status)) { return; } + } +} + U_NAMESPACE_END U_CAPI UBool U_EXPORT2 diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h index 62af5d591d100c..e8de3b9613f990 100644 --- a/deps/icu-small/source/i18n/scriptset.h +++ b/deps/icu-small/source/i18n/scriptset.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2013, International Business Machines @@ -38,6 +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);}; ScriptSet & operator = (const ScriptSet &other); UBool test(UScriptCode script, UErrorCode &status) const; @@ -55,9 +58,14 @@ class U_I18N_API ScriptSet: public UMemory { int32_t hashCode() const; int32_t nextSetBit(int32_t script) const; + UBool isEmpty() const; + UnicodeString &displayScripts(UnicodeString &dest) const; // append script names to dest string. ScriptSet & parseScripts(const UnicodeString &scriptsString, UErrorCode &status); // Replaces ScriptSet contents. + // Wraps around UScript::getScriptExtensions() and adds the corresponding scripts to this instance. + void setScriptExtensions(UChar32 codePoint, UErrorCode& status); + private: uint32_t bits[6]; }; diff --git a/deps/icu-small/source/i18n/search.cpp b/deps/icu-small/source/i18n/search.cpp index 8d2de67974e1d9..77323cc664fc19 100644 --- a/deps/icu-small/source/i18n/search.cpp +++ b/deps/icu-small/source/i18n/search.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2008,2010 IBM and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/selfmt.cpp b/deps/icu-small/source/i18n/selfmt.cpp index 5016e8e30a16c3..041fea515c88ba 100644 --- a/deps/icu-small/source/i18n/selfmt.cpp +++ b/deps/icu-small/source/i18n/selfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/selfmtimpl.h b/deps/icu-small/source/i18n/selfmtimpl.h index 02638448718e56..75bc3e343a8f36 100644 --- a/deps/icu-small/source/i18n/selfmtimpl.h +++ b/deps/icu-small/source/i18n/selfmtimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/sharedbreakiterator.cpp b/deps/icu-small/source/i18n/sharedbreakiterator.cpp index 430dfba1ccb24a..ca962c6283374a 100644 --- a/deps/icu-small/source/i18n/sharedbreakiterator.cpp +++ b/deps/icu-small/source/i18n/sharedbreakiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2014, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/sharedbreakiterator.h b/deps/icu-small/source/i18n/sharedbreakiterator.h index 09ba4312a3995a..58be1f6a76e906 100644 --- a/deps/icu-small/source/i18n/sharedbreakiterator.h +++ b/deps/icu-small/source/i18n/sharedbreakiterator.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/sharedcalendar.h b/deps/icu-small/source/i18n/sharedcalendar.h index 2a10c88b593851..f6d97b55bc128f 100644 --- a/deps/icu-small/source/i18n/sharedcalendar.h +++ b/deps/icu-small/source/i18n/sharedcalendar.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/shareddateformatsymbols.h b/deps/icu-small/source/i18n/shareddateformatsymbols.h index 8451183bc29aa5..a11a8a391b55ba 100644 --- a/deps/icu-small/source/i18n/shareddateformatsymbols.h +++ b/deps/icu-small/source/i18n/shareddateformatsymbols.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/sharednumberformat.h b/deps/icu-small/source/i18n/sharednumberformat.h index b6f5a8c923f36a..fcb618a4d48d50 100644 --- a/deps/icu-small/source/i18n/sharednumberformat.h +++ b/deps/icu-small/source/i18n/sharednumberformat.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/sharedpluralrules.h b/deps/icu-small/source/i18n/sharedpluralrules.h index 51773008fb69d2..faed6dea0e174d 100644 --- a/deps/icu-small/source/i18n/sharedpluralrules.h +++ b/deps/icu-small/source/i18n/sharedpluralrules.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2014, International Business Machines diff --git a/deps/icu-small/source/i18n/significantdigitinterval.h b/deps/icu-small/source/i18n/significantdigitinterval.h index a3d86f1c8fe280..336af784a50649 100644 --- a/deps/icu-small/source/i18n/significantdigitinterval.h +++ b/deps/icu-small/source/i18n/significantdigitinterval.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp index 3696d210736d7f..7dadef5ae60620 100644 --- a/deps/icu-small/source/i18n/simpletz.cpp +++ b/deps/icu-small/source/i18n/simpletz.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/smallintformatter.cpp b/deps/icu-small/source/i18n/smallintformatter.cpp index 44dd9391cb722c..b96f6dad3b5f5d 100644 --- a/deps/icu-small/source/i18n/smallintformatter.cpp +++ b/deps/icu-small/source/i18n/smallintformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/smallintformatter.h b/deps/icu-small/source/i18n/smallintformatter.h index 2907c6203a6f6c..846d6b405472ae 100644 --- a/deps/icu-small/source/i18n/smallintformatter.h +++ b/deps/icu-small/source/i18n/smallintformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 145587fb12ee14..85cc162a11f39f 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2016, International Business Machines Corporation and * @@ -50,10 +52,10 @@ #include "unicode/vtzone.h" #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" +#include "uresimp.h" #include "olsontz.h" #include "patternprops.h" #include "fphdlimp.h" -#include "gregoimp.h" #include "hebrwcal.h" #include "cstring.h" #include "uassert.h" @@ -164,9 +166,6 @@ static const UChar SUPPRESS_NEGATIVE_PREFIX[] = {0xAB00, 0}; * These are the tags we expect to see in normal resource bundle files associated * with a locale. */ -static const char gDateTimePatternsTag[]="DateTimePatterns"; - -//static const UChar gEtcUTC[] = {0x45, 0x74, 0x63, 0x2F, 0x55, 0x54, 0x43, 0x00}; // "Etc/UTC" static const UChar QUOTE = 0x27; // Single quote /* @@ -702,20 +701,42 @@ void SimpleDateFormat::construct(EStyle timeStyle, initializeCalendar(NULL, locale, status); if (U_FAILURE(status)) return; - CalendarData calData(locale, fCalendar?fCalendar->getType():NULL, status); - UResourceBundle *dateTimePatterns = calData.getByKey(gDateTimePatternsTag, status); - UResourceBundle *currentBundle; + // Load date time patterns directly from resources. + const char* cType = fCalendar ? fCalendar->getType() : NULL; + LocalUResourceBundlePointer bundle(ures_open(NULL, locale.getBaseName(), &status)); + if (U_FAILURE(status)) return; + + UBool cTypeIsGregorian = TRUE; + LocalUResourceBundlePointer dateTimePatterns; + if (cType != NULL && uprv_strcmp(cType, "gregorian") != 0) { + CharString resourcePath("calendar/", status); + resourcePath.append(cType, status).append("/DateTimePatterns", status); + dateTimePatterns.adoptInstead( + ures_getByKeyWithFallback(bundle.getAlias(), resourcePath.data(), + (UResourceBundle*)NULL, &status)); + cTypeIsGregorian = FALSE; + } + // Check for "gregorian" fallback. + if (cTypeIsGregorian || status == U_MISSING_RESOURCE_ERROR) { + status = U_ZERO_ERROR; + dateTimePatterns.adoptInstead( + ures_getByKeyWithFallback(bundle.getAlias(), + "calendar/gregorian/DateTimePatterns", + (UResourceBundle*)NULL, &status)); + } if (U_FAILURE(status)) return; - if (ures_getSize(dateTimePatterns) <= kDateTime) + LocalUResourceBundlePointer currentBundle; + + if (ures_getSize(dateTimePatterns.getAlias()) <= kDateTime) { status = U_INVALID_FORMAT_ERROR; return; } - setLocaleIDs(ures_getLocaleByType(dateTimePatterns, ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(dateTimePatterns, ULOC_ACTUAL_LOCALE, &status)); + setLocaleIDs(ures_getLocaleByType(dateTimePatterns.getAlias(), ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(dateTimePatterns.getAlias(), ULOC_ACTUAL_LOCALE, &status)); // create a symbols object from the locale fSymbols = DateFormatSymbols::createForLocale(locale, status); @@ -736,66 +757,64 @@ void SimpleDateFormat::construct(EStyle timeStyle, // and time pattern strings. if ((timeStyle != kNone) && (dateStyle != kNone)) { - currentBundle = ures_getByIndex(dateTimePatterns, (int32_t)timeStyle, NULL, &status); + currentBundle.adoptInstead( + ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)timeStyle, NULL, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; } - switch (ures_getType(currentBundle)) { + switch (ures_getType(currentBundle.getAlias())) { case URES_STRING: { - resStr = ures_getString(currentBundle, &resStrLen, &status); + resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &status); break; } case URES_ARRAY: { - resStr = ures_getStringByIndex(currentBundle, 0, &resStrLen, &status); - ovrStr = ures_getStringByIndex(currentBundle, 1, &ovrStrLen, &status); + resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status); + ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status); fTimeOverride.setTo(TRUE, ovrStr, ovrStrLen); break; } default: { status = U_INVALID_FORMAT_ERROR; - ures_close(currentBundle); return; } } - ures_close(currentBundle); UnicodeString tempus1(TRUE, resStr, resStrLen); - currentBundle = ures_getByIndex(dateTimePatterns, (int32_t)dateStyle, NULL, &status); + currentBundle.adoptInstead( + ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)dateStyle, NULL, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; } - switch (ures_getType(currentBundle)) { + switch (ures_getType(currentBundle.getAlias())) { case URES_STRING: { - resStr = ures_getString(currentBundle, &resStrLen, &status); + resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &status); break; } case URES_ARRAY: { - resStr = ures_getStringByIndex(currentBundle, 0, &resStrLen, &status); - ovrStr = ures_getStringByIndex(currentBundle, 1, &ovrStrLen, &status); + resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status); + ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status); fDateOverride.setTo(TRUE, ovrStr, ovrStrLen); break; } default: { status = U_INVALID_FORMAT_ERROR; - ures_close(currentBundle); return; } } - ures_close(currentBundle); UnicodeString tempus2(TRUE, resStr, resStrLen); int32_t glueIndex = kDateTime; - int32_t patternsSize = ures_getSize(dateTimePatterns); + int32_t patternsSize = ures_getSize(dateTimePatterns.getAlias()); if (patternsSize >= (kDateTimeOffset + kShort + 1)) { // Get proper date time format glueIndex = (int32_t)(kDateTimeOffset + (dateStyle - kDateOffset)); } - resStr = ures_getStringByIndex(dateTimePatterns, glueIndex, &resStrLen, &status); + resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), glueIndex, &resStrLen, &status); SimpleFormatter(UnicodeString(TRUE, resStr, resStrLen), 2, 2, status). format(tempus1, tempus2, fPattern, status); } @@ -803,56 +822,54 @@ void SimpleDateFormat::construct(EStyle timeStyle, // pattern string from the resources // setTo() - see DateFormatSymbols::assignArray comments else if (timeStyle != kNone) { - currentBundle = ures_getByIndex(dateTimePatterns, (int32_t)timeStyle, NULL, &status); + currentBundle.adoptInstead( + ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)timeStyle, NULL, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; } - switch (ures_getType(currentBundle)) { + switch (ures_getType(currentBundle.getAlias())) { case URES_STRING: { - resStr = ures_getString(currentBundle, &resStrLen, &status); + resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &status); break; } case URES_ARRAY: { - resStr = ures_getStringByIndex(currentBundle, 0, &resStrLen, &status); - ovrStr = ures_getStringByIndex(currentBundle, 1, &ovrStrLen, &status); + resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status); + ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status); fDateOverride.setTo(TRUE, ovrStr, ovrStrLen); break; } default: { status = U_INVALID_FORMAT_ERROR; - ures_close(currentBundle); return; } } fPattern.setTo(TRUE, resStr, resStrLen); - ures_close(currentBundle); } else if (dateStyle != kNone) { - currentBundle = ures_getByIndex(dateTimePatterns, (int32_t)dateStyle, NULL, &status); + currentBundle.adoptInstead( + ures_getByIndex(dateTimePatterns.getAlias(), (int32_t)dateStyle, NULL, &status)); if (U_FAILURE(status)) { status = U_INVALID_FORMAT_ERROR; return; } - switch (ures_getType(currentBundle)) { + switch (ures_getType(currentBundle.getAlias())) { case URES_STRING: { - resStr = ures_getString(currentBundle, &resStrLen, &status); + resStr = ures_getString(currentBundle.getAlias(), &resStrLen, &status); break; } case URES_ARRAY: { - resStr = ures_getStringByIndex(currentBundle, 0, &resStrLen, &status); - ovrStr = ures_getStringByIndex(currentBundle, 1, &ovrStrLen, &status); + resStr = ures_getStringByIndex(currentBundle.getAlias(), 0, &resStrLen, &status); + ovrStr = ures_getStringByIndex(currentBundle.getAlias(), 1, &ovrStrLen, &status); fDateOverride.setTo(TRUE, ovrStr, ovrStrLen); break; } default: { status = U_INVALID_FORMAT_ERROR; - ures_close(currentBundle); return; } } fPattern.setTo(TRUE, resStr, resStrLen); - ures_close(currentBundle); } // and if it includes _neither_, that's an error @@ -1553,7 +1570,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, } else if (count == 2) { value /= 10; } - FieldPosition p(0); + FieldPosition p(FieldPosition::DONT_CARE); currentNumberFormat->format(value, appendTo, p); if (count > 3) { currentNumberFormat->setMinimumIntegerDigits(count - 3); @@ -2040,7 +2057,7 @@ SimpleDateFormat::zeroPaddingNumber( int32_t value, int32_t minDigits, int32_t maxDigits) const { if (currentNumberFormat!=NULL) { - FieldPosition pos(0); + FieldPosition pos(FieldPosition::DONT_CARE); currentNumberFormat->setMinimumIntegerDigits(minDigits); currentNumberFormat->setMaximumIntegerDigits(maxDigits); diff --git a/deps/icu-small/source/i18n/smpdtfst.cpp b/deps/icu-small/source/i18n/smpdtfst.cpp index f9e94b82c62939..50980a99e4dfa5 100644 --- a/deps/icu-small/source/i18n/smpdtfst.cpp +++ b/deps/icu-small/source/i18n/smpdtfst.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/smpdtfst.h b/deps/icu-small/source/i18n/smpdtfst.h index da30f11d886f00..38ad558de2dfc0 100644 --- a/deps/icu-small/source/i18n/smpdtfst.h +++ b/deps/icu-small/source/i18n/smpdtfst.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/sortkey.cpp b/deps/icu-small/source/i18n/sortkey.cpp index 257888c741512b..68b0f062b8daf4 100644 --- a/deps/icu-small/source/i18n/sortkey.cpp +++ b/deps/icu-small/source/i18n/sortkey.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/standardplural.cpp b/deps/icu-small/source/i18n/standardplural.cpp index 456e9390ca7c2d..c39bae1ab18b9c 100644 --- a/deps/icu-small/source/i18n/standardplural.cpp +++ b/deps/icu-small/source/i18n/standardplural.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/standardplural.h b/deps/icu-small/source/i18n/standardplural.h index 8a8de2188485ec..56c63c347cee1e 100644 --- a/deps/icu-small/source/i18n/standardplural.h +++ b/deps/icu-small/source/i18n/standardplural.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/strmatch.cpp b/deps/icu-small/source/i18n/strmatch.cpp index ad02c5f44c538a..e72cfc9ab03d00 100644 --- a/deps/icu-small/source/i18n/strmatch.cpp +++ b/deps/icu-small/source/i18n/strmatch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2012, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/strmatch.h b/deps/icu-small/source/i18n/strmatch.h index 32f5c4b7907883..0241adfd3f01f0 100644 --- a/deps/icu-small/source/i18n/strmatch.h +++ b/deps/icu-small/source/i18n/strmatch.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2001-2011, International Business Machines Corporation * and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/strrepl.cpp b/deps/icu-small/source/i18n/strrepl.cpp index 3181d5b15982b7..d061eff579e58a 100644 --- a/deps/icu-small/source/i18n/strrepl.cpp +++ b/deps/icu-small/source/i18n/strrepl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2012, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/strrepl.h b/deps/icu-small/source/i18n/strrepl.h index faf96b62962425..a452db993fb45d 100644 --- a/deps/icu-small/source/i18n/strrepl.h +++ b/deps/icu-small/source/i18n/strrepl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2011, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/stsearch.cpp b/deps/icu-small/source/i18n/stsearch.cpp index 925ee3138f3547..643ec21b277395 100644 --- a/deps/icu-small/source/i18n/stsearch.cpp +++ b/deps/icu-small/source/i18n/stsearch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2014 IBM and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/taiwncal.cpp b/deps/icu-small/source/i18n/taiwncal.cpp index 7c51843c0f5c08..f1ca6fa135bd34 100644 --- a/deps/icu-small/source/i18n/taiwncal.cpp +++ b/deps/icu-small/source/i18n/taiwncal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/taiwncal.h b/deps/icu-small/source/i18n/taiwncal.h index 125a20da173a04..b15cff5beb75b8 100644 --- a/deps/icu-small/source/i18n/taiwncal.h +++ b/deps/icu-small/source/i18n/taiwncal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2003-2013, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index d0a1a418798179..427674aac4ff3d 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 1997-2015, International Business Machines Corporation and +* Copyright (C) 1997-2016, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* * @@ -458,6 +460,8 @@ TimeZone::detectHostTimeZone() uprv_tzset(); // Initialize tz... system data + uprv_tzname_clear_cache(); + // 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 diff --git a/deps/icu-small/source/i18n/titletrn.cpp b/deps/icu-small/source/i18n/titletrn.cpp index 79ffb403194adc..a1de8be6669567 100644 --- a/deps/icu-small/source/i18n/titletrn.cpp +++ b/deps/icu-small/source/i18n/titletrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/titletrn.h b/deps/icu-small/source/i18n/titletrn.h index a093152b66cbdb..a6380e3bd142c6 100644 --- a/deps/icu-small/source/i18n/titletrn.h +++ b/deps/icu-small/source/i18n/titletrn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/tmunit.cpp b/deps/icu-small/source/i18n/tmunit.cpp index e56c51ca0f7e73..d9da2681251c2f 100644 --- a/deps/icu-small/source/i18n/tmunit.cpp +++ b/deps/icu-small/source/i18n/tmunit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2014, Google, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/tmutamt.cpp b/deps/icu-small/source/i18n/tmutamt.cpp index 734b5de882d953..7be730765bfff4 100644 --- a/deps/icu-small/source/i18n/tmutamt.cpp +++ b/deps/icu-small/source/i18n/tmutamt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008, Google, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index fa31d7b3c1815c..1669546f767535 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2015, Google, International Business Machines Corporation @@ -347,6 +349,115 @@ TimeUnitFormat::initDataMembers(UErrorCode& err){ } } +struct TimeUnitFormatReadSink : public ResourceSink { + TimeUnitFormat *timeUnitFormatObj; + const UVector &pluralCounts; + UTimeUnitFormatStyle style; + UBool beenHere; + + TimeUnitFormatReadSink(TimeUnitFormat *timeUnitFormatObj, + const UVector &pluralCounts, UTimeUnitFormatStyle style) : + timeUnitFormatObj(timeUnitFormatObj), pluralCounts(pluralCounts), + style(style), beenHere(FALSE){} + + virtual ~TimeUnitFormatReadSink(); + + virtual void put(const char *key, ResourceValue &value, UBool, UErrorCode &errorCode) { + // Skip all put() calls except the first one -- discard all fallback data. + if (beenHere) { + return; + } else { + beenHere = TRUE; + } + + ResourceTable units = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + + for (int32_t i = 0; units.getKeyAndValue(i, key, value); ++i) { + const char* timeUnitName = key; + if (timeUnitName == NULL) { + continue; + } + + TimeUnit::UTimeUnitFields timeUnitField = TimeUnit::UTIMEUNIT_FIELD_COUNT; + if ( uprv_strcmp(timeUnitName, gTimeUnitYear) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_YEAR; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitMonth) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_MONTH; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitDay) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_DAY; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitHour) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_HOUR; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitMinute) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_MINUTE; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitSecond) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_SECOND; + } else if ( uprv_strcmp(timeUnitName, gTimeUnitWeek) == 0 ) { + timeUnitField = TimeUnit::UTIMEUNIT_WEEK; + } else { + continue; + } + LocalPointer localCountToPatterns; + Hashtable *countToPatterns = + timeUnitFormatObj->fTimeUnitToCountToPatterns[timeUnitField]; + if (countToPatterns == NULL) { + localCountToPatterns.adoptInsteadAndCheckErrorCode( + timeUnitFormatObj->initHash(errorCode), errorCode); + countToPatterns = localCountToPatterns.getAlias(); + if (U_FAILURE(errorCode)) { + return; + } + } + + ResourceTable countsToPatternTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { + continue; + } + for (int32_t j = 0; countsToPatternTable.getKeyAndValue(j, key, value); ++j) { + errorCode = U_ZERO_ERROR; + UnicodeString pattern = value.getUnicodeString(errorCode); + if (U_FAILURE(errorCode)) { + continue; + } + UnicodeString pluralCountUniStr(key, -1, US_INV); + if (!pluralCounts.contains(&pluralCountUniStr)) { + continue; + } + LocalPointer messageFormat(new MessageFormat( + pattern, timeUnitFormatObj->getLocale(errorCode), errorCode), errorCode); + if (U_FAILURE(errorCode)) { + return; + } + MessageFormat** formatters = + (MessageFormat**)countToPatterns->get(pluralCountUniStr); + if (formatters == NULL) { + LocalMemory localFormatters( + (MessageFormat **)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*))); + if (localFormatters.isNull()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + localFormatters[UTMUTFMT_FULL_STYLE] = NULL; + localFormatters[UTMUTFMT_ABBREVIATED_STYLE] = NULL; + countToPatterns->put(pluralCountUniStr, localFormatters.getAlias(), errorCode); + if (U_FAILURE(errorCode)) { + return; + } + formatters = localFormatters.orphan(); + } + formatters[style] = messageFormat.orphan(); + } + + if (timeUnitFormatObj->fTimeUnitToCountToPatterns[timeUnitField] == NULL) { + timeUnitFormatObj->fTimeUnitToCountToPatterns[timeUnitField] = localCountToPatterns.orphan(); + } + } + } + +}; + +TimeUnitFormatReadSink::~TimeUnitFormatReadSink() {} + void TimeUnitFormat::readFromCurrentLocale(UTimeUnitFormatStyle style, const char* key, const UVector& pluralCounts, UErrorCode& err) { @@ -365,94 +476,10 @@ TimeUnitFormat::readFromCurrentLocale(UTimeUnitFormatStyle style, const char* ke if (U_FAILURE(status)) { return; } - int32_t size = ures_getSize(unitsRes.getAlias()); - for ( int32_t index = 0; index < size; ++index) { - status = U_ZERO_ERROR; - // resource of one time unit - LocalUResourceBundlePointer oneTimeUnit( - ures_getByIndex(unitsRes.getAlias(), index, NULL, &status)); - if (U_FAILURE(status)) { - continue; - } - const char* timeUnitName = ures_getKey(oneTimeUnit.getAlias()); - if (timeUnitName == NULL) { - continue; - } - LocalUResourceBundlePointer countsToPatternRB( - ures_getByKey(unitsRes.getAlias(), timeUnitName, NULL, &status)); - if (countsToPatternRB.isNull() || U_FAILURE(status)) { - continue; - } - TimeUnit::UTimeUnitFields timeUnitField = TimeUnit::UTIMEUNIT_FIELD_COUNT; - if ( uprv_strcmp(timeUnitName, gTimeUnitYear) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_YEAR; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitMonth) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_MONTH; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitDay) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_DAY; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitHour) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_HOUR; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitMinute) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_MINUTE; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitSecond) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_SECOND; - } else if ( uprv_strcmp(timeUnitName, gTimeUnitWeek) == 0 ) { - timeUnitField = TimeUnit::UTIMEUNIT_WEEK; - } else { - continue; - } - LocalPointer localCountToPatterns; - Hashtable *countToPatterns = fTimeUnitToCountToPatterns[timeUnitField]; - if (countToPatterns == NULL) { - localCountToPatterns.adoptInsteadAndCheckErrorCode(initHash(err), err); - countToPatterns = localCountToPatterns.getAlias(); - if (U_FAILURE(err)) { - return; - } - } - int32_t count = ures_getSize(countsToPatternRB.getAlias()); - const char* pluralCount; - for ( int32_t pluralIndex = 0; pluralIndex < count; ++pluralIndex) { - // resource of count to pattern - status = U_ZERO_ERROR; - UnicodeString pattern = - ures_getNextUnicodeString(countsToPatternRB.getAlias(), &pluralCount, &status); - if (U_FAILURE(status)) { - continue; - } - UnicodeString pluralCountUniStr(pluralCount, -1, US_INV); - if (!pluralCounts.contains(&pluralCountUniStr)) { - continue; - } - LocalPointer messageFormat(new MessageFormat(pattern, getLocale(err), err), err); - if (U_FAILURE(err)) { - return; - } - MessageFormat** formatters = (MessageFormat**)countToPatterns->get(pluralCountUniStr); - if (formatters == NULL) { - LocalMemory localFormatters( - (MessageFormat **)uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT*sizeof(MessageFormat*))); - if (localFormatters.isNull()) { - err = U_MEMORY_ALLOCATION_ERROR; - return; - } - localFormatters[UTMUTFMT_FULL_STYLE] = NULL; - localFormatters[UTMUTFMT_ABBREVIATED_STYLE] = NULL; - countToPatterns->put(pluralCountUniStr, localFormatters.getAlias(), err); - if (U_FAILURE(err)) { - return; - } - formatters = localFormatters.orphan(); - } - //delete formatters[style]; - formatters[style] = messageFormat.orphan(); - } - if (fTimeUnitToCountToPatterns[timeUnitField] == NULL) { - fTimeUnitToCountToPatterns[timeUnitField] = localCountToPatterns.orphan(); - } - } -} + TimeUnitFormatReadSink sink(this, pluralCounts, style); + ures_getAllItemsWithFallback(unitsRes.getAlias(), "", sink, status); +} void TimeUnitFormat::checkConsistency(UTimeUnitFormatStyle style, const char* key, UErrorCode& err) { diff --git a/deps/icu-small/source/i18n/tolowtrn.cpp b/deps/icu-small/source/i18n/tolowtrn.cpp index 3edeaf81a68443..f0a59bbd0b4716 100644 --- a/deps/icu-small/source/i18n/tolowtrn.cpp +++ b/deps/icu-small/source/i18n/tolowtrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/tolowtrn.h b/deps/icu-small/source/i18n/tolowtrn.h index 564b215a728d54..616e59899f974d 100644 --- a/deps/icu-small/source/i18n/tolowtrn.h +++ b/deps/icu-small/source/i18n/tolowtrn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/toupptrn.cpp b/deps/icu-small/source/i18n/toupptrn.cpp index 4b7c7d06acaca1..a34792e07cfb82 100644 --- a/deps/icu-small/source/i18n/toupptrn.cpp +++ b/deps/icu-small/source/i18n/toupptrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/toupptrn.h b/deps/icu-small/source/i18n/toupptrn.h index 77799acbfd6bba..eae44e7d187dfa 100644 --- a/deps/icu-small/source/i18n/toupptrn.h +++ b/deps/icu-small/source/i18n/toupptrn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp index 56cad2d18f98b9..79328baa2bb157 100644 --- a/deps/icu-small/source/i18n/translit.cpp +++ b/deps/icu-small/source/i18n/translit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index 2f7e7d56fa7b55..cc1d51dea84749 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h index e01f89ad0705e6..334963f8d1e9c2 100644 --- a/deps/icu-small/source/i18n/transreg.h +++ b/deps/icu-small/source/i18n/transreg.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/tridpars.cpp b/deps/icu-small/source/i18n/tridpars.cpp index a58d58550d427d..140e3d7d1cf74d 100644 --- a/deps/icu-small/source/i18n/tridpars.cpp +++ b/deps/icu-small/source/i18n/tridpars.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2014, International Business Machines Corporation @@ -902,7 +904,7 @@ Transliterator* TransliteratorIDParser::createBasicInstance(const UnicodeString& /** * Initialize static memory. Called through umtx_initOnce only. */ -void TransliteratorIDParser::init(UErrorCode &status) { +void U_CALLCONV TransliteratorIDParser::init(UErrorCode &status) { U_ASSERT(SPECIAL_INVERSES == NULL); ucln_i18n_registerCleanup(UCLN_I18N_TRANSLITERATOR, utrans_transliterator_cleanup); diff --git a/deps/icu-small/source/i18n/tridpars.h b/deps/icu-small/source/i18n/tridpars.h index 88620fd18daf78..7c226023ef8011 100644 --- a/deps/icu-small/source/i18n/tridpars.h +++ b/deps/icu-small/source/i18n/tridpars.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** * Copyright (c) 2002-2010, International Business Machines Corporation * @@ -349,7 +351,7 @@ class TransliteratorIDParser /* not : public UObject because all methods are sta /** * Initialize static memory. */ - static void init(UErrorCode &status); + static void U_CALLCONV init(UErrorCode &status); friend class SingleID; }; diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index e03b1a88aae044..783edac34fde70 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index 127ea58deb9e90..4fc726ea54de9b 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/tzgnames.h b/deps/icu-small/source/i18n/tzgnames.h index ebe9b76ba5ba91..e78e8ee991734e 100644 --- a/deps/icu-small/source/i18n/tzgnames.h +++ b/deps/icu-small/source/i18n/tzgnames.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2012, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/tznames.cpp b/deps/icu-small/source/i18n/tznames.cpp index db1ce0ddeec0cc..6aefd13b536fc0 100644 --- a/deps/icu-small/source/i18n/tznames.cpp +++ b/deps/icu-small/source/i18n/tznames.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2015, International Business Machines Corporation and * @@ -116,6 +118,9 @@ class TimeZoneNamesDelegate : public TimeZoneNames { UnicodeString& getExemplarLocationName(const UnicodeString& tzID, UnicodeString& name) const; + void loadAllDisplayNames(UErrorCode& status); + void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const; + MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const; private: TimeZoneNamesDelegate(); @@ -278,6 +283,16 @@ TimeZoneNamesDelegate::getExemplarLocationName(const UnicodeString& tzID, Unicod return fTZnamesCacheEntry->names->getExemplarLocationName(tzID, name); } +void +TimeZoneNamesDelegate::loadAllDisplayNames(UErrorCode& status) { + fTZnamesCacheEntry->names->loadAllDisplayNames(status); +} + +void +TimeZoneNamesDelegate::getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const { + fTZnamesCacheEntry->names->getDisplayNames(tzID, types, numTypes, date, dest, status); +} + TimeZoneNames::MatchInfoCollection* TimeZoneNamesDelegate::find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const { return fTZnamesCacheEntry->names->find(text, start, types, status); @@ -330,6 +345,29 @@ TimeZoneNames::getDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, return name; } +// Empty default implementation, to be overriden in tznames_impl.cpp. +void +TimeZoneNames::loadAllDisplayNames(UErrorCode& /*status*/) { +} + +// A default, lightweight implementation of getDisplayNames. +// Overridden in tznames_impl.cpp. +void +TimeZoneNames::getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const { + if (U_FAILURE(status)) { return; } + if (tzID.isEmpty()) { return; } + UnicodeString mzID; + for (int i = 0; i < numTypes; i++) { + getTimeZoneDisplayName(tzID, types[i], dest[i]); + if (dest[i].isEmpty()) { + if (mzID.isEmpty()) { + getMetaZoneID(tzID, date, mzID); + } + getMetaZoneDisplayName(mzID, types[i], dest[i]); + } + } +} + struct MatchInfo : UMemory { UTimeZoneNameType nameType; diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index 0f50232a3ca64c..3e92acb6f9606e 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2016, International Business Machines Corporation and @@ -21,6 +23,7 @@ #include "cstring.h" #include "uassert.h" #include "mutex.h" +#include "resource.h" #include "uresimp.h" #include "ureslocs.h" #include "zonemeta.h" @@ -28,7 +31,6 @@ #include "uvector.h" #include "olsontz.h" - U_NAMESPACE_BEGIN #define ZID_KEY_MAX 128 @@ -37,25 +39,16 @@ U_NAMESPACE_BEGIN static const char gZoneStrings[] = "zoneStrings"; static const char gMZPrefix[] = "meta:"; -static const char* KEYS[] = {"lg", "ls", "ld", "sg", "ss", "sd"}; -static const int32_t KEYS_SIZE = UPRV_LENGTHOF(KEYS); - -static const char gEcTag[] = "ec"; - -static const char EMPTY[] = ""; // place holder for empty ZNames/TZNames - -static const UTimeZoneNameType ALL_NAME_TYPES[] = { - UTZNM_LONG_GENERIC, UTZNM_LONG_STANDARD, UTZNM_LONG_DAYLIGHT, - UTZNM_SHORT_GENERIC, UTZNM_SHORT_STANDARD, UTZNM_SHORT_DAYLIGHT, - UTZNM_EXEMPLAR_LOCATION, - UTZNM_UNKNOWN // unknown as the last one -}; +static const char EMPTY[] = ""; // place holder for empty ZNames +static const char DUMMY_LOADER[] = ""; // place holder for dummy ZNamesLoader +static const UChar NO_NAME[] = { 0 }; // for empty no-fallback time zone names // stuff for TZDBTimeZoneNames 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 UHashtable* gTZDBNamesMap = NULL; static icu::UInitOnce gTZDBNamesMapInitOnce = U_INITONCE_INITIALIZER; @@ -63,6 +56,20 @@ static icu::UInitOnce gTZDBNamesMapInitOnce = U_INITONCE_INITIALIZER; static TextTrieMap* gTZDBNamesTrie = NULL; static icu::UInitOnce gTZDBNamesTrieInitOnce = U_INITONCE_INITIALIZER; +// The order in which strings are stored may be different than the order in the public enum. +enum UTimeZoneNameTypeIndex { + UTZNM_INDEX_UNKNOWN = -1, + UTZNM_INDEX_EXEMPLAR_LOCATION, + UTZNM_INDEX_LONG_GENERIC, + UTZNM_INDEX_LONG_STANDARD, + UTZNM_INDEX_LONG_DAYLIGHT, + UTZNM_INDEX_SHORT_GENERIC, + UTZNM_INDEX_SHORT_STANDARD, + UTZNM_INDEX_SHORT_DAYLIGHT, + UTZNM_INDEX_COUNT +}; +static const UChar* EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; + U_CDECL_BEGIN static UBool U_CALLCONV tzdbTimeZoneNames_cleanup(void) { if (gTZDBNamesMap != NULL) { @@ -81,6 +88,26 @@ static UBool U_CALLCONV tzdbTimeZoneNames_cleanup(void) { } U_CDECL_END +/** + * ZNameInfo stores zone name information in the trie + */ +struct ZNameInfo { + UTimeZoneNameType type; + const UChar* tzID; + const UChar* mzID; +}; + +/** + * ZMatchInfo stores zone name match information used by find method + */ +struct ZMatchInfo { + const ZNameInfo* znameInfo; + int32_t matchLength; +}; + +// Helper functions +static void mergeTimeZoneKey(const UnicodeString& mzID, char* result); + #define DEFAULT_CHARACTERNODE_CAPACITY 1 // --------------------------------------------------- @@ -182,7 +209,7 @@ TextTrieMap::put(const UnicodeString &key, void *value, ZNStringPool &sp, UError put(s, value, status); } -// This method is for designed for a persistent key, such as string key stored in +// This method is designed for a persistent key, such as string key stored in // resource bundle. void TextTrieMap::put(const UChar *key, void *value, UErrorCode &status) { @@ -194,11 +221,22 @@ TextTrieMap::put(const UChar *key, void *value, UErrorCode &status) { } } if (U_FAILURE(status)) { + if (fValueDeleter) { + fValueDeleter((void*) key); + } return; } U_ASSERT(fLazyContents != NULL); + UChar *s = const_cast(key); fLazyContents->addElement(s, status); + if (U_FAILURE(status)) { + if (fValueDeleter) { + fValueDeleter((void*) key); + } + return; + } + fLazyContents->addElement(value, status); } @@ -207,6 +245,10 @@ TextTrieMap::putImpl(const UnicodeString &key, void *value, UErrorCode &status) if (fNodes == NULL) { fNodesCapacity = 512; fNodes = (CharacterNode *)uprv_malloc(fNodesCapacity * sizeof(CharacterNode)); + if (fNodes == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } fNodes[0].clear(); // Init root node. fNodesCount = 1; } @@ -517,196 +559,283 @@ void ZNStringPool::freeze() { } -// --------------------------------------------------- -// ZNames - names common for time zone and meta zone -// --------------------------------------------------- +/** + * This class stores name data for a meta zone or time zone. + */ class ZNames : public UMemory { -public: - virtual ~ZNames(); +private: + friend class TimeZoneNamesImpl; + + static UTimeZoneNameTypeIndex getTZNameTypeIndex(UTimeZoneNameType type) { + switch(type) { + case UTZNM_EXEMPLAR_LOCATION: return UTZNM_INDEX_EXEMPLAR_LOCATION; + case UTZNM_LONG_GENERIC: return UTZNM_INDEX_LONG_GENERIC; + case UTZNM_LONG_STANDARD: return UTZNM_INDEX_LONG_STANDARD; + case UTZNM_LONG_DAYLIGHT: return UTZNM_INDEX_LONG_DAYLIGHT; + case UTZNM_SHORT_GENERIC: return UTZNM_INDEX_SHORT_GENERIC; + case UTZNM_SHORT_STANDARD: return UTZNM_INDEX_SHORT_STANDARD; + case UTZNM_SHORT_DAYLIGHT: return UTZNM_INDEX_SHORT_DAYLIGHT; + default: return UTZNM_INDEX_UNKNOWN; + } + } + static UTimeZoneNameType getTZNameType(UTimeZoneNameTypeIndex index) { + switch(index) { + case UTZNM_INDEX_EXEMPLAR_LOCATION: return UTZNM_EXEMPLAR_LOCATION; + case UTZNM_INDEX_LONG_GENERIC: return UTZNM_LONG_GENERIC; + case UTZNM_INDEX_LONG_STANDARD: return UTZNM_LONG_STANDARD; + case UTZNM_INDEX_LONG_DAYLIGHT: return UTZNM_LONG_DAYLIGHT; + case UTZNM_INDEX_SHORT_GENERIC: return UTZNM_SHORT_GENERIC; + case UTZNM_INDEX_SHORT_STANDARD: return UTZNM_SHORT_STANDARD; + case UTZNM_INDEX_SHORT_DAYLIGHT: return UTZNM_SHORT_DAYLIGHT; + default: return UTZNM_UNKNOWN; + } + } - static ZNames* createInstance(UResourceBundle* rb, const char* key); - virtual const UChar* getName(UTimeZoneNameType type); + const UChar* fNames[UTZNM_INDEX_COUNT]; + UBool fDidAddIntoTrie; -protected: - ZNames(const UChar** names); - static const UChar** loadData(UResourceBundle* rb, const char* key); + // Whether we own the location string, if computed rather than loaded from a bundle. + // A meta zone names instance never has an exemplar location string. + UBool fOwnsLocationName; + + ZNames(const UChar* names[], const UChar* locationName) + : fDidAddIntoTrie(FALSE) { + uprv_memcpy(fNames, names, sizeof(fNames)); + if (locationName != NULL) { + fOwnsLocationName = TRUE; + fNames[UTZNM_INDEX_EXEMPLAR_LOCATION] = locationName; + } else { + fOwnsLocationName = FALSE; + } + } + +public: + ~ZNames() { + if (fOwnsLocationName) { + const UChar* locationName = fNames[UTZNM_INDEX_EXEMPLAR_LOCATION]; + U_ASSERT(locationName != NULL); + uprv_free((void*) locationName); + } + } private: - const UChar** fNames; -}; + static void* createMetaZoneAndPutInCache(UHashtable* cache, const UChar* names[], + const UnicodeString& mzID, UErrorCode& status) { + if (U_FAILURE(status)) { return NULL; } + U_ASSERT(names != NULL); -ZNames::ZNames(const UChar** names) -: fNames(names) { -} + // Use the persistent ID as the resource key, so we can + // avoid duplications. + // TODO: Is there a more efficient way, like intern() in Java? + void* key = (void*) ZoneMeta::findMetaZoneID(mzID); + void* value; + if (uprv_memcmp(names, EMPTY_NAMES, sizeof(EMPTY_NAMES)) == 0) { + value = (void*) EMPTY; + } else { + value = (void*) (new ZNames(names, NULL)); + if (value == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + } + uhash_put(cache, key, value, &status); + return value; + } + + static void* createTimeZoneAndPutInCache(UHashtable* cache, const UChar* names[], + const UnicodeString& tzID, UErrorCode& status) { + if (U_FAILURE(status)) { return NULL; } + U_ASSERT(names != NULL); + + // If necessary, compute the location name from the time zone name. + UChar* locationName = NULL; + if (names[UTZNM_INDEX_EXEMPLAR_LOCATION] == NULL) { + UnicodeString locationNameUniStr; + TimeZoneNamesImpl::getDefaultExemplarLocationName(tzID, locationNameUniStr); + + // Copy the computed location name to the heap + if (locationNameUniStr.length() > 0) { + const UChar* buff = locationNameUniStr.getTerminatedBuffer(); + int32_t len = sizeof(UChar) * (locationNameUniStr.length() + 1); + locationName = (UChar*) uprv_malloc(len); + if (locationName == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memcpy(locationName, buff, len); + } + } -ZNames::~ZNames() { - if (fNames != NULL) { - uprv_free(fNames); + // Use the persistent ID as the resource key, so we can + // avoid duplications. + // TODO: Is there a more efficient way, like intern() in Java? + void* key = (void*) ZoneMeta::findTimeZoneID(tzID); + void* value = (void*) (new ZNames(names, locationName)); + if (value == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uhash_put(cache, key, value, &status); + return value; } -} -ZNames* -ZNames::createInstance(UResourceBundle* rb, const char* key) { - const UChar** names = loadData(rb, key); - if (names == NULL) { - // No names data available - return NULL; + const UChar* getName(UTimeZoneNameType type) const { + UTimeZoneNameTypeIndex index = getTZNameTypeIndex(type); + return index >= 0 ? fNames[index] : NULL; } - return new ZNames(names); -} -const UChar* -ZNames::getName(UTimeZoneNameType type) { - if (fNames == NULL) { - return NULL; - } - const UChar *name = NULL; - switch(type) { - case UTZNM_LONG_GENERIC: - name = fNames[0]; - break; - case UTZNM_LONG_STANDARD: - name = fNames[1]; - break; - case UTZNM_LONG_DAYLIGHT: - name = fNames[2]; - break; - case UTZNM_SHORT_GENERIC: - name = fNames[3]; - break; - case UTZNM_SHORT_STANDARD: - name = fNames[4]; - break; - case UTZNM_SHORT_DAYLIGHT: - name = fNames[5]; - break; - case UTZNM_EXEMPLAR_LOCATION: // implemeted by subclass - default: - name = NULL; + void addAsMetaZoneIntoTrie(const UChar* mzID, TextTrieMap& trie, UErrorCode& status) { + addNamesIntoTrie(mzID, NULL, trie, status); } - return name; -} - -const UChar** -ZNames::loadData(UResourceBundle* rb, const char* key) { - if (rb == NULL || key == NULL || *key == 0) { - return NULL; + void addAsTimeZoneIntoTrie(const UChar* tzID, TextTrieMap& trie, UErrorCode& status) { + addNamesIntoTrie(NULL, tzID, trie, status); } - UErrorCode status = U_ZERO_ERROR; - const UChar **names = NULL; + void addNamesIntoTrie(const UChar* mzID, const UChar* tzID, TextTrieMap& trie, + UErrorCode& status) { + if (U_FAILURE(status)) { return; } + if (fDidAddIntoTrie) { return; } + fDidAddIntoTrie = TRUE; - UResourceBundle* rbTable = NULL; - rbTable = ures_getByKeyWithFallback(rb, key, rbTable, &status); - if (U_SUCCESS(status)) { - names = (const UChar **)uprv_malloc(sizeof(const UChar*) * KEYS_SIZE); - if (names != NULL) { - UBool isEmpty = TRUE; - for (int32_t i = 0; i < KEYS_SIZE; i++) { - status = U_ZERO_ERROR; - int32_t len = 0; - const UChar *value = ures_getStringByKeyWithFallback(rbTable, KEYS[i], &len, &status); - if (U_FAILURE(status) || len == 0) { - names[i] = NULL; - } else { - names[i] = value; - isEmpty = FALSE; + for (int32_t i = 0; i < UTZNM_INDEX_COUNT; i++) { + const UChar* name = fNames[i]; + if (name != NULL) { + ZNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(ZNameInfo)); + if (nameinfo == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + nameinfo->mzID = mzID; + nameinfo->tzID = tzID; + nameinfo->type = getTZNameType((UTimeZoneNameTypeIndex)i); + trie.put(name, nameinfo, status); // trie.put() takes ownership of the key + if (U_FAILURE(status)) { + return; } - } - if (isEmpty) { - // No need to keep the names array - uprv_free(names); - names = NULL; } } } - ures_close(rbTable); - return names; -} -// --------------------------------------------------- -// TZNames - names for a time zone -// --------------------------------------------------- -class TZNames : public ZNames { public: - virtual ~TZNames(); - - static TZNames* createInstance(UResourceBundle* rb, const char* key, const UnicodeString& tzID); - virtual const UChar* getName(UTimeZoneNameType type); - -private: - TZNames(const UChar** names); - const UChar* fLocationName; - UChar* fLocationNameOwned; + struct ZNamesLoader; }; -TZNames::TZNames(const UChar** names) -: ZNames(names), fLocationName(NULL), fLocationNameOwned(NULL) { -} +struct ZNames::ZNamesLoader : public ResourceSink { + const UChar *names[UTZNM_INDEX_COUNT]; -TZNames::~TZNames() { - if (fLocationNameOwned) { - uprv_free(fLocationNameOwned); + ZNamesLoader() { + clear(); } -} + virtual ~ZNamesLoader(); -const UChar* -TZNames::getName(UTimeZoneNameType type) { - if (type == UTZNM_EXEMPLAR_LOCATION) { - return fLocationName; + /** Reset for loading another set of names. */ + void clear() { + uprv_memcpy(names, EMPTY_NAMES, sizeof(names)); } - return ZNames::getName(type); -} -TZNames* -TZNames::createInstance(UResourceBundle* rb, const char* key, const UnicodeString& tzID) { - if (rb == NULL || key == NULL || *key == 0) { - return NULL; + void loadMetaZone(const UResourceBundle* zoneStrings, const UnicodeString& mzID, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { return; } + + char key[ZID_KEY_MAX + 1]; + mergeTimeZoneKey(mzID, key); + + loadNames(zoneStrings, key, errorCode); } - const UChar** names = loadData(rb, key); - const UChar* locationName = NULL; - UChar* locationNameOwned = NULL; + void loadTimeZone(const UResourceBundle* zoneStrings, const UnicodeString& tzID, UErrorCode& errorCode) { + // Replace "/" with ":". + UnicodeString uKey(tzID); + for (int32_t i = 0; i < uKey.length(); i++) { + if (uKey.charAt(i) == (UChar)0x2F) { + uKey.setCharAt(i, (UChar)0x3A); + } + } + + char key[ZID_KEY_MAX + 1]; + uKey.extract(0, uKey.length(), key, sizeof(key), US_INV); - UErrorCode status = U_ZERO_ERROR; - int32_t len = 0; + loadNames(zoneStrings, key, errorCode); + } + + void loadNames(const UResourceBundle* zoneStrings, const char* key, UErrorCode& errorCode) { + U_ASSERT(zoneStrings != NULL); + U_ASSERT(key != NULL); + U_ASSERT(key[0] != '\0'); - UResourceBundle* table = ures_getByKeyWithFallback(rb, key, NULL, &status); - locationName = ures_getStringByKeyWithFallback(table, gEcTag, &len, &status); - // ignore missing resource here - status = U_ZERO_ERROR; + UErrorCode localStatus = U_ZERO_ERROR; + clear(); + ures_getAllItemsWithFallback(zoneStrings, key, *this, localStatus); - ures_close(table); + // Ignore errors, but propogate possible warnings. + if (U_SUCCESS(localStatus)) { + errorCode = localStatus; + } + } - if (locationName == NULL) { - UnicodeString tmpName; - int32_t tmpNameLen = 0; - TimeZoneNamesImpl::getDefaultExemplarLocationName(tzID, tmpName); - tmpNameLen = tmpName.length(); + void setNameIfEmpty(const char* key, const ResourceValue* value, UErrorCode& errorCode) { + UTimeZoneNameTypeIndex type = nameTypeFromKey(key); + if (type == UTZNM_INDEX_UNKNOWN) { return; } + if (names[type] == NULL) { + int32_t length; + // 'NO_NAME' indicates internally that this field should remain empty. It will be + // replaced by 'NULL' in getNames() + names[type] = (value == NULL) ? NO_NAME : value->getString(length, errorCode); + } + } - if (tmpNameLen > 0) { - locationNameOwned = (UChar*) uprv_malloc(sizeof(UChar) * (tmpNameLen + 1)); - if (locationNameOwned) { - tmpName.extract(locationNameOwned, tmpNameLen + 1, status); - locationName = locationNameOwned; + virtual void put(const char* key, ResourceValue& value, UBool /*noFallback*/, + UErrorCode &errorCode) { + ResourceTable namesTable = value.getTable(errorCode); + if (U_FAILURE(errorCode)) { return; } + for (int32_t i = 0; namesTable.getKeyAndValue(i, key, value); ++i) { + if (value.isNoInheritanceMarker()) { + setNameIfEmpty(key, NULL, errorCode); + } else { + setNameIfEmpty(key, &value, errorCode); } } } - TZNames* tznames = NULL; - if (locationName != NULL || names != NULL) { - tznames = new TZNames(names); - if (tznames == NULL) { - if (locationNameOwned) { - uprv_free(locationNameOwned); + static UTimeZoneNameTypeIndex nameTypeFromKey(const char *key) { + char c0, c1; + if ((c0 = key[0]) == 0 || (c1 = key[1]) == 0 || key[2] != 0) { + return UTZNM_INDEX_UNKNOWN; + } + if (c0 == 'l') { + return c1 == 'g' ? UTZNM_INDEX_LONG_GENERIC : + c1 == 's' ? UTZNM_INDEX_LONG_STANDARD : + c1 == 'd' ? UTZNM_INDEX_LONG_DAYLIGHT : UTZNM_INDEX_UNKNOWN; + } else if (c0 == 's') { + return c1 == 'g' ? UTZNM_INDEX_SHORT_GENERIC : + c1 == 's' ? UTZNM_INDEX_SHORT_STANDARD : + c1 == 'd' ? UTZNM_INDEX_SHORT_DAYLIGHT : UTZNM_INDEX_UNKNOWN; + } else if (c0 == 'e' && c1 == 'c') { + return UTZNM_INDEX_EXEMPLAR_LOCATION; + } + return UTZNM_INDEX_UNKNOWN; + } + + /** + * Returns an array of names. It is the caller's responsibility to copy the data into a + * permanent location, as the returned array is owned by the loader instance and may be + * cleared or leave scope. + * + * This is different than Java, where the array will no longer be modified and null + * may be returned. + */ + const UChar** getNames() { + // Remove 'NO_NAME' references in the array and replace with 'NULL' + for (int32_t i = 0; i < UTZNM_INDEX_COUNT; ++i) { + if (names[i] == NO_NAME) { + names[i] = NULL; } } - tznames->fLocationName = locationName; - tznames->fLocationNameOwned = locationNameOwned; + return names; } +}; + +ZNames::ZNamesLoader::~ZNamesLoader() {} - return tznames; -} // --------------------------------------------------- // The meta zone ID enumeration class @@ -772,25 +901,6 @@ MetaZoneIDsEnumeration::~MetaZoneIDsEnumeration() { } } -U_CDECL_BEGIN -/** - * ZNameInfo stores zone name information in the trie - */ -typedef struct ZNameInfo { - UTimeZoneNameType type; - const UChar* tzID; - const UChar* mzID; -} ZNameInfo; - -/** - * ZMatchInfo stores zone name match information used by find method - */ -typedef struct ZMatchInfo { - const ZNameInfo* znameInfo; - int32_t matchLength; -} ZMatchInfo; -U_CDECL_END - // --------------------------------------------------- // ZNameSearchHandler @@ -883,16 +993,7 @@ U_CDECL_BEGIN static void U_CALLCONV deleteZNames(void *obj) { if (obj != EMPTY) { - delete (ZNames *)obj; - } -} -/** - * Deleter for TZNames - */ -static void U_CALLCONV -deleteTZNames(void *obj) { - if (obj != EMPTY) { - delete (TZNames *)obj; + delete (ZNames*) obj; } } @@ -906,14 +1007,13 @@ deleteZNameInfo(void *obj) { U_CDECL_END -static UMutex gLock = U_MUTEX_INITIALIZER; - TimeZoneNamesImpl::TimeZoneNamesImpl(const Locale& locale, UErrorCode& status) : fLocale(locale), fZoneStrings(NULL), fTZNamesMap(NULL), fMZNamesMap(NULL), fNamesTrieFullyLoaded(FALSE), + fNamesFullyLoaded(FALSE), fNamesTrie(TRUE, deleteZNameInfo) { initialize(locale, status); } @@ -943,14 +1043,14 @@ TimeZoneNamesImpl::initialize(const Locale& locale, UErrorCode& status) { } uhash_setValueDeleter(fMZNamesMap, deleteZNames); - uhash_setValueDeleter(fTZNamesMap, deleteTZNames); + uhash_setValueDeleter(fTZNamesMap, deleteZNames); // no key deleters for name maps // preload zone strings for the default zone TimeZone *tz = TimeZone::createDefault(); const UChar *tzID = ZoneMeta::getCanonicalCLDRID(*tz); if (tzID != NULL) { - loadStrings(UnicodeString(tzID)); + loadStrings(UnicodeString(tzID), status); } delete tz; @@ -962,20 +1062,15 @@ TimeZoneNamesImpl::initialize(const Locale& locale, UErrorCode& status) { * except initializer. */ void -TimeZoneNamesImpl::loadStrings(const UnicodeString& tzCanonicalID) { - loadTimeZoneNames(tzCanonicalID); +TimeZoneNamesImpl::loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& status) { + loadTimeZoneNames(tzCanonicalID, status); + LocalPointer mzIDs(getAvailableMetaZoneIDs(tzCanonicalID, status)); + if (U_FAILURE(status)) { return; } + U_ASSERT(!mzIDs.isNull()); - UErrorCode status = U_ZERO_ERROR; - StringEnumeration *mzIDs = getAvailableMetaZoneIDs(tzCanonicalID, status); - if (U_SUCCESS(status) && mzIDs != NULL) { - const UnicodeString *mzID; - while ((mzID = mzIDs->snext(status))) { - if (U_FAILURE(status)) { - break; - } - loadMetaZoneNames(*mzID); - } - delete mzIDs; + const UnicodeString *mzID; + while ((mzID = mzIDs->snext(status)) && U_SUCCESS(status)) { + loadMetaZoneNames(*mzID, status); } } @@ -1096,7 +1191,6 @@ TimeZoneNamesImpl::_getReferenceZoneID(const UnicodeString& mzID, const char* re return tzID; } - UnicodeString& TimeZoneNamesImpl::getMetaZoneDisplayName(const UnicodeString& mzID, UTimeZoneNameType type, @@ -1109,11 +1203,12 @@ TimeZoneNamesImpl::getMetaZoneDisplayName(const UnicodeString& mzID, ZNames *znames = NULL; TimeZoneNamesImpl *nonConstThis = const_cast(this); - umtx_lock(&gLock); { - znames = nonConstThis->loadMetaZoneNames(mzID); + Mutex lock(&gDataMutex); + UErrorCode status = U_ZERO_ERROR; + znames = nonConstThis->loadMetaZoneNames(mzID, status); + if (U_FAILURE(status)) { return name; } } - umtx_unlock(&gLock); if (znames != NULL) { const UChar* s = znames->getName(type); @@ -1131,14 +1226,15 @@ TimeZoneNamesImpl::getTimeZoneDisplayName(const UnicodeString& tzID, UTimeZoneNa return name; } - TZNames *tznames = NULL; + ZNames *tznames = NULL; TimeZoneNamesImpl *nonConstThis = const_cast(this); - umtx_lock(&gLock); { - tznames = nonConstThis->loadTimeZoneNames(tzID); + Mutex lock(&gDataMutex); + UErrorCode status = U_ZERO_ERROR; + tznames = nonConstThis->loadTimeZoneNames(tzID, status); + if (U_FAILURE(status)) { return name; } } - umtx_unlock(&gLock); if (tznames != NULL) { const UChar *s = tznames->getName(type); @@ -1153,14 +1249,15 @@ UnicodeString& TimeZoneNamesImpl::getExemplarLocationName(const UnicodeString& tzID, UnicodeString& name) const { name.setToBogus(); // cleanup result. const UChar* locName = NULL; - TZNames *tznames = NULL; + ZNames *tznames = NULL; TimeZoneNamesImpl *nonConstThis = const_cast(this); - umtx_lock(&gLock); { - tznames = nonConstThis->loadTimeZoneNames(tzID); + Mutex lock(&gDataMutex); + UErrorCode status = U_ZERO_ERROR; + tznames = nonConstThis->loadTimeZoneNames(tzID, status); + if (U_FAILURE(status)) { return name; } } - umtx_unlock(&gLock); if (tznames != NULL) { locName = tznames->getName(UTZNM_EXEMPLAR_LOCATION); @@ -1193,215 +1290,386 @@ static void mergeTimeZoneKey(const UnicodeString& mzID, char* result) { * This method updates the cache and must be called with a lock */ ZNames* -TimeZoneNamesImpl::loadMetaZoneNames(const UnicodeString& mzID) { - if (mzID.length() > (ZID_KEY_MAX - MZ_PREFIX_LEN)) { - return NULL; - } +TimeZoneNamesImpl::loadMetaZoneNames(const UnicodeString& mzID, UErrorCode& status) { + if (U_FAILURE(status)) { return NULL; } + U_ASSERT(mzID.length() <= ZID_KEY_MAX - MZ_PREFIX_LEN); - ZNames *znames = NULL; - - UErrorCode status = U_ZERO_ERROR; UChar mzIDKey[ZID_KEY_MAX + 1]; mzID.extract(mzIDKey, ZID_KEY_MAX + 1, status); - U_ASSERT(status == U_ZERO_ERROR); // already checked length above + U_ASSERT(U_SUCCESS(status)); // already checked length above mzIDKey[mzID.length()] = 0; - void *cacheVal = uhash_get(fMZNamesMap, mzIDKey); - if (cacheVal == NULL) { - char key[ZID_KEY_MAX + 1]; - mergeTimeZoneKey(mzID, key); - znames = ZNames::createInstance(fZoneStrings, key); - - if (znames == NULL) { - cacheVal = (void *)EMPTY; - } else { - cacheVal = znames; - } - // Use the persistent ID as the resource key, so we can - // avoid duplications. - const UChar* newKey = ZoneMeta::findMetaZoneID(mzID); - if (newKey != NULL) { - uhash_put(fMZNamesMap, (void *)newKey, cacheVal, &status); - if (U_FAILURE(status)) { - if (znames != NULL) { - delete znames; - znames = NULL; - } - } else if (znames != NULL) { - // put the name info into the trie - for (int32_t i = 0; ALL_NAME_TYPES[i] != UTZNM_UNKNOWN; i++) { - const UChar* name = znames->getName(ALL_NAME_TYPES[i]); - if (name != NULL) { - ZNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(ZNameInfo)); - if (nameinfo != NULL) { - nameinfo->type = ALL_NAME_TYPES[i]; - nameinfo->tzID = NULL; - nameinfo->mzID = newKey; - fNamesTrie.put(name, nameinfo, status); - } - } - } - } - - } else { - // Should never happen with a valid input - if (znames != NULL) { - // It's not possible that we get a valid ZNames with unknown ID. - // But just in case.. - delete znames; - znames = NULL; - } - } - } else if (cacheVal != EMPTY) { - znames = (ZNames *)cacheVal; + void* mznames = uhash_get(fMZNamesMap, mzIDKey); + if (mznames == NULL) { + ZNames::ZNamesLoader loader; + loader.loadMetaZone(fZoneStrings, mzID, status); + mznames = ZNames::createMetaZoneAndPutInCache(fMZNamesMap, loader.getNames(), mzID, status); + if (U_FAILURE(status)) { return NULL; } } - return znames; + if (mznames != EMPTY) { + return (ZNames*)mznames; + } else { + return NULL; + } } /* * This method updates the cache and must be called with a lock */ -TZNames* -TimeZoneNamesImpl::loadTimeZoneNames(const UnicodeString& tzID) { - if (tzID.length() > ZID_KEY_MAX) { - return NULL; - } - - TZNames *tznames = NULL; +ZNames* +TimeZoneNamesImpl::loadTimeZoneNames(const UnicodeString& tzID, UErrorCode& status) { + if (U_FAILURE(status)) { return NULL; } + U_ASSERT(tzID.length() <= ZID_KEY_MAX); - UErrorCode status = U_ZERO_ERROR; UChar tzIDKey[ZID_KEY_MAX + 1]; int32_t tzIDKeyLen = tzID.extract(tzIDKey, ZID_KEY_MAX + 1, status); - U_ASSERT(status == U_ZERO_ERROR); // already checked length above + U_ASSERT(U_SUCCESS(status)); // already checked length above tzIDKey[tzIDKeyLen] = 0; - void *cacheVal = uhash_get(fTZNamesMap, tzIDKey); - if (cacheVal == NULL) { - char key[ZID_KEY_MAX + 1]; - UErrorCode status = U_ZERO_ERROR; - // Replace "/" with ":". - UnicodeString uKey(tzID); - for (int32_t i = 0; i < uKey.length(); i++) { - if (uKey.charAt(i) == (UChar)0x2F) { - uKey.setCharAt(i, (UChar)0x3A); - } - } - uKey.extract(0, uKey.length(), key, sizeof(key), US_INV); - tznames = TZNames::createInstance(fZoneStrings, key, tzID); - - if (tznames == NULL) { - cacheVal = (void *)EMPTY; - } else { - cacheVal = tznames; - } - // Use the persistent ID as the resource key, so we can - // avoid duplications. - const UChar* newKey = ZoneMeta::findTimeZoneID(tzID); - if (newKey != NULL) { - uhash_put(fTZNamesMap, (void *)newKey, cacheVal, &status); - if (U_FAILURE(status)) { - if (tznames != NULL) { - delete tznames; - tznames = NULL; - } - } else if (tznames != NULL) { - // put the name info into the trie - for (int32_t i = 0; ALL_NAME_TYPES[i] != UTZNM_UNKNOWN; i++) { - const UChar* name = tznames->getName(ALL_NAME_TYPES[i]); - if (name != NULL) { - ZNameInfo *nameinfo = (ZNameInfo *)uprv_malloc(sizeof(ZNameInfo)); - if (nameinfo != NULL) { - nameinfo->type = ALL_NAME_TYPES[i]; - nameinfo->tzID = newKey; - nameinfo->mzID = NULL; - fNamesTrie.put(name, nameinfo, status); - } - } - } - } - } else { - // Should never happen with a valid input - if (tznames != NULL) { - // It's not possible that we get a valid TZNames with unknown ID. - // But just in case.. - delete tznames; - tznames = NULL; - } - } - } else if (cacheVal != EMPTY) { - tznames = (TZNames *)cacheVal; + void *tznames = uhash_get(fTZNamesMap, tzIDKey); + if (tznames == NULL) { + ZNames::ZNamesLoader loader; + loader.loadTimeZone(fZoneStrings, tzID, status); + tznames = ZNames::createTimeZoneAndPutInCache(fTZNamesMap, loader.getNames(), tzID, status); + if (U_FAILURE(status)) { return NULL; } } - return tznames; + // tznames is never EMPTY + return (ZNames*)tznames; } TimeZoneNames::MatchInfoCollection* TimeZoneNamesImpl::find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const { ZNameSearchHandler handler(types); + TimeZoneNames::MatchInfoCollection* matches; + TimeZoneNamesImpl* nonConstThis = const_cast(this); - TimeZoneNamesImpl *nonConstThis = const_cast(this); - - umtx_lock(&gLock); + // Synchronize so that data is not loaded multiple times. + // TODO: Consider more fine-grained synchronization. { - fNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); - } - umtx_unlock(&gLock); + Mutex lock(&gDataMutex); - if (U_FAILURE(status)) { - return NULL; + // First try of lookup. + matches = doFind(handler, text, start, status); + if (U_FAILURE(status)) { return NULL; } + if (matches != NULL) { + return matches; + } + + // All names are not yet loaded into the trie. + // We may have loaded names for formatting several time zones, + // and might be parsing one of those. + // Populate the parsing trie from all of the already-loaded names. + nonConstThis->addAllNamesIntoTrie(status); + + // Second try of lookup. + matches = doFind(handler, text, start, status); + if (U_FAILURE(status)) { return NULL; } + if (matches != NULL) { + return matches; + } + + // There are still some names we haven't loaded into the trie yet. + // Load everything now. + nonConstThis->internalLoadAllDisplayNames(status); + nonConstThis->addAllNamesIntoTrie(status); + nonConstThis->fNamesTrieFullyLoaded = TRUE; + if (U_FAILURE(status)) { return NULL; } + + // Third try: we must return this one. + return doFind(handler, text, start, status); } +} + +TimeZoneNames::MatchInfoCollection* +TimeZoneNamesImpl::doFind(ZNameSearchHandler& handler, + const UnicodeString& text, int32_t start, UErrorCode& status) const { + + fNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); + if (U_FAILURE(status)) { return NULL; } int32_t maxLen = 0; TimeZoneNames::MatchInfoCollection* matches = handler.getMatches(maxLen); if (matches != NULL && ((maxLen == (text.length() - start)) || fNamesTrieFullyLoaded)) { - // perfect match + // perfect match, or no more names available return matches; } - delete matches; + return NULL; +} - // All names are not yet loaded into the trie - umtx_lock(&gLock); - { - if (!fNamesTrieFullyLoaded) { - const UnicodeString *id; +// Caller must synchronize. +void TimeZoneNamesImpl::addAllNamesIntoTrie(UErrorCode& status) { + if (U_FAILURE(status)) return; + int32_t pos; + const UHashElement* element; - // load strings for all zones - StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); - if (U_SUCCESS(status)) { - while ((id = tzIDs->snext(status))) { - if (U_FAILURE(status)) { - break; + pos = UHASH_FIRST; + while ((element = uhash_nextElement(fMZNamesMap, &pos)) != NULL) { + if (element->value.pointer == EMPTY) { continue; } + UChar* mzID = (UChar*) element->key.pointer; + ZNames* znames = (ZNames*) element->value.pointer; + znames->addAsMetaZoneIntoTrie(mzID, fNamesTrie, status); + if (U_FAILURE(status)) { return; } + } + + pos = UHASH_FIRST; + while ((element = uhash_nextElement(fTZNamesMap, &pos)) != NULL) { + if (element->value.pointer == EMPTY) { continue; } + UChar* tzID = (UChar*) element->key.pointer; + ZNames* znames = (ZNames*) element->value.pointer; + znames->addAsTimeZoneIntoTrie(tzID, fNamesTrie, status); + if (U_FAILURE(status)) { return; } + } +} + +U_CDECL_BEGIN +static void U_CALLCONV +deleteZNamesLoader(void* obj) { + if (obj == DUMMY_LOADER) { return; } + const ZNames::ZNamesLoader* loader = (const ZNames::ZNamesLoader*) obj; + delete loader; +} +U_CDECL_END + +struct TimeZoneNamesImpl::ZoneStringsLoader : public ResourceSink { + TimeZoneNamesImpl& tzn; + UHashtable* keyToLoader; + + ZoneStringsLoader(TimeZoneNamesImpl& _tzn, UErrorCode& status) + : tzn(_tzn) { + keyToLoader = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &status); + if (U_FAILURE(status)) { return; } + uhash_setKeyDeleter(keyToLoader, uprv_free); + uhash_setValueDeleter(keyToLoader, deleteZNamesLoader); + } + virtual ~ZoneStringsLoader(); + + void* createKey(const char* key, UErrorCode& status) { + int32_t len = sizeof(char) * (uprv_strlen(key) + 1); + char* newKey = (char*) uprv_malloc(len); + if (newKey == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + uprv_memcpy(newKey, key, len); + newKey[len-1] = '\0'; + return (void*) newKey; + } + + UBool isMetaZone(const char* key) { + return (uprv_strlen(key) >= MZ_PREFIX_LEN && uprv_memcmp(key, gMZPrefix, MZ_PREFIX_LEN) == 0); + } + + UnicodeString mzIDFromKey(const char* key) { + return UnicodeString(key + MZ_PREFIX_LEN, uprv_strlen(key) - MZ_PREFIX_LEN, US_INV); + } + + UnicodeString tzIDFromKey(const char* key) { + UnicodeString tzID(key, -1, US_INV); + // Replace all colons ':' with slashes '/' + for (int i=0; ivalue.pointer == DUMMY_LOADER) { continue; } + ZNames::ZNamesLoader* loader = (ZNames::ZNamesLoader*) element->value.pointer; + char* key = (char*) element->key.pointer; + + if (isMetaZone(key)) { + UnicodeString mzID = mzIDFromKey(key); + ZNames::createMetaZoneAndPutInCache(tzn.fMZNamesMap, loader->getNames(), mzID, status); + } else { + UnicodeString tzID = tzIDFromKey(key); + ZNames::createTimeZoneAndPutInCache(tzn.fTZNamesMap, loader->getNames(), tzID, status); + } + if (U_FAILURE(status)) { return; } + } + } + + void consumeNamesTable(const char *key, ResourceValue &value, UBool noFallback, + UErrorCode &status) { + if (U_FAILURE(status)) { return; } + + void* loader = uhash_get(keyToLoader, key); + if (loader == NULL) { + if (isMetaZone(key)) { + UnicodeString mzID = mzIDFromKey(key); + void* cacheVal = uhash_get(tzn.fMZNamesMap, mzID.getTerminatedBuffer()); + if (cacheVal != NULL) { + // We have already loaded the names for this meta zone. + loader = (void*) DUMMY_LOADER; + } else { + loader = (void*) new ZNames::ZNamesLoader(); + if (loader == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + } + } else { + UnicodeString tzID = tzIDFromKey(key); + void* cacheVal = uhash_get(tzn.fTZNamesMap, tzID.getTerminatedBuffer()); + if (cacheVal != NULL) { + // We have already loaded the names for this time zone. + loader = (void*) DUMMY_LOADER; + } else { + loader = (void*) new ZNames::ZNamesLoader(); + if (loader == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + return; } - // loadStrings also load related metazone strings - nonConstThis->loadStrings(*id); } } - if (tzIDs != NULL) { - delete tzIDs; + + void* newKey = createKey(key, status); + if (U_FAILURE(status)) { + deleteZNamesLoader(loader); + return; } - if (U_SUCCESS(status)) { - nonConstThis->fNamesTrieFullyLoaded = TRUE; + + uhash_put(keyToLoader, newKey, loader, &status); + if (U_FAILURE(status)) { return; } + } + + if (loader != DUMMY_LOADER) { + // Let the ZNamesLoader consume the names table. + ((ZNames::ZNamesLoader*)loader)->put(key, value, noFallback, status); + } + } + + virtual void put(const char *key, ResourceValue &value, UBool noFallback, + UErrorCode &status) { + ResourceTable timeZonesTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int32_t i = 0; timeZonesTable.getKeyAndValue(i, key, value); ++i) { + U_ASSERT(!value.isNoInheritanceMarker()); + if (value.getType() == URES_TABLE) { + consumeNamesTable(key, value, noFallback, status); + } else { + // Ignore fields that aren't tables (e.g., fallbackFormat and regionFormatStandard). + // All time zone fields are tables. } + if (U_FAILURE(status)) { return; } } } - umtx_unlock(&gLock); +}; - if (U_FAILURE(status)) { - return NULL; +// Virtual destructors must be defined out of line. +TimeZoneNamesImpl::ZoneStringsLoader::~ZoneStringsLoader() { + uhash_close(keyToLoader); +} + +void TimeZoneNamesImpl::loadAllDisplayNames(UErrorCode& status) { + if (U_FAILURE(status)) return; + + { + Mutex lock(&gDataMutex); + internalLoadAllDisplayNames(status); } +} + +void TimeZoneNamesImpl::getDisplayNames(const UnicodeString& tzID, + const UTimeZoneNameType types[], int32_t numTypes, + UDate date, UnicodeString dest[], UErrorCode& status) const { + if (U_FAILURE(status)) return; + + if (tzID.isEmpty()) { return; } + void* tznames = NULL; + void* mznames = NULL; + TimeZoneNamesImpl *nonConstThis = const_cast(this); - umtx_lock(&gLock); + // Load the time zone strings { - // now try it again - fNamesTrie.search(text, start, (TextTrieMapSearchResultHandler *)&handler, status); + Mutex lock(&gDataMutex); + tznames = (void*) nonConstThis->loadTimeZoneNames(tzID, status); + if (U_FAILURE(status)) { return; } + } + U_ASSERT(tznames != NULL); + + // Load the values into the dest array + for (int i = 0; i < numTypes; i++) { + UTimeZoneNameType type = types[i]; + const UChar* name = ((ZNames*)tznames)->getName(type); + if (name == NULL) { + if (mznames == NULL) { + // Load the meta zone name + UnicodeString mzID; + getMetaZoneID(tzID, date, mzID); + if (mzID.isEmpty()) { + mznames = (void*) EMPTY; + } else { + // Load the meta zone strings + // Mutex is scoped to the "else" statement + 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 + // a dummy object instead of NULL. + if (mznames == NULL) { + mznames = (void*) EMPTY; + } + } + } + U_ASSERT(mznames != NULL); + if (mznames != EMPTY) { + name = ((ZNames*)mznames)->getName(type); + } + } + if (name != NULL) { + dest[i].setTo(TRUE, name, -1); + } else { + dest[i].setToBogus(); + } } - umtx_unlock(&gLock); +} - return handler.getMatches(maxLen); +// Caller must synchronize. +void TimeZoneNamesImpl::internalLoadAllDisplayNames(UErrorCode& status) { + if (!fNamesFullyLoaded) { + fNamesFullyLoaded = TRUE; + + ZoneStringsLoader loader(*this, status); + loader.load(status); + if (U_FAILURE(status)) { return; } + + const UnicodeString *id; + + // load strings for all zones + StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration( + UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); + if (U_SUCCESS(status)) { + while ((id = tzIDs->snext(status))) { + if (U_FAILURE(status)) { + break; + } + UnicodeString copy(*id); + void* value = uhash_get(fTZNamesMap, copy.getTerminatedBuffer()); + if (value == NULL) { + // loadStrings also loads related metazone strings + loadStrings(*id, status); + } + } + } + if (tzIDs != NULL) { + delete tzIDs; + } + } } + + static const UChar gEtcPrefix[] = { 0x45, 0x74, 0x63, 0x2F }; // "Etc/" static const int32_t gEtcPrefixLen = 4; static const UChar gSystemVPrefix[] = { 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x56, 0x2F }; // "SystemV/ @@ -1554,7 +1822,7 @@ TZDBNames::createInstance(UResourceBundle* rb, const char* key) { if (regions != NULL) { char **p = regions; for (int32_t i = 0; i < numRegions; p++, i++) { - uprv_free(p); + uprv_free(*p); } uprv_free(regions); } @@ -1982,9 +2250,10 @@ TZDBTimeZoneNames::getMetaZoneNames(const UnicodeString& mzID, UErrorCode& statu } // Use the persistent ID as the resource key, so we can // avoid duplications. - const UChar* newKey = ZoneMeta::findMetaZoneID(mzID); + // TODO: Is there a more efficient way, like intern() in Java? + void* newKey = (void*) ZoneMeta::findMetaZoneID(mzID); if (newKey != NULL) { - uhash_put(gTZDBNamesMap, (void *)newKey, cacheVal, &status); + uhash_put(gTZDBNamesMap, newKey, cacheVal, &status); if (U_FAILURE(status)) { if (tzdbNames != NULL) { delete tzdbNames; diff --git a/deps/icu-small/source/i18n/tznames_impl.h b/deps/icu-small/source/i18n/tznames_impl.h index 5e5d96829e79ca..6b913bb6bf8c1b 100644 --- a/deps/icu-small/source/i18n/tznames_impl.h +++ b/deps/icu-small/source/i18n/tznames_impl.h @@ -1,7 +1,9 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* - * Copyright (C) 2011-2014, International Business Machines Corporation and * - * others. All Rights Reserved. * + * Copyright (C) 2011-2016, International Business Machines Corporation and + * others. All Rights Reserved. ******************************************************************************* */ @@ -159,8 +161,8 @@ class U_I18N_API TextTrieMap : public UMemory { class ZNames; -class TZNames; class TextTrieMap; +class ZNameSearchHandler; class TimeZoneNamesImpl : public TimeZoneNames { public: @@ -184,6 +186,9 @@ class TimeZoneNamesImpl : public TimeZoneNames { TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const; + void loadAllDisplayNames(UErrorCode& status); + void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const; + static UnicodeString& getDefaultExemplarLocationName(const UnicodeString& tzID, UnicodeString& name); static StringEnumeration* _getAvailableMetaZoneIDs(UErrorCode& status); @@ -201,15 +206,23 @@ class TimeZoneNamesImpl : public TimeZoneNames { UHashtable* fMZNamesMap; UBool fNamesTrieFullyLoaded; + UBool fNamesFullyLoaded; TextTrieMap fNamesTrie; void initialize(const Locale& locale, UErrorCode& status); void cleanup(); - void loadStrings(const UnicodeString& tzCanonicalID); + void loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& status); + + ZNames* loadMetaZoneNames(const UnicodeString& mzId, UErrorCode& status); + ZNames* loadTimeZoneNames(const UnicodeString& mzId, UErrorCode& status); + TimeZoneNames::MatchInfoCollection* doFind(ZNameSearchHandler& handler, + const UnicodeString& text, int32_t start, UErrorCode& status) const; + void addAllNamesIntoTrie(UErrorCode& errorCode); + + void internalLoadAllDisplayNames(UErrorCode& status); - ZNames* loadMetaZoneNames(const UnicodeString& mzId); - TZNames* loadTimeZoneNames(const UnicodeString& mzId); + struct ZoneStringsLoader; }; class TZDBNames; diff --git a/deps/icu-small/source/i18n/tzrule.cpp b/deps/icu-small/source/i18n/tzrule.cpp index 59e1f44c87d975..2ff61302b8180e 100644 --- a/deps/icu-small/source/i18n/tzrule.cpp +++ b/deps/icu-small/source/i18n/tzrule.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/tztrans.cpp b/deps/icu-small/source/i18n/tztrans.cpp index 6e0ddf6d39b8aa..76e259c5aef672 100644 --- a/deps/icu-small/source/i18n/tztrans.cpp +++ b/deps/icu-small/source/i18n/tztrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/ucal.cpp b/deps/icu-small/source/i18n/ucal.cpp index c405701ece9121..a9377b1e511f9e 100644 --- a/deps/icu-small/source/i18n/ucal.cpp +++ b/deps/icu-small/source/i18n/ucal.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/ucln_in.cpp b/deps/icu-small/source/i18n/ucln_in.cpp index 49e6b37fd0f6df..b33a68923767ca 100644 --- a/deps/icu-small/source/i18n/ucln_in.cpp +++ b/deps/icu-small/source/i18n/ucln_in.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * @@ -28,7 +30,7 @@ static const char copyright[] = U_COPYRIGHT_STRING; static cleanupFunc *gCleanupFunctions[UCLN_I18N_COUNT]; -static UBool i18n_cleanup(void) +static UBool U_CALLCONV i18n_cleanup(void) { int32_t libType = UCLN_I18N_START; (void)copyright; /* Suppress unused variable warning with clang. */ diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 3fdec6db0d5686..b609fce0c2da5a 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2016, International Business Machines @@ -24,8 +26,8 @@ as the functions are suppose to be called. It's usually best to have child dependencies called first. */ typedef enum ECleanupI18NType { UCLN_I18N_START = -1, - UCLN_I18N_IDENTIFIER_INFO, UCLN_I18N_SPOOF, + UCLN_I18N_SPOOFDATA, UCLN_I18N_TRANSLITERATOR, UCLN_I18N_REGEX, UCLN_I18N_ISLAMIC_CALENDAR, @@ -40,6 +42,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_TIMEZONENAMES, UCLN_I18N_ZONEMETA, UCLN_I18N_TIMEZONE, + UCLN_I18N_DIGITLIST, UCLN_I18N_DECFMT, UCLN_I18N_NUMFMT, UCLN_I18N_ALLOWED_HOUR_FORMATS, diff --git a/deps/icu-small/source/i18n/ucol.cpp b/deps/icu-small/source/i18n/ucol.cpp index b950756d4075b1..c622aef7c245b7 100644 --- a/deps/icu-small/source/i18n/ucol.cpp +++ b/deps/icu-small/source/i18n/ucol.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/ucol_imp.h b/deps/icu-small/source/i18n/ucol_imp.h index bfa2bb445af30d..7c9e8f68911209 100644 --- a/deps/icu-small/source/i18n/ucol_imp.h +++ b/deps/icu-small/source/i18n/ucol_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -76,7 +78,7 @@ class CollationLoader { const CollationCacheEntry *createCacheEntry(UErrorCode &errorCode); private: - static void loadRootRules(UErrorCode &errorCode); + static void U_CALLCONV loadRootRules(UErrorCode &errorCode); // The following members are used by loadTailoring() // and the cache callback. diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index d7e2ab427c9f4d..314b766ee6db02 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 1996-2014, International Business Machines +* Copyright (C) 1996-2016, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol_res.cpp @@ -34,11 +36,13 @@ #include "unicode/uloc.h" #include "unicode/unistr.h" #include "unicode/ures.h" +#include "charstr.h" #include "cmemory.h" #include "cstring.h" #include "collationdatareader.h" #include "collationroot.h" #include "collationtailoring.h" +#include "resource.h" #include "putilimp.h" #include "uassert.h" #include "ucln_in.h" @@ -74,9 +78,7 @@ ucol_res_cleanup() { return TRUE; } -U_CDECL_END - -void +void U_CALLCONV CollationLoader::loadRootRules(UErrorCode &errorCode) { if(U_FAILURE(errorCode)) { return; } rootBundle = ures_open(U_ICUDATA_COLL, kRootLocaleName, &errorCode); @@ -90,6 +92,8 @@ CollationLoader::loadRootRules(UErrorCode &errorCode) { ucln_i18n_registerCleanup(UCLN_I18N_UCOL_RES, ucol_res_cleanup); } +U_CDECL_END + void CollationLoader::appendRootRules(UnicodeString &s) { UErrorCode errorCode = U_ZERO_ERROR; @@ -501,8 +505,6 @@ U_CAPI UCollator* ucol_open(const char *loc, UErrorCode *status) { - U_NAMESPACE_USE - UTRACE_ENTRY_OC(UTRACE_UCOL_OPEN); UTRACE_DATA1(UTRACE_INFO, "locale = \"%s\"", loc); UCollator *result = NULL; @@ -523,8 +525,6 @@ ucol_getDisplayName( const char *objLoc, int32_t resultLength, UErrorCode *status) { - U_NAMESPACE_USE - if(U_FAILURE(*status)) return -1; UnicodeString dst; if(!(result==NULL && resultLength==0)) { @@ -558,8 +558,6 @@ ucol_countAvailable() #if !UCONFIG_NO_SERVICE U_CAPI UEnumeration* U_EXPORT2 ucol_openAvailableLocales(UErrorCode *status) { - U_NAMESPACE_USE - // This is a wrapper over Collator::getAvailableLocales() if (U_FAILURE(*status)) { return NULL; @@ -615,119 +613,75 @@ static const UEnumeration defaultKeywordValues = { ulist_reset_keyword_values_iterator }; -#include - -U_CAPI UEnumeration* U_EXPORT2 -ucol_getKeywordValuesForLocale(const char* /*key*/, const char* locale, - UBool /*commonlyUsed*/, UErrorCode* status) { - /* Get the locale base name. */ - char localeBuffer[ULOC_FULLNAME_CAPACITY] = ""; - uloc_getBaseName(locale, localeBuffer, sizeof(localeBuffer), status); - - /* Create the 2 lists - * -values is the temp location for the keyword values - * -results hold the actual list used by the UEnumeration object - */ - UList *values = ulist_createEmptyList(status); - UList *results = ulist_createEmptyList(status); - UEnumeration *en = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); - if (U_FAILURE(*status) || en == NULL) { - if (en == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - } else { - uprv_free(en); - } - ulist_deleteList(values); - ulist_deleteList(results); - return NULL; - } +namespace { - memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); - en->context = results; - - /* Open the resource bundle for collation with the given locale. */ - UResourceBundle bundle, collations, collres, defres; - ures_initStackObject(&bundle); - ures_initStackObject(&collations); - ures_initStackObject(&collres); - ures_initStackObject(&defres); - - ures_openFillIn(&bundle, U_ICUDATA_COLL, localeBuffer, status); - - while (U_SUCCESS(*status)) { - ures_getByKey(&bundle, RESOURCE_NAME, &collations, status); - ures_resetIterator(&collations); - while (U_SUCCESS(*status) && ures_hasNext(&collations)) { - ures_getNextResource(&collations, &collres, status); - const char *key = ures_getKey(&collres); - /* If the key is default, get the string and store it in results list only - * if results list is empty. - */ - if (uprv_strcmp(key, "default") == 0) { - if (ulist_getListSize(results) == 0) { - char *defcoll = (char *)uprv_malloc(sizeof(char) * ULOC_KEYWORDS_CAPACITY); - int32_t defcollLength = ULOC_KEYWORDS_CAPACITY; - - ures_getNextResource(&collres, &defres, status); -#if U_CHARSET_FAMILY==U_ASCII_FAMILY - /* optimize - use the utf-8 string */ - ures_getUTF8String(&defres, defcoll, &defcollLength, TRUE, status); -#else - { - const UChar* defString = ures_getString(&defres, &defcollLength, status); - if(U_SUCCESS(*status)) { - if(defcollLength+1 > ULOC_KEYWORDS_CAPACITY) { - *status = U_BUFFER_OVERFLOW_ERROR; - } else { - u_UCharsToChars(defString, defcoll, defcollLength+1); - } - } +struct KeywordsSink : public ResourceSink { +public: + KeywordsSink(UErrorCode &errorCode) : + values(ulist_createEmptyList(&errorCode)), hasDefault(FALSE) {} + virtual ~KeywordsSink(); + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return; } + ResourceTable collations = value.getTable(errorCode); + for (int32_t i = 0; collations.getKeyAndValue(i, key, value); ++i) { + UResType type = value.getType(); + if (type == URES_STRING) { + if (!hasDefault && uprv_strcmp(key, "default") == 0) { + CharString defcoll; + defcoll.appendInvariantChars(value.getUnicodeString(errorCode), errorCode); + if (U_SUCCESS(errorCode) && !defcoll.isEmpty()) { + char *ownedDefault = uprv_strdup(defcoll.data()); + if (ownedDefault == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + ulist_removeString(values, defcoll.data()); + ulist_addItemBeginList(values, ownedDefault, TRUE, &errorCode); + hasDefault = TRUE; } -#endif - - ulist_addItemBeginList(results, defcoll, TRUE, status); } - } else if (uprv_strncmp(key, "private-", 8) != 0) { - ulist_addItemEndList(values, key, FALSE, status); - } - } - - /* If the locale is "" this is root so exit. */ - if (uprv_strlen(localeBuffer) == 0) { - break; - } - /* Get the parent locale and open a new resource bundle. */ - uloc_getParent(localeBuffer, localeBuffer, sizeof(localeBuffer), status); - ures_openFillIn(&bundle, U_ICUDATA_COLL, localeBuffer, status); - } - - ures_close(&defres); - ures_close(&collres); - ures_close(&collations); - ures_close(&bundle); - - if (U_SUCCESS(*status)) { - char *value = NULL; - ulist_resetList(values); - while ((value = (char *)ulist_getNext(values)) != NULL) { - if (!ulist_containsString(results, value, (int32_t)uprv_strlen(value))) { - ulist_addItemEndList(results, value, FALSE, status); - if (U_FAILURE(*status)) { - break; + } else if (type == URES_TABLE && uprv_strncmp(key, "private-", 8) != 0) { + if (!ulist_containsString(values, key, (int32_t)uprv_strlen(key))) { + ulist_addItemEndList(values, key, FALSE, &errorCode); } } + if (U_FAILURE(errorCode)) { return; } } } + UList *values; + UBool hasDefault; +}; + +KeywordsSink::~KeywordsSink() { ulist_deleteList(values); +} - if (U_FAILURE(*status)){ - uenum_close(en); - en = NULL; - } else { - ulist_resetList(results); - } +} // namespace + +U_CAPI UEnumeration* U_EXPORT2 +ucol_getKeywordValuesForLocale(const char* /*key*/, const char* locale, + UBool /*commonlyUsed*/, UErrorCode* status) { + // Note: The parameter commonlyUsed is not used. + // The switch is in the method signature for consistency + // with other locale services. + + // Read available collation values from collation bundles. + LocalUResourceBundlePointer bundle(ures_open(U_ICUDATA_COLL, locale, status)); + KeywordsSink sink(*status); + ures_getAllItemsWithFallback(bundle.getAlias(), RESOURCE_NAME, sink, *status); + if (U_FAILURE(*status)) { return NULL; } + UEnumeration *en = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); + if (en == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); + en->context = sink.values; + sink.values = NULL; // Avoid deletion in the sink destructor. return en; } diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index 5d9e0d4546d765..c81977b8a34cc0 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2004-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/ucoleitr.cpp b/deps/icu-small/source/i18n/ucoleitr.cpp index 6ccabded67c898..4b46b205aa07db 100644 --- a/deps/icu-small/source/i18n/ucoleitr.cpp +++ b/deps/icu-small/source/i18n/ucoleitr.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 2001-2016, International Business Machines @@ -34,9 +36,9 @@ U_NAMESPACE_USE #define DEFAULT_BUFFER_SIZE 16 #define BUFFER_GROW 8 -#define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0]) +#define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (size_t)(count) * sizeof (src)[0]) -#define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type)) +#define NEW_ARRAY(type, count) (type *) uprv_malloc((size_t)(count) * sizeof(type)) #define DELETE_ARRAY(array) uprv_free((void *) (array)) diff --git a/deps/icu-small/source/i18n/ucsdet.cpp b/deps/icu-small/source/i18n/ucsdet.cpp index f0445427c706a6..dd69d9f548b78a 100644 --- a/deps/icu-small/source/i18n/ucsdet.cpp +++ b/deps/icu-small/source/i18n/ucsdet.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/udat.cpp b/deps/icu-small/source/i18n/udat.cpp index 7b65aa739a47d3..b07e1ceab7436d 100644 --- a/deps/icu-small/source/i18n/udat.cpp +++ b/deps/icu-small/source/i18n/udat.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/udateintervalformat.cpp b/deps/icu-small/source/i18n/udateintervalformat.cpp index ef6fc197c75680..e6eec44847453c 100644 --- a/deps/icu-small/source/i18n/udateintervalformat.cpp +++ b/deps/icu-small/source/i18n/udateintervalformat.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2010-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/udatpg.cpp b/deps/icu-small/source/i18n/udatpg.cpp index d0bafa30a89cc5..d8824afdfc4adf 100644 --- a/deps/icu-small/source/i18n/udatpg.cpp +++ b/deps/icu-small/source/i18n/udatpg.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/ufieldpositer.cpp b/deps/icu-small/source/i18n/ufieldpositer.cpp index 7f8688425d6fb6..b1c9c64805889c 100644 --- a/deps/icu-small/source/i18n/ufieldpositer.cpp +++ b/deps/icu-small/source/i18n/ufieldpositer.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/uitercollationiterator.cpp b/deps/icu-small/source/i18n/uitercollationiterator.cpp index f717282eac03b8..eb71725380a635 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.cpp +++ b/deps/icu-small/source/i18n/uitercollationiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/uitercollationiterator.h b/deps/icu-small/source/i18n/uitercollationiterator.h index a64f88561b3b33..da9f8d34687d0b 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.h +++ b/deps/icu-small/source/i18n/uitercollationiterator.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/ulocdata.c b/deps/icu-small/source/i18n/ulocdata.c index fc84756d4c88f4..e1e61ce8706abc 100644 --- a/deps/icu-small/source/i18n/ulocdata.c +++ b/deps/icu-small/source/i18n/ulocdata.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index d4a55818cdbe17..75647e37d6bbdf 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -469,7 +471,7 @@ umsg_vformat( const UMessageFormat *fmt, } } UnicodeString resultStr; - FieldPosition fieldPosition(0); + FieldPosition fieldPosition(FieldPosition::DONT_CARE); /* format the message */ ((const MessageFormat*)fmt)->format(args,count,resultStr,fieldPosition,*status); diff --git a/deps/icu-small/source/i18n/umsg_imp.h b/deps/icu-small/source/i18n/umsg_imp.h index 78bbf966bcec1c..e3538d39710f31 100644 --- a/deps/icu-small/source/i18n/umsg_imp.h +++ b/deps/icu-small/source/i18n/umsg_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001, International Business Machines diff --git a/deps/icu-small/source/i18n/unesctrn.cpp b/deps/icu-small/source/i18n/unesctrn.cpp index a4e9358ae68052..2e79067dee6aa9 100644 --- a/deps/icu-small/source/i18n/unesctrn.cpp +++ b/deps/icu-small/source/i18n/unesctrn.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2011, International Business Machines @@ -85,7 +87,7 @@ static UChar* copySpec(const UChar* spec) { UChar *result = (UChar *)uprv_malloc(len*sizeof(UChar)); // Check for memory allocation error. if (result != NULL) { - uprv_memcpy(result, spec, len*sizeof(result[0])); + uprv_memcpy(result, spec, (size_t)len*sizeof(result[0])); } return result; } diff --git a/deps/icu-small/source/i18n/unesctrn.h b/deps/icu-small/source/i18n/unesctrn.h index bfde6fc134fdd7..7ae8302b0fcb33 100644 --- a/deps/icu-small/source/i18n/unesctrn.h +++ b/deps/icu-small/source/i18n/unesctrn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/uni2name.cpp b/deps/icu-small/source/i18n/uni2name.cpp index a10fa14c7f31f7..24323b3f60642f 100644 --- a/deps/icu-small/source/i18n/uni2name.cpp +++ b/deps/icu-small/source/i18n/uni2name.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/uni2name.h b/deps/icu-small/source/i18n/uni2name.h index aede864564a65b..7d85113f665b1d 100644 --- a/deps/icu-small/source/i18n/uni2name.h +++ b/deps/icu-small/source/i18n/uni2name.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2007, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/alphaindex.h b/deps/icu-small/source/i18n/unicode/alphaindex.h index 9116ccc26c1d36..e9e8739ed28a00 100644 --- a/deps/icu-small/source/i18n/unicode/alphaindex.h +++ b/deps/icu-small/source/i18n/unicode/alphaindex.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/i18n/unicode/basictz.h b/deps/icu-small/source/i18n/unicode/basictz.h index 5b470382507f54..8da4a00bf877be 100644 --- a/deps/icu-small/source/i18n/unicode/basictz.h +++ b/deps/icu-small/source/i18n/unicode/basictz.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index 35252bb9c809a0..b7da5f3c5b8b94 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/choicfmt.h b/deps/icu-small/source/i18n/unicode/choicfmt.h index cfd520624dc53a..ab3c28fe0740d7 100644 --- a/deps/icu-small/source/i18n/unicode/choicfmt.h +++ b/deps/icu-small/source/i18n/unicode/choicfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/coleitr.h b/deps/icu-small/source/i18n/unicode/coleitr.h index f07ada7b6703a2..628b461f9453d4 100644 --- a/deps/icu-small/source/i18n/unicode/coleitr.h +++ b/deps/icu-small/source/i18n/unicode/coleitr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1997-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/coll.h b/deps/icu-small/source/i18n/unicode/coll.h index 5468342716b6d4..e41be2ee81a25c 100644 --- a/deps/icu-small/source/i18n/unicode/coll.h +++ b/deps/icu-small/source/i18n/unicode/coll.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1996-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/compactdecimalformat.h b/deps/icu-small/source/i18n/unicode/compactdecimalformat.h index ced6bee5994a4f..1fcc5c581e089d 100644 --- a/deps/icu-small/source/i18n/unicode/compactdecimalformat.h +++ b/deps/icu-small/source/i18n/unicode/compactdecimalformat.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2012-2016, International Business Machines @@ -157,7 +159,6 @@ class U_I18N_API CompactDecimalFormat : public DecimalFormat { FieldPositionIterator* posIter, UErrorCode& status) const; - /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual. */ /** * Format a long number using base-10 representation. * @@ -167,7 +168,7 @@ class U_I18N_API CompactDecimalFormat : public DecimalFormat { * @param pos On input: an alignment field, if desired. * On output: the offsets of the alignment field. * @return Reference to 'appendTo' parameter. - * @draft ICU 56 + * @stable ICU 56 */ virtual UnicodeString& format(int32_t number, UnicodeString& appendTo, @@ -274,7 +275,7 @@ class U_I18N_API CompactDecimalFormat : public DecimalFormat { * @return Reference to 'appendTo' parameter. * @internal */ - virtual UnicodeString& format(const StringPiece &number, + virtual UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const; diff --git a/deps/icu-small/source/i18n/unicode/curramt.h b/deps/icu-small/source/i18n/unicode/curramt.h index ce9acbfd5cda7c..268d53c0b15f7e 100644 --- a/deps/icu-small/source/i18n/unicode/curramt.h +++ b/deps/icu-small/source/i18n/unicode/curramt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2006, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/currpinf.h b/deps/icu-small/source/i18n/unicode/currpinf.h index 4f1f8962c38896..133de38fc2fd99 100644 --- a/deps/icu-small/source/i18n/unicode/currpinf.h +++ b/deps/icu-small/source/i18n/unicode/currpinf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2015, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index 93ecd2c48906e2..313c92a6acacfc 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/datefmt.h b/deps/icu-small/source/i18n/unicode/datefmt.h index 2ccac7976037d9..6e3a78f2913ce1 100644 --- a/deps/icu-small/source/i18n/unicode/datefmt.h +++ b/deps/icu-small/source/i18n/unicode/datefmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h index 9b406b14172b43..946227addb7557 100644 --- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index e7f8ea592e09af..7339399f72e001 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -968,7 +970,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(double number, UnicodeString& appendTo, @@ -1017,7 +1019,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(int32_t number, UnicodeString& appendTo, @@ -1066,7 +1068,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(int64_t number, UnicodeString& appendTo, @@ -1087,9 +1089,9 @@ class U_I18N_API DecimalFormat: public NumberFormat { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ - virtual UnicodeString& format(const StringPiece &number, + virtual UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const; @@ -2101,6 +2103,8 @@ class U_I18N_API DecimalFormat: public NumberFormat { DecimalFormatSymbols* symbolsToAdopt = 0 ); + void handleCurrencySignInPattern(UErrorCode& status); + void parse(const UnicodeString& text, Formattable& result, ParsePosition& pos, diff --git a/deps/icu-small/source/i18n/unicode/dtfmtsym.h b/deps/icu-small/source/i18n/unicode/dtfmtsym.h index c338c46fac2dbc..507868e2c328fb 100644 --- a/deps/icu-small/source/i18n/unicode/dtfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dtfmtsym.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines @@ -270,9 +272,15 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { * @stable ICU 3.6 */ enum DtContextType { - FORMAT, - STANDALONE, - DT_CONTEXT_COUNT + FORMAT, + STANDALONE, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal DtContextType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + DT_CONTEXT_COUNT +#endif // U_HIDE_DEPRECATED_API }; /** @@ -280,17 +288,21 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { * @stable ICU 3.6 */ enum DtWidthType { - ABBREVIATED, - WIDE, - NARROW, - /** - * Short width is currently only supported for weekday names. - * @stable ICU 51 - */ - SHORT, - /** - */ - DT_WIDTH_COUNT = 4 + ABBREVIATED, + WIDE, + NARROW, + /** + * Short width is currently only supported for weekday names. + * @stable ICU 51 + */ + SHORT, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal DtWidthType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + DT_WIDTH_COUNT = 4 +#endif // U_HIDE_DEPRECATED_API }; /** diff --git a/deps/icu-small/source/i18n/unicode/dtitvfmt.h b/deps/icu-small/source/i18n/unicode/dtitvfmt.h index 181d46c8e0af72..68360b87dffaf5 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvfmt.h +++ b/deps/icu-small/source/i18n/unicode/dtitvfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************** * Copyright (C) 2008-2016, International Business Machines Corporation and * others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/unicode/dtitvinf.h b/deps/icu-small/source/i18n/unicode/dtitvinf.h index 1c7f3983df991e..b31061e16aff10 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvinf.h +++ b/deps/icu-small/source/i18n/unicode/dtitvinf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2016, International Business Machines Corporation and @@ -150,7 +152,8 @@ U_NAMESPACE_BEGIN class U_I18N_API DateIntervalInfo U_FINAL : public UObject { public: -#ifndef U_HIDE_INTERNAL_API + // Do not enclose the protected default constructor with #ifndef U_HIDE_INTERNAL_API + // or else the compiler will create a public default constructor. /** * Default constructor. * It does not initialize any interval patterns except @@ -165,7 +168,6 @@ class U_I18N_API DateIntervalInfo U_FINAL : public UObject { * @internal ICU 4.0 */ DateIntervalInfo(UErrorCode& status); -#endif /* U_HIDE_INTERNAL_API */ /** @@ -339,7 +341,10 @@ class U_I18N_API DateIntervalInfo U_FINAL : public UObject { */ friend class DateIntervalFormat; - friend struct DateIntervalSink; + /** + * Internal struct used to load resource bundle data. + */ + struct DateIntervalSink; /** * Following is for saving the interval patterns. diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index eb8a44541e061c..fd617ce3cdcbfb 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -1,3 +1,5 @@ +// Copyright (C) 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 @@ -116,7 +118,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { */ UBool operator!=(const DateTimePatternGenerator& other) const; -#ifndef U_HIDE_DRAFT_API /** * Utility to return a unique skeleton from a given pattern. For example, * both "MMM-dd" and "dd/MMM" produce the skeleton "MMMdd". @@ -125,10 +126,9 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param status Output param set to success/failure code on exit, * which must not indicate a failure before the function call. * @return skeleton such as "MMMdd" - * @draft ICU 56 + * @stable ICU 56 */ static UnicodeString staticGetSkeleton(const UnicodeString& pattern, UErrorCode& status); -#endif /* U_HIDE_DRAFT_API */ /** * Utility to return a unique skeleton from a given pattern. For example, @@ -149,7 +149,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { return staticGetSkeleton(pattern, status); }*/ -#ifndef U_HIDE_DRAFT_API /** * Utility to return a unique base skeleton from a given pattern. This is * the same as the skeleton, except that differences in length are minimized @@ -161,10 +160,9 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @param status Output param set to success/failure code on exit, * which must not indicate a failure before the function call. * @return base skeleton, such as "MMMd" - * @draft ICU 56 + * @stable ICU 56 */ static UnicodeString staticGetBaseSkeleton(const UnicodeString& pattern, UErrorCode& status); -#endif /* U_HIDE_DRAFT_API */ /** * Utility to return a unique base skeleton from a given pattern. This is @@ -518,7 +516,6 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UnicodeString decimal; DateTimeMatcher *skipMatcher; Hashtable *fAvailableFormatKeyHash; - UnicodeString hackPattern; UnicodeString emptyString; UChar fDefaultHourFormatChar; @@ -534,9 +531,11 @@ class U_I18N_API DateTimePatternGenerator : public UObject { }; void initData(const Locale &locale, UErrorCode &status); - void addCanonicalItems(); + void addCanonicalItems(UErrorCode &status); void addICUPatterns(const Locale& locale, UErrorCode& status); void hackTimes(const UnicodeString& hackPattern, UErrorCode& status); + void getCalendarTypeToUse(const Locale& locale, CharString& destination, UErrorCode& err); + void consumeShortTimePattern(const UnicodeString& shortTimePattern, UErrorCode& status); void addCLDRData(const Locale& locale, UErrorCode& status); UDateTimePatternConflict addPatternWithSkeleton(const UnicodeString& pattern, const UnicodeString * skeletonToUse, UBool override, UnicodeString& conflictingPattern, UErrorCode& status); void initHashtable(UErrorCode& status); @@ -544,6 +543,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { void setDecimalSymbols(const Locale& locale, UErrorCode& status); UDateTimePatternField getAppendFormatNumber(const char* field) const; UDateTimePatternField getAppendNameNumber(const char* field) const; + UnicodeString& getMutableAppendItemName(UDateTimePatternField field); void getAppendName(UDateTimePatternField field, UnicodeString& value); int32_t getCanonicalIndex(const UnicodeString& field); const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, const PtnSkeleton** specifiedSkeletonPtr = 0); @@ -554,8 +554,12 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UBool isAvailableFormatSet(const UnicodeString &key) const; void copyHashtable(Hashtable *other, UErrorCode &status); UBool isCanonicalItem(const UnicodeString& item) const; - static void loadAllowedHourFormatsData(UErrorCode &status); + static void U_CALLCONV loadAllowedHourFormatsData(UErrorCode &status); void getAllowedHourFormats(const Locale &locale, UErrorCode &status); + + struct AppendItemFormatsSink; + struct AppendItemNamesSink; + struct AvailableFormatsSink; } ;// end class DateTimePatternGenerator U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/unicode/dtrule.h b/deps/icu-small/source/i18n/unicode/dtrule.h index 3ef080b4eb0ee9..32d230ea778244 100644 --- a/deps/icu-small/source/i18n/unicode/dtrule.h +++ b/deps/icu-small/source/i18n/unicode/dtrule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2008, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/fieldpos.h b/deps/icu-small/source/i18n/unicode/fieldpos.h index b3d64b4e842186..6091941106e87d 100644 --- a/deps/icu-small/source/i18n/unicode/fieldpos.h +++ b/deps/icu-small/source/i18n/unicode/fieldpos.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2006, International Business Machines @@ -56,7 +58,7 @@ U_NAMESPACE_BEGIN * to perform partial formatting or to get information about the * formatted output (such as the position of a field). * - * The FieldPosition class is not suitable for subclassing. + * The FieldPosition class is not intended for public subclassing. * *

* Below is an example of using FieldPosition to aid @@ -107,7 +109,8 @@ class U_I18N_API FieldPosition : public UObject { public: /** * DONT_CARE may be specified as the field to indicate that the - * caller doesn't need to specify a field. Do not subclass. + * caller doesn't need to specify a field. + * @stable ICU 2.0 */ enum { DONT_CARE = -1 }; diff --git a/deps/icu-small/source/i18n/unicode/fmtable.h b/deps/icu-small/source/i18n/unicode/fmtable.h index 6cad276f42366c..ac5daba893646f 100644 --- a/deps/icu-small/source/i18n/unicode/fmtable.h +++ b/deps/icu-small/source/i18n/unicode/fmtable.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2014, International Business Machines @@ -134,7 +136,7 @@ class U_I18N_API Formattable : public UObject { * decimal number. * @stable ICU 4.4 */ - Formattable(const StringPiece &number, UErrorCode &status); + Formattable(StringPiece number, UErrorCode &status); /** * Creates a Formattable object with a UnicodeString object to copy from. @@ -581,7 +583,7 @@ class U_I18N_API Formattable : public UObject { * incoming string is not a valid decimal number. * @stable ICU 4.4 */ - void setDecimalNumber(const StringPiece &numberString, + void setDecimalNumber(StringPiece numberString, UErrorCode &status); /** diff --git a/deps/icu-small/source/i18n/unicode/format.h b/deps/icu-small/source/i18n/unicode/format.h index 7bbd32df6adee6..1484e9f00edf6d 100644 --- a/deps/icu-small/source/i18n/unicode/format.h +++ b/deps/icu-small/source/i18n/unicode/format.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2011, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 20e78714dc071c..694a1d8770d019 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2010-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/gender.h b/deps/icu-small/source/i18n/unicode/gender.h index cbb73916c66ce7..02948951843c10 100644 --- a/deps/icu-small/source/i18n/unicode/gender.h +++ b/deps/icu-small/source/i18n/unicode/gender.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/gregocal.h b/deps/icu-small/source/i18n/unicode/gregocal.h index 1e507d3bb7b620..60ba0cc6acf6f4 100644 --- a/deps/icu-small/source/i18n/unicode/gregocal.h +++ b/deps/icu-small/source/i18n/unicode/gregocal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2013, International Business Machines Corporation and others. * All Rights Reserved. diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index c177a963f80b63..866d7d3227cae7 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2016, International Business Machines @@ -59,11 +61,13 @@ enum UMeasureFormatWidth { */ UMEASFMT_WIDTH_NUMERIC, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of values in this enum. - * @stable ICU 53 + * One more than the highest normal UMeasureFormatWidth value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UMEASFMT_WIDTH_COUNT = 4 +#endif // U_HIDE_DEPRECATED_API }; /** @stable ICU 53 */ typedef enum UMeasureFormatWidth UMeasureFormatWidth; @@ -206,6 +210,21 @@ class U_I18N_API MeasureFormat : public Format { FieldPosition &pos, UErrorCode &status) const; +#ifndef U_HIDE_DRAFT_API + /** + * Gets the display name of the specified {@link MeasureUnit} corresponding to the current + * locale and format width. + * @param unit The unit for which to get a display name. + * @param status the error. + * @return The display name in the locale and width specified in + * {@link MeasureFormat#getInstance}, or null if there is no display name available + * for the specified unit. + * + * @draft ICU 58 + */ + UnicodeString getUnitDisplayName(const MeasureUnit& unit, UErrorCode &status) const; +#endif /* U_HIDE_DRAFT_API */ + /** * Return a formatter for CurrencyAmount objects in the given diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 8f8c92415b9dc2..9810b91194616b 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2016, International Business Machines @@ -255,15 +257,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createRadian(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of angle: revolution. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createRevolutionAngle(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of area: acre. @@ -375,15 +375,13 @@ class U_I18N_API MeasureUnit: public UObject { static MeasureUnit *createPartPerMillion(UErrorCode &status); #endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API /** * Returns unit of consumption: liter-per-100kilometers. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createLiterPer100Kilometers(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of consumption: liter-per-kilometer. @@ -411,6 +409,46 @@ class U_I18N_API MeasureUnit: public UObject { static MeasureUnit *createMilePerGallonImperial(UErrorCode &status); #endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DRAFT_API + /** + * Returns unit of coordinate: east. + * Caller owns returned value and must free it. + * @param status ICU error code. + * @draft ICU 58 + */ + static MeasureUnit *createEast(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns unit of coordinate: north. + * Caller owns returned value and must free it. + * @param status ICU error code. + * @draft ICU 58 + */ + static MeasureUnit *createNorth(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns unit of coordinate: south. + * Caller owns returned value and must free it. + * @param status ICU error code. + * @draft ICU 58 + */ + static MeasureUnit *createSouth(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DRAFT_API + /** + * Returns unit of coordinate: west. + * Caller owns returned value and must free it. + * @param status ICU error code. + * @draft ICU 58 + */ + static MeasureUnit *createWest(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns unit of digital: bit. * Caller owns returned value and must free it. @@ -491,15 +529,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createTerabyte(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of duration: century. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createCentury(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of duration: day. @@ -789,15 +825,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createMile(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of length: mile-scandinavian. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createMileScandinavian(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of length: millimeter. @@ -1039,15 +1073,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createKilometerPerHour(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of speed: knot. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createKnot(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of speed: meter-per-second. @@ -1081,15 +1113,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createFahrenheit(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of temperature: generic. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createGenericTemperature(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of temperature: kelvin. @@ -1187,15 +1217,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createCup(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of volume: cup-metric. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createCupMetric(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of volume: deciliter. @@ -1271,15 +1299,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createPint(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of volume: pint-metric. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 56 + * @stable ICU 56 */ static MeasureUnit *createPintMetric(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of volume: quart. diff --git a/deps/icu-small/source/i18n/unicode/measure.h b/deps/icu-small/source/i18n/unicode/measure.h index a9c75989965ae6..719bc6bc8f6054 100644 --- a/deps/icu-small/source/i18n/unicode/measure.h +++ b/deps/icu-small/source/i18n/unicode/measure.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2004-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/msgfmt.h b/deps/icu-small/source/i18n/unicode/msgfmt.h index 5de91e41ff70c3..1a9973872d627d 100644 --- a/deps/icu-small/source/i18n/unicode/msgfmt.h +++ b/deps/icu-small/source/i18n/unicode/msgfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2007-2013, International Business Machines Corporation and * others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index 072b566da13a18..9e3d5d34ec4cca 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2016, International Business Machines Corporation and others. @@ -266,7 +268,7 @@ class U_I18N_API NumberFormat : public Format { * NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo, @@ -389,7 +391,7 @@ class U_I18N_API NumberFormat : public Format { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(double number, UnicodeString& appendTo, @@ -441,7 +443,7 @@ class U_I18N_API NumberFormat : public Format { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(int32_t number, UnicodeString& appendTo, @@ -494,7 +496,7 @@ class U_I18N_API NumberFormat : public Format { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ virtual UnicodeString& format(int64_t number, UnicodeString& appendTo, @@ -515,9 +517,9 @@ class U_I18N_API NumberFormat : public Format { * Can be NULL. * @param status Output param filled with success/failure status. * @return Reference to 'appendTo' parameter. - * @stable 4.4 + * @stable ICU 4.4 */ - virtual UnicodeString& format(const StringPiece &number, + virtual UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, UErrorCode& status) const; diff --git a/deps/icu-small/source/i18n/unicode/numsys.h b/deps/icu-small/source/i18n/unicode/numsys.h index 2b21afc074ac5f..da181551c272d0 100644 --- a/deps/icu-small/source/i18n/unicode/numsys.h +++ b/deps/icu-small/source/i18n/unicode/numsys.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/plurfmt.h b/deps/icu-small/source/i18n/unicode/plurfmt.h index 6b417b8d57a2f2..b10e4179b6bab0 100644 --- a/deps/icu-small/source/i18n/unicode/plurfmt.h +++ b/deps/icu-small/source/i18n/unicode/plurfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index 7abd6574086495..146e6bea831f09 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index 2cd02e70f14b6f..14230f8982d2ef 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and others. @@ -54,7 +56,13 @@ enum URBNFRuleSetTag { URBNF_ORDINAL, URBNF_DURATION, URBNF_NUMBERING_SYSTEM, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal URBNFRuleSetTag value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ URBNF_COUNT +#endif // U_HIDE_DEPRECATED_API }; /** diff --git a/deps/icu-small/source/i18n/unicode/rbtz.h b/deps/icu-small/source/i18n/unicode/rbtz.h index 79805dd64eeac9..20de34bb1743dc 100644 --- a/deps/icu-small/source/i18n/unicode/rbtz.h +++ b/deps/icu-small/source/i18n/unicode/rbtz.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/regex.h b/deps/icu-small/source/i18n/unicode/regex.h index 2333f96b25f2c0..96c64874a4cf43 100644 --- a/deps/icu-small/source/i18n/unicode/regex.h +++ b/deps/icu-small/source/i18n/unicode/regex.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2002-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/region.h b/deps/icu-small/source/i18n/unicode/region.h index 2e1ac82a62f1d1..47829944a3bfaf 100644 --- a/deps/icu-small/source/i18n/unicode/region.h +++ b/deps/icu-small/source/i18n/unicode/region.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2014-2016, International Business Machines Corporation and others. @@ -210,7 +212,7 @@ class U_I18N_API Region : public UObject { * anything meaningful. */ - static void loadRegionData(UErrorCode &status); + static void U_CALLCONV loadRegionData(UErrorCode &status); }; diff --git a/deps/icu-small/source/i18n/unicode/reldatefmt.h b/deps/icu-small/source/i18n/unicode/reldatefmt.h index b336e2fe3ddc9f..8e659e2bc83b1a 100644 --- a/deps/icu-small/source/i18n/unicode/reldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/reldatefmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 2014-2016, International Business Machines Corporation and @@ -23,7 +25,7 @@ * \brief C++ API: Formats relative dates such as "1 day ago" or "tomorrow" */ -#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION +#if !UCONFIG_NO_FORMATTING /** * Represents the unit for formatting a relative date. e.g "in 5 days" @@ -74,11 +76,13 @@ typedef enum UDateRelativeUnit { */ UDAT_RELATIVE_YEARS, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of items in this enum. - * @stable ICU 53 + * One more than the highest normal UDateRelativeUnit value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_RELATIVE_UNIT_COUNT +#endif // U_HIDE_DEPRECATED_API } UDateRelativeUnit; /** @@ -161,11 +165,13 @@ typedef enum UDateAbsoluteUnit { */ UDAT_ABSOLUTE_NOW, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of items in this enum. - * @stable ICU 53 + * One more than the highest normal UDateAbsoluteUnit value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_ABSOLUTE_UNIT_COUNT +#endif // U_HIDE_DEPRECATED_API } UDateAbsoluteUnit; /** @@ -211,13 +217,16 @@ typedef enum UDateDirection { */ UDAT_DIRECTION_PLAIN, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of items in this enum. - * @stable ICU 53 + * One more than the highest normal UDateDirection value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_DIRECTION_COUNT +#endif // U_HIDE_DEPRECATED_API } UDateDirection; +#if !UCONFIG_NO_BREAK_ITERATION U_NAMESPACE_BEGIN @@ -509,5 +518,6 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { U_NAMESPACE_END -#endif /* !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION*/ -#endif +#endif /* !UCONFIG_NO_BREAK_ITERATION */ +#endif /* !UCONFIG_NO_FORMATTING */ +#endif /* __RELDATEFMT_H */ diff --git a/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h b/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h index 710238a796d6b1..0b34755dc2858b 100644 --- a/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h +++ b/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2014-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/search.h b/deps/icu-small/source/i18n/unicode/search.h index 5b65e88b9c3e75..35a05526236db7 100644 --- a/deps/icu-small/source/i18n/unicode/search.h +++ b/deps/icu-small/source/i18n/unicode/search.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011 IBM and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h old mode 100644 new mode 100755 index 635144bb9b35d6..37a8f2b82192fc --- a/deps/icu-small/source/i18n/unicode/selfmt.h +++ b/deps/icu-small/source/i18n/unicode/selfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/simpletz.h b/deps/icu-small/source/i18n/unicode/simpletz.h index a0639d6a708d40..7e41a4ab8a4849 100644 --- a/deps/icu-small/source/i18n/unicode/simpletz.h +++ b/deps/icu-small/source/i18n/unicode/simpletz.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 1997-2013, International Business Machines * diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index b7fa42054dc9a3..e6cf28d22be00d 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2016, International Business Machines Corporation and * others. All Rights Reserved. @@ -651,7 +653,7 @@ class SimpleDateFormatMutableNFs; * = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss a zzz", success ); * GregorianCalendar cal(success); * UDate currentTime_1 = cal.getTime(success); - * FieldPosition fp(0); + * FieldPosition fp(FieldPosition::DONT_CARE); * UnicodeString dateString; * formatter->format( currentTime_1, dateString, fp ); * cout << "result: " << dateString << endl; @@ -999,6 +1001,12 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * (Presumably, letters that would be more mnemonic in that locale's * language.) This function would produce a pattern using those * letters. + *

+ * Note: This implementation depends on DateFormatSymbols::getLocalPatternChars() + * to get localized format pattern characters. ICU does not include + * localized pattern character data, therefore, unless user sets localized + * pattern characters manually, this method returns the same result as + * toPattern(). * * @param result Receives the localized pattern. * @param status Output param set to success/failure code on diff --git a/deps/icu-small/source/i18n/unicode/sortkey.h b/deps/icu-small/source/i18n/unicode/sortkey.h index b4629d4e241ccc..6f1543da4003d9 100644 --- a/deps/icu-small/source/i18n/unicode/sortkey.h +++ b/deps/icu-small/source/i18n/unicode/sortkey.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** * Copyright (C) 1996-2014, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/i18n/unicode/stsearch.h b/deps/icu-small/source/i18n/unicode/stsearch.h index 64317608b5acf2..1cae53d12859de 100644 --- a/deps/icu-small/source/i18n/unicode/stsearch.h +++ b/deps/icu-small/source/i18n/unicode/stsearch.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2014 IBM and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/unicode/tblcoll.h b/deps/icu-small/source/i18n/unicode/tblcoll.h index 020c4b96062ad7..c48ea38c130a2f 100644 --- a/deps/icu-small/source/i18n/unicode/tblcoll.h +++ b/deps/icu-small/source/i18n/unicode/tblcoll.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * Copyright (C) 1996-2016, International Business Machines Corporation and @@ -854,7 +856,7 @@ class U_I18N_API RuleBasedCollator : public Collator { */ UBool isUnsafe(UChar32 c) const; - static void computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode); + static void U_CALLCONV computeMaxExpansions(const CollationTailoring *t, UErrorCode &errorCode); UBool initMaxExpansions(UErrorCode &errorCode) const; void setFastLatinOptions(CollationSettings &ownedSettings) const; diff --git a/deps/icu-small/source/i18n/unicode/timezone.h b/deps/icu-small/source/i18n/unicode/timezone.h index 6c72095537f75f..58c84d062bebad 100644 --- a/deps/icu-small/source/i18n/unicode/timezone.h +++ b/deps/icu-small/source/i18n/unicode/timezone.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /************************************************************************* * Copyright (c) 1997-2016, International Business Machines Corporation * and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/unicode/tmunit.h b/deps/icu-small/source/i18n/unicode/tmunit.h index e398ab96bdcf23..a19a1f3c1760c3 100644 --- a/deps/icu-small/source/i18n/unicode/tmunit.h +++ b/deps/icu-small/source/i18n/unicode/tmunit.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2016, International Business Machines Corporation, * @@ -41,7 +43,13 @@ class U_I18N_API TimeUnit: public MeasureUnit { UTIMEUNIT_HOUR, UTIMEUNIT_MINUTE, UTIMEUNIT_SECOND, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UTimeUnitFields value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UTIMEUNIT_FIELD_COUNT +#endif // U_HIDE_DEPRECATED_API }; /** diff --git a/deps/icu-small/source/i18n/unicode/tmutamt.h b/deps/icu-small/source/i18n/unicode/tmutamt.h index ad8047a1f1a4de..887150121fe545 100644 --- a/deps/icu-small/source/i18n/unicode/tmutamt.h +++ b/deps/icu-small/source/i18n/unicode/tmutamt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2010, Google, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/tmutfmt.h b/deps/icu-small/source/i18n/unicode/tmutfmt.h index 728ff13219a012..b90d4a096d71bb 100644 --- a/deps/icu-small/source/i18n/unicode/tmutfmt.h +++ b/deps/icu-small/source/i18n/unicode/tmutfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2008-2014, Google, International Business Machines Corporation @@ -50,6 +52,8 @@ U_NAMESPACE_BEGIN class Hashtable; class UVector; +struct TimeUnitFormatReadSink; + /** * Format or parse a TimeUnitAmount, using plural rules for the units where available. * @@ -227,6 +231,7 @@ class U_I18N_API TimeUnitFormat: public MeasureFormat { // UTIMEUNIT_YEAR. static const char* getTimeUnitName(TimeUnit::UTimeUnitFields field, UErrorCode& status); + friend struct TimeUnitFormatReadSink; }; inline UBool diff --git a/deps/icu-small/source/i18n/unicode/translit.h b/deps/icu-small/source/i18n/unicode/translit.h index d41b5c0a80edc8..1e49bfb9697a62 100644 --- a/deps/icu-small/source/i18n/unicode/translit.h +++ b/deps/icu-small/source/i18n/unicode/translit.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 1999-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/tzfmt.h b/deps/icu-small/source/i18n/unicode/tzfmt.h index 9b39bf0ee43c6e..dd86f1b48c9619 100644 --- a/deps/icu-small/source/i18n/unicode/tzfmt.h +++ b/deps/icu-small/source/i18n/unicode/tzfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h index cbc9c1f3a847e3..8861a7d026b89b 100644 --- a/deps/icu-small/source/i18n/unicode/tznames.h +++ b/deps/icu-small/source/i18n/unicode/tznames.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* -* Copyright (C) 2011-2015, International Business Machines Corporation and +* Copyright (C) 2011-2016, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* */ @@ -133,7 +135,7 @@ class U_I18N_API TimeZoneNames : public UObject { virtual ~TimeZoneNames(); /** - * Return true if the given TimeZoneNames objects are emantically equal. + * Return true if the given TimeZoneNames objects are semantically equal. * @param other the object to be compared with. * @return Return TRUE if the given Format objects are semantically equal. * @stable ICU 50 @@ -288,6 +290,18 @@ class U_I18N_API TimeZoneNames : public UObject { */ virtual UnicodeString& getDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UDate date, UnicodeString& name) const; + /** + * @internal For specific users only until proposed publicly. + * @deprecated This API is ICU internal only. + */ + virtual void loadAllDisplayNames(UErrorCode& status); + + /** + * @internal For specific users only until proposed publicly. + * @deprecated This API is ICU internal only. + */ + virtual void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const; + /** * MatchInfoCollection represents a collection of time zone name matches used by * {@link TimeZoneNames#find}. diff --git a/deps/icu-small/source/i18n/unicode/tzrule.h b/deps/icu-small/source/i18n/unicode/tzrule.h index c153afa1e94da2..5e020bc1a38c56 100644 --- a/deps/icu-small/source/i18n/unicode/tzrule.h +++ b/deps/icu-small/source/i18n/unicode/tzrule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2008, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/tztrans.h b/deps/icu-small/source/i18n/unicode/tztrans.h index f5934d91254525..b2e09999bb9263 100644 --- a/deps/icu-small/source/i18n/unicode/tztrans.h +++ b/deps/icu-small/source/i18n/unicode/tztrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2008, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h index 8f3bf71f99a587..18522f6475e15e 100644 --- a/deps/icu-small/source/i18n/unicode/ucal.h +++ b/deps/icu-small/source/i18n/unicode/ucal.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines Corporation and @@ -423,10 +425,12 @@ enum UCalendarDateFields { */ UCAL_IS_LEAP_MONTH, - /** - * Field count - * @stable ICU 2.6 - */ + // Do not conditionalize with #ifndef U_HIDE_DEPRECATED_API, + // it is needed for layout of Calendar, DateFormat, and other objects + /** + * One more than the highest normal UCalendarDateFields value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCAL_FIELD_COUNT, /** diff --git a/deps/icu-small/source/i18n/unicode/ucol.h b/deps/icu-small/source/i18n/unicode/ucol.h index 25f90408c92ecc..0b3fab90b1a05d 100644 --- a/deps/icu-small/source/i18n/unicode/ucol.h +++ b/deps/icu-small/source/i18n/unicode/ucol.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (c) 1996-2015, International Business Machines Corporation and others. @@ -123,8 +125,13 @@ typedef enum { /** upper case sorts before lower case */ UCOL_UPPER_FIRST = 25, +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UColAttributeValue value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCOL_ATTRIBUTE_VALUE_COUNT - +#endif // U_HIDE_DEPRECATED_API } UColAttributeValue; /** @@ -191,12 +198,13 @@ typedef enum { * @stable ICU 4.8 */ UCOL_REORDER_CODE_DIGIT = 0x1004, - /** - * The limit of the reorder codes. This is intended for use in range checking - * and enumeration of the reorder codes. - * @stable ICU 4.8 - */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UColReorderCode value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCOL_REORDER_CODE_LIMIT = 0x1005 +#endif // U_HIDE_DEPRECATED_API } UColReorderCode; /** @@ -333,10 +341,13 @@ typedef enum { * @stable ICU 2.8 */ UCOL_NUMERIC_COLLATION = UCOL_STRENGTH + 2, - /** - * The number of UColAttribute constants. - * @stable ICU 2.0 - */ + + // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + // it is needed for layout of RuleBasedCollator object. + /** + * One more than the highest normal UColAttribute value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UCOL_ATTRIBUTE_COUNT } UColAttribute; @@ -1050,7 +1061,13 @@ typedef enum { UCOL_BOUND_UPPER = 1, /** upper bound that will match all the strings that have the same initial substring as the given string */ UCOL_BOUND_UPPER_LONG = 2, - UCOL_BOUND_VALUE_COUNT +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UColBoundMode value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + UCOL_BOUND_VALUE_COUNT +#endif // U_HIDE_DEPRECATED_API } UColBoundMode; /** diff --git a/deps/icu-small/source/i18n/unicode/ucoleitr.h b/deps/icu-small/source/i18n/unicode/ucoleitr.h index 7af783d37c52f3..89fd9e85cf79a0 100644 --- a/deps/icu-small/source/i18n/unicode/ucoleitr.h +++ b/deps/icu-small/source/i18n/unicode/ucoleitr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2001-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/ucsdet.h b/deps/icu-small/source/i18n/unicode/ucsdet.h index b737b160479268..a926d2f22cbbc4 100644 --- a/deps/icu-small/source/i18n/unicode/ucsdet.h +++ b/deps/icu-small/source/i18n/unicode/ucsdet.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2005-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/udat.h b/deps/icu-small/source/i18n/unicode/udat.h index 5baec621379d90..cacfbe85009c23 100644 --- a/deps/icu-small/source/i18n/unicode/udat.h +++ b/deps/icu-small/source/i18n/unicode/udat.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2016, International Business Machines @@ -787,16 +789,15 @@ typedef enum UDateFormatField { UDAT_TIME_SEPARATOR_FIELD = 37, #endif /* U_HIDE_INTERNAL_API */ - /** +#ifndef U_HIDE_DEPRECATED_API + /** * Number of FieldPosition and UFieldPosition selectors for * DateFormat and UDateFormat. * Valid selectors range from 0 to UDAT_FIELD_COUNT-1. - * This value is subject to change if new fields are defined - * in the future. - * @stable ICU 3.0 + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_FIELD_COUNT = 38 - +#endif // U_HIDE_DEPRECATED_API } UDateFormatField; @@ -888,23 +889,24 @@ typedef enum UDateFormatBooleanAttribute { * @stable ICU 53 */ UDAT_PARSE_ALLOW_NUMERIC = 1, -#ifndef U_HIDE_DRAFT_API /** * indicates tolerance of a partial literal match * e.g. accepting "--mon-02-march-2011" for a pattern of "'--: 'EEE-WW-MMMM-yyyy" - * @draft ICU 56 + * @stable ICU 56 */ UDAT_PARSE_PARTIAL_LITERAL_MATCH = 2, /** * indicates tolerance of pattern mismatch between input data and specified format pattern. * e.g. accepting "September" for a month pattern of MMM ("Sep") - * @draft ICU 56 + * @stable ICU 56 */ UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH = 3, -#endif /* U_HIDE_DRAFT_API */ + + // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + // it is needed for layout of DateFormat object. /** - * count boolean date format constants - * @stable ICU 53 + * One more than the highest normal UDateFormatBooleanAttribute value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_BOOLEAN_ATTRIBUTE_COUNT = 4 } UDateFormatBooleanAttribute; diff --git a/deps/icu-small/source/i18n/unicode/udateintervalformat.h b/deps/icu-small/source/i18n/unicode/udateintervalformat.h index 26d9b5a9ddc0ce..81bff16d6e67af 100644 --- a/deps/icu-small/source/i18n/unicode/udateintervalformat.h +++ b/deps/icu-small/source/i18n/unicode/udateintervalformat.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2010-2012,2015 International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/udatpg.h b/deps/icu-small/source/i18n/unicode/udatpg.h index f52ed4c34ae88a..365d51c493c5fe 100644 --- a/deps/icu-small/source/i18n/unicode/udatpg.h +++ b/deps/icu-small/source/i18n/unicode/udatpg.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -83,7 +85,13 @@ typedef enum UDateTimePatternField { UDATPG_FRACTIONAL_SECOND_FIELD, /** @stable ICU 3.8 */ UDATPG_ZONE_FIELD, - /** @stable ICU 3.8 */ + + // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + // it is needed for layout of DateTimePatternGenerator object. + /** + * One more than the highest normal UDateTimePatternField value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UDATPG_FIELD_COUNT } UDateTimePatternField; @@ -120,8 +128,13 @@ typedef enum UDateTimePatternConflict { UDATPG_BASE_CONFLICT, /** @stable ICU 3.8 */ UDATPG_CONFLICT, - /** @stable ICU 3.8 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UDateTimePatternConflict value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UDATPG_CONFLICT_COUNT +#endif // U_HIDE_DEPRECATED_API } UDateTimePatternConflict; /** diff --git a/deps/icu-small/source/i18n/unicode/ufieldpositer.h b/deps/icu-small/source/i18n/unicode/ufieldpositer.h index 836bfdf279d4b2..8dfa3df5a409d0 100644 --- a/deps/icu-small/source/i18n/unicode/ufieldpositer.h +++ b/deps/icu-small/source/i18n/unicode/ufieldpositer.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2015-2016, International Business Machines @@ -84,8 +86,8 @@ U_NAMESPACE_END /** * Get information for the next field in the formatted string to which this - * UFieldPositionIterator currently applies, or return FALSE if there are - * no more fields. + * UFieldPositionIterator currently applies, or return a negative value if there + * are no more fields. * @param fpositer * A pointer to the UFieldPositionIterator object containing iteration * state for the format fields. diff --git a/deps/icu-small/source/i18n/unicode/uformattable.h b/deps/icu-small/source/i18n/unicode/uformattable.h index a64ae14653a19d..e4683d56c35898 100644 --- a/deps/icu-small/source/i18n/unicode/uformattable.h +++ b/deps/icu-small/source/i18n/unicode/uformattable.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2013-2014, International Business Machines Corporation and others. @@ -49,7 +51,13 @@ typedef enum UFormattableType { UFMT_ARRAY, /**< ufmt_countArray() and ufmt_getArray() will return the value. @see ufmt_getArrayItemByIndex */ UFMT_INT64, /**< ufmt_getInt64() will return without conversion. @see ufmt_getInt64 */ UFMT_OBJECT, /**< ufmt_getObject() will return without conversion. @see ufmt_getObject*/ - UFMT_COUNT /**< Count of defined UFormattableType values */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UFormattableType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + UFMT_COUNT +#endif // U_HIDE_DEPRECATED_API } UFormattableType; diff --git a/deps/icu-small/source/i18n/unicode/ugender.h b/deps/icu-small/source/i18n/unicode/ugender.h index 86e229df61b298..c1e591ed28fb0e 100644 --- a/deps/icu-small/source/i18n/unicode/ugender.h +++ b/deps/icu-small/source/i18n/unicode/ugender.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2010-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/ulocdata.h b/deps/icu-small/source/i18n/unicode/ulocdata.h index 63495f681cee4a..ecf6fdcb3f532e 100644 --- a/deps/icu-small/source/i18n/unicode/ulocdata.h +++ b/deps/icu-small/source/i18n/unicode/ulocdata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * @@ -47,8 +49,13 @@ typedef enum ULocaleDataExemplarSetType { ULOCDATA_ES_INDEX=2, /** Punctuation set @stable ICU 51 */ ULOCDATA_ES_PUNCTUATION=3, - /** One higher than the last valid type @stable ICU 3.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal ULocaleDataExemplarSetType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ ULOCDATA_ES_COUNT=4 +#endif // U_HIDE_DEPRECATED_API } ULocaleDataExemplarSetType; /** The possible types of delimiters. @@ -63,8 +70,13 @@ typedef enum ULocaleDataDelimiterType { ULOCDATA_ALT_QUOTATION_START = 2, /** Alternate quotation end @stable ICU 3.4 */ ULOCDATA_ALT_QUOTATION_END = 3, - /** One higher than the last valid type @stable ICU 3.4 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal ULocaleDataDelimiterType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ ULOCDATA_DELIMITER_COUNT = 4 +#endif // U_HIDE_DEPRECATED_API } ULocaleDataDelimiterType; /** @@ -189,7 +201,13 @@ typedef enum UMeasurementSystem { UMS_SI, /**< Measurement system specified by SI otherwise known as Metric system. @stable ICU 2.8 */ UMS_US, /**< Measurement system followed in the United States of America. @stable ICU 2.8 */ UMS_UK, /**< Mix of metric and imperial units used in Great Britain. @stable ICU 55 */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UMeasurementSystem value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UMS_LIMIT +#endif // U_HIDE_DEPRECATED_API } UMeasurementSystem; /** diff --git a/deps/icu-small/source/i18n/unicode/umsg.h b/deps/icu-small/source/i18n/unicode/umsg.h index e79026f72e00b6..0beb39d5abbee0 100644 --- a/deps/icu-small/source/i18n/unicode/umsg.h +++ b/deps/icu-small/source/i18n/unicode/umsg.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/unirepl.h b/deps/icu-small/source/i18n/unicode/unirepl.h index 974a3f54014081..37815a9a24cfa4 100644 --- a/deps/icu-small/source/i18n/unicode/unirepl.h +++ b/deps/icu-small/source/i18n/unicode/unirepl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (c) 2002-2005, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h index 8747cc595fec1a..7c652e09cf701b 100644 --- a/deps/icu-small/source/i18n/unicode/unum.h +++ b/deps/icu-small/source/i18n/unicode/unum.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2015, International Business Machines Corporation and others. @@ -219,35 +221,35 @@ typedef enum UNumberFormatStyle { * @stable ICU 54 */ UNUM_CASH_CURRENCY=13, -#ifndef U_HIDE_DRAFT_API /** * Decimal format expressed using compact notation * (short form, corresponds to UNumberCompactStyle=UNUM_SHORT) * e.g. "23K", "45B" - * @draft ICU 56 + * @stable ICU 56 */ UNUM_DECIMAL_COMPACT_SHORT=14, /** * Decimal format expressed using compact notation * (long form, corresponds to UNumberCompactStyle=UNUM_LONG) * e.g. "23 thousand", "45 billion" - * @draft ICU 56 + * @stable ICU 56 */ UNUM_DECIMAL_COMPACT_LONG=15, /** * Currency format with a currency symbol, e.g., "$1.00", * using non-accounting style for negative values (e.g. minus sign). * Overrides any style specified using -cf- key in locale. - * @draft ICU 56 + * @stable ICU 56 */ UNUM_CURRENCY_STANDARD=16, -#endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_DEPRECATED_API /** - * One more than the highest number format style constant. - * @stable ICU 4.8 + * One more than the highest normal UNumberFormatStyle value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UNUM_FORMAT_STYLE_COUNT=17, +#endif // U_HIDE_DEPRECATED_API /** * Default format @@ -323,7 +325,13 @@ enum UCurrencySpacing { UNUM_CURRENCY_SURROUNDING_MATCH, /** @stable ICU 4.8 */ UNUM_CURRENCY_INSERT, - /** @stable ICU 4.8 */ + + // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + // it is needed for layout of DecimalFormatSymbols object. + /** + * One more than the highest normal UCurrencySpacing value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UNUM_CURRENCY_SPACING_COUNT }; typedef enum UCurrencySpacing UCurrencySpacing; /**< @stable ICU 4.8 */ @@ -357,8 +365,13 @@ typedef enum UNumberFormatFields { UNUM_PERMILL_FIELD, /** @stable ICU 49 */ UNUM_SIGN_FIELD, - /** @stable ICU 49 */ +#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 +#endif // U_HIDE_DEPRECATED_API } UNumberFormatFields; @@ -1272,8 +1285,13 @@ typedef enum UNumberFormatSymbol { */ UNUM_EXPONENT_MULTIPLICATION_SYMBOL = 27, - /** count symbol constants */ +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UNumberFormatSymbol value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ UNUM_FORMAT_SYMBOL_COUNT = 28 +#endif // U_HIDE_DEPRECATED_API } UNumberFormatSymbol; /** diff --git a/deps/icu-small/source/i18n/unicode/unumsys.h b/deps/icu-small/source/i18n/unicode/unumsys.h index 8f9d386dd5d458..396d55d6b7699b 100644 --- a/deps/icu-small/source/i18n/unicode/unumsys.h +++ b/deps/icu-small/source/i18n/unicode/unumsys.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2013-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/upluralrules.h b/deps/icu-small/source/i18n/unicode/upluralrules.h index 5bcadd4bda60f4..52e34d8d25dd66 100644 --- a/deps/icu-small/source/i18n/unicode/upluralrules.h +++ b/deps/icu-small/source/i18n/unicode/upluralrules.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2010-2013, International Business Machines @@ -52,11 +54,13 @@ enum UPluralType { * @stable ICU 50 */ UPLURAL_TYPE_ORDINAL, +#ifndef U_HIDE_DEPRECATED_API /** - * Number of Plural rules types. - * @stable ICU 50 + * One more than the highest normal UPluralType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UPLURAL_TYPE_COUNT +#endif // U_HIDE_DEPRECATED_API }; /** * @stable ICU 50 diff --git a/deps/icu-small/source/i18n/unicode/uregex.h b/deps/icu-small/source/i18n/unicode/uregex.h index c51acd5f4043fe..7806a74afcc745 100644 --- a/deps/icu-small/source/i18n/unicode/uregex.h +++ b/deps/icu-small/source/i18n/unicode/uregex.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2004-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/uregion.h b/deps/icu-small/source/i18n/unicode/uregion.h index 29347528e0d284..b5d03691cabfe9 100644 --- a/deps/icu-small/source/i18n/unicode/uregion.h +++ b/deps/icu-small/source/i18n/unicode/uregion.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2014, International Business Machines @@ -105,11 +107,13 @@ typedef enum URegionType { */ URGN_DEPRECATED, +#ifndef U_HIDE_DEPRECATED_API /** - * Maximum value for this unumeration. - * @stable ICU 51 + * One more than the highest normal URegionType value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ URGN_LIMIT +#endif // U_HIDE_DEPRECATED_API } URegionType; #if !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/unicode/ureldatefmt.h b/deps/icu-small/source/i18n/unicode/ureldatefmt.h index fce016f564ff64..fad8ffd9e184b8 100644 --- a/deps/icu-small/source/i18n/unicode/ureldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/ureldatefmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2016, International Business Machines @@ -58,11 +60,13 @@ typedef enum UDateRelativeDateTimeFormatterStyle { */ UDAT_STYLE_NARROW, - /** - * The number of styles. - * @stable ICU 54 - */ - UDAT_STYLE_COUNT +#ifndef U_HIDE_DEPRECATED_API + /** + * One more than the highest normal UDateRelativeDateTimeFormatterStyle value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. + */ + UDAT_STYLE_COUNT +#endif // U_HIDE_DEPRECATED_API } UDateRelativeDateTimeFormatterStyle; #ifndef U_HIDE_DRAFT_API @@ -162,11 +166,13 @@ typedef enum URelativeDateTimeUnit { * @draft ICU 57 */ UDAT_REL_UNIT_SATURDAY, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of URelativeDateTimeUnit values - * @draft ICU 57 + * One more than the highest normal URelativeDateTimeUnit value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_REL_UNIT_COUNT +#endif // U_HIDE_DEPRECATED_API } URelativeDateTimeUnit; #endif /* U_HIDE_DRAFT_API */ diff --git a/deps/icu-small/source/i18n/unicode/usearch.h b/deps/icu-small/source/i18n/unicode/usearch.h index 10721bc726dc2c..dcdb7fe420b814 100644 --- a/deps/icu-small/source/i18n/unicode/usearch.h +++ b/deps/icu-small/source/i18n/unicode/usearch.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2011,2014 IBM and others. All rights reserved. @@ -188,11 +190,13 @@ typedef enum { */ USEARCH_ELEMENT_COMPARISON = 2, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of attribute types - * @stable ICU 2.4 + * One more than the highest normal USearchAttribute value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ USEARCH_ATTRIBUTE_COUNT = 3 +#endif // U_HIDE_DEPRECATED_API } USearchAttribute; /** @@ -262,11 +266,13 @@ typedef enum { */ USEARCH_ANY_BASE_WEIGHT_IS_WILDCARD, +#ifndef U_HIDE_DEPRECATED_API /** - * Count of attribute values - * @stable ICU 2.4 + * One more than the highest normal USearchAttributeValue value. + * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ USEARCH_ATTRIBUTE_VALUE_COUNT +#endif // U_HIDE_DEPRECATED_API } USearchAttributeValue; /* open and close ------------------------------------------------------ */ diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h index c2285a700ed6bc..40b73380c57d52 100644 --- a/deps/icu-small/source/i18n/unicode/uspoof.h +++ b/deps/icu-small/source/i18n/unicode/uspoof.h @@ -1,6 +1,8 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** -* Copyright (C) 2008-2015, International Business Machines Corporation +* Copyright (C) 2008-2016, International Business Machines Corporation * and others. All Rights Reserved. *************************************************************************** * file name: uspoof.h @@ -35,123 +37,350 @@ * \file * \brief Unicode Security and Spoofing Detection, C API. * - * These functions are intended to check strings, typically - * identifiers of some type, such as URLs, for the presence of - * characters that are likely to be visually confusing - - * for cases where the displayed form of an identifier may - * not be what it appears to be. - * - * Unicode Technical Report #36, http://unicode.org/reports/tr36, and - * Unicode Technical Standard #39, http://unicode.org/reports/tr39 - * "Unicode security considerations", give more background on - * security an spoofing issues with Unicode identifiers. - * The tests and checks provided by this module implement the recommendations - * from those Unicode documents. - * - * The tests available on identifiers fall into two general categories: - * -# Single identifier tests. Check whether an identifier is - * potentially confusable with any other string, or is suspicious - * for other reasons. - * -# Two identifier tests. Check whether two specific identifiers are confusable. - * This does not consider whether either of strings is potentially - * confusable with any string other than the exact one specified. - * - * The steps to perform confusability testing are - * -# Open a USpoofChecker. - * -# Configure the USPoofChecker for the desired set of tests. The tests that will - * be performed are specified by a set of USpoofChecks flags. - * -# Perform the checks using the pre-configured USpoofChecker. The results indicate - * which (if any) of the selected tests have identified possible problems with the identifier. - * Results are reported as a set of USpoofChecks flags; this mirrors the form in which - * the set of tests to perform was originally specified to the USpoofChecker. - * - * A USpoofChecker may be used repeatedly to perform checks on any number of identifiers. - * - * Thread Safety: The test functions for checking a single identifier, or for testing - * whether two identifiers are possible confusable, are thread safe. - * They may called concurrently, from multiple threads, using the same USpoofChecker instance. - * - * More generally, the standard ICU thread safety rules apply: functions that take a - * const USpoofChecker parameter are thread safe. Those that take a non-const - * USpoofChecier are not thread safe. - * - * - * Descriptions of the available checks. - * - * When testing whether pairs of identifiers are confusable, with the uspoof_areConfusable() - * family of functions, the relevant tests are - * - * -# USPOOF_SINGLE_SCRIPT_CONFUSABLE: All of the characters from the two identifiers are - * from a single script, and the two identifiers are visually confusable. - * -# USPOOF_MIXED_SCRIPT_CONFUSABLE: At least one of the identifiers contains characters - * from more than one script, and the two identifiers are visually confusable. - * -# USPOOF_WHOLE_SCRIPT_CONFUSABLE: Each of the two identifiers is of a single script, but - * the two identifiers are from different scripts, and they are visually confusable. - * - * The safest approach is to enable all three of these checks as a group. - * - * USPOOF_ANY_CASE is a modifier for the above tests. If the identifiers being checked can - * be of mixed case and are used in a case-sensitive manner, this option should be specified. - * - * If the identifiers being checked are used in a case-insensitive manner, and if they are - * displayed to users in lower-case form only, the USPOOF_ANY_CASE option should not be - * specified. Confusabality issues involving upper case letters will not be reported. - * - * When performing tests on a single identifier, with the uspoof_check() family of functions, - * the relevant tests are: - * - * -# USPOOF_MIXED_SCRIPT_CONFUSABLE: the identifier contains characters from multiple - * scripts, and there exists an identifier of a single script that is visually confusable. - * -# USPOOF_WHOLE_SCRIPT_CONFUSABLE: the identifier consists of characters from a single - * script, and there exists a visually confusable identifier. - * The visually confusable identifier also consists of characters from a single script. - * but not the same script as the identifier being checked. - * -# USPOOF_ANY_CASE: modifies the mixed script and whole script confusables tests. If - * specified, the checks will consider confusable characters of any case. If this flag is not - * set, the test is performed assuming case folded identifiers. - * -# USPOOF_SINGLE_SCRIPT: check that the identifier contains only characters from a - * single script. (Characters from the 'common' and 'inherited' scripts are ignored.) - * This is not a test for confusable identifiers - * -# USPOOF_INVISIBLE: check an identifier for the presence of invisible characters, - * such as zero-width spaces, or character sequences that are - * likely not to display, such as multiple occurrences of the same - * non-spacing mark. This check does not test the input string as a whole - * for conformance to any particular syntax for identifiers. - * -# USPOOF_CHAR_LIMIT: check that an identifier contains only characters from a specified set - * of acceptable characters. See uspoof_setAllowedChars() and - * uspoof_setAllowedLocales(). - * - * Note on Scripts: - * Characters from the Unicode Scripts "Common" and "Inherited" are ignored when considering - * the script of an identifier. Common characters include digits and symbols that - * are normally used with text from more than one script. - * - * Identifier Skeletons: A skeleton is a transformation of an identifier, such that - * all identifiers that are confusable with each other have the same skeleton. - * Using skeletons, it is possible to build a dictionary data structure for - * a set of identifiers, and then quickly test whether a new identifier is - * confusable with an identifier already in the set. The uspoof_getSkeleton() - * family of functions will produce the skeleton from an identifier. - * - * Note that skeletons are not guaranteed to be stable between versions - * of Unicode or ICU, so an applications should not rely on creating a permanent, - * or difficult to update, database of skeletons. Instabilities result from - * identifying new pairs or sequences of characters that are visually - * confusable, and thus must be mapped to the same skeleton character(s). - * - * Skeletons are computed using the algorithm and data describe in Unicode UAX 39. - * The latest proposed update, UAX 39 Version 8 draft 1, says "the tables SL, SA, and ML - * were still problematic, and discouraged from use in [Uniocde] 7.0. - * They were thus removed from version 8.0" - * - * In light of this, the default mapping data included with ICU 55 uses the - * Unicode 7 MA (Multi script Any case) table data for the other type options - * (Single Script, Any Case), (Single Script, Lower Case) and (Multi Script, Lower Case). + *

+ * This class, based on Unicode Technical Report #36 and + * Unicode Technical Standard #39, has two main functions: + * + *

    + *
  1. Checking whether two strings are visually confusable with each other, such as "Harvest" and + * "Ηarvest", where the second string starts with the Greek capital letter Eta.
  2. + *
  3. Checking whether an individual string is likely to be an attempt at confusing the reader (spoof + * detection), such as "paypal" with some Latin characters substituted with Cyrillic look-alikes.
  4. + *
+ * + *

+ * Although originally designed as a method for flagging suspicious identifier strings such as URLs, + * USpoofChecker has a number of other practical use cases, such as preventing attempts to evade bad-word + * content filters. + * + *

+ * The functions of this class are exposed as C API, with a handful of syntactical conveniences for C++. + * + *

Confusables

+ * + *

+ * The following example shows how to use USpoofChecker to check for confusability between two strings: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * UChar* str1 = (UChar*) u"Harvest"; + * UChar* str2 = (UChar*) u"\u0397arvest"; // with U+0397 GREEK CAPITAL LETTER ETA + * + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setChecks(sc, USPOOF_CONFUSABLE, &status); + * + * int32_t bitmask = uspoof_areConfusable(sc, str1, -1, str2, -1, &status); + * UBool result = bitmask != 0; + * // areConfusable: 1 (status: U_ZERO_ERROR) + * printf("areConfusable: %d (status: %s)\n", result, u_errorName(status)); + * uspoof_close(sc); + * \endcode + * + *

+ * The call to {@link uspoof_open} creates a USpoofChecker object; the call to {@link uspoof_setChecks} + * enables confusable checking and disables all other checks; the call to {@link uspoof_areConfusable} performs the + * confusability test; and the following line extracts the result out of the return value. For best performance, + * the instance should be created once (e.g., upon application startup), and the efficient + * {@link uspoof_areConfusable} method can be used at runtime. + * + *

+ * The type {@link LocalUSpoofCheckerPointer} is exposed for C++ programmers. It will automatically call + * {@link uspoof_close} when the object goes out of scope: + * + * \code{.cpp} + * UErrorCode status = U_ZERO_ERROR; + * LocalUSpoofCheckerPointer sc(uspoof_open(&status)); + * uspoof_setChecks(sc.getAlias(), USPOOF_CONFUSABLE, &status); + * // ... + * \endcode + * + *

+ * UTS 39 defines two strings to be confusable if they map to the same skeleton string. A skeleton can + * be thought of as a "hash code". {@link uspoof_getSkeleton} computes the skeleton for a particular string, so + * the following snippet is equivalent to the example above: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * UChar* str1 = (UChar*) u"Harvest"; + * UChar* str2 = (UChar*) u"\u0397arvest"; // with U+0397 GREEK CAPITAL LETTER ETA + * + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setChecks(sc, USPOOF_CONFUSABLE, &status); + * + * // Get skeleton 1 + * int32_t skel1Len = uspoof_getSkeleton(sc, 0, str1, -1, NULL, 0, &status); + * UChar* skel1 = (UChar*) malloc(++skel1Len * sizeof(UChar)); + * status = U_ZERO_ERROR; + * uspoof_getSkeleton(sc, 0, str1, -1, skel1, skel1Len, &status); + * + * // Get skeleton 2 + * int32_t skel2Len = uspoof_getSkeleton(sc, 0, str2, -1, NULL, 0, &status); + * UChar* skel2 = (UChar*) malloc(++skel2Len * sizeof(UChar)); + * status = U_ZERO_ERROR; + * uspoof_getSkeleton(sc, 0, str2, -1, skel2, skel2Len, &status); + * + * // Are the skeletons the same? + * UBool result = u_strcmp(skel1, skel2) == 0; + * // areConfusable: 1 (status: U_ZERO_ERROR) + * printf("areConfusable: %d (status: %s)\n", result, u_errorName(status)); + * uspoof_close(sc); + * free(skel1); + * free(skel2); + * \endcode + * + *

+ * If you need to check if a string is confusable with any string in a dictionary of many strings, rather than calling + * {@link uspoof_areConfusable} many times in a loop, {@link uspoof_getSkeleton} can be used instead, as shown below: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * #define DICTIONARY_LENGTH 2 + * UChar* dictionary[DICTIONARY_LENGTH] = { (UChar*) u"lorem", (UChar*) u"ipsum" }; + * UChar* skeletons[DICTIONARY_LENGTH]; + * UChar* str = (UChar*) u"1orern"; + * + * // Setup: + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setChecks(sc, USPOOF_CONFUSABLE, &status); + * for (size_t i=0; i + * Note: Since the Unicode confusables mapping table is frequently updated, confusable skeletons are not + * guaranteed to be the same between ICU releases. We therefore recommend that you always compute confusable skeletons + * at runtime and do not rely on creating a permanent, or difficult to update, database of skeletons. + * + *

Spoof Detection

+ * + *

+ * The following snippet shows a minimal example of using USpoofChecker to perform spoof detection on a + * string: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * UChar* str = (UChar*) u"p\u0430ypal"; // with U+0430 CYRILLIC SMALL LETTER A + * + * // Get the default set of allowable characters: + * USet* allowed = uset_openEmpty(); + * uset_addAll(allowed, uspoof_getRecommendedSet(&status)); + * uset_addAll(allowed, uspoof_getInclusionSet(&status)); + * + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setAllowedChars(sc, allowed, &status); + * uspoof_setRestrictionLevel(sc, USPOOF_MODERATELY_RESTRICTIVE); + * + * int32_t bitmask = uspoof_check(sc, str, -1, NULL, &status); + * UBool result = bitmask != 0; + * // fails checks: 1 (status: U_ZERO_ERROR) + * printf("fails checks: %d (status: %s)\n", result, u_errorName(status)); + * uspoof_close(sc); + * uset_close(allowed); + * \endcode + * + *

+ * As in the case for confusability checking, it is good practice to create one USpoofChecker instance at + * startup, and call the cheaper {@link uspoof_check} online. We specify the set of + * allowed characters to be those with type RECOMMENDED or INCLUSION, according to the recommendation in UTS 39. + * + *

+ * In addition to {@link uspoof_check}, the function {@link uspoof_checkUTF8} is exposed for UTF8-encoded char* strings, + * and {@link uspoof_checkUnicodeString} is exposed for C++ programmers. + * + *

+ * If the {@link USPOOF_AUX_INFO} check is enabled, a limited amount of information on why a string failed the checks + * is available in the returned bitmask. For complete information, use the {@link uspoof_check2} class of functions + * with a {@link USpoofCheckResult} parameter: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * UChar* str = (UChar*) u"p\u0430ypal"; // with U+0430 CYRILLIC SMALL LETTER A + * + * // Get the default set of allowable characters: + * USet* allowed = uset_openEmpty(); + * uset_addAll(allowed, uspoof_getRecommendedSet(&status)); + * uset_addAll(allowed, uspoof_getInclusionSet(&status)); + * + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setAllowedChars(sc, allowed, &status); + * uspoof_setRestrictionLevel(sc, USPOOF_MODERATELY_RESTRICTIVE); + * + * USpoofCheckResult* checkResult = uspoof_openCheckResult(&status); + * int32_t bitmask = uspoof_check2(sc, str, -1, checkResult, &status); + * + * int32_t failures1 = bitmask; + * int32_t failures2 = uspoof_getCheckResultChecks(checkResult, &status); + * assert(failures1 == failures2); + * // checks that failed: 0x00000010 (status: U_ZERO_ERROR) + * printf("checks that failed: %#010x (status: %s)\n", failures1, u_errorName(status)); + * + * // Cleanup: + * uspoof_close(sc); + * uset_close(allowed); + * uspoof_closeCheckResult(checkResult); + * \endcode + * + * C++ users can take advantage of a few syntactical conveniences. The following snippet is functionally + * equivalent to the one above: + * + * \code{.cpp} + * UErrorCode status = U_ZERO_ERROR; + * UnicodeString str((UChar*) u"p\u0430ypal"); // with U+0430 CYRILLIC SMALL LETTER A + * + * // Get the default set of allowable characters: + * UnicodeSet allowed; + * allowed.addAll(*uspoof_getRecommendedUnicodeSet(&status)); + * allowed.addAll(*uspoof_getInclusionUnicodeSet(&status)); + * + * LocalUSpoofCheckerPointer sc(uspoof_open(&status)); + * uspoof_setAllowedChars(sc.getAlias(), allowed.toUSet(), &status); + * uspoof_setRestrictionLevel(sc.getAlias(), USPOOF_MODERATELY_RESTRICTIVE); + * + * LocalUSpoofCheckResultPointer checkResult(uspoof_openCheckResult(&status)); + * int32_t bitmask = uspoof_check2UnicodeString(sc.getAlias(), str, checkResult.getAlias(), &status); + * + * int32_t failures1 = bitmask; + * int32_t failures2 = uspoof_getCheckResultChecks(checkResult.getAlias(), &status); + * assert(failures1 == failures2); + * // checks that failed: 0x00000010 (status: U_ZERO_ERROR) + * printf("checks that failed: %#010x (status: %s)\n", failures1, u_errorName(status)); + * + * // Explicit cleanup not necessary. + * \endcode + * + *

+ * The return value is a bitmask of the checks that failed. In this case, there was one check that failed: + * {@link USPOOF_RESTRICTION_LEVEL}, corresponding to the fifth bit (16). The possible checks are: + * + *

    + *
  • RESTRICTION_LEVEL: flags strings that violate the + * Restriction Level test as specified in UTS + * 39; in most cases, this means flagging strings that contain characters from multiple different scripts.
  • + *
  • INVISIBLE: flags strings that contain invisible characters, such as zero-width spaces, or character + * sequences that are likely not to display, such as multiple occurrences of the same non-spacing mark.
  • + *
  • CHAR_LIMIT: flags strings that contain characters outside of a specified set of acceptable + * characters. See {@link uspoof_setAllowedChars} and {@link uspoof_setAllowedLocales}.
  • + *
  • MIXED_NUMBERS: flags strings that contain digits from multiple different numbering systems.
  • + *
+ * + *

+ * These checks can be enabled independently of each other. For example, if you were interested in checking for only the + * INVISIBLE and MIXED_NUMBERS conditions, you could do: + * + * \code{.c} + * UErrorCode status = U_ZERO_ERROR; + * UChar* str = (UChar*) u"8\u09EA"; // 8 mixed with U+09EA BENGALI DIGIT FOUR + * + * USpoofChecker* sc = uspoof_open(&status); + * uspoof_setChecks(sc, USPOOF_INVISIBLE | USPOOF_MIXED_NUMBERS, &status); + * + * int32_t bitmask = uspoof_check2(sc, str, -1, NULL, &status); + * UBool result = bitmask != 0; + * // fails checks: 1 (status: U_ZERO_ERROR) + * printf("fails checks: %d (status: %s)\n", result, u_errorName(status)); + * uspoof_close(sc); + * \endcode + * + *

+ * Here is an example in C++ showing how to compute the restriction level of a string: + * + * \code{.cpp} + * UErrorCode status = U_ZERO_ERROR; + * UnicodeString str((UChar*) u"p\u0430ypal"); // with U+0430 CYRILLIC SMALL LETTER A + * + * // Get the default set of allowable characters: + * UnicodeSet allowed; + * allowed.addAll(*uspoof_getRecommendedUnicodeSet(&status)); + * allowed.addAll(*uspoof_getInclusionUnicodeSet(&status)); + * + * LocalUSpoofCheckerPointer sc(uspoof_open(&status)); + * uspoof_setAllowedChars(sc.getAlias(), allowed.toUSet(), &status); + * uspoof_setRestrictionLevel(sc.getAlias(), USPOOF_MODERATELY_RESTRICTIVE); + * uspoof_setChecks(sc.getAlias(), USPOOF_RESTRICTION_LEVEL | USPOOF_AUX_INFO, &status); + * + * LocalUSpoofCheckResultPointer checkResult(uspoof_openCheckResult(&status)); + * int32_t bitmask = uspoof_check2UnicodeString(sc.getAlias(), str, checkResult.getAlias(), &status); + * + * URestrictionLevel restrictionLevel = uspoof_getCheckResultRestrictionLevel(checkResult.getAlias(), &status); + * // Since USPOOF_AUX_INFO was enabled, the restriction level is also available in the upper bits of the bitmask: + * assert((restrictionLevel & bitmask) == restrictionLevel); + * // Restriction level: 0x50000000 (status: U_ZERO_ERROR) + * printf("Restriction level: %#010x (status: %s)\n", restrictionLevel, u_errorName(status)); + * \endcode + * + *

+ * The code '0x50000000' corresponds to the restriction level USPOOF_MINIMALLY_RESTRICTIVE. Since + * USPOOF_MINIMALLY_RESTRICTIVE is weaker than USPOOF_MODERATELY_RESTRICTIVE, the string fails the check. + * + *

+ * Note: The Restriction Level is the most powerful of the checks. The full logic is documented in + * UTS 39, but the basic idea is that strings + * are restricted to contain characters from only a single script, except that most scripts are allowed to have + * Latin characters interspersed. Although the default restriction level is HIGHLY_RESTRICTIVE, it is + * recommended that users set their restriction level to MODERATELY_RESTRICTIVE, which allows Latin mixed + * with all other scripts except Cyrillic, Greek, and Cherokee, with which it is often confusable. For more details on + * the levels, see UTS 39 or {@link URestrictionLevel}. The Restriction Level test is aware of the set of + * allowed characters set in {@link uspoof_setAllowedChars}. Note that characters which have script code + * COMMON or INHERITED, such as numbers and punctuation, are ignored when computing whether a string has multiple + * scripts. + * + *

Additional Information

+ * + *

+ * A USpoofChecker instance may be used repeatedly to perform checks on any number of identifiers. + * + *

+ * Thread Safety: The test functions for checking a single identifier, or for testing whether + * two identifiers are possible confusable, are thread safe. They may called concurrently, from multiple threads, + * using the same USpoofChecker instance. + * + *

+ * More generally, the standard ICU thread safety rules apply: functions that take a const USpoofChecker parameter are + * thread safe. Those that take a non-const USpoofChecker are not thread safe.. + * + * @stable ICU 4.6 */ struct USpoofChecker; typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker */ +#ifndef U_HIDE_DRAFT_API +/** + * @see uspoof_openCheckResult + */ +struct USpoofCheckResult; +/** + * @see uspoof_openCheckResult + */ +typedef struct USpoofCheckResult USpoofCheckResult; +#endif /* U_HIDE_DRAFT_API */ + /** * Enum for the kinds of checks that USpoofChecker can perform. * These enum values are used both to select the set of checks that @@ -160,45 +389,61 @@ typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker * @stable ICU 4.2 */ typedef enum USpoofChecks { - /** Single script confusable test. - * When testing whether two identifiers are confusable, report that they are if - * both are from the same script and they are visually confusable. - * Note: this test is not applicable to a check of a single identifier. - */ + /** + * When performing the two-string {@link uspoof_areConfusable} test, this flag in the return value indicates + * that the two strings are visually confusable and that they are from the same script, according to UTS 39 section + * 4. + * + * @see uspoof_areConfusable + * @stable ICU 4.2 + */ USPOOF_SINGLE_SCRIPT_CONFUSABLE = 1, - /** Mixed script confusable test. - * When checking a single identifier, report a problem if - * the identifier contains multiple scripts, and - * is confusable with some other identifier in a single script - * When testing whether two identifiers are confusable, report that they are if - * the two IDs are visually confusable, - * and at least one contains characters from more than one script. + /** + * When performing the two-string {@link uspoof_areConfusable} test, this flag in the return value indicates + * that the two strings are visually confusable and that they are not from the same script, according to UTS + * 39 section 4. + * + * @see uspoof_areConfusable + * @stable ICU 4.2 */ USPOOF_MIXED_SCRIPT_CONFUSABLE = 2, - /** Whole script confusable test. - * When checking a single identifier, report a problem if - * The identifier is of a single script, and - * there exists a confusable identifier in another script. - * When testing whether two identifiers are confusable, report that they are if - * each is of a single script, - * the scripts of the two identifiers are different, and - * the identifiers are visually confusable. + /** + * When performing the two-string {@link uspoof_areConfusable} test, this flag in the return value indicates + * that the two strings are visually confusable and that they are not from the same script but both of them are + * single-script strings, according to UTS 39 section 4. + * + * @see uspoof_areConfusable + * @stable ICU 4.2 */ USPOOF_WHOLE_SCRIPT_CONFUSABLE = 4, - /** Any Case Modifier for confusable identifier tests. - If specified, consider all characters, of any case, when looking for confusables. - If USPOOF_ANY_CASE is not specified, identifiers being checked are assumed to have been - case folded. Upper case confusable characters will not be checked. - Selects between Lower Case Confusable and - Any Case Confusable. */ +#ifndef U_HIDE_DRAFT_API + /** + * Enable this flag in {@link uspoof_setChecks} to turn on all types of confusables. You may set + * the checks to some subset of SINGLE_SCRIPT_CONFUSABLE, MIXED_SCRIPT_CONFUSABLE, or WHOLE_SCRIPT_CONFUSABLE to + * make {@link uspoof_areConfusable} return only those types of confusables. + * + * @see uspoof_areConfusable + * @see uspoof_getSkeleton + * @draft ICU 58 + */ + USPOOF_CONFUSABLE = USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_WHOLE_SCRIPT_CONFUSABLE, +#endif /* U_HIDE_DRAFT_API */ + +#ifndef U_HIDE_DEPRECATED_API + /** + * This flag is deprecated and no longer affects the behavior of SpoofChecker. + * + * @deprecated ICU 58 Any case confusable mappings were removed from UTS 39; the corresponding ICU API was deprecated. + */ USPOOF_ANY_CASE = 8, +#endif /* U_HIDE_DEPRECATED_API */ /** * Check that an identifier is no looser than the specified RestrictionLevel. - * The default if uspoof_setRestrctionLevel() is not called is HIGHLY_RESTRICTIVE. + * The default if {@link uspoof_setRestrictionLevel} is not called is HIGHLY_RESTRICTIVE. * * If USPOOF_AUX_INFO is enabled the actual restriction level of the * identifier being tested will also be returned by uspoof_check(). @@ -229,14 +474,15 @@ typedef enum USpoofChecks { USPOOF_INVISIBLE = 32, /** Check that an identifier contains only characters from a specified set - * of acceptable characters. See uspoof_setAllowedChars() and - * uspoof_setAllowedLocales(). + * of acceptable characters. See {@link uspoof_setAllowedChars} and + * {@link uspoof_setAllowedLocales}. Note that a string that fails this check + * will also fail the {@link USPOOF_RESTRICTION_LEVEL} check. */ USPOOF_CHAR_LIMIT = 64, /** - * Check that an identifier does not include decimal digits from - * more than one numbering system. + * Check that an identifier does not mix numbers from different numbering systems. + * For more information, see UTS 39 section 5.3. * * @stable ICU 51 */ @@ -253,11 +499,11 @@ typedef enum USpoofChecks { * Enable the return of auxillary (non-error) information in the * upper bits of the check results value. * - * If this "check" is not enabled, the results of uspoof_check() will be zero when an - * identifier passes all of the enabled checks. + * If this "check" is not enabled, the results of {@link uspoof_check} will be + * zero when an identifier passes all of the enabled checks. * - * If this "check" is enabled, (uspoof_check() & USPOOF_ALL_CHECKS) will be zero - * when an identifier passes all checks. + * If this "check" is enabled, (uspoof_check() & {@link USPOOF_ALL_CHECKS}) will + * be zero when an identifier passes all checks. * * @stable ICU 51 */ @@ -267,39 +513,53 @@ typedef enum USpoofChecks { /** - * Constants from UAX #39 for use in setRestrictionLevel(), and + * Constants from UAX #39 for use in {@link uspoof_setRestrictionLevel}, and * for returned identifier restriction levels in check results. + * * @stable ICU 51 + * + * @see uspoof_setRestrictionLevel + * @see uspoof_check */ typedef enum URestrictionLevel { /** - * Only ASCII characters: U+0000..U+007F + * All characters in the string are in the identifier profile and all characters in the string are in the + * ASCII range. * * @stable ICU 51 */ USPOOF_ASCII = 0x10000000, /** - * All characters in each identifier must be from a single script. - * - * @stable ICU 53 - */ + * The string classifies as ASCII-Only, or all characters in the string are in the identifier profile and + * the string is single-script, according to the definition in UTS 39 section 5.1. + * + * @stable ICU 53 + */ USPOOF_SINGLE_SCRIPT_RESTRICTIVE = 0x20000000, /** - * All characters in each identifier must be from a single script, or from the combinations: Latin + Han + - * Hiragana + Katakana; Latin + Han + Bopomofo; or Latin + Han + Hangul. Note that this level will satisfy the - * vast majority of Latin-script users; also that TR36 has ASCII instead of Latin. + * The string classifies as Single Script, or all characters in the string are in the identifier profile and + * the string is covered by any of the following sets of scripts, according to the definition in UTS 39 + * section 5.1: + *

    + *
  • Latin + Han + Bopomofo (or equivalently: Latn + Hanb)
  • + *
  • Latin + Han + Hiragana + Katakana (or equivalently: Latn + Jpan)
  • + *
  • Latin + Han + Hangul (or equivalently: Latn +Kore)
  • + *
+ * This is the default restriction in ICU. * * @stable ICU 51 */ USPOOF_HIGHLY_RESTRICTIVE = 0x30000000, /** - * Allow Latin with other scripts except Cyrillic, Greek, Cherokee Otherwise, the same as Highly Restrictive + * The string classifies as Highly Restrictive, or all characters in the string are in the identifier profile + * and the string is covered by Latin and any one other Recommended or Aspirational script, except Cyrillic, + * Greek, and Cherokee. * * @stable ICU 51 */ USPOOF_MODERATELY_RESTRICTIVE = 0x40000000, /** - * Allow arbitrary mixtures of scripts. Otherwise, the same as Moderately Restrictive. + * All characters in the string are in the identifier profile. Allow arbitrary mixtures of scripts. * * @stable ICU 51 */ @@ -311,11 +571,18 @@ typedef enum USpoofChecks { */ USPOOF_UNRESTRICTIVE = 0x60000000, /** - * Mask for selecting the Restriction Level bits from the return value of uspoof_check(). - * - * @stable ICU 53 - */ - USPOOF_RESTRICTION_LEVEL_MASK = 0x7F000000 + * Mask for selecting the Restriction Level bits from the return value of {@link uspoof_check}. + * + * @stable ICU 53 + */ + USPOOF_RESTRICTION_LEVEL_MASK = 0x7F000000, +#ifndef U_HIDE_INTERNAL_API + /** + * An undefined restriction level. + * @internal + */ + USPOOF_UNDEFINED_RESTRICTIVE = -1 +#endif /* U_HIDE_INTERNAL_API */ } URestrictionLevel; /** @@ -359,10 +626,10 @@ uspoof_openFromSerialized(const void *data, int32_t length, int32_t *pActualLeng /** * Open a Spoof Checker from the source form of the spoof data. - * The two inputs correspond to the Unicode data files confusables.txt - * and confusablesWholeScript.txt as described in Unicode UAX #39. - * The syntax of the source data is as described in UAX #39 for - * these files, and the content of these files is acceptable input. + * The input corresponds to the Unicode data file confusables.txt + * as described in Unicode UAX #39. The syntax of the source data + * is as described in UAX #39 for this file, and the content of + * this file is acceptable input. * * The character encoding of the (char *) input text is UTF-8. * @@ -371,10 +638,9 @@ uspoof_openFromSerialized(const void *data, int32_t length, int32_t *pActualLeng * @param confusablesLen The length of the confusables text, or -1 if the * input string is zero terminated. * @param confusablesWholeScript - * a pointer to the whole script confusables definitions, - * as found in the file confusablesWholeScript.txt from unicode.org. - * @param confusablesWholeScriptLen The length of the whole script confusables text, or - * -1 if the input string is zero terminated. + * Deprecated in ICU 58. No longer used. + * @param confusablesWholeScriptLen + * Deprecated in ICU 58. No longer used. * @param errType In the event of an error in the input, indicates * which of the input files contains the error. * The value is one of USPOOF_SINGLE_SCRIPT_CONFUSABLE or @@ -435,8 +701,33 @@ uspoof_clone(const USpoofChecker *sc, UErrorCode *status); /** - * Specify the set of checks that will be performed by the check - * functions of this Spoof Checker. + * Specify the bitmask of checks that will be performed by {@link uspoof_check}. Calling this method + * overwrites any checks that may have already been enabled. By default, all checks are enabled. + * + * To enable specific checks and disable all others, the "whitelisted" checks should be ORed together. For + * example, to fail strings containing characters outside of the set specified by {@link uspoof_setAllowedChars} and + * also strings that contain digits from mixed numbering systems: + * + *
+ * {@code
+ * uspoof_setChecks(USPOOF_CHAR_LIMIT | USPOOF_MIXED_NUMBERS);
+ * }
+ * 
+ * + * To disable specific checks and enable all others, the "blacklisted" checks should be ANDed away from + * ALL_CHECKS. For example, if you are not planning to use the {@link uspoof_areConfusable} functionality, + * it is good practice to disable the CONFUSABLE check: + * + *
+ * {@code
+ * uspoof_setChecks(USPOOF_ALL_CHECKS & ~USPOOF_CONFUSABLE);
+ * }
+ * 
+ * + * Note that methods such as {@link uspoof_setAllowedChars}, {@link uspoof_setAllowedLocales}, and + * {@link uspoof_setRestrictionLevel} will enable certain checks when called. Those methods will OR the check they + * enable onto the existing bitmask specified by this method. For more details, see the documentation of those + * methods. * * @param sc The USpoofChecker * @param checks The set of checks that this spoof checker will perform. @@ -464,19 +755,22 @@ U_STABLE int32_t U_EXPORT2 uspoof_getChecks(const USpoofChecker *sc, UErrorCode *status); /** - * Set the loosest restriction level allowed. The default if this function - * is not called is HIGHLY_RESTRICTIVE. - * Calling this function also enables the RESTRICTION_LEVEL check. - * @param restrictionLevel The loosest restriction level allowed. - * @see URestrictionLevel - * @stable ICU 51 - */ + * Set the loosest restriction level allowed for strings. The default if this is not called is + * {@link USPOOF_HIGHLY_RESTRICTIVE}. Calling this method enables the {@link USPOOF_RESTRICTION_LEVEL} and + * {@link USPOOF_MIXED_NUMBERS} checks, corresponding to Sections 5.1 and 5.2 of UTS 39. To customize which checks are + * to be performed by {@link uspoof_check}, see {@link uspoof_setChecks}. + * + * @param sc The USpoofChecker + * @param restrictionLevel The loosest restriction level allowed. + * @see URestrictionLevel + * @stable ICU 51 + */ U_STABLE void U_EXPORT2 uspoof_setRestrictionLevel(USpoofChecker *sc, URestrictionLevel restrictionLevel); /** - * Get the Restriction Level that will be tested if the checks include RESTRICTION_LEVEL. + * Get the Restriction Level that will be tested if the checks include {@link USPOOF_RESTRICTION_LEVEL}. * * @return The restriction level * @see URestrictionLevel @@ -499,7 +793,7 @@ uspoof_getRestrictionLevel(const USpoofChecker *sc); * Supplying an empty string removes all restrictions; * characters from any script will be allowed. * - * The USPOOF_CHAR_LIMIT test is automatically enabled for this + * The {@link USPOOF_CHAR_LIMIT} test is automatically enabled for this * USpoofChecker when calling this function with a non-empty list * of locales. * @@ -511,7 +805,7 @@ uspoof_getRestrictionLevel(const USpoofChecker *sc); * can be made to the result of uspoof_setAllowedLocales() by * fetching the resulting set with uspoof_getAllowedChars(), * manipulating it with the Unicode Set API, then resetting the - * spoof detectors limits with uspoof_setAllowedChars() + * spoof detectors limits with uspoof_setAllowedChars(). * * @param sc The USpoofChecker * @param localesList A list list of locales, from which the language @@ -654,16 +948,21 @@ uspoof_getAllowedUnicodeSet(const USpoofChecker *sc, UErrorCode *status); * The text to be checked will typically be an identifier of some sort. * The set of checks to be performed is specified with uspoof_setChecks(). * + * \note + * Consider using the newer API, {@link uspoof_check2}, instead. + * The newer API exposes additional information from the check procedure + * and is otherwise identical to this method. + * * @param sc The USpoofChecker * @param id The identifier to be checked for possible security issues, * in UTF-16 format. * @param length the length of the string to be checked, expressed in * 16 bit UTF-16 code units, or -1 if the string is * zero terminated. - * @param position An out parameter. - * Originally, the index of the first string position that failed a check. - * Now, always returns zero. - * This parameter may be null. + * @param position Deprecated in ICU 51. Always returns zero. + * Originally, an out parameter for the index of the first + * string position that failed a check. + * This parameter may be NULL. * @param status The error code, set if an error occurred while attempting to * perform the check. * Spoofing or security issues detected with the input string are @@ -673,6 +972,7 @@ uspoof_getAllowedUnicodeSet(const USpoofChecker *sc, UErrorCode *status); * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) * will be zero if the input string passes all of the * enabled checks. + * @see uspoof_check2 * @stable ICU 4.2 */ U_STABLE int32_t U_EXPORT2 @@ -687,15 +987,19 @@ uspoof_check(const USpoofChecker *sc, * The text to be checked will typically be an identifier of some sort. * The set of checks to be performed is specified with uspoof_setChecks(). * + * \note + * Consider using the newer API, {@link uspoof_check2UTF8}, instead. + * The newer API exposes additional information from the check procedure + * and is otherwise identical to this method. + * * @param sc The USpoofChecker * @param id A identifier to be checked for possible security issues, in UTF8 format. * @param length the length of the string to be checked, or -1 if the string is * zero terminated. - * @param position An out parameter. - * Originally, the index of the first string position that failed a check. - * Now, always returns zero. - * This parameter may be null. - * @deprecated ICU 51 + * @param position Deprecated in ICU 51. Always returns zero. + * Originally, an out parameter for the index of the first + * string position that failed a check. + * This parameter may be NULL. * @param status The error code, set if an error occurred while attempting to * perform the check. * Spoofing or security issues detected with the input string are @@ -707,6 +1011,7 @@ uspoof_check(const USpoofChecker *sc, * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) * will be zero if the input string passes all of the * enabled checks. + * @see uspoof_check2UTF8 * @stable ICU 4.2 */ U_STABLE int32_t U_EXPORT2 @@ -722,13 +1027,17 @@ uspoof_checkUTF8(const USpoofChecker *sc, * The text to be checked will typically be an identifier of some sort. * The set of checks to be performed is specified with uspoof_setChecks(). * + * \note + * Consider using the newer API, {@link uspoof_check2UnicodeString}, instead. + * The newer API exposes additional information from the check procedure + * and is otherwise identical to this method. + * * @param sc The USpoofChecker * @param id A identifier to be checked for possible security issues. - * @param position An out parameter. - * Originally, the index of the first string position that failed a check. - * Now, always returns zero. - * This parameter may be null. - * @deprecated ICU 51 + * @param position Deprecated in ICU 51. Always returns zero. + * Originally, an out parameter for the index of the first + * string position that failed a check. + * This parameter may be NULL. * @param status The error code, set if an error occurred while attempting to * perform the check. * Spoofing or security issues detected with the input string are @@ -738,6 +1047,7 @@ uspoof_checkUTF8(const USpoofChecker *sc, * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) * will be zero if the input string passes all of the * enabled checks. + * @see uspoof_check2UnicodeString * @stable ICU 4.2 */ U_STABLE int32_t U_EXPORT2 @@ -745,26 +1055,229 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, int32_t *position, UErrorCode *status); +#endif + + +#ifndef U_HIDE_DRAFT_API +/** + * Check the specified string for possible security issues. + * The text to be checked will typically be an identifier of some sort. + * The set of checks to be performed is specified with uspoof_setChecks(). + * + * @param sc The USpoofChecker + * @param id The identifier to be checked for possible security issues, + * in UTF-16 format. + * @param length the length of the string to be checked, or -1 if the string is + * zero terminated. + * @param checkResult An instance of USpoofCheckResult to be filled with + * details about the identifier. Can be NULL. + * @param status The error code, set if an error occurred while attempting to + * perform the check. + * Spoofing or security issues detected with the input string are + * not reported here, but through the function's return value. + * @return An integer value with bits set for any potential security + * or spoofing issues detected. The bits are defined by + * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) + * will be zero if the input string passes all of the + * enabled checks. Any information in this bitmask will be + * consistent with the information saved in the optional + * checkResult parameter. + * @see uspoof_openCheckResult + * @see uspoof_check2UTF8 + * @see uspoof_check2UnicodeString + * @draft ICU 58 + */ +U_DRAFT int32_t U_EXPORT2 +uspoof_check2(const USpoofChecker *sc, + const UChar* id, int32_t length, + USpoofCheckResult* checkResult, + UErrorCode *status); + +/** + * Check the specified string for possible security issues. + * The text to be checked will typically be an identifier of some sort. + * The set of checks to be performed is specified with uspoof_setChecks(). + * + * This version of {@link uspoof_check} accepts a USpoofCheckResult, which + * returns additional information about the identifier. For more + * information, see {@link uspoof_openCheckResult}. + * + * @param sc The USpoofChecker + * @param id A identifier to be checked for possible security issues, in UTF8 format. + * @param length the length of the string to be checked, or -1 if the string is + * zero terminated. + * @param checkResult An instance of USpoofCheckResult to be filled with + * details about the identifier. Can be NULL. + * @param status The error code, set if an error occurred while attempting to + * perform the check. + * Spoofing or security issues detected with the input string are + * not reported here, but through the function's return value. + * @return An integer value with bits set for any potential security + * or spoofing issues detected. The bits are defined by + * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) + * will be zero if the input string passes all of the + * enabled checks. Any information in this bitmask will be + * consistent with the information saved in the optional + * checkResult parameter. + * @see uspoof_openCheckResult + * @see uspoof_check2 + * @see uspoof_check2UnicodeString + * @draft ICU 58 + */ +U_DRAFT int32_t U_EXPORT2 +uspoof_check2UTF8(const USpoofChecker *sc, + const char *id, int32_t length, + USpoofCheckResult* checkResult, + UErrorCode *status); + +#if U_SHOW_CPLUSPLUS_API +/** + * Check the specified string for possible security issues. + * The text to be checked will typically be an identifier of some sort. + * The set of checks to be performed is specified with uspoof_setChecks(). + * + * @param sc The USpoofChecker + * @param id A identifier to be checked for possible security issues. + * @param checkResult An instance of USpoofCheckResult to be filled with + * details about the identifier. Can be NULL. + * @param status The error code, set if an error occurred while attempting to + * perform the check. + * Spoofing or security issues detected with the input string are + * not reported here, but through the function's return value. + * @return An integer value with bits set for any potential security + * or spoofing issues detected. The bits are defined by + * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) + * will be zero if the input string passes all of the + * enabled checks. Any information in this bitmask will be + * consistent with the information saved in the optional + * checkResult parameter. + * @see uspoof_openCheckResult + * @see uspoof_check2 + * @see uspoof_check2UTF8 + * @draft ICU 58 + */ +U_DRAFT int32_t U_EXPORT2 +uspoof_check2UnicodeString(const USpoofChecker *sc, + const icu::UnicodeString &id, + USpoofCheckResult* checkResult, + UErrorCode *status); +#endif + +/** + * Create a USpoofCheckResult, used by the {@link uspoof_check2} class of functions to return + * information about the identifier. Information includes: + *
    + *
  • A bitmask of the checks that failed
  • + *
  • The identifier's restriction level (UTS 39 section 5.2)
  • + *
  • The set of numerics in the string (UTS 39 section 5.3)
  • + *
+ * The data held in a USpoofCheckResult is cleared whenever it is passed into a new call + * of {@link uspoof_check2}. + * + * @param status The error code, set if this function encounters a problem. + * @return the newly created USpoofCheckResult + * @see uspoof_check2 + * @see uspoof_check2UTF8 + * @see uspoof_check2UnicodeString + * @draft ICU 58 + */ +U_DRAFT USpoofCheckResult* U_EXPORT2 +uspoof_openCheckResult(UErrorCode *status); + +/** + * Close a USpoofCheckResult, freeing any memory that was being held by + * its implementation. + * + * @param checkResult The instance of USpoofCheckResult to close + * @draft ICU 58 + */ +U_DRAFT void U_EXPORT2 +uspoof_closeCheckResult(USpoofCheckResult *checkResult); + +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + +/** + * \class LocalUSpoofCheckResultPointer + * "Smart pointer" class, closes a USpoofCheckResult via {@link uspoof_closeCheckResult}. + * For most methods see the LocalPointerBase base class. + * + * @see LocalPointerBase + * @see LocalPointer + * @draft ICU 58 + */ +U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult); + +U_NAMESPACE_END #endif +/** + * Indicates which of the spoof check(s) have failed. The value is a bitwise OR of the constants for the tests + * in question: USPOOF_RESTRICTION_LEVEL, USPOOF_CHAR_LIMIT, and so on. + * + * @param checkResult The instance of USpoofCheckResult created by {@link uspoof_openCheckResult} + * @param status The error code, set if an error occurred. + * @return An integer value with bits set for any potential security + * or spoofing issues detected. The bits are defined by + * enum USpoofChecks. (returned_value & USPOOF_ALL_CHECKS) + * will be zero if the input string passes all of the + * enabled checks. + * @see uspoof_setChecks + * @draft ICU 58 + */ +U_DRAFT int32_t U_EXPORT2 +uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *status); + +/** + * Gets the restriction level that the text meets, if the USPOOF_RESTRICTION_LEVEL check + * was enabled; otherwise, undefined. + * + * @param checkResult The instance of USpoofCheckResult created by {@link uspoof_openCheckResult} + * @param status The error code, set if an error occurred. + * @return The restriction level contained in the USpoofCheckResult + * @see uspoof_setRestrictionLevel + * @draft ICU 58 + */ +U_DRAFT URestrictionLevel U_EXPORT2 +uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErrorCode *status); + +/** + * Gets the set of numerics found in the string, if the USPOOF_MIXED_NUMBERS check was enabled; + * otherwise, undefined. The set will contain the zero digit from each decimal number system found + * in the input string. Ownership of the returned USet remains with the USpoofCheckResult. + * The USet will be free'd when {@link uspoof_closeCheckResult} is called. + * + * @param checkResult The instance of USpoofCheckResult created by {@link uspoof_openCheckResult} + * @return The set of numerics contained in the USpoofCheckResult + * @param status The error code, set if an error occurred. + * @draft ICU 58 + */ +U_DRAFT const USet* U_EXPORT2 +uspoof_getCheckResultNumerics(const USpoofCheckResult *checkResult, UErrorCode *status); +#endif /* U_HIDE_DRAFT_API */ + /** * Check the whether two specified strings are visually confusable. - * The types of confusability to be tested - single script, mixed script, - * or whole script - are determined by the check options set for the - * USpoofChecker. * - * The tests to be performed are controlled by the flags - * USPOOF_SINGLE_SCRIPT_CONFUSABLE - * USPOOF_MIXED_SCRIPT_CONFUSABLE - * USPOOF_WHOLE_SCRIPT_CONFUSABLE - * At least one of these tests must be selected. + * If the strings are confusable, the return value will be nonzero, as long as + * {@link USPOOF_CONFUSABLE} was enabled in uspoof_setChecks(). + * + * The bits in the return value correspond to flags for each of the classes of + * confusables applicable to the two input strings. According to UTS 39 + * section 4, the possible flags are: + * + *
    + *
  • {@link USPOOF_SINGLE_SCRIPT_CONFUSABLE}
  • + *
  • {@link USPOOF_MIXED_SCRIPT_CONFUSABLE}
  • + *
  • {@link USPOOF_WHOLE_SCRIPT_CONFUSABLE}
  • + *
* - * USPOOF_ANY_CASE is a modifier for the tests. Select it if the identifiers - * may be of mixed case. - * If identifiers are case folded for comparison and - * display to the user, do not select the USPOOF_ANY_CASE option. + * If one or more of the above flags were not listed in uspoof_setChecks(), this + * function will never report that class of confusable. The check + * {@link USPOOF_CONFUSABLE} enables all three flags. * * * @param sc The USpoofChecker @@ -786,6 +1299,7 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, * the type of confusability found, as defined by * enum USpoofChecks. Zero is returned if the identifiers * are not confusable. + * * @stable ICU 4.2 */ U_STABLE int32_t U_EXPORT2 @@ -797,10 +1311,7 @@ uspoof_areConfusable(const USpoofChecker *sc, /** - * Check the whether two specified strings are visually confusable. - * The types of confusability to be tested - single script, mixed script, - * or whole script - are determined by the check options set for the - * USpoofChecker. + * A version of {@link uspoof_areConfusable} accepting strings in UTF-8 format. * * @param sc The USpoofChecker * @param id1 The first of the two identifiers to be compared for @@ -819,7 +1330,10 @@ uspoof_areConfusable(const USpoofChecker *sc, * the type of confusability found, as defined by * enum USpoofChecks. Zero is returned if the strings * are not confusable. + * * @stable ICU 4.2 + * + * @see uspoof_areConfusable */ U_STABLE int32_t U_EXPORT2 uspoof_areConfusableUTF8(const USpoofChecker *sc, @@ -832,10 +1346,7 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, #if U_SHOW_CPLUSPLUS_API /** - * Check the whether two specified strings are visually confusable. - * The types of confusability to be tested - single script, mixed script, - * or whole script - are determined by the check options set for the - * USpoofChecker. + * A version of {@link uspoof_areConfusable} accepting UnicodeStrings. * * @param sc The USpoofChecker * @param s1 The first of the two identifiers to be compared for @@ -850,7 +1361,10 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, * the type of confusability found, as defined by * enum USpoofChecks. Zero is returned if the identifiers * are not confusable. + * * @stable ICU 4.2 + * + * @see uspoof_areConfusable */ U_STABLE int32_t U_EXPORT2 uspoof_areConfusableUnicodeString(const USpoofChecker *sc, @@ -861,37 +1375,36 @@ uspoof_areConfusableUnicodeString(const USpoofChecker *sc, /** - * Get the "skeleton" for an identifier. - * Skeletons are a transformation of the input identifier; - * Two identifiers are confusable if their skeletons are identical. - * See Unicode UAX #39 for additional information. - * - * Using skeletons directly makes it possible to quickly check - * whether an identifier is confusable with any of some large - * set of existing identifiers, by creating an efficiently - * searchable collection of the skeletons. - * - * @param sc The USpoofChecker - * @param type The type of skeleton, corresponding to which - * of the Unicode confusable data tables to use. - * The default is Mixed-Script, Lowercase. - * Allowed options are USPOOF_SINGLE_SCRIPT_CONFUSABLE and - * USPOOF_ANY_CASE. The two flags may be ORed. - * @param id The input identifier whose skeleton will be computed. - * @param length The length of the input identifier, expressed in 16 bit - * UTF-16 code units, or -1 if the string is zero terminated. - * @param dest The output buffer, to receive the skeleton string. - * @param destCapacity The length of the output buffer, in 16 bit units. - * The destCapacity may be zero, in which case the function will - * return the actual length of the skeleton. - * @param status The error code, set if an error occurred while attempting to - * perform the check. - * @return The length of the skeleton string. The returned length - * is always that of the complete skeleton, even when the - * supplied buffer is too small (or of zero length) - * - * @stable ICU 4.2 - */ + * Get the "skeleton" for an identifier. + * Skeletons are a transformation of the input identifier; + * Two identifiers are confusable if their skeletons are identical. + * See Unicode UAX #39 for additional information. + * + * Using skeletons directly makes it possible to quickly check + * whether an identifier is confusable with any of some large + * set of existing identifiers, by creating an efficiently + * searchable collection of the skeletons. + * + * @param sc The USpoofChecker + * @param type Deprecated in ICU 58. You may pass any number. + * Originally, controlled which of the Unicode confusable data + * tables to use. + * @param id The input identifier whose skeleton will be computed. + * @param length The length of the input identifier, expressed in 16 bit + * UTF-16 code units, or -1 if the string is zero terminated. + * @param dest The output buffer, to receive the skeleton string. + * @param destCapacity The length of the output buffer, in 16 bit units. + * The destCapacity may be zero, in which case the function will + * return the actual length of the skeleton. + * @param status The error code, set if an error occurred while attempting to + * perform the check. + * @return The length of the skeleton string. The returned length + * is always that of the complete skeleton, even when the + * supplied buffer is too small (or of zero length) + * + * @stable ICU 4.2 + * @see uspoof_areConfusable + */ U_STABLE int32_t U_EXPORT2 uspoof_getSkeleton(const USpoofChecker *sc, uint32_t type, @@ -900,40 +1413,38 @@ uspoof_getSkeleton(const USpoofChecker *sc, UErrorCode *status); /** - * Get the "skeleton" for an identifier. - * Skeletons are a transformation of the input identifier; - * Two identifiers are confusable if their skeletons are identical. - * See Unicode UAX #39 for additional information. - * - * Using skeletons directly makes it possible to quickly check - * whether an identifier is confusable with any of some large - * set of existing identifiers, by creating an efficiently - * searchable collection of the skeletons. - * - * @param sc The USpoofChecker - * @param type The type of skeleton, corresponding to which - * of the Unicode confusable data tables to use. - * The default is Mixed-Script, Lowercase. - * Allowed options are USPOOF_SINGLE_SCRIPT_CONFUSABLE and - * USPOOF_ANY_CASE. The two flags may be ORed. - * @param id The UTF-8 format identifier whose skeleton will be computed. - * @param length The length of the input string, in bytes, - * or -1 if the string is zero terminated. - * @param dest The output buffer, to receive the skeleton string. - * @param destCapacity The length of the output buffer, in bytes. - * The destCapacity may be zero, in which case the function will - * return the actual length of the skeleton. - * @param status The error code, set if an error occurred while attempting to - * perform the check. Possible Errors include U_INVALID_CHAR_FOUND - * for invalid UTF-8 sequences, and - * U_BUFFER_OVERFLOW_ERROR if the destination buffer is too small - * to hold the complete skeleton. - * @return The length of the skeleton string, in bytes. The returned length - * is always that of the complete skeleton, even when the - * supplied buffer is too small (or of zero length) - * - * @stable ICU 4.2 - */ + * Get the "skeleton" for an identifier. + * Skeletons are a transformation of the input identifier; + * Two identifiers are confusable if their skeletons are identical. + * See Unicode UAX #39 for additional information. + * + * Using skeletons directly makes it possible to quickly check + * whether an identifier is confusable with any of some large + * set of existing identifiers, by creating an efficiently + * searchable collection of the skeletons. + * + * @param sc The USpoofChecker + * @param type Deprecated in ICU 58. You may pass any number. + * Originally, controlled which of the Unicode confusable data + * tables to use. + * @param id The UTF-8 format identifier whose skeleton will be computed. + * @param length The length of the input string, in bytes, + * or -1 if the string is zero terminated. + * @param dest The output buffer, to receive the skeleton string. + * @param destCapacity The length of the output buffer, in bytes. + * The destCapacity may be zero, in which case the function will + * return the actual length of the skeleton. + * @param status The error code, set if an error occurred while attempting to + * perform the check. Possible Errors include U_INVALID_CHAR_FOUND + * for invalid UTF-8 sequences, and + * U_BUFFER_OVERFLOW_ERROR if the destination buffer is too small + * to hold the complete skeleton. + * @return The length of the skeleton string, in bytes. The returned length + * is always that of the complete skeleton, even when the + * supplied buffer is too small (or of zero length) + * + * @stable ICU 4.2 + */ U_STABLE int32_t U_EXPORT2 uspoof_getSkeletonUTF8(const USpoofChecker *sc, uint32_t type, @@ -943,30 +1454,28 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc, #if U_SHOW_CPLUSPLUS_API /** - * Get the "skeleton" for an identifier. - * Skeletons are a transformation of the input identifier; - * Two identifiers are confusable if their skeletons are identical. - * See Unicode UAX #39 for additional information. - * - * Using skeletons directly makes it possible to quickly check - * whether an identifier is confusable with any of some large - * set of existing identifiers, by creating an efficiently - * searchable collection of the skeletons. - * - * @param sc The USpoofChecker. - * @param type The type of skeleton, corresponding to which - * of the Unicode confusable data tables to use. - * The default is Mixed-Script, Lowercase. - * Allowed options are USPOOF_SINGLE_SCRIPT_CONFUSABLE and - * USPOOF_ANY_CASE. The two flags may be ORed. - * @param id The input identifier whose skeleton will be computed. - * @param dest The output identifier, to receive the skeleton string. - * @param status The error code, set if an error occurred while attempting to - * perform the check. - * @return A reference to the destination (skeleton) string. - * - * @stable ICU 4.2 - */ + * Get the "skeleton" for an identifier. + * Skeletons are a transformation of the input identifier; + * Two identifiers are confusable if their skeletons are identical. + * See Unicode UAX #39 for additional information. + * + * Using skeletons directly makes it possible to quickly check + * whether an identifier is confusable with any of some large + * set of existing identifiers, by creating an efficiently + * searchable collection of the skeletons. + * + * @param sc The USpoofChecker. + * @param type Deprecated in ICU 58. You may pass any number. + * Originally, controlled which of the Unicode confusable data + * tables to use. + * @param id The input identifier whose skeleton will be computed. + * @param dest The output identifier, to receive the skeleton string. + * @param status The error code, set if an error occurred while attempting to + * perform the check. + * @return A reference to the destination (skeleton) string. + * + * @stable ICU 4.2 + */ U_I18N_API icu::UnicodeString & U_EXPORT2 uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, uint32_t type, @@ -977,7 +1486,8 @@ uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, /** * Get the set of Candidate Characters for Inclusion in Identifiers, as defined - * in Unicode UAX #31, http://www.unicode.org/reports/tr31/#Table_Candidate_Characters_for_Inclusion_in_Identifiers + * in http://unicode.org/Public/security/latest/xidmodifications.txt + * and documented in http://www.unicode.org/reports/tr39/, Unicode Security Mechanisms. * * The returned set is frozen. Ownership of the set remains with the ICU library; it must not * be deleted by the caller. @@ -991,7 +1501,8 @@ uspoof_getInclusionSet(UErrorCode *status); /** * Get the set of characters from Recommended Scripts for Inclusion in Identifiers, as defined - * in Unicode UAX #31, http://www.unicode.org/reports/tr31/#Table_Recommended_Scripts + * in http://unicode.org/Public/security/latest/xidmodifications.txt + * and documented in http://www.unicode.org/reports/tr39/, Unicode Security Mechanisms. * * The returned set is frozen. Ownership of the set remains with the ICU library; it must not * be deleted by the caller. @@ -1007,7 +1518,8 @@ uspoof_getRecommendedSet(UErrorCode *status); /** * Get the set of Candidate Characters for Inclusion in Identifiers, as defined - * in Unicode UAX #31, http://www.unicode.org/reports/tr31/#Table_Candidate_Characters_for_Inclusion_in_Identifiers + * in http://unicode.org/Public/security/latest/xidmodifications.txt + * and documented in http://www.unicode.org/reports/tr39/, Unicode Security Mechanisms. * * The returned set is frozen. Ownership of the set remains with the ICU library; it must not * be deleted by the caller. @@ -1021,7 +1533,8 @@ uspoof_getInclusionUnicodeSet(UErrorCode *status); /** * Get the set of characters from Recommended Scripts for Inclusion in Identifiers, as defined - * in Unicode UAX #31, http://www.unicode.org/reports/tr31/#Table_Recommended_Scripts + * in http://unicode.org/Public/security/latest/xidmodifications.txt + * and documented in http://www.unicode.org/reports/tr39/, Unicode Security Mechanisms. * * The returned set is frozen. Ownership of the set remains with the ICU library; it must not * be deleted by the caller. diff --git a/deps/icu-small/source/i18n/unicode/utmscale.h b/deps/icu-small/source/i18n/unicode/utmscale.h index e22b1bc5e6ce99..6b4b389ac8ad24 100644 --- a/deps/icu-small/source/i18n/unicode/utmscale.h +++ b/deps/icu-small/source/i18n/unicode/utmscale.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2004 - 2008, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unicode/utrans.h b/deps/icu-small/source/i18n/unicode/utrans.h index 4ada5ef93c2082..661ee5d3850860 100644 --- a/deps/icu-small/source/i18n/unicode/utrans.h +++ b/deps/icu-small/source/i18n/unicode/utrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2011,2014-2015 International Business Machines diff --git a/deps/icu-small/source/i18n/unicode/vtzone.h b/deps/icu-small/source/i18n/unicode/vtzone.h index 22992b197f4c01..1682a3d526ccfb 100644 --- a/deps/icu-small/source/i18n/unicode/vtzone.h +++ b/deps/icu-small/source/i18n/unicode/vtzone.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/unum.cpp b/deps/icu-small/source/i18n/unum.cpp index 4b617df36fb759..0e224858db0a1d 100644 --- a/deps/icu-small/source/i18n/unum.cpp +++ b/deps/icu-small/source/i18n/unum.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1996-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/unumsys.cpp b/deps/icu-small/source/i18n/unumsys.cpp index aab769dd030f74..f643e342ebc762 100644 --- a/deps/icu-small/source/i18n/unumsys.cpp +++ b/deps/icu-small/source/i18n/unumsys.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2013, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/i18n/upluralrules.cpp b/deps/icu-small/source/i18n/upluralrules.cpp index 1e92c8840f30a9..5e1eebf53d5dc2 100644 --- a/deps/icu-small/source/i18n/upluralrules.cpp +++ b/deps/icu-small/source/i18n/upluralrules.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2010-2012, International Business Machines diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index a6e6be26a7d5f8..03e2586c5f74f4 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2004-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/uregexc.cpp b/deps/icu-small/source/i18n/uregexc.cpp index f430cdbf68bd2d..6d0dc2062c6037 100644 --- a/deps/icu-small/source/i18n/uregexc.cpp +++ b/deps/icu-small/source/i18n/uregexc.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2006, International Business Machines diff --git a/deps/icu-small/source/i18n/uregion.cpp b/deps/icu-small/source/i18n/uregion.cpp index 58bd9d0a0cca44..8e079ec593318c 100644 --- a/deps/icu-small/source/i18n/uregion.cpp +++ b/deps/icu-small/source/i18n/uregion.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** * Copyright (C) 2013-2015, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index a2aad7c67495eb..5e1617eb3e8d8d 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2015 IBM and others. All rights reserved. @@ -222,7 +224,7 @@ inline int32_t * addTouint32_tArray(int32_t *destination, if (U_FAILURE(*status)) { return NULL; } - uprv_memcpy(temp, destination, sizeof(int32_t) * offset); + uprv_memcpy(temp, destination, sizeof(int32_t) * (size_t)offset); *destinationlength = newlength; destination = temp; } @@ -264,7 +266,7 @@ inline int64_t * addTouint64_tArray(int64_t *destination, return NULL; } - uprv_memcpy(temp, destination, sizeof(int64_t) * offset); + uprv_memcpy(temp, destination, sizeof(int64_t) * (size_t)offset); *destinationlength = newlength; destination = temp; } @@ -1379,7 +1381,7 @@ inline UChar * addToUCharArray( UChar *destination, } } if (source1length != 0) { - uprv_memcpy(destination, source1, sizeof(UChar) * source1length); + u_memcpy(destination, source1, source1length); } if (source2length != 0) { uprv_memcpy(destination + source1length, source2, diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 341fff6ecd086d..3be10862fccdd9 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 2008-2015, International Business Machines Corporation @@ -20,7 +22,6 @@ #include "unicode/utf16.h" #include "cmemory.h" #include "cstring.h" -#include "identifier_info.h" #include "mutex.h" #include "scriptset.h" #include "uassert.h" @@ -40,9 +41,7 @@ U_NAMESPACE_USE static UnicodeSet *gInclusionSet = NULL; static UnicodeSet *gRecommendedSet = NULL; static const Normalizer2 *gNfdNormalizer = NULL; -static SpoofData *gDefaultSpoofData = NULL; static UInitOnce gSpoofInitStaticsOnce = U_INITONCE_INITIALIZER; -static UInitOnce gSpoofInitDefaultOnce = U_INITONCE_INITIALIZER; static UBool U_CALLCONV uspoof_cleanup(void) { @@ -51,83 +50,78 @@ uspoof_cleanup(void) { delete gRecommendedSet; gRecommendedSet = NULL; gNfdNormalizer = NULL; - if (gDefaultSpoofData) { - gDefaultSpoofData->removeReference(); // Will delete, assuming all user-level spoof checkers were closed. - } - gDefaultSpoofData = NULL; gSpoofInitStaticsOnce.reset(); - gSpoofInitDefaultOnce.reset(); return TRUE; } static void U_CALLCONV initializeStatics(UErrorCode &status) { static const char *inclusionPat = - "[\\u0027\\u002D-\\u002E\\u003A\\u00B7\\u0375\\u058A\\u05F3-\\u05F4" - "\\u06FD-\\u06FE\\u0F0B\\u200C-\\u200D\\u2010\\u2019\\u2027\\u30A0\\u30FB]"; + "['\\-.\\:\\u00B7\\u0375\\u058A\\u05F3\\u05F4\\u06FD\\u06FE\\u0F0B\\u200C\\u200D\\u2010\\u" + "2019\\u2027\\u30A0\\u30FB]"; gInclusionSet = new UnicodeSet(UnicodeString(inclusionPat, -1, US_INV), status); gInclusionSet->freeze(); - // Note: data from http://unicode.org/Public/security/latest/xidmodifications.txt version 8.0.0 - // There is no tooling to generate this from the .txt file, hand extracted with editor macros. - // Ultimately, data will be available as character properties, eliminating this. + // Note: data from http://unicode.org/Public/security/9.0.0/IdentifierStatus.txt + // 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 char *recommendedPat = - "[\\u0030-\\u0039\\u0041-\\u005A\\u005F\\u0061-\\u007A\\u00C0-\\u00D6\\u00D8-\\u00F6" - "\\u00F8-\\u0131\\u0134-\\u013E\\u0141-\\u0148\\u014A-\\u017E\\u018F\\u01A0-\\u01A1" - "\\u01AF-\\u01B0\\u01CD-\\u01DC\\u01DE-\\u01E3\\u01E6-\\u01F0\\u01F4-\\u01F5\\u01F8-\\u021B" - "\\u021E-\\u021F\\u0226-\\u0233\\u0259\\u02BB-\\u02BC\\u02EC\\u0300-\\u0304\\u0306-\\u030C" - "\\u030F-\\u0311\\u0313-\\u0314\\u031B\\u0323-\\u0328\\u032D-\\u032E\\u0330-\\u0331" - "\\u0335\\u0338-\\u0339\\u0342\\u0345\\u037B-\\u037D\\u0386\\u0388-\\u038A\\u038C" - "\\u038E-\\u03A1\\u03A3-\\u03CE\\u03FC-\\u045F\\u048A-\\u0529\\u052E-\\u052F\\u0531-\\u0556" - "\\u0559\\u0561-\\u0586\\u05B4\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u0655" - "\\u0660-\\u0669\\u0670-\\u0672\\u0674\\u0679-\\u068D\\u068F-\\u06D3\\u06D5\\u06E5-\\u06E6" - "\\u06EE-\\u06FC\\u06FF\\u0750-\\u07B1\\u08A0-\\u08AC\\u08B2\\u0901-\\u094D\\u094F-\\u0950" - "\\u0956-\\u0957\\u0960-\\u0963\\u0966-\\u096F\\u0971-\\u0977\\u0979-\\u097F\\u0981-\\u0983" - "\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9" - "\\u09BC-\\u09C4\\u09C7-\\u09C8\\u09CB-\\u09CE\\u09D7\\u09E0-\\u09E3\\u09E6-\\u09F1" - "\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32" - "\\u0A35\\u0A38-\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47-\\u0A48\\u0A4B-\\u0A4D\\u0A5C" - "\\u0A66-\\u0A74\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0" - "\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0" - "\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28" - "\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B43\\u0B47-\\u0B48\\u0B4B-\\u0B4D" - "\\u0B56-\\u0B57\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71\\u0B82-\\u0B83\\u0B85-\\u0B8A" - "\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4" - "\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0" - "\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28" - "\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55-\\u0C56" - "\\u0C60-\\u0C61\\u0C66-\\u0C6F\\u0C82-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8" - "\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5-\\u0CD6" - "\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1-\\u0CF2\\u0D02-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10" - "\\u0D12-\\u0D3A\\u0D3D-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D61" - "\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82-\\u0D83\\u0D85-\\u0D8E\\u0D91-\\u0D96\\u0D9A-\\u0DA5" - "\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6" - "\\u0DD8-\\u0DDE\\u0DF2\\u0E01-\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59" - "\\u0E81-\\u0E82\\u0E84\\u0E87-\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F" - "\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA-\\u0EAB\\u0EAD-\\u0EB2\\u0EB4-\\u0EB9\\u0EBB-\\u0EBD" - "\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE-\\u0EDF\\u0F00\\u0F20-\\u0F29" - "\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-\\u0F51\\u0F53-\\u0F56" - "\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71-\\u0F72\\u0F74\\u0F7A-\\u0F80" - "\\u0F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6" - "\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D" - "\\u10C7\\u10CD\\u10D0-\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D" - "\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0" - "\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310" - "\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-\\u17A2\\u17A5-\\u17A7" - "\\u17A9-\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7\\u17DC\\u17E0-\\u17E9\\u1E00-\\u1E99" - "\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D" - "\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74\\u1F76\\u1F78" - "\\u1F7A\\u1F7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-\\u1FC4\\u1FC6-\\u1FC8" - "\\u1FCA\\u1FCC\\u1FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-\\u1FE2\\u1FE4-\\u1FEA\\u1FEC" - "\\u1FF2-\\u1FF4\\u1FF6-\\u1FF8\\u1FFA\\u1FFC\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6" - "\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6" - "\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3041-\\u3096\\u3099-\\u309A\\u309D-\\u309E\\u30A1-\\u30FA" - "\\u30FC-\\u30FE\\u3105-\\u312D\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA660-\\uA661" - "\\uA674-\\uA67B\\uA67F\\uA69F\\uA717-\\uA71F\\uA788\\uA78D-\\uA78E\\uA790-\\uA793" - "\\uA7A0-\\uA7AA\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06" - "\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAC00-\\uD7A3\\uFA0E-\\uFA0F" - "\\uFA11\\uFA13-\\uFA14\\uFA1F\\uFA21\\uFA23-\\uFA24\\uFA27-\\uFA29\\U00020000-\\U0002A6D6" - "\\U0002A700-\\U0002B734\\U0002B740-\\U0002B81D\\U0002B820-\\U0002CEA1]"; + "[0-9A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u0131\\u0134-\\u013E\\u0141-\\u014" + "8\\u014A-\\u017E\\u018F\\u01A0\\u01A1\\u01AF\\u01B0\\u01CD-\\u01DC\\u01DE-\\u01E3\\u01E" + "6-\\u01F0\\u01F4\\u01F5\\u01F8-\\u021B\\u021E\\u021F\\u0226-\\u0233\\u0259\\u02BB\\u02B" + "C\\u02EC\\u0300-\\u0304\\u0306-\\u030C\\u030F-\\u0311\\u0313\\u0314\\u031B\\u0323-\\u03" + "28\\u032D\\u032E\\u0330\\u0331\\u0335\\u0338\\u0339\\u0342\\u0345\\u037B-\\u037D\\u0386" + "\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03CE\\u03FC-\\u045F\\u048A-\\u0529\\u05" + "2E\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0586\\u05B4\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0" + "620-\\u063F\\u0641-\\u0655\\u0660-\\u0669\\u0670-\\u0672\\u0674\\u0679-\\u068D\\u068F-" + "\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0750-\\u07B1\\u08A0-\\u08AC\\u08B2" + "\\u08B6-\\u08BD\\u0901-\\u094D\\u094F\\u0950\\u0956\\u0957\\u0960-\\u0963\\u0966-\\u096" + "F\\u0971-\\u0977\\u0979-\\u097F\\u0981-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u0" + "9A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u" + "09D7\\u09E0-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-" + "\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A35\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\" + "u0A4B-\\u0A4D\\u0A5C\\u0A66-\\u0A74\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A9" + "3-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0" + "ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\" + "u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B43\\u0B47" + "\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83" + "\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3" + "\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0B" + "D0\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u" + "0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56" + "\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C80\\u0C82\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92" + "-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0" + "CD5\\u0CD6\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D02\\u0D03\\u0D05-\\u0D0C\\u0" + "D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D43\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57" + "\\u0D60\\u0D61\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D8E\\u0D91-\\u0D9" + "6\\u0D9A-\\u0DA5\\u0DA7-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0" + "DD4\\u0DD6\\u0DD8-\\u0DDE\\u0DF2\\u0E01-\\u0E32\\u0E34-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\" + "u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u" + "0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB2\\u0EB4-\\u0EB9\\u0EBB-\\u0EBD\\" + "u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDE\\u0EDF\\u0F00\\u0F20-\\u0F29" + "\\u0F35\\u0F37\\u0F3E-\\u0F42\\u0F44-\\u0F47\\u0F49-\\u0F4C\\u0F4E-\\u0F51\\u0F53-\\u0F" + "56\\u0F58-\\u0F5B\\u0F5D-\\u0F68\\u0F6A-\\u0F6C\\u0F71\\u0F72\\u0F74\\u0F7A-\\u0F80\\u0" + "F82-\\u0F84\\u0F86-\\u0F92\\u0F94-\\u0F97\\u0F99-\\u0F9C\\u0F9E-\\u0FA1\\u0FA3-\\u0FA6" + "\\u0FA8-\\u0FAB\\u0FAD-\\u0FB8\\u0FBA-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10" + "C7\\u10CD\\u10D0-\\u10F0\\u10F7-\\u10FA\\u10FD-\\u10FF\\u1200-\\u1248\\u124A-\\u124D\\u" + "1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2" + "-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1" + "315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u1780-\\u17A2\\u17A5-\\u17A7\\u17A9-" + "\\u17B3\\u17B6-\\u17CA\\u17D2\\u17D7\\u17DC\\u17E0-\\u17E9\\u1C80-\\u1C88\\u1E00-\\u1E9" + "9\\u1E9E\\u1EA0-\\u1EF9\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1" + "F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F70\\u1F72\\u1F74\\u1F76\\u1F78\\u1F7A\\u1F" + "7C\\u1F80-\\u1FB4\\u1FB6-\\u1FBA\\u1FBC\\u1FC2-\\u1FC4\\u1FC6-\\u1FC8\\u1FCA\\u1FCC\\u1" + "FD0-\\u1FD2\\u1FD6-\\u1FDA\\u1FE0-\\u1FE2\\u1FE4-\\u1FEA\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-" + "\\u1FF8\\u1FFA\\u1FFC\\u2D27\\u2D2D\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0" + "-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3" + "005-\\u3007\\u3041-\\u3096\\u3099\\u309A\\u309D\\u309E\\u30A1-\\u30FA\\u30FC-\\u30FE\\u" + "3105-\\u312D\\u31A0-\\u31BA\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA660\\uA661\\uA674-\\uA67B" + "\\uA67F\\uA69F\\uA717-\\uA71F\\uA788\\uA78D\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7AE" + "\\uA7FA\\uA9E7-\\uA9FE\\uAA60-\\uAA76\\uAA7A-\\uAA7F\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB" + "11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAC00-\\uD7A3\\uFA0E\\uFA0F\\uFA11\\uFA13\\uF" + "A14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29\\U00020000-\\U0002A6D6\\U0002A700-\\U0" + "002B734\\U0002B740-\\U0002B81D\\U0002B820-\\U0002CEA1]"; gRecommendedSet = new UnicodeSet(UnicodeString(recommendedPat, -1, US_INV), status); gRecommendedSet->freeze(); @@ -135,11 +129,6 @@ static void U_CALLCONV initializeStatics(UErrorCode &status) { ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup); } -static void U_CALLCONV initializeDefaultData(UErrorCode &status) { - gDefaultSpoofData = SpoofData::getDefault(status); - ucln_i18n_registerCleanup(UCLN_I18N_SPOOF, uspoof_cleanup); -} - U_CFUNC void uspoof_internalInitStatics(UErrorCode *status) { umtx_initOnce(gSpoofInitStaticsOnce, &initializeStatics, *status); } @@ -147,14 +136,10 @@ U_CFUNC void uspoof_internalInitStatics(UErrorCode *status) { U_CAPI USpoofChecker * U_EXPORT2 uspoof_open(UErrorCode *status) { umtx_initOnce(gSpoofInitStaticsOnce, &initializeStatics, *status); - umtx_initOnce(gSpoofInitDefaultOnce, &initializeDefaultData, *status); if (U_FAILURE(*status)) { return NULL; } - SpoofImpl *si = new SpoofImpl(gDefaultSpoofData, *status); - if (si) { - gDefaultSpoofData->addReference(); - } + SpoofImpl *si = new SpoofImpl(*status); if (U_SUCCESS(*status) && si == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; } @@ -162,7 +147,7 @@ uspoof_open(UErrorCode *status) { delete si; si = NULL; } - return reinterpret_cast(si); + return si->asUSpoofChecker(); } @@ -188,9 +173,9 @@ uspoof_openFromSerialized(const void *data, int32_t length, int32_t *pActualLeng } if (pActualLength != NULL) { - *pActualLength = sd->fRawData->fLength; + *pActualLength = sd->size(); } - return reinterpret_cast(si); + return si->asUSpoofChecker(); } @@ -205,7 +190,7 @@ uspoof_clone(const USpoofChecker *sc, UErrorCode *status) { delete result; result = NULL; } - return reinterpret_cast(result); + return result->asUSpoofChecker(); } @@ -250,6 +235,7 @@ uspoof_setRestrictionLevel(USpoofChecker *sc, URestrictionLevel restrictionLevel SpoofImpl *This = SpoofImpl::validateThis(sc, status); if (This != NULL) { This->fRestrictionLevel = restrictionLevel; + This->fChecks |= USPOOF_RESTRICTION_LEVEL; } } @@ -333,6 +319,22 @@ uspoof_check(const USpoofChecker *sc, int32_t *position, UErrorCode *status) { + // Backwards compatibility: + if (position != NULL) { + *position = 0; + } + + // Delegate to uspoof_check2 + return uspoof_check2(sc, id, length, NULL, status); +} + + +U_CAPI int32_t U_EXPORT2 +uspoof_check2(const USpoofChecker *sc, + const UChar* id, int32_t length, + USpoofCheckResult* checkResult, + UErrorCode *status) { + const SpoofImpl *This = SpoofImpl::validateThis(sc, *status); if (This == NULL) { return 0; @@ -342,7 +344,7 @@ uspoof_check(const USpoofChecker *sc, return 0; } UnicodeString idStr((length == -1), id, length); // Aliasing constructor. - int32_t result = uspoof_checkUnicodeString(sc, idStr, position, status); + int32_t result = uspoof_check2UnicodeString(sc, idStr, checkResult, status); return result; } @@ -353,11 +355,27 @@ uspoof_checkUTF8(const USpoofChecker *sc, int32_t *position, UErrorCode *status) { + // Backwards compatibility: + if (position != NULL) { + *position = 0; + } + + // Delegate to uspoof_check2 + return uspoof_check2UTF8(sc, id, length, NULL, status); +} + + +U_CAPI int32_t U_EXPORT2 +uspoof_check2UTF8(const USpoofChecker *sc, + const char *id, int32_t length, + USpoofCheckResult* checkResult, + UErrorCode *status) { + if (U_FAILURE(*status)) { return 0; } UnicodeString idStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : uprv_strlen(id))); - int32_t result = uspoof_checkUnicodeString(sc, idStr, position, status); + int32_t result = uspoof_check2UnicodeString(sc, idStr, checkResult, status); return result; } @@ -419,125 +437,95 @@ uspoof_areConfusableUnicodeString(const USpoofChecker *sc, // If no tests relavant to this function have been specified, return an error. // TODO: is this really the right thing to do? It's probably an error on the caller's part, // but logically we would just return 0 (no error). - if ((This->fChecks & (USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | - USPOOF_WHOLE_SCRIPT_CONFUSABLE)) == 0) { + if ((This->fChecks & USPOOF_CONFUSABLE) == 0) { *status = U_INVALID_STATE_ERROR; return 0; } - int32_t flagsForSkeleton = This->fChecks & USPOOF_ANY_CASE; - int32_t result = 0; - IdentifierInfo *identifierInfo = This->getIdentifierInfo(*status); - if (U_FAILURE(*status)) { + // Compute the skeletons and check for confusability. + UnicodeString id1Skeleton; + uspoof_getSkeletonUnicodeString(sc, 0 /* deprecated */, id1, id1Skeleton, status); + UnicodeString id2Skeleton; + uspoof_getSkeletonUnicodeString(sc, 0 /* deprecated */, id2, id2Skeleton, status); + if (U_FAILURE(*status)) { return 0; } + if (id1Skeleton != id2Skeleton) { return 0; } - identifierInfo->setIdentifier(id1, *status); - int32_t id1ScriptCount = identifierInfo->getScriptCount(); - int32_t id1FirstScript = identifierInfo->getScripts()->nextSetBit(0); - identifierInfo->setIdentifier(id2, *status); - int32_t id2ScriptCount = identifierInfo->getScriptCount(); - int32_t id2FirstScript = identifierInfo->getScripts()->nextSetBit(0); - This->releaseIdentifierInfo(identifierInfo); - identifierInfo = NULL; - - if (This->fChecks & USPOOF_SINGLE_SCRIPT_CONFUSABLE) { - UnicodeString id1Skeleton; - UnicodeString id2Skeleton; - if (id1ScriptCount <= 1 && id2ScriptCount <= 1 && id1FirstScript == id2FirstScript) { - flagsForSkeleton |= USPOOF_SINGLE_SCRIPT_CONFUSABLE; - uspoof_getSkeletonUnicodeString(sc, flagsForSkeleton, id1, id1Skeleton, status); - uspoof_getSkeletonUnicodeString(sc, flagsForSkeleton, id2, id2Skeleton, status); - if (id1Skeleton == id2Skeleton) { - result |= USPOOF_SINGLE_SCRIPT_CONFUSABLE; - } + + // If we get here, the strings are confusable. Now we just need to set the flags for the appropriate classes + // of confusables according to UTS 39 section 4. + // Start by computing the resolved script sets of id1 and id2. + ScriptSet id1RSS; + This->getResolvedScriptSet(id1, id1RSS, *status); + ScriptSet id2RSS; + This->getResolvedScriptSet(id2, id2RSS, *status); + + // Turn on all applicable flags + int32_t result = 0; + if (id1RSS.intersects(id2RSS)) { + result |= USPOOF_SINGLE_SCRIPT_CONFUSABLE; + } else { + result |= USPOOF_MIXED_SCRIPT_CONFUSABLE; + if (!id1RSS.isEmpty() && !id2RSS.isEmpty()) { + result |= USPOOF_WHOLE_SCRIPT_CONFUSABLE; } } - if (result & USPOOF_SINGLE_SCRIPT_CONFUSABLE) { - // If the two inputs are single script confusable they cannot also be - // mixed or whole script confusable, according to the UAX39 definitions. - // So we can skip those tests. - return result; + // Turn off flags that the user doesn't want + if ((This->fChecks & USPOOF_SINGLE_SCRIPT_CONFUSABLE) == 0) { + result &= ~USPOOF_SINGLE_SCRIPT_CONFUSABLE; } - - // Two identifiers are whole script confusable if each is of a single script - // and they are mixed script confusable. - UBool possiblyWholeScriptConfusables = - id1ScriptCount <= 1 && id2ScriptCount <= 1 && (This->fChecks & USPOOF_WHOLE_SCRIPT_CONFUSABLE); - - // - // Mixed Script Check - // - if ((This->fChecks & USPOOF_MIXED_SCRIPT_CONFUSABLE) || possiblyWholeScriptConfusables ) { - // For getSkeleton(), resetting the USPOOF_SINGLE_SCRIPT_CONFUSABLE flag will get us - // the mixed script table skeleton, which is what we want. - // The Any Case / Lower Case bit in the skelton flags was set at the top of the function. - UnicodeString id1Skeleton; - UnicodeString id2Skeleton; - flagsForSkeleton &= ~USPOOF_SINGLE_SCRIPT_CONFUSABLE; - uspoof_getSkeletonUnicodeString(sc, flagsForSkeleton, id1, id1Skeleton, status); - uspoof_getSkeletonUnicodeString(sc, flagsForSkeleton, id2, id2Skeleton, status); - if (id1Skeleton == id2Skeleton) { - result |= USPOOF_MIXED_SCRIPT_CONFUSABLE; - if (possiblyWholeScriptConfusables) { - result |= USPOOF_WHOLE_SCRIPT_CONFUSABLE; - } - } + if ((This->fChecks & USPOOF_MIXED_SCRIPT_CONFUSABLE) == 0) { + result &= ~USPOOF_MIXED_SCRIPT_CONFUSABLE; + } + if ((This->fChecks & USPOOF_WHOLE_SCRIPT_CONFUSABLE) == 0) { + result &= ~USPOOF_WHOLE_SCRIPT_CONFUSABLE; } return result; } - - U_CAPI int32_t U_EXPORT2 uspoof_checkUnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, int32_t *position, UErrorCode *status) { - const SpoofImpl *This = SpoofImpl::validateThis(sc, *status); - if (This == NULL) { - return 0; - } - int32_t result = 0; - IdentifierInfo *identifierInfo = NULL; - if ((This->fChecks) & (USPOOF_RESTRICTION_LEVEL | USPOOF_MIXED_NUMBERS)) { - identifierInfo = This->getIdentifierInfo(*status); - if (U_FAILURE(*status)) { - goto cleanupAndReturn; - } - identifierInfo->setIdentifier(id, *status); - identifierInfo->setIdentifierProfile(*This->fAllowedCharsSet); + // Backwards compatibility: + if (position != NULL) { + *position = 0; } + // Delegate to uspoof_check2 + return uspoof_check2UnicodeString(sc, id, NULL, status); +} + +int32_t checkImpl(const SpoofImpl* This, const UnicodeString& id, CheckResult* checkResult, UErrorCode* status) { + U_ASSERT(This != NULL); + U_ASSERT(checkResult != NULL); + checkResult->clear(); + int32_t result = 0; - if ((This->fChecks) & USPOOF_RESTRICTION_LEVEL) { - URestrictionLevel idRestrictionLevel = identifierInfo->getRestrictionLevel(*status); + if (0 != (This->fChecks & USPOOF_RESTRICTION_LEVEL)) { + URestrictionLevel idRestrictionLevel = This->getRestrictionLevel(id, *status); if (idRestrictionLevel > This->fRestrictionLevel) { result |= USPOOF_RESTRICTION_LEVEL; } - if (This->fChecks & USPOOF_AUX_INFO) { - result |= idRestrictionLevel; - } + checkResult->fRestrictionLevel = idRestrictionLevel; } - if ((This->fChecks) & USPOOF_MIXED_NUMBERS) { - const UnicodeSet *numerics = identifierInfo->getNumerics(); - if (numerics->size() > 1) { + if (0 != (This->fChecks & USPOOF_MIXED_NUMBERS)) { + UnicodeSet numerics; + This->getNumerics(id, numerics, *status); + if (numerics.size() > 1) { result |= USPOOF_MIXED_NUMBERS; } - - // TODO: ICU4J returns the UnicodeSet of the numerics found in the identifier. - // We have no easy way to do the same in C. - // if (checkResult != null) { - // checkResult.numerics = numerics; - // } + checkResult->fNumerics = numerics; // UnicodeSet::operator= } - if (This->fChecks & (USPOOF_CHAR_LIMIT)) { + if (0 != (This->fChecks & USPOOF_CHAR_LIMIT)) { int32_t i; UChar32 c; int32_t length = id.length(); @@ -551,103 +539,74 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, } } - if (This->fChecks & - (USPOOF_WHOLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_INVISIBLE)) { - // These are the checks that need to be done on NFD input + if (0 != (This->fChecks & USPOOF_INVISIBLE)) { + // This check needs to be done on NFD input UnicodeString nfdText; gNfdNormalizer->normalize(id, nfdText, *status); int32_t nfdLength = nfdText.length(); - if (This->fChecks & USPOOF_INVISIBLE) { - - // scan for more than one occurence of the same non-spacing mark - // in a sequence of non-spacing marks. - int32_t i; - UChar32 c; - UChar32 firstNonspacingMark = 0; - UBool haveMultipleMarks = FALSE; - UnicodeSet marksSeenSoFar; // Set of combining marks in a single combining sequence. - - for (i=0; ifChecks & (USPOOF_WHOLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE)) { - // The basic test is the same for both whole and mixed script confusables. - // Compute the set of scripts that every input character has a confusable in. - // For this computation an input character is always considered to be - // confusable with itself in its own script. - // - // If the number of such scripts is two or more, and the input consisted of - // characters all from a single script, we have a whole script confusable. - // (The two scripts will be the original script and the one that is confusable) - // - // If the number of such scripts >= one, and the original input contained characters from - // more than one script, we have a mixed script confusable. (We can transform - // some of the characters, and end up with a visually similar string all in - // one script.) - - if (identifierInfo == NULL) { - identifierInfo = This->getIdentifierInfo(*status); - if (U_FAILURE(*status)) { - goto cleanupAndReturn; + for (i=0; isetIdentifier(id, *status); + continue; } - - int32_t scriptCount = identifierInfo->getScriptCount(); - - ScriptSet scripts; - This->wholeScriptCheck(nfdText, &scripts, *status); - int32_t confusableScriptCount = scripts.countMembers(); - //printf("confusableScriptCount = %d\n", confusableScriptCount); - - if ((This->fChecks & USPOOF_WHOLE_SCRIPT_CONFUSABLE) && - confusableScriptCount >= 2 && - scriptCount == 1) { - result |= USPOOF_WHOLE_SCRIPT_CONFUSABLE; + if (firstNonspacingMark == 0) { + firstNonspacingMark = c; + continue; } - - if ((This->fChecks & USPOOF_MIXED_SCRIPT_CONFUSABLE) && - confusableScriptCount >= 1 && - scriptCount > 1) { - result |= USPOOF_MIXED_SCRIPT_CONFUSABLE; + if (!haveMultipleMarks) { + marksSeenSoFar.add(firstNonspacingMark); + haveMultipleMarks = TRUE; } + if (marksSeenSoFar.contains(c)) { + // report the error, and stop scanning. + // No need to find more than the first failure. + result |= USPOOF_INVISIBLE; + break; + } + marksSeenSoFar.add(c); } } -cleanupAndReturn: - This->releaseIdentifierInfo(identifierInfo); - if (position != NULL) { - *position = 0; + checkResult->fChecks = result; + return checkResult->toCombinedBitmask(This->fChecks); +} + +U_CAPI int32_t U_EXPORT2 +uspoof_check2UnicodeString(const USpoofChecker *sc, + const icu::UnicodeString &id, + USpoofCheckResult* checkResult, + UErrorCode *status) { + const SpoofImpl *This = SpoofImpl::validateThis(sc, *status); + if (This == NULL) { + return FALSE; + } + + if (checkResult != NULL) { + CheckResult* ThisCheckResult = CheckResult::validateThis(checkResult, *status); + if (ThisCheckResult == NULL) { + return FALSE; + } + return checkImpl(This, id, ThisCheckResult, status); + } else { + // Stack-allocate the checkResult since this method doesn't return it + CheckResult stackCheckResult; + return checkImpl(This, id, &stackCheckResult, status); } - return result; } @@ -678,7 +637,7 @@ uspoof_getSkeleton(const USpoofChecker *sc, U_I18N_API UnicodeString & U_EXPORT2 uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, - uint32_t type, + uint32_t /*type*/, const UnicodeString &id, UnicodeString &dest, UErrorCode *status) { @@ -687,21 +646,9 @@ uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, return dest; } - int32_t tableMask = 0; - switch (type) { - case 0: - tableMask = USPOOF_ML_TABLE_FLAG; - break; - case USPOOF_SINGLE_SCRIPT_CONFUSABLE: - tableMask = USPOOF_SL_TABLE_FLAG; - break; - case USPOOF_ANY_CASE: - tableMask = USPOOF_MA_TABLE_FLAG; - break; - case USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_ANY_CASE: - tableMask = USPOOF_SA_TABLE_FLAG; - break; - default: + // Check that at least one of the CONFUSABLE flags is turned on. If not, + // return an error. + if ((This->fChecks & USPOOF_CONFUSABLE) == 0) { *status = U_ILLEGAL_ARGUMENT_ERROR; return dest; } @@ -717,7 +664,7 @@ uspoof_getSkeletonUnicodeString(const USpoofChecker *sc, for (inputIndex=0; inputIndex < normalizedLen; ) { UChar32 c = nfdId.char32At(inputIndex); inputIndex += U16_LENGTH(c); - This->confusableLookup(c, tableMask, skelStr); + This->fSpoofData->confusableLookup(c, skelStr); } gNfdNormalizer->normalize(skelStr, dest, *status); @@ -761,13 +708,8 @@ uspoof_serialize(USpoofChecker *sc,void *buf, int32_t capacity, UErrorCode *stat U_ASSERT(U_FAILURE(*status)); return 0; } - int32_t dataSize = This->fSpoofData->fRawData->fLength; - if (capacity < dataSize) { - *status = U_BUFFER_OVERFLOW_ERROR; - return dataSize; - } - uprv_memcpy(buf, This->fSpoofData->fRawData, dataSize); - return dataSize; + + return This->fSpoofData->serialize(buf, capacity, *status); } U_CAPI const USet * U_EXPORT2 @@ -794,6 +736,48 @@ uspoof_getRecommendedUnicodeSet(UErrorCode *status) { return gRecommendedSet; } +//------------------ +// CheckResult APIs +//------------------ + +U_CAPI USpoofCheckResult* U_EXPORT2 +uspoof_openCheckResult(UErrorCode *status) { + CheckResult* checkResult = new CheckResult(); + if (checkResult == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + return checkResult->asUSpoofCheckResult(); +} + +U_CAPI void U_EXPORT2 +uspoof_closeCheckResult(USpoofCheckResult* checkResult) { + UErrorCode status = U_ZERO_ERROR; + CheckResult* This = CheckResult::validateThis(checkResult, status); + delete This; +} + +U_CAPI int32_t U_EXPORT2 +uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *status) { + const CheckResult* This = CheckResult::validateThis(checkResult, *status); + if (U_FAILURE(*status)) { return 0; } + return This->fChecks; +} + +U_CAPI URestrictionLevel U_EXPORT2 +uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErrorCode *status) { + const CheckResult* This = CheckResult::validateThis(checkResult, *status); + if (U_FAILURE(*status)) { return USPOOF_UNRESTRICTIVE; } + return This->fRestrictionLevel; +} + +U_CAPI const USet* U_EXPORT2 +uspoof_getCheckResultNumerics(const USpoofCheckResult *checkResult, UErrorCode *status) { + const CheckResult* This = CheckResult::validateThis(checkResult, *status); + if (U_FAILURE(*status)) { return NULL; } + return This->fNumerics.toUSet(); +} + #endif // !UCONFIG_NO_NORMALIZATION diff --git a/deps/icu-small/source/i18n/uspoof_build.cpp b/deps/icu-small/source/i18n/uspoof_build.cpp index 0a404faf76bef2..d676fe997741b3 100644 --- a/deps/icu-small/source/i18n/uspoof_build.cpp +++ b/deps/icu-small/source/i18n/uspoof_build.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 2008-2015, International Business Machines Corporation @@ -35,7 +37,6 @@ #include "uassert.h" #include "uarrsort.h" #include "uspoof_conf.h" -#include "uspoof_wsconf.h" #if !UCONFIG_NO_NORMALIZATION @@ -48,7 +49,7 @@ U_CFUNC void uspoof_internalInitStatics(UErrorCode *status); U_CAPI USpoofChecker * U_EXPORT2 uspoof_openFromSource(const char *confusables, int32_t confusablesLen, - const char *confusablesWholeScript, int32_t confusablesWholeScriptLen, + const char* /*confusablesWholeScript*/, int32_t /*confusablesWholeScriptLen*/, int32_t *errorType, UParseError *pe, UErrorCode *status) { uspoof_internalInitStatics(status); if (U_FAILURE(*status)) { @@ -74,7 +75,6 @@ uspoof_openFromSource(const char *confusables, int32_t confusablesLen, // Compile the binary data from the source (text) format. ConfusabledataBuilder::buildConfusableData(This, confusables, confusablesLen, errorType, pe, *status); - buildWSConfusableData(This, confusablesWholeScript, confusablesWholeScriptLen, pe, *status); if (U_FAILURE(*status)) { delete This; diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp index aba8375e7c6bf8..6edd1fa3f3cd66 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.cpp +++ b/deps/icu-small/source/i18n/uspoof_conf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -43,11 +45,13 @@ U_NAMESPACE_USE // // The binary structures are described in uspoof_impl.h // -// 1. parse the data, building 4 hash tables, one each for the SL, SA, ML and MA -// tables. Each maps from a UChar32 to a String. +// 1. Parse the data, making a hash table mapping from a UChar32 to a String. // // 2. Sort all of the strings encountered by length, since they will need to // be stored in that order in the final string table. +// TODO: Sorting these strings by length is no longer needed since the removal of +// the string lengths table. This logic can be removed to save processing time +// when building confusables data. // // 3. Build a list of keys (UChar32s) from the four mapping tables. Sort the // list because that will be the ordering of our runtime table. @@ -61,7 +65,7 @@ U_NAMESPACE_USE SPUString::SPUString(UnicodeString *s) { fStr = s; - fStrTableIndex = 0; + fCharOrStrTableIndex = 0; } @@ -143,15 +147,11 @@ SPUString *SPUStringPool::addString(UnicodeString *src, UErrorCode &status) { ConfusabledataBuilder::ConfusabledataBuilder(SpoofImpl *spImpl, UErrorCode &status) : fSpoofImpl(spImpl), fInput(NULL), - fSLTable(NULL), - fSATable(NULL), - fMLTable(NULL), - fMATable(NULL), + fTable(NULL), fKeySet(NULL), fKeyVec(NULL), fValueVec(NULL), fStringTable(NULL), - fStringLengthsTable(NULL), stringPool(NULL), fParseLine(NULL), fParseHexNum(NULL), @@ -160,10 +160,7 @@ ConfusabledataBuilder::ConfusabledataBuilder(SpoofImpl *spImpl, UErrorCode &stat if (U_FAILURE(status)) { return; } - fSLTable = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &status); - fSATable = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &status); - fMLTable = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &status); - fMATable = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &status); + fTable = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &status); fKeySet = new UnicodeSet(); fKeyVec = new UVector(status); fValueVec = new UVector(status); @@ -175,14 +172,10 @@ ConfusabledataBuilder::~ConfusabledataBuilder() { uprv_free(fInput); uregex_close(fParseLine); uregex_close(fParseHexNum); - uhash_close(fSLTable); - uhash_close(fSATable); - uhash_close(fMLTable); - uhash_close(fMATable); + uhash_close(fTable); delete fKeySet; delete fKeyVec; delete fStringTable; - delete fStringLengthsTable; delete fValueVec; delete stringPool; } @@ -228,7 +221,7 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL // any line. What was matched is determined by examining which capture groups have a match. // Capture Group 1: the source char // Capture Group 2: the replacement chars - // Capture Group 3-6 the table type, SL, SA, ML, or MA + // Capture Group 3-6 the table type, SL, SA, ML, or MA (deprecated) // Capture Group 7: A blank or comment only line. // Capture Group 8: A syntactically invalid line. Anything that didn't match before. // Example Line from the confusables.txt source file: @@ -294,41 +287,12 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL // This a little like a Java intern() - any duplicates will be eliminated. SPUString *smapString = stringPool->addString(mapString, status); - // Add the UChar32 -> string mapping to the appropriate table. - UHashtable *table = uregex_start(fParseLine, 3, &status) >= 0 ? fSLTable : - uregex_start(fParseLine, 4, &status) >= 0 ? fSATable : - uregex_start(fParseLine, 5, &status) >= 0 ? fMLTable : - uregex_start(fParseLine, 6, &status) >= 0 ? fMATable : - NULL; - if (U_SUCCESS(status) && table == NULL) { - status = U_PARSE_ERROR; - } - if (U_FAILURE(status)) { - return; - } - + // Add the UChar32 -> string mapping to the table. // For Unicode 8, the SL, SA and ML tables have been discontinued. // All input data from confusables.txt is tagged MA. - // ICU spoof check functions should ignore the specified table and always - // use this MA Data. - // For now, implement by populating the MA data into all four tables, and - // keep the multiple table implementation in place, in case it comes back - // at some time in the future. - // There is no run time size penalty to keeping the four table implementation - - // the data is shared when it's the same betweeen tables. - if (table != fMATable) { - status = U_PARSE_ERROR; - return; - }; - // uhash_iput(table, keyChar, smapString, &status); - uhash_iput(fSLTable, keyChar, smapString, &status); - uhash_iput(fSATable, keyChar, smapString, &status); - uhash_iput(fMLTable, keyChar, smapString, &status); - uhash_iput(fMATable, keyChar, smapString, &status); + uhash_iput(fTable, keyChar, smapString, &status); + if (U_FAILURE(status)) { return; } fKeySet->add(keyChar); - if (U_FAILURE(status)) { - return; - } } // Input data is now all parsed and collected. @@ -341,43 +305,24 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL // Build up the string array, and record the index of each string therein // in the (build time only) string pool. // Strings of length one are not entered into the strings array. - // At the same time, build up the string lengths table, which records the - // position in the string table of the first string of each length >= 4. // (Strings in the table are sorted by length) stringPool->sort(status); fStringTable = new UnicodeString(); - fStringLengthsTable = new UVector(status); - int32_t previousStringLength = 0; - int32_t previousStringIndex = 0; int32_t poolSize = stringPool->size(); int32_t i; for (i=0; igetByIndex(i); int32_t strLen = s->fStr->length(); int32_t strIndex = fStringTable->length(); - U_ASSERT(strLen >= previousStringLength); if (strLen == 1) { // strings of length one do not get an entry in the string table. // Keep the single string character itself here, which is the same // convention that is used in the final run-time string table index. - s->fStrTableIndex = s->fStr->charAt(0); + s->fCharOrStrTableIndex = s->fStr->charAt(0); } else { - if ((strLen > previousStringLength) && (previousStringLength >= 4)) { - fStringLengthsTable->addElement(previousStringIndex, status); - fStringLengthsTable->addElement(previousStringLength, status); - } - s->fStrTableIndex = strIndex; + s->fCharOrStrTableIndex = strIndex; fStringTable->append(*(s->fStr)); } - previousStringLength = strLen; - previousStringIndex = strIndex; - } - // Make the final entry to the string lengths table. - // (it holds an entry for the _last_ string of each length, so adding the - // final one doesn't happen in the main loop because no longer string was encountered.) - if (previousStringLength >= 4) { - fStringLengthsTable->addElement(previousStringIndex, status); - fStringLengthsTable->addElement(previousStringLength, status); } // Construct the compile-time Key and Value tables @@ -396,10 +341,22 @@ void ConfusabledataBuilder::build(const char * confusables, int32_t confusablesL // code points requires a nested loop. for (UChar32 keyChar=fKeySet->getRangeStart(range); keyChar <= fKeySet->getRangeEnd(range); keyChar++) { - addKeyEntry(keyChar, fSLTable, USPOOF_SL_TABLE_FLAG, status); - addKeyEntry(keyChar, fSATable, USPOOF_SA_TABLE_FLAG, status); - addKeyEntry(keyChar, fMLTable, USPOOF_ML_TABLE_FLAG, status); - addKeyEntry(keyChar, fMATable, USPOOF_MA_TABLE_FLAG, status); + SPUString *targetMapping = static_cast(uhash_iget(fTable, keyChar)); + U_ASSERT(targetMapping != NULL); + + // Set an error code if trying to consume a long string. Otherwise, + // codePointAndLengthToKey will abort on a U_ASSERT. + if (targetMapping->fStr->length() > 256) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + int32_t key = ConfusableDataUtils::codePointAndLengthToKey(keyChar, + targetMapping->fStr->length()); + int32_t value = targetMapping->fCharOrStrTableIndex; + + fKeyVec->addElement(key, status); + fValueVec->addElement(value, status); } } @@ -435,14 +392,14 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { return; } int i; - int32_t previousKey = 0; + UChar32 previousCodePoint = 0; for (i=0; ielementAti(i); - (void)previousKey; // Suppress unused variable warning on gcc. - U_ASSERT((key & 0x00ffffff) >= (previousKey & 0x00ffffff)); - U_ASSERT((key & 0xff000000) != 0); + UChar32 codePoint = ConfusableDataUtils::keyToCodePoint(key); + // strictly greater because there can be only one entry per code point + U_ASSERT(codePoint > previousCodePoint); keys[i] = key; - previousKey = key; + previousCodePoint = codePoint; } SpoofDataHeader *rawData = fSpoofImpl->fSpoofData->fRawData; rawData->fCFUKeys = (int32_t)((char *)keys - (char *)rawData); @@ -484,143 +441,6 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { rawData->fCFUStringTable = (int32_t)((char *)strings - (char *)rawData); rawData->fCFUStringTableLen = stringsLength; fSpoofImpl->fSpoofData->fCFUStrings = strings; - - // The String Lengths Table - // While copying into the runtime array do some sanity checks on the values - // Each complete entry contains two fields, an index and an offset. - // Lengths should increase with each entry. - // Offsets should be less than the size of the string table. - int32_t lengthTableLength = fStringLengthsTable->size(); - uint16_t *stringLengths = - static_cast(fSpoofImpl->fSpoofData->reserveSpace(lengthTableLength*sizeof(uint16_t), status)); - if (U_FAILURE(status)) { - return; - } - int32_t destIndex = 0; - uint32_t previousLength = 0; - for (i=0; i(fStringLengthsTable->elementAti(i)); - uint32_t length = static_cast(fStringLengthsTable->elementAti(i+1)); - U_ASSERT(offset < stringsLength); - U_ASSERT(length < 40); - (void)previousLength; // Suppress unused variable warning on gcc. - U_ASSERT(length > previousLength); - stringLengths[destIndex++] = static_cast(offset); - stringLengths[destIndex++] = static_cast(length); - previousLength = length; - } - rawData = fSpoofImpl->fSpoofData->fRawData; - rawData->fCFUStringLengths = (int32_t)((char *)stringLengths - (char *)rawData); - // Note: StringLengthsSize in the raw data is the number of complete entries, - // each consisting of a pair of 16 bit values, hence the divide by 2. - rawData->fCFUStringLengthsSize = lengthTableLength / 2; - fSpoofImpl->fSpoofData->fCFUStringLengths = - reinterpret_cast(stringLengths); -} - - - -// addKeyEntry Construction of the confusable Key and Mapping Values tables. -// This is an intermediate point in the building process. -// We already have the mappings in the hash tables fSLTable, etc. -// This function builds corresponding run-time style table entries into -// fKeyVec and fValueVec - -void ConfusabledataBuilder::addKeyEntry( - UChar32 keyChar, // The key character - UHashtable *table, // The table, one of SATable, MATable, etc. - int32_t tableFlag, // One of USPOOF_SA_TABLE_FLAG, etc. - UErrorCode &status) { - - SPUString *targetMapping = static_cast(uhash_iget(table, keyChar)); - if (targetMapping == NULL) { - // No mapping for this key character. - // (This function is called for all four tables for each key char that - // is seen anywhere, so this no entry cases are very much expected.) - return; - } - - // Check whether there is already an entry with the correct mapping. - // If so, simply set the flag in the keyTable saying that the existing entry - // applies to the table that we're doing now. - - UBool keyHasMultipleValues = FALSE; - int32_t i; - for (i=fKeyVec->size()-1; i>=0 ; i--) { - int32_t key = fKeyVec->elementAti(i); - if ((key & 0x0ffffff) != keyChar) { - // We have now checked all existing key entries for this key char (if any) - // without finding one with the same mapping. - break; - } - UnicodeString mapping = getMapping(i); - if (mapping == *(targetMapping->fStr)) { - // The run time entry we are currently testing has the correct mapping. - // Set the flag in it indicating that it applies to the new table also. - key |= tableFlag; - fKeyVec->setElementAt(key, i); - return; - } - keyHasMultipleValues = TRUE; - } - - // Need to add a new entry to the binary data being built for this mapping. - // Includes adding entries to both the key table and the parallel values table. - - int32_t newKey = keyChar | tableFlag; - if (keyHasMultipleValues) { - newKey |= USPOOF_KEY_MULTIPLE_VALUES; - } - int32_t adjustedMappingLength = targetMapping->fStr->length() - 1; - if (adjustedMappingLength>3) { - adjustedMappingLength = 3; - } - newKey |= adjustedMappingLength << USPOOF_KEY_LENGTH_SHIFT; - - int32_t newData = targetMapping->fStrTableIndex; - - fKeyVec->addElement(newKey, status); - fValueVec->addElement(newData, status); - - // If the preceding key entry is for the same key character (but with a different mapping) - // set the multiple-values flag on it. - if (keyHasMultipleValues) { - int32_t previousKeyIndex = fKeyVec->size() - 2; - int32_t previousKey = fKeyVec->elementAti(previousKeyIndex); - previousKey |= USPOOF_KEY_MULTIPLE_VALUES; - fKeyVec->setElementAt(previousKey, previousKeyIndex); - } -} - - - -UnicodeString ConfusabledataBuilder::getMapping(int32_t index) { - int32_t key = fKeyVec->elementAti(index); - int32_t value = fValueVec->elementAti(index); - int32_t length = USPOOF_KEY_LENGTH_FIELD(key); - int32_t lastIndexWithLen; - switch (length) { - case 0: - return UnicodeString(static_cast(value)); - case 1: - case 2: - return UnicodeString(*fStringTable, value, length+1); - case 3: - length = 0; - int32_t i; - for (i=0; isize(); i+=2) { - lastIndexWithLen = fStringLengthsTable->elementAti(i); - if (value <= lastIndexWithLen) { - length = fStringLengthsTable->elementAti(i+1); - break; - } - } - U_ASSERT(length>=3); - return UnicodeString(*fStringTable, value, length); - default: - U_ASSERT(FALSE); - } - return UnicodeString(); } #endif diff --git a/deps/icu-small/source/i18n/uspoof_conf.h b/deps/icu-small/source/i18n/uspoof_conf.h index 2157142be6cd9e..72cd028104fdad 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.h +++ b/deps/icu-small/source/i18n/uspoof_conf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -36,9 +38,9 @@ U_NAMESPACE_BEGIN struct SPUString : public UMemory { UnicodeString *fStr; // The actual string. - int32_t fStrTableIndex; // Index into the final runtime data for this string. - // (or, for length 1, the single string char itself, - // there being no string table entry for it.) + int32_t fCharOrStrTableIndex; // Index into the final runtime data for this + // string (or, for length 1, the single string char + // itself, there being no string table entry for it.) SPUString(UnicodeString *s); ~SPUString(); }; @@ -86,10 +88,7 @@ class ConfusabledataBuilder : public UMemory { private: SpoofImpl *fSpoofImpl; UChar *fInput; - UHashtable *fSLTable; - UHashtable *fSATable; - UHashtable *fMLTable; - UHashtable *fMATable; + UHashtable *fTable; UnicodeSet *fKeySet; // A set of all keys (UChar32s) that go into the four mapping tables. // The binary data is first assembled into the following four collections, then @@ -97,7 +96,6 @@ class ConfusabledataBuilder : public UMemory { UVector *fKeyVec; UVector *fValueVec; UnicodeString *fStringTable; - UVector *fStringLengthsTable; SPUStringPool *stringPool; URegularExpression *fParseLine; diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index 111a1489ffd55c..fba742c3ffc013 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2008-2016, International Business Machines @@ -13,11 +15,11 @@ #include "utrie2.h" #include "cmemory.h" #include "cstring.h" -#include "identifier_info.h" #include "scriptset.h" #include "umutex.h" #include "udataswp.h" #include "uassert.h" +#include "ucln_in.h" #include "uspoof_impl.h" #if !UCONFIG_NO_NORMALIZATION @@ -27,41 +29,53 @@ U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(SpoofImpl) -SpoofImpl::SpoofImpl(SpoofData *data, UErrorCode &status) : - fMagic(0), fChecks(USPOOF_ALL_CHECKS), fSpoofData(data), fAllowedCharsSet(NULL) , - fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) { - if (U_FAILURE(status)) { - return; - } +SpoofImpl::SpoofImpl(SpoofData *data, UErrorCode& status) { + construct(status); + fSpoofData = data; +} + +SpoofImpl::SpoofImpl(UErrorCode& status) { + construct(status); + + // TODO: Call this method where it is actually needed, instead of in the + // constructor, to allow for lazy data loading. See #12696. + fSpoofData = SpoofData::getDefault(status); +} + +SpoofImpl::SpoofImpl() { + UErrorCode status = U_ZERO_ERROR; + construct(status); + + // TODO: Call this method where it is actually needed, instead of in the + // constructor, to allow for lazy data loading. See #12696. + fSpoofData = SpoofData::getDefault(status); +} + +void SpoofImpl::construct(UErrorCode& status) { + fMagic = USPOOF_MAGIC; + fChecks = USPOOF_ALL_CHECKS; + fSpoofData = NULL; + fAllowedCharsSet = NULL; + fAllowedLocales = NULL; fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE; + if (U_FAILURE(status)) { return; } + UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); - allowedCharsSet->freeze(); fAllowedCharsSet = allowedCharsSet; fAllowedLocales = uprv_strdup(""); if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; return; } - fMagic = USPOOF_MAGIC; -} - - -SpoofImpl::SpoofImpl() : - fMagic(USPOOF_MAGIC), fChecks(USPOOF_ALL_CHECKS), fSpoofData(NULL), fAllowedCharsSet(NULL) , - fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) { - UnicodeSet *allowedCharsSet = new UnicodeSet(0, 0x10ffff); allowedCharsSet->freeze(); - fAllowedCharsSet = allowedCharsSet; - fAllowedLocales = uprv_strdup(""); - fRestrictionLevel = USPOOF_HIGHLY_RESTRICTIVE; } // 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) , - fAllowedLocales(NULL), fCachedIdentifierInfo(NULL) { + fAllowedLocales(NULL) { if (U_FAILURE(status)) { return; } @@ -71,10 +85,10 @@ SpoofImpl::SpoofImpl(const SpoofImpl &src, UErrorCode &status) : fSpoofData = src.fSpoofData->addReference(); } fAllowedCharsSet = static_cast(src.fAllowedCharsSet->clone()); - if (fAllowedCharsSet == NULL) { + fAllowedLocales = uprv_strdup(src.fAllowedLocales); + if (fAllowedCharsSet == NULL || fAllowedLocales == NULL) { status = U_MEMORY_ALLOCATION_ERROR; } - fAllowedLocales = uprv_strdup(src.fAllowedLocales); fRestrictionLevel = src.fRestrictionLevel; } @@ -86,7 +100,11 @@ SpoofImpl::~SpoofImpl() { } delete fAllowedCharsSet; uprv_free((void *)fAllowedLocales); - delete fCachedIdentifierInfo; +} + +// Cast this instance as a USpoofChecker for the C API. +USpoofChecker *SpoofImpl::asUSpoofChecker() { + return reinterpret_cast(this); } // @@ -102,12 +120,11 @@ const SpoofImpl *SpoofImpl::validateThis(const USpoofChecker *sc, UErrorCode &st return NULL; } SpoofImpl *This = (SpoofImpl *)sc; - if (This->fMagic != USPOOF_MAGIC || - This->fSpoofData == NULL) { + if (This->fMagic != USPOOF_MAGIC) { status = U_INVALID_FORMAT_ERROR; return NULL; } - if (!SpoofData::validateDataVersion(This->fSpoofData->fRawData, status)) { + if (This->fSpoofData != NULL && !This->fSpoofData->validateDataVersion(status)) { return NULL; } return This; @@ -119,148 +136,6 @@ SpoofImpl *SpoofImpl::validateThis(USpoofChecker *sc, UErrorCode &status) { } - -//-------------------------------------------------------------------------------------- -// -// confusableLookup() This is the heart of the confusable skeleton generation -// implementation. -// -// Given a source character, produce the corresponding -// replacement character(s), appending them to the dest string. -// -//--------------------------------------------------------------------------------------- -int32_t SpoofImpl::confusableLookup(UChar32 inChar, int32_t tableMask, UnicodeString &dest) const { - - // Binary search the spoof data key table for the inChar - int32_t *low = fSpoofData->fCFUKeys; - int32_t *mid = NULL; - int32_t *limit = low + fSpoofData->fRawData->fCFUKeysSize; - UChar32 midc; - do { - int32_t delta = ((int32_t)(limit-low))/2; - mid = low + delta; - midc = *mid & 0x1fffff; - if (inChar == midc) { - goto foundChar; - } else if (inChar < midc) { - limit = mid; - } else { - low = mid; - } - } while (low < limit-1); - mid = low; - midc = *mid & 0x1fffff; - if (inChar != midc) { - // Char not found. It maps to itself. - int i = 0; - dest.append(inChar); - return i; - } - foundChar: - int32_t keyFlags = *mid & 0xff000000; - if ((keyFlags & tableMask) == 0) { - // We found the right key char, but the entry doesn't pertain to the - // table we need. See if there is an adjacent key that does - if (keyFlags & USPOOF_KEY_MULTIPLE_VALUES) { - int32_t *altMid; - for (altMid = mid-1; (*altMid&0x00ffffff) == inChar; altMid--) { - keyFlags = *altMid & 0xff000000; - if (keyFlags & tableMask) { - mid = altMid; - goto foundKey; - } - } - for (altMid = mid+1; (*altMid&0x00ffffff) == inChar; altMid++) { - keyFlags = *altMid & 0xff000000; - if (keyFlags & tableMask) { - mid = altMid; - goto foundKey; - } - } - } - // No key entry for this char & table. - // The input char maps to itself. - int i = 0; - dest.append(inChar); - return i; - } - - foundKey: - int32_t stringLen = USPOOF_KEY_LENGTH_FIELD(keyFlags) + 1; - int32_t keyTableIndex = (int32_t)(mid - fSpoofData->fCFUKeys); - - // Value is either a UChar (for strings of length 1) or - // an index into the string table (for longer strings) - uint16_t value = fSpoofData->fCFUValues[keyTableIndex]; - if (stringLen == 1) { - dest.append((UChar)value); - return 1; - } - - // String length of 4 from the above lookup is used for all strings of length >= 4. - // For these, get the real length from the string lengths table, - // which maps string table indexes to lengths. - // All strings of the same length are stored contiguously in the string table. - // 'value' from the lookup above is the starting index for the desired string. - - int32_t ix; - if (stringLen == 4) { - int32_t stringLengthsLimit = fSpoofData->fRawData->fCFUStringLengthsSize; - for (ix = 0; ix < stringLengthsLimit; ix++) { - if (fSpoofData->fCFUStringLengths[ix].fLastString >= value) { - stringLen = fSpoofData->fCFUStringLengths[ix].fStrLength; - break; - } - } - U_ASSERT(ix < stringLengthsLimit); - } - - U_ASSERT(value + stringLen <= fSpoofData->fRawData->fCFUStringTableLen); - UChar *src = &fSpoofData->fCFUStrings[value]; - dest.append(src, stringLen); - return stringLen; -} - - -//--------------------------------------------------------------------------------------- -// -// wholeScriptCheck() -// -// Input text is already normalized to NFD -// Return the set of scripts, each of which can represent something that is -// confusable with the input text. The script of the input text -// is included; input consisting of characters from a single script will -// always produce a result consisting of a set containing that script. -// -//--------------------------------------------------------------------------------------- -void SpoofImpl::wholeScriptCheck( - const UnicodeString &text, ScriptSet *result, UErrorCode &status) const { - - UTrie2 *table = - (fChecks & USPOOF_ANY_CASE) ? fSpoofData->fAnyCaseTrie : fSpoofData->fLowerCaseTrie; - result->setAll(); - int32_t length = text.length(); - for (int32_t inputIdx=0; inputIdx < length;) { - UChar32 c = text.char32At(inputIdx); - inputIdx += U16_LENGTH(c); - uint32_t index = utrie2_get32(table, c); - if (index == 0) { - // No confusables in another script for this char. - // TODO: we should change the data to have sets with just the single script - // bit for the script of this char. Gets rid of this special case. - // Until then, grab the script from the char and intersect it with the set. - UScriptCode cpScript = uscript_getScript(c, &status); - U_ASSERT(cpScript > USCRIPT_INHERITED); - result->intersect(cpScript, status); - } else if (index == 1) { - // Script == Common or Inherited. Nothing to do. - } else { - result->intersect(fSpoofData->fScriptSets[index]); - } - } -} - - void SpoofImpl::setAllowedLocales(const char *localesList, UErrorCode &status) { UnicodeSet allowedChars; UnicodeSet *tmpSet = NULL; @@ -372,6 +247,137 @@ void SpoofImpl::addScriptChars(const char *locale, UnicodeSet *allowedChars, UEr } } +// Computes the augmented script set for a code point, according to UTS 39 section 5.1. +void SpoofImpl::getAugmentedScriptSet(UChar32 codePoint, ScriptSet& result, UErrorCode& status) { + result.resetAll(); + result.setScriptExtensions(codePoint, status); + if (U_FAILURE(status)) { return; } + + // Section 5.1 step 1 + if (result.test(USCRIPT_HAN, status)) { + result.set(USCRIPT_HAN_WITH_BOPOMOFO, status); + result.set(USCRIPT_JAPANESE, status); + result.set(USCRIPT_KOREAN, status); + } + if (result.test(USCRIPT_HIRAGANA, status)) { + result.set(USCRIPT_JAPANESE, status); + } + if (result.test(USCRIPT_KATAKANA, status)) { + result.set(USCRIPT_JAPANESE, status); + } + if (result.test(USCRIPT_HANGUL, status)) { + result.set(USCRIPT_KOREAN, status); + } + if (result.test(USCRIPT_BOPOMOFO, status)) { + result.set(USCRIPT_HAN_WITH_BOPOMOFO, status); + } + + // Section 5.1 step 2 + if (result.test(USCRIPT_COMMON, status) || result.test(USCRIPT_INHERITED, status)) { + result.setAll(); + } +} + +// Computes the resolved script set for a string, according to UTS 39 section 5.1. +void SpoofImpl::getResolvedScriptSet(const UnicodeString& input, ScriptSet& result, UErrorCode& status) const { + getResolvedScriptSetWithout(input, USCRIPT_CODE_LIMIT, result, status); +} + +// Computes the resolved script set for a string, omitting characters having the specified script. +// If USCRIPT_CODE_LIMIT is passed as the second argument, all characters are included. +void SpoofImpl::getResolvedScriptSetWithout(const UnicodeString& input, UScriptCode script, ScriptSet& result, UErrorCode& status) const { + result.setAll(); + + ScriptSet temp; + UChar32 codePoint; + for (int32_t i = 0; i < input.length(); i += U16_LENGTH(codePoint)) { + codePoint = input.char32At(i); + + // Compute the augmented script set for the character + getAugmentedScriptSet(codePoint, temp, status); + if (U_FAILURE(status)) { return; } + + // Intersect the augmented script set with the resolved script set, but only if the character doesn't + // have the script specified in the function call + if (script == USCRIPT_CODE_LIMIT || !temp.test(script, status)) { + result.intersect(temp); + } + } +} + +// Computes the set of numerics for a string, according to UTS 39 section 5.3. +void SpoofImpl::getNumerics(const UnicodeString& input, UnicodeSet& result, UErrorCode& /*status*/) const { + result.clear(); + + UChar32 codePoint; + for (int32_t i = 0; i < input.length(); i += U16_LENGTH(codePoint)) { + codePoint = input.char32At(i); + + // Store a representative character for each kind of decimal digit + if (u_charType(codePoint) == U_DECIMAL_DIGIT_NUMBER) { + // Store the zero character as a representative for comparison. + // Unicode guarantees it is codePoint - value + result.add(codePoint - (UChar32)u_getNumericValue(codePoint)); + } + } +} + +// Computes the restriction level of a string, according to UTS 39 section 5.2. +URestrictionLevel SpoofImpl::getRestrictionLevel(const UnicodeString& input, UErrorCode& status) const { + // Section 5.2 step 1: + if (!fAllowedCharsSet->containsAll(input)) { + return USPOOF_UNRESTRICTIVE; + } + + // Section 5.2 step 2 + // Java use a static UnicodeSet for this test. In C++, avoid the static variable + // and just do a simple for loop. + UBool allASCII = TRUE; + for (int32_t i=0, length=input.length(); i 0x7f) { + allASCII = FALSE; + break; + } + } + if (allASCII) { + return USPOOF_ASCII; + } + + // Section 5.2 steps 3: + ScriptSet resolvedScriptSet; + getResolvedScriptSet(input, resolvedScriptSet, status); + if (U_FAILURE(status)) { return USPOOF_UNRESTRICTIVE; } + + // Section 5.2 step 4: + if (!resolvedScriptSet.isEmpty()) { + return USPOOF_SINGLE_SCRIPT_RESTRICTIVE; + } + + // Section 5.2 step 5: + ScriptSet resolvedNoLatn; + getResolvedScriptSetWithout(input, USCRIPT_LATIN, resolvedNoLatn, status); + if (U_FAILURE(status)) { return USPOOF_UNRESTRICTIVE; } + + // Section 5.2 step 6: + if (resolvedNoLatn.test(USCRIPT_HAN_WITH_BOPOMOFO, status) + || resolvedNoLatn.test(USCRIPT_JAPANESE, status) + || resolvedNoLatn.test(USCRIPT_KOREAN, status)) { + return USPOOF_HIGHLY_RESTRICTIVE; + } + + // Section 5.2 step 7: + if (!resolvedNoLatn.isEmpty() + && !resolvedNoLatn.test(USCRIPT_CYRILLIC, status) + && !resolvedNoLatn.test(USCRIPT_GREEK, status) + && !resolvedNoLatn.test(USCRIPT_CHEROKEE, status)) { + return USPOOF_MODERATELY_RESTRICTIVE; + } + + // Section 5.2 step 8: + return USPOOF_MINIMALLY_RESTRICTIVE; +} + + // Convert a text format hex number. Utility function used by builder code. Static. // Input: UChar *string text. Output: a UChar32 @@ -404,55 +410,60 @@ UChar32 SpoofImpl::ScanHex(const UChar *s, int32_t start, int32_t limit, UErrorC return (UChar32)val; } -// IdentifierInfo Cache. IdentifierInfo objects are somewhat expensive to create. -// Maintain a one-element cache, which is sufficient to avoid repeatedly -// creating new ones unless we get multi-thread concurrency in spoof -// check operations, which should be statistically uncommon. -// These functions are used in place of new & delete of an IdentifierInfo. -// They will recycle the IdentifierInfo when possible. -// They are logically const, and used within const functions that must be thread safe. -IdentifierInfo *SpoofImpl::getIdentifierInfo(UErrorCode &status) const { - IdentifierInfo *returnIdInfo = NULL; - if (U_FAILURE(status)) { - return returnIdInfo; - } - SpoofImpl *nonConstThis = const_cast(this); - { - Mutex m; - returnIdInfo = nonConstThis->fCachedIdentifierInfo; - nonConstThis->fCachedIdentifierInfo = NULL; - } - if (returnIdInfo == NULL) { - returnIdInfo = new IdentifierInfo(status); - if (U_SUCCESS(status) && returnIdInfo == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(status) && returnIdInfo != NULL) { - delete returnIdInfo; - returnIdInfo = NULL; - } - } - return returnIdInfo; +//----------------------------------------- +// +// class CheckResult Implementation +// +//----------------------------------------- + +CheckResult::CheckResult() : fMagic(USPOOF_CHECK_MAGIC) { + clear(); } +USpoofCheckResult* CheckResult::asUSpoofCheckResult() { + return reinterpret_cast(this); +} -void SpoofImpl::releaseIdentifierInfo(IdentifierInfo *idInfo) const { - if (idInfo != NULL) { - SpoofImpl *nonConstThis = const_cast(this); - { - Mutex m; - if (nonConstThis->fCachedIdentifierInfo == NULL) { - nonConstThis->fCachedIdentifierInfo = idInfo; - idInfo = NULL; - } - } - delete idInfo; +// +// Incoming parameter check on Status and the CheckResult object +// 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; +} + +CheckResult* CheckResult::validateThis(USpoofCheckResult *ptr, UErrorCode &status) { + return const_cast + (CheckResult::validateThis(const_cast(ptr), status)); } +void CheckResult::clear() { + fChecks = 0; + fNumerics.clear(); + fRestrictionLevel = USPOOF_UNDEFINED_RESTRICTIVE; +} +int32_t CheckResult::toCombinedBitmask(int32_t enabledChecks) { + if ((enabledChecks & USPOOF_AUX_INFO) != 0 && fRestrictionLevel != USPOOF_UNDEFINED_RESTRICTIVE) { + return fChecks | fRestrictionLevel; + } else { + return fChecks; + } +} +CheckResult::~CheckResult() { +} //---------------------------------------------------------------------------------------------- // @@ -461,12 +472,14 @@ void SpoofImpl::releaseIdentifierInfo(IdentifierInfo *idInfo) const { //---------------------------------------------------------------------------------------------- -UBool SpoofData::validateDataVersion(const SpoofDataHeader *rawData, UErrorCode &status) { +UBool SpoofData::validateDataVersion(UErrorCode &status) const { if (U_FAILURE(status) || - rawData == NULL || - rawData->fMagic != USPOOF_MAGIC || - rawData->fFormatVersion[0] > 1 || - rawData->fFormatVersion[1] > 0) { + fRawData == NULL || + fRawData->fMagic != USPOOF_MAGIC || + fRawData->fFormatVersion[0] != USPOOF_CONFUSABLE_DATA_FORMAT_VERSION || + fRawData->fFormatVersion[1] != 0 || + fRawData->fFormatVersion[2] != 0 || + fRawData->fFormatVersion[3] != 0) { status = U_INVALID_FORMAT_ERROR; return FALSE; } @@ -485,7 +498,7 @@ spoofDataIsAcceptable(void *context, pInfo->dataFormat[1] == 0x66 && pInfo->dataFormat[2] == 0x75 && pInfo->dataFormat[3] == 0x20 && - pInfo->formatVersion[0] == 1 + pInfo->formatVersion[0] == USPOOF_CONFUSABLE_DATA_FORMAT_VERSION ) { UVersionInfo *version = static_cast(context); if(version != NULL) { @@ -497,32 +510,61 @@ spoofDataIsAcceptable(void *context, } } +// Methods for the loading of the default confusables data file. The confusable +// data is loaded only when it is needed. +// +// SpoofData::getDefault() - Return the default confusables data, and call the +// initOnce() if it is not available. Adds a reference +// to the SpoofData that the caller is responsible for +// decrementing when they are done with the data. // -// SpoofData::getDefault() - return a wrapper around the spoof data that is -// baked into the default ICU data. +// uspoof_loadDefaultData - Called once, from initOnce(). The resulting SpoofData +// is shared by all spoof checkers using the default data. // -// Called once, from the initOnce() function in uspoof_impl.cpp; the resulting -// SpoofData is shared by all spoof checkers using the default data. +// uspoof_cleanupDefaultData - Called during cleanup. // -SpoofData *SpoofData::getDefault(UErrorCode &status) { + +static UInitOnce gSpoofInitDefaultOnce = U_INITONCE_INITIALIZER; +static SpoofData* gDefaultSpoofData; + +static UBool U_CALLCONV +uspoof_cleanupDefaultData(void) { + if (gDefaultSpoofData) { + // Will delete, assuming all user-level spoof checkers were closed. + gDefaultSpoofData->removeReference(); + gDefaultSpoofData = NULL; + gSpoofInitDefaultOnce.reset(); + } + return TRUE; +} + +static void U_CALLCONV uspoof_loadDefaultData(UErrorCode& status) { UDataMemory *udm = udata_openChoice(NULL, "cfu", "confusables", spoofDataIsAcceptable, NULL, // context, would receive dataVersion if supplied. &status); + if (U_FAILURE(status)) { return; } + gDefaultSpoofData = new SpoofData(udm, status); if (U_FAILURE(status)) { - return NULL; - } - SpoofData *This = new SpoofData(udm, status); - if (U_FAILURE(status)) { - delete This; - return NULL; + delete gDefaultSpoofData; + return; } - if (This == NULL) { + if (gDefaultSpoofData == NULL) { status = U_MEMORY_ALLOCATION_ERROR; + return; } - return This; + ucln_i18n_registerCleanup(UCLN_I18N_SPOOFDATA, uspoof_cleanupDefaultData); +} + +SpoofData* SpoofData::getDefault(UErrorCode& status) { + umtx_initOnce(gSpoofInitDefaultOnce, &uspoof_loadDefaultData, status); + if (U_FAILURE(status)) { return NULL; } + gDefaultSpoofData->addReference(); + return gDefaultSpoofData; } + + SpoofData::SpoofData(UDataMemory *udm, UErrorCode &status) { reset(); @@ -533,7 +575,7 @@ SpoofData::SpoofData(UDataMemory *udm, UErrorCode &status) // fRawData is non-const because it may be constructed by the data builder. fRawData = reinterpret_cast( const_cast(udata_getMemory(udm))); - validateDataVersion(fRawData, status); + validateDataVersion(status); initPtrs(status); } @@ -554,7 +596,7 @@ SpoofData::SpoofData(const void *data, int32_t length, UErrorCode &status) status = U_INVALID_FORMAT_ERROR; return; } - validateDataVersion(fRawData, status); + validateDataVersion(status); initPtrs(status); } @@ -582,7 +624,7 @@ SpoofData::SpoofData(UErrorCode &status) { uprv_memset(fRawData, 0, initialSize); fRawData->fMagic = USPOOF_MAGIC; - fRawData->fFormatVersion[0] = 1; + fRawData->fFormatVersion[0] = USPOOF_CONFUSABLE_DATA_FORMAT_VERSION; fRawData->fFormatVersion[1] = 0; fRawData->fFormatVersion[2] = 0; fRawData->fFormatVersion[3] = 0; @@ -600,11 +642,7 @@ void SpoofData::reset() { fRefCount = 1; fCFUKeys = NULL; fCFUValues = NULL; - fCFUStringLengths = NULL; fCFUStrings = NULL; - fAnyCaseTrie = NULL; - fLowerCaseTrie = NULL; - fScriptSets = NULL; } @@ -626,7 +664,6 @@ void SpoofData::reset() { void SpoofData::initPtrs(UErrorCode &status) { fCFUKeys = NULL; fCFUValues = NULL; - fCFUStringLengths = NULL; fCFUStrings = NULL; if (U_FAILURE(status)) { return; @@ -637,33 +674,13 @@ void SpoofData::initPtrs(UErrorCode &status) { if (fRawData->fCFUStringIndex != 0) { fCFUValues = (uint16_t *)((char *)fRawData + fRawData->fCFUStringIndex); } - if (fRawData->fCFUStringLengths != 0) { - fCFUStringLengths = (SpoofStringLengthsElement *)((char *)fRawData + fRawData->fCFUStringLengths); - } if (fRawData->fCFUStringTable != 0) { fCFUStrings = (UChar *)((char *)fRawData + fRawData->fCFUStringTable); } - - if (fAnyCaseTrie == NULL && fRawData->fAnyCaseTrie != 0) { - fAnyCaseTrie = utrie2_openFromSerialized(UTRIE2_16_VALUE_BITS, - (char *)fRawData + fRawData->fAnyCaseTrie, fRawData->fAnyCaseTrieLength, NULL, &status); - } - if (fLowerCaseTrie == NULL && fRawData->fLowerCaseTrie != 0) { - fLowerCaseTrie = utrie2_openFromSerialized(UTRIE2_16_VALUE_BITS, - (char *)fRawData + fRawData->fLowerCaseTrie, fRawData->fLowerCaseTrieLength, NULL, &status); - } - - if (fRawData->fScriptSets != 0) { - fScriptSets = (ScriptSet *)((char *)fRawData + fRawData->fScriptSets); - } } SpoofData::~SpoofData() { - utrie2_close(fAnyCaseTrie); - fAnyCaseTrie = NULL; - utrie2_close(fLowerCaseTrie); - fLowerCaseTrie = NULL; if (fDataOwned) { uprv_free(fRawData); } @@ -708,6 +725,78 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) { return (char *)fRawData + returnOffset; } +int32_t SpoofData::serialize(void *buf, int32_t capacity, UErrorCode &status) const { + int32_t dataSize = fRawData->fLength; + if (capacity < dataSize) { + status = U_BUFFER_OVERFLOW_ERROR; + return dataSize; + } + uprv_memcpy(buf, fRawData, dataSize); + return dataSize; +} + +int32_t SpoofData::size() const { + return fRawData->fLength; +} + +//------------------------------- +// +// Front-end APIs for SpoofData +// +//------------------------------- + +int32_t SpoofData::confusableLookup(UChar32 inChar, UnicodeString &dest) const { + // Perform a binary search. + // [lo, hi), i.e lo is inclusive, hi is exclusive. + // The result after the loop will be in lo. + int32_t lo = 0; + int32_t hi = length(); + do { + int32_t mid = (lo + hi) / 2; + if (codePointAt(mid) > inChar) { + hi = mid; + } else if (codePointAt(mid) < inChar) { + lo = mid; + } else { + // Found result. Break early. + lo = mid; + break; + } + } while (hi - lo > 1); + + // Did we find an entry? If not, the char maps to itself. + if (codePointAt(lo) != inChar) { + dest.append(inChar); + return 1; + } + + // Add the element to the string builder and return. + return appendValueTo(lo, dest); +} + +int32_t SpoofData::length() const { + return fRawData->fCFUKeysSize; +} + +UChar32 SpoofData::codePointAt(int32_t index) const { + return ConfusableDataUtils::keyToCodePoint(fCFUKeys[index]); +} + +int32_t SpoofData::appendValueTo(int32_t index, UnicodeString& dest) const { + int32_t stringLength = ConfusableDataUtils::keyToLength(fCFUKeys[index]); + + // Value is either a char (for strings of length 1) or + // an index into the string table (for longer strings) + uint16_t value = fCFUValues[index]; + if (stringLength == 1) { + dest.append((UChar)value); + } else { + dest.append(fCFUStrings + value, stringLength); + } + + return stringLength; +} + U_NAMESPACE_END @@ -739,7 +828,10 @@ uspoof_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *ou pInfo->dataFormat[1]==0x66 && pInfo->dataFormat[2]==0x75 && pInfo->dataFormat[3]==0x20 && - pInfo->formatVersion[0]==1 )) { + pInfo->formatVersion[0]==USPOOF_CONFUSABLE_DATA_FORMAT_VERSION && + pInfo->formatVersion[1]==0 && + pInfo->formatVersion[2]==0 && + pInfo->formatVersion[3]==0 )) { udata_printError(ds, "uspoof_swap(): data format %02x.%02x.%02x.%02x " "(format version %02x %02x %02x %02x) is not recognized\n", pInfo->dataFormat[0], pInfo->dataFormat[1], @@ -828,26 +920,6 @@ uspoof_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *ou sectionLength = ds->readUInt32(spoofDH->fCFUStringTableLen) * 2; ds->swapArray16(ds, inBytes+sectionStart, sectionLength, outBytes+sectionStart, status); - // String Lengths Section - sectionStart = ds->readUInt32(spoofDH->fCFUStringLengths); - sectionLength = ds->readUInt32(spoofDH->fCFUStringLengthsSize) * 4; - ds->swapArray16(ds, inBytes+sectionStart, sectionLength, outBytes+sectionStart, status); - - // Any Case Trie - sectionStart = ds->readUInt32(spoofDH->fAnyCaseTrie); - sectionLength = ds->readUInt32(spoofDH->fAnyCaseTrieLength); - utrie2_swap(ds, inBytes+sectionStart, sectionLength, outBytes+sectionStart, status); - - // Lower Case Trie - sectionStart = ds->readUInt32(spoofDH->fLowerCaseTrie); - sectionLength = ds->readUInt32(spoofDH->fLowerCaseTrieLength); - utrie2_swap(ds, inBytes+sectionStart, sectionLength, outBytes+sectionStart, status); - - // Script Sets. The data is an array of int32_t - sectionStart = ds->readUInt32(spoofDH->fScriptSets); - sectionLength = ds->readUInt32(spoofDH->fScriptSetsLength) * sizeof(ScriptSet); - ds->swapArray32(ds, inBytes+sectionStart, sectionLength, outBytes+sectionStart, status); - // And, last, swap the header itself. // int32_t fMagic // swap this // uint8_t fFormatVersion[4] // Do not swap this, just copy diff --git a/deps/icu-small/source/i18n/uspoof_impl.h b/deps/icu-small/source/i18n/uspoof_impl.h index 44f6b5c9439053..62480e39e89791 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.h +++ b/deps/icu-small/source/i18n/uspoof_impl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** * Copyright (C) 2008-2013, International Business Machines Corporation @@ -13,6 +15,7 @@ #ifndef USPOOFIM_H #define USPOOFIM_H +#include "uassert.h" #include "unicode/utypes.h" #include "unicode/uspoof.h" #include "unicode/uscript.h" @@ -37,11 +40,13 @@ U_NAMESPACE_BEGIN // Magic number for sanity checking spoof data. #define USPOOF_MAGIC 0x3845fdef -class IdentifierInfo; +// Magic number for sanity checking spoof checkers. +#define USPOOF_CHECK_MAGIC 0x2734ecde + class ScriptSet; class SpoofData; struct SpoofDataHeader; -struct SpoofStringLengthsElement; +class ConfusableDataUtils; /** * Class SpoofImpl corresponds directly to the plain C API opaque type @@ -49,25 +54,20 @@ struct SpoofStringLengthsElement; */ class SpoofImpl : public UObject { public: - SpoofImpl(SpoofData *data, UErrorCode &status); - SpoofImpl(); - virtual ~SpoofImpl(); + SpoofImpl(SpoofData *data, UErrorCode& status); + SpoofImpl(UErrorCode& status); + SpoofImpl(); + void construct(UErrorCode& status); + virtual ~SpoofImpl(); /** Copy constructor, used by the user level uspoof_clone() function. */ SpoofImpl(const SpoofImpl &src, UErrorCode &status); + USpoofChecker *asUSpoofChecker(); static SpoofImpl *validateThis(USpoofChecker *sc, UErrorCode &status); static const SpoofImpl *validateThis(const USpoofChecker *sc, UErrorCode &status); - /** Get the confusable skeleton transform for a single code point. - * The result is a string with a length between 1 and 18. - * @param tableMask bit flag specifying which confusable table to use. - * One of USPOOF_SL_TABLE_FLAG, USPOOF_MA_TABLE_FLAG, etc. - * @return The length in UTF-16 code units of the substition string. - */ - int32_t confusableLookup(UChar32 inChar, int32_t tableMask, UnicodeString &destBuf) const; - /** Set and Get AllowedLocales, implementations of the corresponding API */ void setAllowedLocales(const char *localesList, UErrorCode &status); const char * getAllowedLocales(UErrorCode &status); @@ -76,26 +76,19 @@ class SpoofImpl : public UObject { // the specified locale. Part of the implementation of setAllowedLocales. void addScriptChars(const char *locale, UnicodeSet *allowedChars, UErrorCode &status); + // Functions implementing the features of UTS 39 section 5. + static void getAugmentedScriptSet(UChar32 codePoint, ScriptSet& result, UErrorCode& status); + void getResolvedScriptSet(const UnicodeString& input, ScriptSet& result, UErrorCode& status) const; + void getResolvedScriptSetWithout(const UnicodeString& input, UScriptCode script, ScriptSet& result, UErrorCode& status) const; + void getNumerics(const UnicodeString& input, UnicodeSet& result, UErrorCode& status) const; + URestrictionLevel getRestrictionLevel(const UnicodeString& input, UErrorCode& status) const; /** parse a hex number. Untility used by the builders. */ static UChar32 ScanHex(const UChar *s, int32_t start, int32_t limit, UErrorCode &status); - // Implementation for Whole Script tests. - // Return the test bit flag to be ORed into the eventual user return value - // if a Spoof opportunity is detected. - void wholeScriptCheck( - const UnicodeString &text, ScriptSet *result, UErrorCode &status) const; - static UClassID U_EXPORT2 getStaticClassID(void); virtual UClassID getDynamicClassID(void) const; - // IdentifierInfo Cache. IdentifierInfo objects are somewhat expensive to create. - // Maintain a one-element cache, which is sufficient to avoid repeatedly - // creating new ones unless we get multi-thread concurrency in spoof - // check operations, which should be statistically uncommon. - IdentifierInfo *getIdentifierInfo(UErrorCode &status) const; - void releaseIdentifierInfo(IdentifierInfo *idInfo) const; - // // Data Members // @@ -110,14 +103,36 @@ class SpoofImpl : public UObject { const char *fAllowedLocales; // The list of allowed locales. URestrictionLevel fRestrictionLevel; // The maximum restriction level for an acceptable identifier. - - IdentifierInfo *fCachedIdentifierInfo; // Do not use directly. See getIdentifierInfo().:w }; +/** + * Class CheckResult corresponds directly to the plain C API opaque type + * USpoofCheckResult. One can be cast to the other. + */ +class CheckResult : public UObject { +public: + CheckResult(); + virtual ~CheckResult(); + + USpoofCheckResult *asUSpoofCheckResult(); + static CheckResult *validateThis(USpoofCheckResult *ptr, UErrorCode &status); + static const CheckResult *validateThis(const USpoofCheckResult *ptr, UErrorCode &status); + + void clear(); + + // Used to convert this CheckResult to the older int32_t return value API + 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. +}; // -// Confusable Mappings Data Structures +// Confusable Mappings Data Structures, version 2.0 // // For the confusable data, we are essentially implementing a map, // key: a code point @@ -125,14 +140,7 @@ class SpoofImpl : public UObject { // // The keys are stored as a sorted array of 32 bit ints. // bits 0-23 a code point value -// bits 24-31 flags -// 24: 1 if entry applies to SL table -// 25: 1 if entry applies to SA table -// 26: 1 if entry applies to ML table -// 27: 1 if entry applies to MA table -// 28: 1 if there are multiple entries for this code point. -// 29-30: length of value string, in UChars. -// values are (1, 2, 3, other) +// bits 24-31 length of value string, in UChars (between 1 and 256 UChars). // The key table is sorted in ascending code point order. (not on the // 32 bit int value, the flag bits do not participate in the sorting.) // @@ -146,39 +154,37 @@ class SpoofImpl : public UObject { // The strings table contains all of the value strings (those of length two or greater) // concatentated together into one long UChar (UTF-16) array. // -// The array is arranged by length of the strings - all strings of the same length -// are stored together. The sections are ordered by length of the strings - -// all two char strings first, followed by all of the three Char strings, etc. -// // There is no nul character or other mark between adjacent strings. // -// String Lengths table -// The length of strings from 1 to 3 is flagged in the key table. -// For strings of length 4 or longer, the string length table provides a -// mapping between an index into the string table and the corresponding length. -// Strings of these lengths are rare, so lookup time is not an issue. -// Each entry consists of -// uint16_t index of the _last_ string with this length -// uint16_t the length +//---------------------------------------------------------------------------- // +// Changes from format version 1 to format version 2: +// 1) Removal of the whole-script confusable data tables. +// 2) Removal of the SL/SA/ML/MA and multi-table flags in the key bitmask. +// 3) Expansion of string length value in the key bitmask from 2 bits to 8 bits. +// 4) Removal of the string lengths table since 8 bits is sufficient for the +// lengths of all entries in confusables.txt. -// Flag bits in the Key entries -#define USPOOF_SL_TABLE_FLAG (1<<24) -#define USPOOF_SA_TABLE_FLAG (1<<25) -#define USPOOF_ML_TABLE_FLAG (1<<26) -#define USPOOF_MA_TABLE_FLAG (1<<27) -#define USPOOF_KEY_MULTIPLE_VALUES (1<<28) -#define USPOOF_KEY_LENGTH_SHIFT 29 -#define USPOOF_KEY_LENGTH_FIELD(x) (((x)>>29) & 3) -struct SpoofStringLengthsElement { - uint16_t fLastString; // index in string table of last string with this length - uint16_t fStrLength; // Length of strings +// Internal functions for manipulating confusable data table keys +#define USPOOF_CONFUSABLE_DATA_FORMAT_VERSION 2 // version for ICU 58 +class ConfusableDataUtils { +public: + inline static UChar32 keyToCodePoint(int32_t key) { + return key & 0x00ffffff; + } + inline static int32_t keyToLength(int32_t key) { + return ((key & 0xff000000) >> 24) + 1; + } + inline static int32_t codePointAndLengthToKey(UChar32 codePoint, int32_t length) { + U_ASSERT((codePoint & 0x00ffffff) == codePoint); + U_ASSERT(length <= 256); + return codePoint | ((length - 1) << 24); + } }; - //------------------------------------------------------------------------------------- // // SpoofData @@ -195,7 +201,9 @@ struct SpoofStringLengthsElement { //--------------------------------------------------------------------------------------- class SpoofData: public UMemory { public: - static SpoofData *getDefault(UErrorCode &status); // Load standard ICU spoof data. + static SpoofData* getDefault(UErrorCode &status); // Get standard ICU spoof data. + static void releaseDefault(); // Cleanup reference to default spoof data. + SpoofData(UErrorCode &status); // Create new spoof data wrapper. // Only used when building new data from rules. @@ -210,7 +218,8 @@ class SpoofData: public UMemory { // Check raw Spoof Data Version compatibility. // Return TRUE it looks good. - static UBool validateDataVersion(const SpoofDataHeader *rawData, UErrorCode &status); + UBool validateDataVersion(UErrorCode &status) const; + ~SpoofData(); // Destructor not normally used. // Use removeReference() instead. // Reference Counting functions. @@ -220,6 +229,35 @@ class SpoofData: public UMemory { SpoofData *addReference(); void removeReference(); + // Reset all fields to an initial state. + // Called from the top of all constructors. + void reset(); + + // Copy this instance's raw data buffer to the specified address. + int32_t serialize(void *buf, int32_t capacity, UErrorCode &status) const; + + // Get the total number of bytes of data backed by this SpoofData. + // Not to be confused with length, which returns the number of confusable entries. + int32_t size() const; + + // Get the confusable skeleton transform for a single code point. + // The result is a string with a length between 1 and 18 as of Unicode 9. + // This is the main public endpoint for this class. + // @return The length in UTF-16 code units of the substition string. + int32_t confusableLookup(UChar32 inChar, UnicodeString &dest) const; + + // Get the number of confusable entries in this SpoofData. + int32_t length() const; + + // Get the code point (key) at the specified index. + UChar32 codePointAt(int32_t index) const; + + // Get the confusable skeleton (value) at the specified index. + // Append it to the specified UnicodeString&. + // @return The length in UTF-16 code units of the skeleton string. + int32_t appendValueTo(int32_t index, UnicodeString& dest) const; + + private: // Reserve space in the raw data. For use by builder when putting together a // new set of data. Init the new storage to zero, to prevent inconsistent // results if it is not all otherwise set by the requester. @@ -230,10 +268,6 @@ class SpoofData: public UMemory { // initialize the pointers from this object to the raw data. void initPtrs(UErrorCode &status); - // Reset all fields to an initial state. - // Called from the top of all constructors. - void reset(); - SpoofDataHeader *fRawData; // Ptr to the raw memory-mapped data UBool fDataOwned; // True if the raw data is owned, and needs // to be deleted when refcount goes to zero. @@ -247,15 +281,10 @@ class SpoofData: public UMemory { // Confusable data int32_t *fCFUKeys; uint16_t *fCFUValues; - SpoofStringLengthsElement *fCFUStringLengths; UChar *fCFUStrings; - // Whole Script Confusable Data - UTrie2 *fAnyCaseTrie; - UTrie2 *fLowerCaseTrie; - ScriptSet *fScriptSets; - }; - + friend class ConfusabledataBuilder; +}; //--------------------------------------------------------------------------------------- // @@ -284,47 +313,11 @@ struct SpoofDataHeader { int32_t fCFUStringTable; // byte offset of String table int32_t fCFUStringTableLen; // length of string table (in 16 bit UChars) - int32_t fCFUStringLengths; // byte offset to String Lengths table - int32_t fCFUStringLengthsSize; // number of entries in lengths table. (2 x 16 bits each) - - - // The following sections are for data from confusablesWholeScript.txt - - int32_t fAnyCaseTrie; // byte offset to the serialized Any Case Trie - int32_t fAnyCaseTrieLength; // Length (bytes) of the serialized Any Case Trie - - int32_t fLowerCaseTrie; // byte offset to the serialized Lower Case Trie - int32_t fLowerCaseTrieLength; // Length (bytes) of the serialized Lower Case Trie - - int32_t fScriptSets; // byte offset to array of ScriptSets - int32_t fScriptSetsLength; // Number of ScriptSets (24 bytes each) - - // The following sections are for data from xidmodifications.txt - int32_t unused[15]; // Padding, Room for Expansion +}; - }; - - - - -// -// Structure for the Whole Script Confusable Data -// See Unicode UAX-39, Unicode Security Mechanisms, for a description of the -// Whole Script confusable data -// -// The data provides mappings from code points to a set of scripts -// that contain characters that might be confused with the code point. -// There are two mappings, one for lower case only, and one for characters -// of any case. -// -// The actual data consists of a utrie2 to map from a code point to an offset, -// and an array of UScriptSets (essentially bit maps) that is indexed -// by the offsets obtained from the Trie. -// -// U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/uspoof_wsconf.cpp b/deps/icu-small/source/i18n/uspoof_wsconf.cpp deleted file mode 100644 index ad73ed690cd3fc..00000000000000 --- a/deps/icu-small/source/i18n/uspoof_wsconf.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2008-2013, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: uspoof_wsconf.cpp -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2009Jan05 (refactoring earlier files) -* created by: Andy Heninger -* -* Internal functions for compililing Whole Script confusable source data -* into its binary (runtime) form. The binary data format is described -* in uspoof_impl.h -*/ - -#include "unicode/utypes.h" -#include "unicode/uspoof.h" - -#if !UCONFIG_NO_NORMALIZATION - -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - -#include "unicode/unorm.h" -#include "unicode/uregex.h" -#include "unicode/ustring.h" -#include "cmemory.h" -#include "scriptset.h" -#include "uspoof_impl.h" -#include "uhash.h" -#include "uvector.h" -#include "uassert.h" -#include "uspoof_wsconf.h" - -U_NAMESPACE_USE - - -// Regular expression for parsing a line from the Unicode file confusablesWholeScript.txt -// Example Lines: -// 006F ; Latn; Deva; A # (o) LATIN SMALL LETTER O -// 0048..0049 ; Latn; Grek; A # [2] (H..I) LATIN CAPITAL LETTER H..LATIN CAPITAL LETTER I -// | | | | -// | | | |---- Which table, Any Case or Lower Case (A or L) -// | | |----------Target script. We need this. -// | |----------------Src script. Should match the script of the source -// | code points. Beyond checking that, we don't keep it. -// |--------------------------------Source code points or range. -// -// The expression will match _all_ lines, including erroneous lines. -// The result of the parse is returned via the contents of the (match) groups. -static const char *parseExp = - "(?m)" // Multi-line mode - "^([ \\t]*(?:#.*?)?)$" // A blank or comment line. Matches Group 1. - "|^(?:" // OR - "\\s*([0-9A-F]{4,})(?:..([0-9A-F]{4,}))?\\s*;" // Code point range. Groups 2 and 3. - "\\s*([A-Za-z]+)\\s*;" // The source script. Group 4. - "\\s*([A-Za-z]+)\\s*;" // The target script. Group 5. - "\\s*(?:(A)|(L))" // The table A or L. Group 6 or 7 - "[ \\t]*(?:#.*?)?" // Trailing commment - ")$|" // OR - "^(.*?)$"; // An error line. Group 8. - // Any line not matching the preceding - // parts of the expression.will match - // this, and thus be flagged as an error - - -// Extract a regular expression match group into a char * string. -// The group must contain only invariant characters. -// Used for script names -// -static void extractGroup( - URegularExpression *e, int32_t group, char *destBuf, int32_t destCapacity, UErrorCode &status) { - - UChar ubuf[50]; - ubuf[0] = 0; - destBuf[0] = 0; - int32_t len = uregex_group(e, group, ubuf, 50, &status); - if (U_FAILURE(status) || len == -1 || len >= destCapacity) { - return; - } - UnicodeString s(FALSE, ubuf, len); // Aliasing constructor - s.extract(0, len, destBuf, destCapacity, US_INV); -} - - - -U_NAMESPACE_BEGIN - -// Build the Whole Script Confusable data -// -// TODO: Reorganize. Either get rid of the WSConfusableDataBuilder class, -// because everything is local to this one build function anyhow, -// OR -// break this function into more reasonably sized pieces, with -// state in WSConfusableDataBuilder. -// -void buildWSConfusableData(SpoofImpl *spImpl, const char * confusablesWS, - int32_t confusablesWSLen, UParseError *pe, UErrorCode &status) -{ - if (U_FAILURE(status)) { - return; - } - URegularExpression *parseRegexp = NULL; - int32_t inputLen = 0; - UChar *input = NULL; - int32_t lineNum = 0; - - UVector *scriptSets = NULL; - uint32_t rtScriptSetsCount = 2; - - UTrie2 *anyCaseTrie = NULL; - UTrie2 *lowerCaseTrie = NULL; - - anyCaseTrie = utrie2_open(0, 0, &status); - lowerCaseTrie = utrie2_open(0, 0, &status); - - UnicodeString pattern(parseExp, -1, US_INV); - - // The scriptSets vector provides a mapping from TRIE values to the set of scripts. - // - // Reserved TRIE values: - // 0: Code point has no whole script confusables. - // 1: Code point is of script Common or Inherited. - // These code points do not participate in whole script confusable detection. - // (This is logically equivalent to saying that they contain confusables in - // all scripts) - // - // Because Trie values are indexes into the ScriptSets vector, pre-fill - // vector positions 0 and 1 to avoid conflicts with the reserved values. - - scriptSets = new UVector(status); - if (scriptSets == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - scriptSets->addElement((void *)NULL, status); - scriptSets->addElement((void *)NULL, status); - - // Convert the user input data from UTF-8 to UChar (UTF-16) - u_strFromUTF8(NULL, 0, &inputLen, confusablesWS, confusablesWSLen, &status); - if (status != U_BUFFER_OVERFLOW_ERROR) { - goto cleanup; - } - status = U_ZERO_ERROR; - input = static_cast(uprv_malloc((inputLen+1) * sizeof(UChar))); - if (input == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - u_strFromUTF8(input, inputLen+1, NULL, confusablesWS, confusablesWSLen, &status); - - parseRegexp = uregex_open(pattern.getBuffer(), pattern.length(), 0, NULL, &status); - - // Zap any Byte Order Mark at the start of input. Changing it to a space is benign - // given the syntax of the input. - if (*input == 0xfeff) { - *input = 0x20; - } - - // Parse the input, one line per iteration of this loop. - uregex_setText(parseRegexp, input, inputLen, &status); - while (uregex_findNext(parseRegexp, &status)) { - lineNum++; - if (uregex_start(parseRegexp, 1, &status) >= 0) { - // this was a blank or comment line. - continue; - } - if (uregex_start(parseRegexp, 8, &status) >= 0) { - // input file syntax error. - status = U_PARSE_ERROR; - goto cleanup; - } - if (U_FAILURE(status)) { - goto cleanup; - } - - // Pick up the start and optional range end code points from the parsed line. - UChar32 startCodePoint = SpoofImpl::ScanHex( - input, uregex_start(parseRegexp, 2, &status), uregex_end(parseRegexp, 2, &status), status); - UChar32 endCodePoint = startCodePoint; - if (uregex_start(parseRegexp, 3, &status) >=0) { - endCodePoint = SpoofImpl::ScanHex( - input, uregex_start(parseRegexp, 3, &status), uregex_end(parseRegexp, 3, &status), status); - } - - // Extract the two script names from the source line. We need these in an 8 bit - // default encoding (will be EBCDIC on IBM mainframes) in order to pass them on - // to the ICU u_getPropertyValueEnum() function. Ugh. - char srcScriptName[20]; - char targScriptName[20]; - extractGroup(parseRegexp, 4, srcScriptName, sizeof(srcScriptName), status); - extractGroup(parseRegexp, 5, targScriptName, sizeof(targScriptName), status); - UScriptCode srcScript = - static_cast(u_getPropertyValueEnum(UCHAR_SCRIPT, srcScriptName)); - UScriptCode targScript = - static_cast(u_getPropertyValueEnum(UCHAR_SCRIPT, targScriptName)); - if (U_FAILURE(status)) { - goto cleanup; - } - if (srcScript == USCRIPT_INVALID_CODE || targScript == USCRIPT_INVALID_CODE) { - status = U_INVALID_FORMAT_ERROR; - goto cleanup; - } - - // select the table - (A) any case or (L) lower case only - UTrie2 *table = anyCaseTrie; - if (uregex_start(parseRegexp, 7, &status) >= 0) { - table = lowerCaseTrie; - } - - // Build the set of scripts containing confusable characters for - // the code point(s) specified in this input line. - // Sanity check that the script of the source code point is the same - // as the source script indicated in the input file. Failure of this check is - // an error in the input file. - // Include the source script in the set (needed for Mixed Script Confusable detection). - // - UChar32 cp; - for (cp=startCodePoint; cp<=endCodePoint; cp++) { - int32_t setIndex = utrie2_get32(table, cp); - BuilderScriptSet *bsset = NULL; - if (setIndex > 0) { - U_ASSERT(setIndex < scriptSets->size()); - bsset = static_cast(scriptSets->elementAt(setIndex)); - } else { - bsset = new BuilderScriptSet(); - if (bsset == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - bsset->codePoint = cp; - bsset->trie = table; - bsset->sset = new ScriptSet(); - setIndex = scriptSets->size(); - bsset->index = setIndex; - bsset->rindex = 0; - if (bsset->sset == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - goto cleanup; - } - scriptSets->addElement(bsset, status); - utrie2_set32(table, cp, setIndex, &status); - } - bsset->sset->set(targScript, status); - bsset->sset->set(srcScript, status); - - if (U_FAILURE(status)) { - goto cleanup; - } - UScriptCode cpScript = uscript_getScript(cp, &status); - if (cpScript != srcScript) { - status = U_INVALID_FORMAT_ERROR; - goto cleanup; - } - } - } - - // Eliminate duplicate script sets. At this point we have a separate - // script set for every code point that had data in the input file. - // - // We eliminate underlying ScriptSet objects, not the BuildScriptSets that wrap them - // - // printf("Number of scriptSets: %d\n", scriptSets->size()); - { - int32_t duplicateCount = 0; - rtScriptSetsCount = 2; - for (int32_t outeri=2; outerisize(); outeri++) { - BuilderScriptSet *outerSet = static_cast(scriptSets->elementAt(outeri)); - if (outerSet->index != static_cast(outeri)) { - // This set was already identified as a duplicate. - // It will not be allocated a position in the runtime array of ScriptSets. - continue; - } - outerSet->rindex = rtScriptSetsCount++; - for (int32_t inneri=outeri+1; innerisize(); inneri++) { - BuilderScriptSet *innerSet = static_cast(scriptSets->elementAt(inneri)); - if (*(outerSet->sset) == *(innerSet->sset) && outerSet->sset != innerSet->sset) { - delete innerSet->sset; - innerSet->scriptSetOwned = FALSE; - innerSet->sset = outerSet->sset; - innerSet->index = outeri; - innerSet->rindex = outerSet->rindex; - duplicateCount++; - } - // But this doesn't get all. We need to fix the TRIE. - } - } - // printf("Number of distinct script sets: %d\n", rtScriptSetsCount); - } - - - - // Update the Trie values to be reflect the run time script indexes (after duplicate merging). - // (Trie Values 0 and 1 are reserved, and the corresponding slots in scriptSets - // are unused, which is why the loop index starts at 2.) - { - for (int32_t i=2; isize(); i++) { - BuilderScriptSet *bSet = static_cast(scriptSets->elementAt(i)); - if (bSet->rindex != (uint32_t)i) { - utrie2_set32(bSet->trie, bSet->codePoint, bSet->rindex, &status); - } - } - } - - // For code points with script==Common or script==Inherited, - // Set the reserved value of 1 into both Tries. These characters do not participate - // in Whole Script Confusable detection; this reserved value is the means - // by which they are detected. - { - UnicodeSet ignoreSet; - ignoreSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_COMMON, status); - UnicodeSet inheritedSet; - inheritedSet.applyIntPropertyValue(UCHAR_SCRIPT, USCRIPT_INHERITED, status); - ignoreSet.addAll(inheritedSet); - for (int32_t rn=0; rnfSpoofData->fRawData->fAnyCaseTrie = spImpl->fSpoofData->fMemLimit; - spImpl->fSpoofData->fRawData->fAnyCaseTrieLength = size; - spImpl->fSpoofData->fAnyCaseTrie = anyCaseTrie; - void *where = spImpl->fSpoofData->reserveSpace(size, status); - utrie2_serialize(anyCaseTrie, where, size, &status); - - utrie2_freeze(lowerCaseTrie, UTRIE2_16_VALUE_BITS, &status); - size = utrie2_serialize(lowerCaseTrie, NULL, 0, &status); - // printf("Lower case Trie size: %d\n", size); - if (status != U_BUFFER_OVERFLOW_ERROR) { - goto cleanup; - } - status = U_ZERO_ERROR; - spImpl->fSpoofData->fRawData->fLowerCaseTrie = spImpl->fSpoofData->fMemLimit; - spImpl->fSpoofData->fRawData->fLowerCaseTrieLength = size; - spImpl->fSpoofData->fLowerCaseTrie = lowerCaseTrie; - where = spImpl->fSpoofData->reserveSpace(size, status); - utrie2_serialize(lowerCaseTrie, where, size, &status); - - spImpl->fSpoofData->fRawData->fScriptSets = spImpl->fSpoofData->fMemLimit; - spImpl->fSpoofData->fRawData->fScriptSetsLength = rtScriptSetsCount; - ScriptSet *rtScriptSets = static_cast - (spImpl->fSpoofData->reserveSpace(rtScriptSetsCount * sizeof(ScriptSet), status)); - uint32_t rindex = 2; - for (int32_t i=2; isize(); i++) { - BuilderScriptSet *bSet = static_cast(scriptSets->elementAt(i)); - if (bSet->rindex < rindex) { - // We have already copied this script set to the serialized data. - continue; - } - U_ASSERT(rindex == bSet->rindex); - rtScriptSets[rindex] = *bSet->sset; // Assignment of a ScriptSet just copies the bits. - rindex++; - } - } - - // Open new utrie2s from the serialized data. We don't want to keep the ones - // we just built because we would then have two copies of the data, one internal to - // the utries that we have already constructed, and one in the serialized data area. - // An alternative would be to not pre-serialize the Trie data, but that makes the - // spoof detector data different, depending on how the detector was constructed. - // It's simpler to keep the data always the same. - - spImpl->fSpoofData->fAnyCaseTrie = utrie2_openFromSerialized( - UTRIE2_16_VALUE_BITS, - (const char *)spImpl->fSpoofData->fRawData + spImpl->fSpoofData->fRawData->fAnyCaseTrie, - spImpl->fSpoofData->fRawData->fAnyCaseTrieLength, - NULL, - &status); - - spImpl->fSpoofData->fLowerCaseTrie = utrie2_openFromSerialized( - UTRIE2_16_VALUE_BITS, - (const char *)spImpl->fSpoofData->fRawData + spImpl->fSpoofData->fRawData->fLowerCaseTrie, - spImpl->fSpoofData->fRawData->fAnyCaseTrieLength, - NULL, - &status); - - - -cleanup: - if (U_FAILURE(status)) { - pe->line = lineNum; - } - uregex_close(parseRegexp); - uprv_free(input); - - int32_t i; - if (scriptSets != NULL) { - for (i=0; isize(); i++) { - BuilderScriptSet *bsset = static_cast(scriptSets->elementAt(i)); - delete bsset; - } - delete scriptSets; - } - utrie2_close(anyCaseTrie); - utrie2_close(lowerCaseTrie); - return; -} - -U_NAMESPACE_END - - - -BuilderScriptSet::BuilderScriptSet() { - codePoint = -1; - trie = NULL; - sset = NULL; - index = 0; - rindex = 0; - scriptSetOwned = TRUE; -} - -BuilderScriptSet::~BuilderScriptSet() { - if (scriptSetOwned) { - delete sset; - } -} - -#endif -#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/deps/icu-small/source/i18n/uspoof_wsconf.h b/deps/icu-small/source/i18n/uspoof_wsconf.h deleted file mode 100644 index 5c0e6111a7a45d..00000000000000 --- a/deps/icu-small/source/i18n/uspoof_wsconf.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -****************************************************************************** -* -* Copyright (C) 2008-2012, International Business Machines -* Corporation and others. All Rights Reserved. -* -****************************************************************************** -* file name: uspoof_buildwsconf.h -* encoding: US-ASCII -* tab size: 8 (not used) -* indentation:4 -* -* created on: 2009Jan19 -* created by: Andy Heninger -* -* Internal classes and functions -* for compiling whole script confusable data into its binary (runtime) form. -*/ - -#ifndef __USPOOF_BUILDWSCONF_H__ -#define __USPOOF_BUILDWSCONF_H__ - -#include "unicode/utypes.h" - -#if !UCONFIG_NO_NORMALIZATION - -#if !UCONFIG_NO_REGULAR_EXPRESSIONS - -#include "uspoof_impl.h" -#include "utrie2.h" - - -U_NAMESPACE_BEGIN - -// -// class BuilderScriptSet. Represents the set of scripts (Script Codes) -// containing characters that are confusable with one specific -// code point. -// - -class BuilderScriptSet: public UMemory { - public: - UChar32 codePoint; // The source code point. - UTrie2 *trie; // Any-case or Lower-case Trie. - // These Trie tables are the final result of the - // build. This flag indicates which of the two - // this set of data is for. - ScriptSet *sset; // The set of scripts itself. - - // Vectors of all B - uint32_t index; // Index of this set in the Build Time vector - // of script sets. - uint32_t rindex; // Index of this set in the final (runtime) - // array of sets. - UBool scriptSetOwned; // True if this BuilderScriptSet owns (should delete) - // its underlying sset. - - BuilderScriptSet(); - ~BuilderScriptSet(); -}; - - -void buildWSConfusableData(SpoofImpl *spImpl, const char * confusablesWS, - int32_t confusablesWSLen, UParseError *pe, UErrorCode &status); - -U_NAMESPACE_END - -#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS -#endif // !UCONFIG_NO_NORMALIZATION -#endif diff --git a/deps/icu-small/source/i18n/usrchimp.h b/deps/icu-small/source/i18n/usrchimp.h index 898e38a20f9e72..e6693d16b7ac51 100644 --- a/deps/icu-small/source/i18n/usrchimp.h +++ b/deps/icu-small/source/i18n/usrchimp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2015 IBM and others. All rights reserved. diff --git a/deps/icu-small/source/i18n/utf16collationiterator.cpp b/deps/icu-small/source/i18n/utf16collationiterator.cpp index 559ea91ea88492..733729fae79ece 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf16collationiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/utf16collationiterator.h b/deps/icu-small/source/i18n/utf16collationiterator.h index 16de2078ed0b3f..505ab810d37921 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.h +++ b/deps/icu-small/source/i18n/utf16collationiterator.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/utf8collationiterator.cpp b/deps/icu-small/source/i18n/utf8collationiterator.cpp index ddb753f6aefe66..0a0205e7b31cc2 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf8collationiterator.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2014, International Business Machines diff --git a/deps/icu-small/source/i18n/utf8collationiterator.h b/deps/icu-small/source/i18n/utf8collationiterator.h index bb0fc1179dc1eb..8deb5ea395b7af 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.h +++ b/deps/icu-small/source/i18n/utf8collationiterator.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2012-2016, International Business Machines diff --git a/deps/icu-small/source/i18n/utmscale.c b/deps/icu-small/source/i18n/utmscale.c index 94fb7525fd39a5..6868b9db2261a1 100644 --- a/deps/icu-small/source/i18n/utmscale.c +++ b/deps/icu-small/source/i18n/utmscale.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2004-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/utrans.cpp b/deps/icu-small/source/i18n/utrans.cpp index 91d9f1c8e67313..aed817ce2636e7 100644 --- a/deps/icu-small/source/i18n/utrans.cpp +++ b/deps/icu-small/source/i18n/utrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1997-2009,2014 International Business Machines diff --git a/deps/icu-small/source/i18n/valueformatter.cpp b/deps/icu-small/source/i18n/valueformatter.cpp index d7870d1041df8d..45b08f60b653ac 100644 --- a/deps/icu-small/source/i18n/valueformatter.cpp +++ b/deps/icu-small/source/i18n/valueformatter.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/valueformatter.h b/deps/icu-small/source/i18n/valueformatter.h index 42ccd212077670..da2dd1b33787e5 100644 --- a/deps/icu-small/source/i18n/valueformatter.h +++ b/deps/icu-small/source/i18n/valueformatter.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/visibledigits.cpp b/deps/icu-small/source/i18n/visibledigits.cpp index a6cbd0fdce276e..1fea3504dfeee8 100644 --- a/deps/icu-small/source/i18n/visibledigits.cpp +++ b/deps/icu-small/source/i18n/visibledigits.cpp @@ -1,5 +1,7 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* - * Copyright (C) 2015, International Business Machines + * Copyright (C) 2016, International Business Machines * Corporation and others. All Rights Reserved. * * file name: visibledigits.cpp @@ -84,8 +86,11 @@ double VisibleDigits::computeAbsDoubleValue() const { } // stack allocate a decNumber to hold MAX_DBL_DIGITS+3 significant digits - char rawNumber[sizeof(decNumber) + MAX_DBL_DIGITS+3]; - decNumber *numberPtr = (decNumber *) rawNumber; + struct { + decNumber decNum; + char digits[MAX_DBL_DIGITS+3]; + } decNumberWithStorage; + decNumber *numberPtr = &decNumberWithStorage.decNum; int32_t mostSig = fInterval.getMostSignificantExclusive(); int32_t mostSigNonZero = fExponent + fDigits.length(); @@ -109,15 +114,8 @@ double VisibleDigits::computeAbsDoubleValue() const { char str[MAX_DBL_DIGITS+18]; uprv_decNumberToString(numberPtr, str); U_ASSERT(uprv_strlen(str) < MAX_DBL_DIGITS+18); - char decimalSeparator = DigitList::getStrtodDecimalSeparator(); - if (decimalSeparator != '.') { - char *decimalPt = strchr(str, '.'); - if (decimalPt != NULL) { - *decimalPt = decimalSeparator; - } - } char *unused = NULL; - return uprv_strtod(str, &unused); + return DigitList::decimalStrToDouble(str, &unused); } void VisibleDigits::getFixedDecimal( @@ -165,7 +163,8 @@ void VisibleDigits::getFixedDecimal( // f (decimal digits) // skip over any leading 0's in fraction digits. int32_t idx = -1; - for (; idx >= -v && getDigitByExponent(idx) == 0; --idx); + for (; idx >= -v && getDigitByExponent(idx) == 0; --idx) + ; // Only process up to first 18 non zero fraction digits for decimalDigits // since that is all we can fit into an int64. diff --git a/deps/icu-small/source/i18n/visibledigits.h b/deps/icu-small/source/i18n/visibledigits.h index 9390aadc6bd200..cd18239a56601a 100644 --- a/deps/icu-small/source/i18n/visibledigits.h +++ b/deps/icu-small/source/i18n/visibledigits.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index 0585ea75ae0fa2..ba5f3bc0d7bde2 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 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 diff --git a/deps/icu-small/source/i18n/vzone.cpp b/deps/icu-small/source/i18n/vzone.cpp index cd75802a179074..7ee95e4edecd6a 100644 --- a/deps/icu-small/source/i18n/vzone.cpp +++ b/deps/icu-small/source/i18n/vzone.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/vzone.h b/deps/icu-small/source/i18n/vzone.h index f89a5619a67fa8..22a41b4e37b478 100644 --- a/deps/icu-small/source/i18n/vzone.h +++ b/deps/icu-small/source/i18n/vzone.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index 8625ea7e3efa4e..20ce338bb4b88a 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2016, International Business Machines @@ -230,8 +232,8 @@ static const DWORD dfFlags[] = {DATE_LONGDATE, DATE_LONGDATE, DATE_SHORTDATE, DA void Win32DateFormat::formatDate(const SYSTEMTIME *st, UnicodeString &appendTo) const { int result; - UChar stackBuffer[STACK_BUFFER_SIZE]; - UChar *buffer = stackBuffer; + wchar_t stackBuffer[STACK_BUFFER_SIZE]; + wchar_t *buffer = stackBuffer; result = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, STACK_BUFFER_SIZE); @@ -239,12 +241,12 @@ void Win32DateFormat::formatDate(const SYSTEMTIME *st, UnicodeString &appendTo) if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { int newLength = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, NULL, 0); - buffer = NEW_ARRAY(UChar, newLength); + buffer = NEW_ARRAY(wchar_t, newLength); GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, newLength); } } - appendTo.append(buffer, (int32_t) wcslen(buffer)); + appendTo.append((const UChar *)buffer, (int32_t) wcslen(buffer)); if (buffer != stackBuffer) { DELETE_ARRAY(buffer); @@ -256,8 +258,8 @@ static const DWORD tfFlags[] = {0, 0, 0, TIME_NOSECONDS}; void Win32DateFormat::formatTime(const SYSTEMTIME *st, UnicodeString &appendTo) const { int result; - UChar stackBuffer[STACK_BUFFER_SIZE]; - UChar *buffer = stackBuffer; + wchar_t stackBuffer[STACK_BUFFER_SIZE]; + wchar_t *buffer = stackBuffer; result = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, STACK_BUFFER_SIZE); @@ -265,12 +267,12 @@ void Win32DateFormat::formatTime(const SYSTEMTIME *st, UnicodeString &appendTo) if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { int newLength = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, NULL, 0); - buffer = NEW_ARRAY(UChar, newLength); + buffer = NEW_ARRAY(wchar_t, newLength); GetDateFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, newLength); } } - appendTo.append(buffer, (int32_t) wcslen(buffer)); + appendTo.append((const UChar *)buffer, (int32_t) wcslen(buffer)); if (buffer != stackBuffer) { DELETE_ARRAY(buffer); diff --git a/deps/icu-small/source/i18n/windtfmt.h b/deps/icu-small/source/i18n/windtfmt.h index a286ced2e3ddad..a8221943706ef0 100644 --- a/deps/icu-small/source/i18n/windtfmt.h +++ b/deps/icu-small/source/i18n/windtfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index 23610732a2e94a..d7e98723bb271d 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2016, International Business Machines @@ -86,10 +88,10 @@ static void getNumberFormat(NUMBERFMTW *fmt, int32_t lcid) GetLocaleInfoA(lcid, LOCALE_SGROUPING, buf, 10); fmt->Grouping = getGrouping(buf); - fmt->lpDecimalSep = NEW_ARRAY(UChar, 6); + fmt->lpDecimalSep = NEW_ARRAY(wchar_t, 6); GetLocaleInfoW(lcid, LOCALE_SDECIMAL, fmt->lpDecimalSep, 6); - fmt->lpThousandSep = NEW_ARRAY(UChar, 6); + fmt->lpThousandSep = NEW_ARRAY(wchar_t, 6); GetLocaleInfoW(lcid, LOCALE_STHOUSAND, fmt->lpThousandSep, 6); GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_INEGNUMBER, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); @@ -113,16 +115,16 @@ static void getCurrencyFormat(CURRENCYFMTW *fmt, int32_t lcid) GetLocaleInfoA(lcid, LOCALE_SMONGROUPING, buf, sizeof(buf)); fmt->Grouping = getGrouping(buf); - fmt->lpDecimalSep = NEW_ARRAY(UChar, 6); + fmt->lpDecimalSep = NEW_ARRAY(wchar_t, 6); GetLocaleInfoW(lcid, LOCALE_SMONDECIMALSEP, fmt->lpDecimalSep, 6); - fmt->lpThousandSep = NEW_ARRAY(UChar, 6); + fmt->lpThousandSep = NEW_ARRAY(wchar_t, 6); GetLocaleInfoW(lcid, LOCALE_SMONTHOUSANDSEP, fmt->lpThousandSep, 6); GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_INEGCURR, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_ICURRENCY, (LPWSTR) &fmt->PositiveOrder, sizeof(UINT)); - fmt->lpCurrencySymbol = NEW_ARRAY(UChar, 8); + fmt->lpCurrencySymbol = NEW_ARRAY(wchar_t, 8); GetLocaleInfoW(lcid, LOCALE_SCURRENCY, (LPWSTR) fmt->lpCurrencySymbol, 8); } @@ -290,8 +292,8 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen } } - UChar stackBuffer[STACK_BUFFER_SIZE]; - UChar *buffer = stackBuffer; + wchar_t stackBuffer[STACK_BUFFER_SIZE]; + wchar_t *buffer = stackBuffer; FormatInfo formatInfo; formatInfo = *fFormatInfo; @@ -314,7 +316,7 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen if (lastError == ERROR_INSUFFICIENT_BUFFER) { int newLength = GetCurrencyFormatW(fLCID, 0, nBuffer, &formatInfo.currency, NULL, 0); - buffer = NEW_ARRAY(UChar, newLength); + buffer = NEW_ARRAY(wchar_t, newLength); buffer[0] = 0x0000; GetCurrencyFormatW(fLCID, 0, nBuffer, &formatInfo.currency, buffer, newLength); } @@ -334,14 +336,14 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { int newLength = GetNumberFormatW(fLCID, 0, nBuffer, &formatInfo.number, NULL, 0); - buffer = NEW_ARRAY(UChar, newLength); + buffer = NEW_ARRAY(wchar_t, newLength); buffer[0] = 0x0000; GetNumberFormatW(fLCID, 0, nBuffer, &formatInfo.number, buffer, newLength); } } } - appendTo.append(buffer, (int32_t) wcslen(buffer)); + appendTo.append((UChar *)buffer, (int32_t) wcslen(buffer)); if (buffer != stackBuffer) { DELETE_ARRAY(buffer); diff --git a/deps/icu-small/source/i18n/winnmfmt.h b/deps/icu-small/source/i18n/winnmfmt.h index a0b34dfc9fe8d2..3b0df915e1439b 100644 --- a/deps/icu-small/source/i18n/winnmfmt.h +++ b/deps/icu-small/source/i18n/winnmfmt.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2005-2015, International Business Machines diff --git a/deps/icu-small/source/i18n/wintzimpl.cpp b/deps/icu-small/source/i18n/wintzimpl.cpp index 921ecf78d2323b..4c042d54213d05 100644 --- a/deps/icu-small/source/i18n/wintzimpl.cpp +++ b/deps/icu-small/source/i18n/wintzimpl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2009-2013, International Business Machines diff --git a/deps/icu-small/source/i18n/wintzimpl.h b/deps/icu-small/source/i18n/wintzimpl.h index 3ba4174a06f37c..8149fc14173814 100644 --- a/deps/icu-small/source/i18n/wintzimpl.h +++ b/deps/icu-small/source/i18n/wintzimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** * Copyright (C) 2008-2011, International Business Machines diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index e2c75e5577b503..fdf333c3712aef 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/zonemeta.h b/deps/icu-small/source/i18n/zonemeta.h index ac65e82acbc69c..84be5553ea797e 100644 --- a/deps/icu-small/source/i18n/zonemeta.h +++ b/deps/icu-small/source/i18n/zonemeta.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2007-2013, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/zrule.cpp b/deps/icu-small/source/i18n/zrule.cpp index a7573e5fb5b61d..ad64ab6e161ed5 100644 --- a/deps/icu-small/source/i18n/zrule.cpp +++ b/deps/icu-small/source/i18n/zrule.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2011, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/zrule.h b/deps/icu-small/source/i18n/zrule.h index cfc2b71542cdae..b9827bf5201a66 100644 --- a/deps/icu-small/source/i18n/zrule.h +++ b/deps/icu-small/source/i18n/zrule.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/ztrans.cpp b/deps/icu-small/source/i18n/ztrans.cpp index e33e8511bceddc..956b563a2a0310 100644 --- a/deps/icu-small/source/i18n/ztrans.cpp +++ b/deps/icu-small/source/i18n/ztrans.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2010, International Business Machines Corporation and * diff --git a/deps/icu-small/source/i18n/ztrans.h b/deps/icu-small/source/i18n/ztrans.h index 6697dcd5eb1c2f..0101dc06e36bae 100644 --- a/deps/icu-small/source/i18n/ztrans.h +++ b/deps/icu-small/source/i18n/ztrans.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2009-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/io/io.rc b/deps/icu-small/source/io/io.rc index daa8da94b9cc6e..94db3ebd0f4a62 100644 --- a/deps/icu-small/source/io/io.rc +++ b/deps/icu-small/source/io/io.rc @@ -1,6 +1,8 @@ // Do not edit with Microsoft Developer Studio Resource Editor. // It will permanently substitute version numbers that are intended to be // picked up by the pre-processor during each build. +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html // Copyright (c) 2001-2010 International Business Machines // Corporation and others. All Rights Reserved. // diff --git a/deps/icu-small/source/io/locbund.cpp b/deps/icu-small/source/io/locbund.cpp index e032d00c8a3bf4..4dc50d50df1e4c 100644 --- a/deps/icu-small/source/io/locbund.cpp +++ b/deps/icu-small/source/io/locbund.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/io/locbund.h b/deps/icu-small/source/io/locbund.h index 1eac6227b1d5eb..b9e19484b654d2 100644 --- a/deps/icu-small/source/io/locbund.h +++ b/deps/icu-small/source/io/locbund.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/io/sprintf.c b/deps/icu-small/source/io/sprintf.c index 251faca5c3cb41..17cdb2dcdd3f5e 100644 --- a/deps/icu-small/source/io/sprintf.c +++ b/deps/icu-small/source/io/sprintf.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -179,7 +181,7 @@ u_vsnprintf(UChar *buffer, int32_t size = (int32_t)strlen(patternSpecification) + 1; /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { + if (size >= (int32_t)MAX_UCHAR_BUFFER_SIZE(patBuffer)) { pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); if(pattern == 0) { return 0; diff --git a/deps/icu-small/source/io/sscanf.c b/deps/icu-small/source/io/sscanf.c index c9579e8b5627de..2e14cdbcb65968 100644 --- a/deps/icu-small/source/io/sscanf.c +++ b/deps/icu-small/source/io/sscanf.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -71,7 +73,7 @@ u_vsscanf(const UChar *buffer, int32_t size = (int32_t)uprv_strlen(patternSpecification) + 1; /* convert from the default codepage to Unicode */ - if (size >= MAX_UCHAR_BUFFER_SIZE(patBuffer)) { + if (size >= (int32_t)MAX_UCHAR_BUFFER_SIZE(patBuffer)) { pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); if(pattern == 0) { return 0; diff --git a/deps/icu-small/source/io/ucln_io.cpp b/deps/icu-small/source/io/ucln_io.cpp index 9469f5d58bb959..5822d22be15981 100644 --- a/deps/icu-small/source/io/ucln_io.cpp +++ b/deps/icu-small/source/io/ucln_io.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * @@ -33,7 +35,7 @@ static const char copyright[] = U_COPYRIGHT_STRING; static cleanupFunc *gCleanupFunctions[UCLN_IO_COUNT]; -static UBool io_cleanup(void) +static UBool U_CALLCONV io_cleanup(void) { int32_t libType = UCLN_IO_START; diff --git a/deps/icu-small/source/io/ucln_io.h b/deps/icu-small/source/io/ucln_io.h index 105eca8b136701..97d06a12ffd18c 100644 --- a/deps/icu-small/source/io/ucln_io.h +++ b/deps/icu-small/source/io/ucln_io.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * * diff --git a/deps/icu-small/source/io/ufile.c b/deps/icu-small/source/io/ufile.c index d20f8079b1e314..71d27a5e2596dd 100644 --- a/deps/icu-small/source/io/ufile.c +++ b/deps/icu-small/source/io/ufile.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/ufile.h b/deps/icu-small/source/io/ufile.h index e0c343d6aa5fa7..b2562747e6e1ac 100644 --- a/deps/icu-small/source/io/ufile.h +++ b/deps/icu-small/source/io/ufile.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/io/ufmt_cmn.c b/deps/icu-small/source/io/ufmt_cmn.c index a9f533ce735fbb..e896bc560d44bc 100644 --- a/deps/icu-small/source/io/ufmt_cmn.c +++ b/deps/icu-small/source/io/ufmt_cmn.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/ufmt_cmn.h b/deps/icu-small/source/io/ufmt_cmn.h index b0852de5f8a62c..7daeee881363b2 100644 --- a/deps/icu-small/source/io/ufmt_cmn.h +++ b/deps/icu-small/source/io/ufmt_cmn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/unicode/ustdio.h b/deps/icu-small/source/io/unicode/ustdio.h index ec2a35fef4fc4a..5e11bb67666c45 100644 --- a/deps/icu-small/source/io/unicode/ustdio.h +++ b/deps/icu-small/source/io/unicode/ustdio.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/unicode/ustream.h b/deps/icu-small/source/io/unicode/ustream.h index 41ccf5ae036c67..ab52f6a28a0728 100644 --- a/deps/icu-small/source/io/unicode/ustream.h +++ b/deps/icu-small/source/io/unicode/ustream.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2014 International Business Machines diff --git a/deps/icu-small/source/io/uprintf.cpp b/deps/icu-small/source/io/uprintf.cpp index 4453d3a2da96f0..e6062ade297862 100644 --- a/deps/icu-small/source/io/uprintf.cpp +++ b/deps/icu-small/source/io/uprintf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/uprintf.h b/deps/icu-small/source/io/uprintf.h index 4b538451023274..0a07e6b7d6a0c3 100644 --- a/deps/icu-small/source/io/uprintf.h +++ b/deps/icu-small/source/io/uprintf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/uprntf_p.c b/deps/icu-small/source/io/uprntf_p.c index a51b67108f73b4..81f52696581960 100644 --- a/deps/icu-small/source/io/uprntf_p.c +++ b/deps/icu-small/source/io/uprntf_p.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/uscanf.c b/deps/icu-small/source/io/uscanf.c index 2919305f9e570a..9866963201ea53 100644 --- a/deps/icu-small/source/io/uscanf.c +++ b/deps/icu-small/source/io/uscanf.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/uscanf.h b/deps/icu-small/source/io/uscanf.h index 96b5c4da44e0eb..bbe84d9e2bbf2a 100644 --- a/deps/icu-small/source/io/uscanf.h +++ b/deps/icu-small/source/io/uscanf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/io/uscanf_p.c b/deps/icu-small/source/io/uscanf_p.c index 4e874f24f1f4ad..f17502038ae45b 100644 --- a/deps/icu-small/source/io/uscanf_p.c +++ b/deps/icu-small/source/io/uscanf_p.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/io/ustdio.c b/deps/icu-small/source/io/ustdio.c index 20eaf35dcd25c9..4b156595bb18f5 100644 --- a/deps/icu-small/source/io/ustdio.c +++ b/deps/icu-small/source/io/ustdio.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * @@ -428,7 +430,7 @@ ufile_fill_uchar_buffer(UFILE *f) /* shift the buffer if it isn't empty */ if(dataSize != 0) { - uprv_memmove(f->fUCBuffer, str->fPos, dataSize * sizeof(UChar)); /* not accessing beyond memory */ + u_memmove(f->fUCBuffer, str->fPos, dataSize); /* not accessing beyond memory */ } diff --git a/deps/icu-small/source/io/ustream.cpp b/deps/icu-small/source/io/ustream.cpp index 25c54eb55532f9..8e0087edbe6b21 100644 --- a/deps/icu-small/source/io/ustream.cpp +++ b/deps/icu-small/source/io/ustream.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** * Copyright (C) 2001-2016, International Business Machines diff --git a/deps/icu-small/source/stubdata/stubdata.c b/deps/icu-small/source/stubdata/stubdata.c index 2f1d41191ff091..a1a16545605de1 100644 --- a/deps/icu-small/source/stubdata/stubdata.c +++ b/deps/icu-small/source/stubdata/stubdata.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * * Copyright (C) 2001, International Business Machines diff --git a/deps/icu-small/source/tools/genccode/genccode.c b/deps/icu-small/source/tools/genccode/genccode.c index 58f5c2e8e0a713..2534820bac33b6 100644 --- a/deps/icu-small/source/tools/genccode/genccode.c +++ b/deps/icu-small/source/tools/genccode/genccode.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/tools/gencmn/gencmn.c b/deps/icu-small/source/tools/gencmn/gencmn.c index a6498ce6a977e0..d328a305215159 100644 --- a/deps/icu-small/source/tools/gencmn/gencmn.c +++ b/deps/icu-small/source/tools/gencmn/gencmn.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/derb.cpp b/deps/icu-small/source/tools/genrb/derb.cpp index 3d2507bc14e23f..22e275ef353700 100644 --- a/deps/icu-small/source/tools/genrb/derb.cpp +++ b/deps/icu-small/source/tools/genrb/derb.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/errmsg.c b/deps/icu-small/source/tools/genrb/errmsg.c index 420c12399e607b..7340f01af2a7d8 100644 --- a/deps/icu-small/source/tools/genrb/errmsg.c +++ b/deps/icu-small/source/tools/genrb/errmsg.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/errmsg.h b/deps/icu-small/source/tools/genrb/errmsg.h index 19dfee8d858792..5026ecf7be54bb 100644 --- a/deps/icu-small/source/tools/genrb/errmsg.h +++ b/deps/icu-small/source/tools/genrb/errmsg.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index 50e9bfd02e97eb..685fb5884e405c 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/genrb.h b/deps/icu-small/source/tools/genrb/genrb.h index 9a190f28d37f92..99c604f7809454 100644 --- a/deps/icu-small/source/tools/genrb/genrb.h +++ b/deps/icu-small/source/tools/genrb/genrb.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 879db96b024340..f448daab6cc460 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/parse.h b/deps/icu-small/source/tools/genrb/parse.h index c9ac5521e1bf90..d7341be6dd9fc4 100644 --- a/deps/icu-small/source/tools/genrb/parse.h +++ b/deps/icu-small/source/tools/genrb/parse.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/prscmnts.cpp b/deps/icu-small/source/tools/genrb/prscmnts.cpp index d9c690ff525096..edae16c5c5f99b 100644 --- a/deps/icu-small/source/tools/genrb/prscmnts.cpp +++ b/deps/icu-small/source/tools/genrb/prscmnts.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2014, International Business Machines diff --git a/deps/icu-small/source/tools/genrb/prscmnts.h b/deps/icu-small/source/tools/genrb/prscmnts.h index da085965aa1b4a..c9958cd0713119 100644 --- a/deps/icu-small/source/tools/genrb/prscmnts.h +++ b/deps/icu-small/source/tools/genrb/prscmnts.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/rbutil.c b/deps/icu-small/source/tools/genrb/rbutil.c index bbe8624909b94e..174b4d7b44c4c6 100644 --- a/deps/icu-small/source/tools/genrb/rbutil.c +++ b/deps/icu-small/source/tools/genrb/rbutil.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/rbutil.h b/deps/icu-small/source/tools/genrb/rbutil.h index 3f055a848c89e0..d2a303516ab820 100644 --- a/deps/icu-small/source/tools/genrb/rbutil.h +++ b/deps/icu-small/source/tools/genrb/rbutil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/read.c b/deps/icu-small/source/tools/genrb/read.c index b652fee9bfead5..313fb61677f01f 100644 --- a/deps/icu-small/source/tools/genrb/read.c +++ b/deps/icu-small/source/tools/genrb/read.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/read.h b/deps/icu-small/source/tools/genrb/read.h index f79b145f25aa36..74b8c823a2e970 100644 --- a/deps/icu-small/source/tools/genrb/read.h +++ b/deps/icu-small/source/tools/genrb/read.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index 9f8365d7f6a405..9420184a9df806 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h index 5d09ecd8db572d..614be2d10f9c56 100644 --- a/deps/icu-small/source/tools/genrb/reslist.h +++ b/deps/icu-small/source/tools/genrb/reslist.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/rle.c b/deps/icu-small/source/tools/genrb/rle.c index fb14d1afc236a7..4a69cd52985ad7 100644 --- a/deps/icu-small/source/tools/genrb/rle.c +++ b/deps/icu-small/source/tools/genrb/rle.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/rle.h b/deps/icu-small/source/tools/genrb/rle.h index 0810914c52aab4..93d51a3750e8b2 100644 --- a/deps/icu-small/source/tools/genrb/rle.h +++ b/deps/icu-small/source/tools/genrb/rle.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/ustr.c b/deps/icu-small/source/tools/genrb/ustr.c index b73ce9bd2a2e07..1631a205ff9fe0 100644 --- a/deps/icu-small/source/tools/genrb/ustr.c +++ b/deps/icu-small/source/tools/genrb/ustr.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -92,7 +94,7 @@ ustr_cpy(struct UString *dst, if(src->fChars == NULL || dst->fChars == NULL){ return; } - uprv_memcpy(dst->fChars, src->fChars, sizeof(UChar) * src->fLength); + u_memcpy(dst->fChars, src->fChars, src->fLength); dst->fLength = src->fLength; dst->fChars[dst->fLength] = 0x0000; } diff --git a/deps/icu-small/source/tools/genrb/ustr.h b/deps/icu-small/source/tools/genrb/ustr.h index 05a446ea0e58ad..c27a78104fbdb1 100644 --- a/deps/icu-small/source/tools/genrb/ustr.h +++ b/deps/icu-small/source/tools/genrb/ustr.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/wrtjava.cpp b/deps/icu-small/source/tools/genrb/wrtjava.cpp index 6bfa7bb150b3f7..329753717b1f64 100644 --- a/deps/icu-small/source/tools/genrb/wrtjava.cpp +++ b/deps/icu-small/source/tools/genrb/wrtjava.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/genrb/wrtxml.cpp b/deps/icu-small/source/tools/genrb/wrtxml.cpp index c250fc29b41e58..62fdd2427cd249 100644 --- a/deps/icu-small/source/tools/genrb/wrtxml.cpp +++ b/deps/icu-small/source/tools/genrb/wrtxml.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/icupkg/icupkg.cpp b/deps/icu-small/source/tools/icupkg/icupkg.cpp index 056fc46faca5e7..20239304410e7a 100644 --- a/deps/icu-small/source/tools/icupkg/icupkg.cpp +++ b/deps/icu-small/source/tools/icupkg/icupkg.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp index 5dc075101be25c..bf933186025baf 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp +++ b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2000-2016, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/pkgdata/pkgtypes.c b/deps/icu-small/source/tools/pkgdata/pkgtypes.c index c8e08c2e828369..eadf634db385e8 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgtypes.c +++ b/deps/icu-small/source/tools/pkgdata/pkgtypes.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /************************************************************************** * * Copyright (C) 2000-2016, International Business Machines diff --git a/deps/icu-small/source/tools/pkgdata/pkgtypes.h b/deps/icu-small/source/tools/pkgdata/pkgtypes.h index 0bba60c517b625..c7eeba42cb218e 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgtypes.h +++ b/deps/icu-small/source/tools/pkgdata/pkgtypes.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /************************************************************************** * * Copyright (C) 2000-2012, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/collationinfo.cpp b/deps/icu-small/source/tools/toolutil/collationinfo.cpp index fef1cdf1051cc9..bbb1839ef1a5a4 100644 --- a/deps/icu-small/source/tools/toolutil/collationinfo.cpp +++ b/deps/icu-small/source/tools/toolutil/collationinfo.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/collationinfo.h b/deps/icu-small/source/tools/toolutil/collationinfo.h index dac12d2d48149f..48cd5561844cb8 100644 --- a/deps/icu-small/source/tools/toolutil/collationinfo.h +++ b/deps/icu-small/source/tools/toolutil/collationinfo.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2013-2015, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.cpp b/deps/icu-small/source/tools/toolutil/dbgutil.cpp index 668a2269e20a7f..345715163baacd 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/dbgutil.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2007-2012, International Business Machines Corporation and diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.h b/deps/icu-small/source/tools/toolutil/dbgutil.h index 49d52eae51f8ca..704090cc21d6c1 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.h +++ b/deps/icu-small/source/tools/toolutil/dbgutil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************ diff --git a/deps/icu-small/source/tools/toolutil/denseranges.cpp b/deps/icu-small/source/tools/toolutil/denseranges.cpp index 7d81f2e9442f01..3b83715f28cfce 100644 --- a/deps/icu-small/source/tools/toolutil/denseranges.cpp +++ b/deps/icu-small/source/tools/toolutil/denseranges.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/denseranges.h b/deps/icu-small/source/tools/toolutil/denseranges.h index f9af56173872bd..7b072f4654ce59 100644 --- a/deps/icu-small/source/tools/toolutil/denseranges.h +++ b/deps/icu-small/source/tools/toolutil/denseranges.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2010, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/filestrm.c b/deps/icu-small/source/tools/toolutil/filestrm.c index c7b4eee54a31e0..446125de6b1a83 100644 --- a/deps/icu-small/source/tools/toolutil/filestrm.c +++ b/deps/icu-small/source/tools/toolutil/filestrm.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/tools/toolutil/filestrm.h b/deps/icu-small/source/tools/toolutil/filestrm.h index 0eeba98b661fd6..b42345140681c6 100644 --- a/deps/icu-small/source/tools/toolutil/filestrm.h +++ b/deps/icu-small/source/tools/toolutil/filestrm.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * diff --git a/deps/icu-small/source/tools/toolutil/filetools.cpp b/deps/icu-small/source/tools/toolutil/filetools.cpp index 238ef7ba155004..b0d4ed81a560dd 100644 --- a/deps/icu-small/source/tools/toolutil/filetools.cpp +++ b/deps/icu-small/source/tools/toolutil/filetools.cpp @@ -1,9 +1,12 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2013, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* */ +#include "unicode/platform.h" #if U_PLATFORM == U_PF_MINGW // *cough* - for struct stat #ifdef __STRICT_ANSI__ @@ -13,6 +16,7 @@ #include "filetools.h" #include "filestrm.h" +#include "charstr.h" #include "cstring.h" #include "unicode/putil.h" #include "putilimp.h" @@ -27,8 +31,6 @@ #include typedef struct dirent DIRENT; -#define MAX_PATH_SIZE 4096 /* Set the limit for the size of the path. */ - #define SKIP1 "." #define SKIP2 ".." #endif @@ -56,20 +58,24 @@ isFileModTimeLater(const char *filePath, const char *checkAgainst, UBool isDir) while ((dirEntry = readdir(pDir)) != NULL) { if (uprv_strcmp(dirEntry->d_name, SKIP1) != 0 && uprv_strcmp(dirEntry->d_name, SKIP2) != 0) { - char newpath[MAX_PATH_SIZE] = ""; - uprv_strcpy(newpath, checkAgainst); - uprv_strcat(newpath, U_FILE_SEP_STRING); - uprv_strcat(newpath, dirEntry->d_name); - - if ((subDirp = opendir(newpath)) != NULL) { + UErrorCode status = U_ZERO_ERROR; + icu::CharString newpath(checkAgainst, -1, status); + newpath.append(U_FILE_SEP_STRING, -1, status); + newpath.append(dirEntry->d_name, -1, status); + if (U_FAILURE(status)) { + fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, u_errorName(status)); + return FALSE; + }; + + if ((subDirp = opendir(newpath.data())) != NULL) { /* If this new path is a directory, make a recursive call with the newpath. */ closedir(subDirp); - isLatest = isFileModTimeLater(filePath, newpath, isDir); + isLatest = isFileModTimeLater(filePath, newpath.data(), isDir); if (!isLatest) { break; } } else { - int32_t latest = whichFileModTimeIsLater(filePath, newpath); + int32_t latest = whichFileModTimeIsLater(filePath, newpath.data()); if (latest < 0 || latest == 2) { isLatest = FALSE; break; diff --git a/deps/icu-small/source/tools/toolutil/filetools.h b/deps/icu-small/source/tools/toolutil/filetools.h index 7d4e13905575ca..5ede02761ac46a 100644 --- a/deps/icu-small/source/tools/toolutil/filetools.h +++ b/deps/icu-small/source/tools/toolutil/filetools.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/flagparser.c b/deps/icu-small/source/tools/toolutil/flagparser.c index 252267b7ae8e07..c87beb147cf44b 100644 --- a/deps/icu-small/source/tools/toolutil/flagparser.c +++ b/deps/icu-small/source/tools/toolutil/flagparser.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2015, International Business Machines * Corporation and others. All Rights Reserved. @@ -61,7 +63,7 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, continue; } - if (uprv_strlen(buffer) == (currentBufferSize - 1) && buffer[currentBufferSize-2] != '\n') { + if ((int32_t)uprv_strlen(buffer) == (currentBufferSize - 1) && buffer[currentBufferSize-2] != '\n') { /* Allocate more space for buffer if it didnot read the entrire line */ allocateMoreSpace = TRUE; T_FileStream_rewind(f); diff --git a/deps/icu-small/source/tools/toolutil/flagparser.h b/deps/icu-small/source/tools/toolutil/flagparser.h index 32a51e3d2acbd8..4aa03c8a5fdca4 100644 --- a/deps/icu-small/source/tools/toolutil/flagparser.h +++ b/deps/icu-small/source/tools/toolutil/flagparser.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/package.cpp b/deps/icu-small/source/tools/toolutil/package.cpp index 8992f30eee691a..d069147708ed3d 100644 --- a/deps/icu-small/source/tools/toolutil/package.cpp +++ b/deps/icu-small/source/tools/toolutil/package.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -1292,7 +1294,7 @@ void Package::setItemCapacity(int32_t max) exit(U_MEMORY_ALLOCATION_ERROR); } if(items && itemCount>0) { - uprv_memcpy(newItems, items, itemCount*sizeof(items[0])); + uprv_memcpy(newItems, items, (size_t)itemCount*sizeof(items[0])); } itemMax = max; items = newItems; diff --git a/deps/icu-small/source/tools/toolutil/package.h b/deps/icu-small/source/tools/toolutil/package.h index 194722f4f4e59a..4d60202999243b 100644 --- a/deps/icu-small/source/tools/toolutil/package.h +++ b/deps/icu-small/source/tools/toolutil/package.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.c b/deps/icu-small/source/tools/toolutil/pkg_genc.c index f486ec4a107c6c..c85a12322b9381 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.c +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2016, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.h b/deps/icu-small/source/tools/toolutil/pkg_genc.h index 9bd312b96f74ac..12ffc927285b27 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.h +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2011, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.c b/deps/icu-small/source/tools/toolutil/pkg_gencmn.c index 25f36088a0f8f4..38cc820a176d3b 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.c +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2012, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.h b/deps/icu-small/source/tools/toolutil/pkg_gencmn.h index 0ba953be74ab96..62f8327cdfdf91 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.h +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_icu.cpp b/deps/icu-small/source/tools/toolutil/pkg_icu.cpp index 471b1d45ec1220..e679c23be84f99 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_icu.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_icu.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2015, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_icu.h b/deps/icu-small/source/tools/toolutil/pkg_icu.h index 50f3f51c96dfce..3d620f78dfb6cc 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_icu.h +++ b/deps/icu-small/source/tools/toolutil/pkg_icu.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2016, International Business Machines * Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/tools/toolutil/pkg_imp.h b/deps/icu-small/source/tools/toolutil/pkg_imp.h index 45ddc4c0912844..c9fe81bd73a20a 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_imp.h +++ b/deps/icu-small/source/tools/toolutil/pkg_imp.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/pkgitems.cpp b/deps/icu-small/source/tools/toolutil/pkgitems.cpp index 7c8c744a442347..91c85201101c01 100644 --- a/deps/icu-small/source/tools/toolutil/pkgitems.cpp +++ b/deps/icu-small/source/tools/toolutil/pkgitems.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/ppucd.cpp b/deps/icu-small/source/tools/toolutil/ppucd.cpp index ed5229be786a60..18d317e3e330f2 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.cpp +++ b/deps/icu-small/source/tools/toolutil/ppucd.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2014, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/ppucd.h b/deps/icu-small/source/tools/toolutil/ppucd.h index d4726fec1091f4..593bd247996c23 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.h +++ b/deps/icu-small/source/tools/toolutil/ppucd.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2011-2013, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.cpp b/deps/icu-small/source/tools/toolutil/swapimpl.cpp index dbeff2d7b8ac6c..6cc21623016849 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.cpp +++ b/deps/icu-small/source/tools/toolutil/swapimpl.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -230,7 +232,7 @@ uprops_swap(const UDataSwapper *ds, /* copy everything for inaccessible data (padding) */ if(inData32!=outData32) { - uprv_memcpy(outData32, inData32, 4*dataTop); + uprv_memcpy(outData32, inData32, 4*(size_t)dataTop); } /* swap the indexes[16] */ diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.h b/deps/icu-small/source/tools/toolutil/swapimpl.h index b36ec2609dabf5..0e4d41734433d2 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.h +++ b/deps/icu-small/source/tools/toolutil/swapimpl.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/toolutil.cpp b/deps/icu-small/source/tools/toolutil/toolutil.cpp index 259df9873d21ae..bb393a2e7d0302 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.cpp +++ b/deps/icu-small/source/tools/toolutil/toolutil.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -312,7 +314,7 @@ utm_hasCapacity(UToolMemory *mem, int32_t capacity) { if(mem->array==mem->staticArray) { mem->array=uprv_malloc(newCapacity*mem->size); if(mem->array!=NULL) { - uprv_memcpy(mem->array, mem->staticArray, mem->idx*mem->size); + uprv_memcpy(mem->array, mem->staticArray, (size_t)mem->idx*mem->size); } } else { mem->array=uprv_realloc(mem->array, newCapacity*mem->size); diff --git a/deps/icu-small/source/tools/toolutil/toolutil.h b/deps/icu-small/source/tools/toolutil/toolutil.h index 68c9e834a65cfd..026e75aeb2ef47 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.h +++ b/deps/icu-small/source/tools/toolutil/toolutil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp index d83acff276c089..b6b0150afc1b48 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp +++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.h b/deps/icu-small/source/tools/toolutil/ucbuf.h index 739eb9fbe2607c..cb9509b427a718 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.h +++ b/deps/icu-small/source/tools/toolutil/ucbuf.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/ucln_tu.cpp b/deps/icu-small/source/tools/toolutil/ucln_tu.cpp index 0a88ba584bc5bb..2f67641768e27e 100644 --- a/deps/icu-small/source/tools/toolutil/ucln_tu.cpp +++ b/deps/icu-small/source/tools/toolutil/ucln_tu.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2007-2014, International Business Machines Corporation and diff --git a/deps/icu-small/source/tools/toolutil/ucm.c b/deps/icu-small/source/tools/toolutil/ucm.c index adb3ebd2d0a9e8..8d4cdfc40f1e45 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.c +++ b/deps/icu-small/source/tools/toolutil/ucm.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -967,7 +969,7 @@ ucm_addMapping(UCMTable *table, exit(U_MEMORY_ALLOCATION_ERROR); } - uprv_memcpy(table->codePoints+idx, codePoints, m->uLen*4); + uprv_memcpy(table->codePoints+idx, codePoints, (size_t)m->uLen*4); m->u=idx; } @@ -1124,7 +1126,7 @@ ucm_addMappingAuto(UCMFile *ucm, UBool forBase, UCMStates *baseStates, U_CAPI UBool U_EXPORT2 ucm_addMappingFromLine(UCMFile *ucm, const char *line, UBool forBase, UCMStates *baseStates) { - UCMapping m={ 0 }; + UCMapping m={ 0, {0}, 0, 0, 0, 0 }; UChar32 codePoints[UCNV_EXT_MAX_UCHARS]; uint8_t bytes[UCNV_EXT_MAX_BYTES]; diff --git a/deps/icu-small/source/tools/toolutil/ucm.h b/deps/icu-small/source/tools/toolutil/ucm.h index 5de1bdc5e38d14..0058adab5da1d1 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.h +++ b/deps/icu-small/source/tools/toolutil/ucm.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2003-2013, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/ucmstate.c b/deps/icu-small/source/tools/toolutil/ucmstate.c index 6152ca94636759..7c8559090b2a9b 100644 --- a/deps/icu-small/source/tools/toolutil/ucmstate.c +++ b/deps/icu-small/source/tools/toolutil/ucmstate.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/udbgutil.cpp b/deps/icu-small/source/tools/toolutil/udbgutil.cpp index 819cbd91150a12..bbb814ba901c41 100644 --- a/deps/icu-small/source/tools/toolutil/udbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/udbgutil.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 2007-2016, International Business Machines Corporation and @@ -13,6 +15,7 @@ #include "unicode/ulocdata.h" #include "unicode/ucnv.h" #include "unicode/unistr.h" +#include "cstr.h" /* To add a new enum type @@ -689,8 +692,9 @@ void KnownIssues::add(const char *ticket, const char *where, const UChar *msg, U } if(msg==NULL || !*msg) return; - std::string str; - fTable[ticket][where].insert(icu::UnicodeString(msg).toUTF8String(str)); + const icu::UnicodeString ustr(msg); + + fTable[ticket][where].insert(std::string(icu::CStr(ustr)())); } void KnownIssues::add(const char *ticket, const char *where, const char *msg, UBool *firstForTicket, UBool *firstForWhere) diff --git a/deps/icu-small/source/tools/toolutil/udbgutil.h b/deps/icu-small/source/tools/toolutil/udbgutil.h index 3f6ecb0c85ed5b..4bfb4cf86720a9 100644 --- a/deps/icu-small/source/tools/toolutil/udbgutil.h +++ b/deps/icu-small/source/tools/toolutil/udbgutil.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************ * Copyright (c) 2008-2015, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/unewdata.c b/deps/icu-small/source/tools/toolutil/unewdata.c index 94af7859517748..f3b152c0796ce0 100644 --- a/deps/icu-small/source/tools/toolutil/unewdata.c +++ b/deps/icu-small/source/tools/toolutil/unewdata.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -39,7 +41,7 @@ udata_create(const char *dir, const char *type, const char *name, uint16_t headerSize, commentLength; char filename[512]; uint8_t bytes[16]; - int length; + int32_t length; if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { return NULL; @@ -74,7 +76,7 @@ udata_create(const char *dir, const char *type, const char *name, /* LDH buffer Length error check */ - if(length > (sizeof(filename) - 1)) + if(length > ((int32_t)sizeof(filename) - 1)) { *pErrorCode = U_BUFFER_OVERFLOW_ERROR; uprv_free(pData); diff --git a/deps/icu-small/source/tools/toolutil/unewdata.h b/deps/icu-small/source/tools/toolutil/unewdata.h index d25b8e9f749847..9cc39942258700 100644 --- a/deps/icu-small/source/tools/toolutil/unewdata.h +++ b/deps/icu-small/source/tools/toolutil/unewdata.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/uoptions.c b/deps/icu-small/source/tools/toolutil/uoptions.c index 291e2fce4e7fb8..e5ce64a3728e99 100644 --- a/deps/icu-small/source/tools/toolutil/uoptions.c +++ b/deps/icu-small/source/tools/toolutil/uoptions.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/uoptions.h b/deps/icu-small/source/tools/toolutil/uoptions.h index 59804793646886..72652feadba560 100644 --- a/deps/icu-small/source/tools/toolutil/uoptions.h +++ b/deps/icu-small/source/tools/toolutil/uoptions.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/uparse.c b/deps/icu-small/source/tools/toolutil/uparse.c index 71c7602cc007b4..a7142c3cba6cde 100644 --- a/deps/icu-small/source/tools/toolutil/uparse.c +++ b/deps/icu-small/source/tools/toolutil/uparse.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/uparse.h b/deps/icu-small/source/tools/toolutil/uparse.h index b379cf83548fdc..5ad766cf104c85 100644 --- a/deps/icu-small/source/tools/toolutil/uparse.h +++ b/deps/icu-small/source/tools/toolutil/uparse.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/writesrc.c b/deps/icu-small/source/tools/toolutil/writesrc.c index 6fd9f75dba743d..e3f14f2c46e377 100644 --- a/deps/icu-small/source/tools/toolutil/writesrc.c +++ b/deps/icu-small/source/tools/toolutil/writesrc.c @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * @@ -48,18 +50,16 @@ usrc_createWithHeader(const char *path, const char *filename, f=fopen(p, "w"); if(f!=NULL) { - char year[8]; const struct tm *lt; time_t t; time(&t); lt=localtime(&t); - strftime(year, sizeof(year), "%Y", lt); if(generator==NULL) { strftime(buffer, sizeof(buffer), "%Y-%m-%d", lt); - fprintf(f, header, year, filename, buffer); + fprintf(f, header, filename, buffer); } else { - fprintf(f, header, year, filename, generator); + fprintf(f, header, filename, generator); } } else { fprintf( @@ -72,28 +72,34 @@ usrc_createWithHeader(const char *path, const char *filename, U_CAPI FILE * U_EXPORT2 usrc_create(const char *path, const char *filename, const char *generator) { + // TODO: Add parameter for the first year this file was generated, not before 2016. static const char *header= - "/*\n" - " * Copyright (C) 1999-%s, International Business Machines\n" - " * Corporation and others. All Rights Reserved.\n" - " *\n" - " * file name: %s\n" - " *\n" - " * machine-generated by: %s\n" - " */\n\n"; + "// Copyright (C) 2016 and later: Unicode, Inc. and others.\n" + "// License & terms of use: http://www.unicode.org/copyright.html\n" + "//\n" + "// Copyright (C) 1999-2016, International Business Machines\n" + "// Corporation and others. All Rights Reserved.\n" + "//\n" + "// file name: %s\n" + "//\n" + "// machine-generated by: %s\n" + "\n\n"; return usrc_createWithHeader(path, filename, generator, header); } U_CAPI FILE * U_EXPORT2 usrc_createTextData(const char *path, const char *filename, const char *generator) { + // TODO: Add parameter for the first year this file was generated, not before 2016. static const char *header= - "# Copyright (C) 1999-%s, International Business Machines\n" + "# Copyright (C) 2016 and later: Unicode, Inc. and others.\n" + "# License & terms of use: http://www.unicode.org/copyright.html\n" + "# Copyright (C) 1999-2016, International Business Machines\n" "# Corporation and others. All Rights Reserved.\n" "#\n" "# file name: %s\n" "#\n" "# machine-generated by: %s\n" - "#\n\n"; + "\n\n"; return usrc_createWithHeader(path, filename, generator, header); } diff --git a/deps/icu-small/source/tools/toolutil/writesrc.h b/deps/icu-small/source/tools/toolutil/writesrc.h index f4ca08103bbfc0..c82bf3c3345edd 100644 --- a/deps/icu-small/source/tools/toolutil/writesrc.h +++ b/deps/icu-small/source/tools/toolutil/writesrc.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.cpp b/deps/icu-small/source/tools/toolutil/xmlparser.cpp index 8d467bac6a53f4..2fc6e1f78c21b1 100644 --- a/deps/icu-small/source/tools/toolutil/xmlparser.cpp +++ b/deps/icu-small/source/tools/toolutil/xmlparser.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.h b/deps/icu-small/source/tools/toolutil/xmlparser.h index 30bd746beffdb3..5c08903f86ac1a 100644 --- a/deps/icu-small/source/tools/toolutil/xmlparser.h +++ b/deps/icu-small/source/tools/toolutil/xmlparser.h @@ -1,3 +1,5 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * From eeabab3827aca4e913a8b9446255f4ae67fcb5ff Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 28 Oct 2016 15:37:48 -0700 Subject: [PATCH 074/119] doc: add 2016-10-26 CTC meeting minutes PR-URL: https://github.com/nodejs/node/pull/9348 Reviewed-By: James M Snell --- doc/ctc-meetings/2016-10-26.md | 151 +++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 doc/ctc-meetings/2016-10-26.md diff --git a/doc/ctc-meetings/2016-10-26.md b/doc/ctc-meetings/2016-10-26.md new file mode 100644 index 00000000000000..ed8f8fee78a1bf --- /dev/null +++ b/doc/ctc-meetings/2016-10-26.md @@ -0,0 +1,151 @@ +# Node Foundation CTC Meeting 2016-10-26 + +## Links + +* **Audio Recording**: TBP +* **GitHub Issue**: +[#9261](https://github.com/nodejs/node/issues/9261) +* **Minutes Google Doc**: +* _Previous Minutes Google Doc: _ + + +## Present + +* Anna Henningsen @addaleax (CTC) +* Bradley Meck @bmeck (observer/GoDaddy/TC39) +* Ben Noordhuis @bnoordhuis (CTC) +* Сковорода Никита Андреевич @ChALkeR (CTC) +* Colin Ihrig @cjihrig (CTC) +* Evan Lucas @evanlucas (CTC) +* James M Snell @jasnell (CTC) +* Brian White @mscdex (CTC) +* Ali Ijaz Sheikh @ofrobots (CTC) +* Seth Thompson @s3ththompson (observer/Google) +* Shigeki Ohtsu @shigeki (CTC) +* Sakthipriyan Vairamani @thefourtheye (observer) +* Rich Trott @Trott (CTC) + + +## Standup + +* Anna Henningsen @addaleax (CTC) + * Not much +* Bradley Meck @bmeck (observer/GoDaddy/TC39) + * Work on making inspector work w/ vm + * Minor talks w/ modules spec authors +* Ben Noordhuis @bnoordhuis (CTC) + * (Nothing reported.) +* Сковорода Никита Андреевич @ChALkeR (CTC) + * Rebuilt a new dataset from npm packages, some further work on the tooling + * Some issue/pr comments as usual + * Some ecosystem security stuff +* Colin Ihrig @cjihrig (CTC) + * Reviewing issues and PRs, opened a few PRs, libuv 1.10.0 update +* Evan Lucas @evanlucas (CTC) + * Working on getting libuv to use fsevents for file watching on OS X + * Opened small PR to fix a test that kept failing on freebsd +* James M Snell @jasnell (CTC) + * Getting v7.0.0 out the door + * PRs + * More work on HTTP/2 +* Brian White @mscdex (CTC) + * Continued working on string encoding/decoding performance. Starting to see even more promising results. + * Reviewed PRs, commented on issues +* Ali Ijaz Sheikh @ofrobots (CTC) + * Not much +* Seth Thompson @s3ththompson (observer/Google) + * V8 5.5 beta shipped with async/await +* Shigeki Ohtsu @shigeki (CTC) + * Reviewed a few PR and made a security assessments of CVE-2016-8610 for Node-v0.10 and 0.12. +* Sakthipriyan Vairamani @thefourtheye (observer) + * Held an event to help people to get their first contribution into Node.js + * Looking at V8 code base +* Rich Trott @Trott (CTC) + * Outreachy, Node Todo, Node Interactive prep + * test and tools PRs + * usual PR review/commenting + + +--- + + +## Agenda + + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + + +### nodejs/TSC + + +* Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) + + +### nodejs/node + + +* Debugging: name every function +[#8913]https://github.com/nodejs/node/issues/8913 + + +--- + + +## Previous Meeting Review + + +Extracted from **ctc-agenda** labelled issues and pull requests from the **nodejs org** prior to the meeting. + + +### nodejs/node + + +* doc: add ctc-review label information [#9072](https://github.com/nodejs/node/pull/9072) @Trott +* http: improve invalid character in header error message [#9010](https://github.com/nodejs/node/pull/9010) @evanlucas +* net: multiple listen() events fail silently [#8419](https://github.com/nodejs/node/pull/8419) @jasnell + + +### nodejs/TSC + + +* Consider folding TSC into CTC [#146](https://github.com/nodejs/TSC/issues/146) @rvagg + + +--- + + +## Minutes + + +### Consider folding TSC into CTC + + +Rich: Defer until Rod is here and have the conversation in the issue tracker until then? + + +James: Makes sense. Also, TSC call is tomorrow so it can be discussed then. + + +### Debugging: name every function + + +Rich: It seemed like a good idea initially, but it is not clear if it is a good thing in all cases (some +, some -). Issue is marked as good first contribution which means lots of new contributors are coming in. +Myles wanted a quick resolution, but it is not clear there is a quick resolution. Someone needs to sit down and come up with a list of cases where it would be beneficial + + +Brian: Prototype functions? + + +Rich: That is a case where it doesn't add value but doesn't hurt either. There are other cases where it does remove information. + + +Sakthipriyan: One example was fs.readFileSync.. + + +Brian: V8 may also be inferring names from a variable in cases when you do `let a = () => {...}`. Another case to take into consideration. + + +Rich: Move back to the issue tracker; remove 'good-first-contribution' label until we have documented what should/shouldn't be done. I can work with someone, or come up with documentation. + + +Floor: General agreement? Yes, general agreement. From dbeadd363cb5f6d7b98824d75080511fff1b4a19 Mon Sep 17 00:00:00 2001 From: kobelb Date: Fri, 28 Oct 2016 07:27:03 -0400 Subject: [PATCH 075/119] doc: update OpenSSL links PR-URL: https://github.com/nodejs/node/pull/9338 Reviewed-By: James M Snell Reviewed-By: Sam Roberts Reviewed-By: Roman Reiss --- BUILDING.md | 2 +- doc/api/crypto.md | 12 ++++++------ doc/api/https.md | 4 ++-- doc/api/tls.md | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 7749574a993ee1..2fe919328edd62 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -230,7 +230,7 @@ as `deps/icu` (You'll have: `deps/icu/source/...`) NOTE: Windows is not yet supported It is possible to build Node.js with -[OpenSSL FIPS module](https://www.openssl.org/docs/fips/fipsnotes.html). +[OpenSSL FIPS module](https://www.openssl.org/docs/fipsnotes.html). **Note**: building in this way does **not** allow you to claim that the runtime is FIPS 140-2 validated. Instead you can indicate that the runtime diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 956c1cb891ca1e..0f063157b7160a 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -1633,20 +1633,20 @@ the `crypto`, `tls`, and `https` modules and are generally specific to OpenSSL. SSL_OP_ALL Applies multiple bug workarounds within OpenSSL. See - https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_options.html for + https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html for detail. SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION Allows legacy insecure renegotiation between OpenSSL and unpatched clients or servers. See - https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_options.html. + https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. SSL_OP_CIPHER_SERVER_PREFERENCE Uses the server's preferences instead of the clients when selecting a cipher. See - https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_options.html. + https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_options.html. SSL_OP_CISCO_ANYCONNECT @@ -1949,7 +1949,7 @@ the `crypto`, `tls`, and `https` modules and are generally specific to OpenSSL. [`ecdh.generateKeys()`]: #crypto_ecdh_generatekeys_encoding_format [`ecdh.setPrivateKey()`]: #crypto_ecdh_setprivatekey_private_key_encoding [`ecdh.setPublicKey()`]: #crypto_ecdh_setpublickey_public_key_encoding -[`EVP_BytesToKey`]: https://www.openssl.org/docs/crypto/EVP_BytesToKey.html +[`EVP_BytesToKey`]: https://www.openssl.org/docs/man1.0.2/crypto/EVP_BytesToKey.html [`hash.digest()`]: #crypto_hash_digest_encoding [`hash.update()`]: #crypto_hash_update_data_input_encoding [`hmac.digest()`]: #crypto_hmac_digest_encoding @@ -1964,8 +1964,8 @@ the `crypto`, `tls`, and `https` modules and are generally specific to OpenSSL. [initialization vector]: https://en.wikipedia.org/wiki/Initialization_vector [NIST SP 800-131A]: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar1.pdf [NIST SP 800-132]: http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf -[OpenSSL cipher list format]: https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT -[OpenSSL's SPKAC implementation]: https://www.openssl.org/docs/apps/spkac.html +[OpenSSL cipher list format]: https://www.openssl.org/docs/man1.0.2/apps/ciphers.html#CIPHER-LIST-FORMAT +[OpenSSL's SPKAC implementation]: https://www.openssl.org/docs/man1.0.2/apps/spkac.html [publicly trusted list of CAs]: https://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt [RFC 2412]: https://www.rfc-editor.org/rfc/rfc2412.txt [RFC 3526]: https://www.rfc-editor.org/rfc/rfc3526.txt diff --git a/doc/api/https.md b/doc/api/https.md index bc0e4114c39761..3af6dedcd914e7 100644 --- a/doc/api/https.md +++ b/doc/api/https.md @@ -203,7 +203,7 @@ The following options from [`tls.connect()`][] can also be specified. However, a certificates in PEM format. If this is omitted several well known "root" CAs will be used, like VeriSign. These are used to authorize connections. - `ciphers`: A string describing the ciphers to use or exclude. Consult - for + for details on the format. - `rejectUnauthorized`: If `true`, the server certificate is verified against the list of supplied CAs. An `'error'` event is emitted if verification @@ -267,7 +267,7 @@ var req = https.request(options, (res) => { [`http.Server`]: http.html#http_class_http_server [`https.Agent`]: #https_class_https_agent [`https.request()`]: #https_https_request_options_callback -[`SSL_METHODS`]: https://www.openssl.org/docs/ssl/ssl.html#DEALING-WITH-PROTOCOL-METHODS +[`SSL_METHODS`]: https://www.openssl.org/docs/man1.0.2/ssl/ssl.html#DEALING-WITH-PROTOCOL-METHODS [`tls.connect()`]: tls.html#tls_tls_connect_options_callback [`tls.createServer()`]: tls.html#tls_tls_createserver_options_secureconnectionlistener [`url.parse()`]: url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost diff --git a/doc/api/tls.md b/doc/api/tls.md index c7daa8f181820e..6180d91b667e67 100644 --- a/doc/api/tls.md +++ b/doc/api/tls.md @@ -535,7 +535,7 @@ that first defined the cipher. For example: `{ name: 'AES256-SHA', version: 'TLSv1/SSLv3' }` See `SSL_CIPHER_get_name()` and `SSL_CIPHER_get_version()` in -https://www.openssl.org/docs/manmaster/ssl/SSL_CIPHER_get_name.html for more +https://www.openssl.org/docs/man1.0.2/ssl/SSL_CIPHER_get_name.html for more information. ### tlsSocket.getEphemeralKeyInfo() @@ -611,7 +611,7 @@ Example responses include: * `TLSv1.2` * `unknown` -See https://www.openssl.org/docs/manmaster/ssl/SSL_get_version.html for more +See https://www.openssl.org/docs/man1.0.2/ssl/SSL_get_version.html for more information. ### tlsSocket.getSession() @@ -936,7 +936,7 @@ added: v0.11.13 CRLs (Certificate Revocation List). * `ciphers` {string} A string describing the ciphers to use or exclude. Consult - + for details on the format. * `honorCipherOrder` {boolean} If `true`, when a cipher is being selected, the server's preferences will be used instead of the client preferences. @@ -1252,7 +1252,7 @@ secure_socket = tls.TLSSocket(socket, options); where `secure_socket` has the same API as `pair.cleartext`. -[OpenSSL cipher list format documentation]: https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT +[OpenSSL cipher list format documentation]: https://www.openssl.org/docs/man1.0.2/apps/ciphers.html#CIPHER-LIST-FORMAT [Chrome's 'modern cryptography' setting]: https://www.chromium.org/Home/chromium-security/education/tls#TOC-Cipher-Suites [specific attacks affecting larger AES key sizes]: https://www.schneier.com/blog/archives/2009/07/another_new_aes.html [`crypto.getCurves()`]: crypto.html#crypto_crypto_getcurves @@ -1266,9 +1266,9 @@ where `secure_socket` has the same API as `pair.cleartext`. [`'secureConnection'`]: #tls_event_secureconnection [Perfect Forward Secrecy]: #tls_perfect_forward_secrecy [Stream]: stream.html#stream_stream -[SSL_METHODS]: https://www.openssl.org/docs/ssl/ssl.html#DEALING-WITH-PROTOCOL-METHODS +[SSL_METHODS]: https://www.openssl.org/docs/man1.0.2/ssl/ssl.html#DEALING-WITH-PROTOCOL-METHODS [tls.Server]: #tls_class_tls_server -[SSL_CTX_set_timeout]: https://www.openssl.org/docs/ssl/SSL_CTX_set_timeout.html +[SSL_CTX_set_timeout]: https://www.openssl.org/docs/man1.0.2/ssl/SSL_CTX_set_timeout.html [Forward secrecy]: https://en.wikipedia.org/wiki/Perfect_forward_secrecy [DHE]: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange [ECDHE]: https://en.wikipedia.org/wiki/Elliptic_curve_Diffie%E2%80%93Hellman From 225a9dfb000dfb0f9bc143718f2b9aac408e9fb7 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 31 Oct 2016 15:59:08 +0200 Subject: [PATCH 076/119] doc: fs: fix link to mkdtemp PR-URL: https://github.com/nodejs/node/pull/9379 Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Prince John Wesley Reviewed-By: Luigi Pinca Reviewed-By: Roman Reiss --- doc/api/fs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/fs.md b/doc/api/fs.md index a9e1e3fd4bd1a6..cf60b5810b1159 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -2190,7 +2190,7 @@ The following constants are meant for use with the [`fs.Stats`][] object's [`fs.FSWatcher`]: #fs_class_fs_fswatcher [`fs.futimes()`]: #fs_fs_futimes_fd_atime_mtime_callback [`fs.lstat()`]: #fs_fs_lstat_path_callback -[`fs.mkdtemp()`]: #fs_fs_mkdtemp_prefix_callback +[`fs.mkdtemp()`]: #fs_fs_mkdtemp_prefix_options_callback [`fs.open()`]: #fs_fs_open_path_flags_mode_callback [`fs.read()`]: #fs_fs_read_fd_buffer_offset_length_position_callback [`fs.readFile`]: #fs_fs_readfile_file_options_callback @@ -2217,4 +2217,4 @@ The following constants are meant for use with the [`fs.Stats`][] object's [`event ports`]: http://illumos.org/man/port_create [`ReadDirectoryChangesW`]: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx [`AHAFS`]: https://www.ibm.com/developerworks/aix/library/au-aix_event_infrastructure/ -[Common System Errors]: errors.html#errors_common_system_errors \ No newline at end of file +[Common System Errors]: errors.html#errors_common_system_errors From 3d4a829d857e812f12229124d0daada674606a8a Mon Sep 17 00:00:00 2001 From: Jesse McCarthy Date: Wed, 26 Oct 2016 08:30:07 -0400 Subject: [PATCH 077/119] doc: fix broken links to Buffer.from(string) PR-URL: https://github.com/nodejs/node/pull/9294 Reviewed-By: Colin Ihrig Reviewed-By: Prince John Wesley Reviewed-By: James M Snell Reviewed-By: Roman Reiss --- doc/api/buffer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 96b280375ae36e..a79db2131e7a44 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -2421,7 +2421,7 @@ console.log(buf); [`Buffer.from(array)`]: #buffer_class_method_buffer_from_array [`Buffer.from(arrayBuffer)`]: #buffer_class_method_buffer_from_arraybuffer_byteoffset_length [`Buffer.from(buffer)`]: #buffer_class_method_buffer_from_buffer -[`Buffer.from(string)`]: #buffer_class_method_buffer_from_str_encoding +[`Buffer.from(string)`]: #buffer_class_method_buffer_from_string_encoding [`Buffer.poolSize`]: #buffer_class_property_buffer_poolsize [`RangeError`]: errors.html#errors_class_rangeerror [`util.inspect()`]: util.html#util_util_inspect_object_options From 0c236d1d362b579fbdc4b4fa467f5f16b35e72a8 Mon Sep 17 00:00:00 2001 From: AnnaMag Date: Thu, 6 Oct 2016 22:50:41 +0200 Subject: [PATCH 078/119] src: replace SetNamedPropertyHandler() The changes introdcued here replace the deprecated v8 method SetNamedPropertyHandler() to SetHandler() in node.cc. Prior to refactoring, the method defined callbacks when accessing object properties defined by Strings and not Symbols. test/parallel/test-v8-interceptStrings-not-Symbols.js demonstrates that this behaviour remained unchanged after refactoring. PR-URL: https://github.com/nodejs/node/pull/9062 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Franziska Hinkelmann --- src/node.cc | 25 ++++++++------ .../test-v8-interceptStrings-not-Symbols.js | 34 +++++++++++++++++++ 2 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 test/parallel/test-v8-interceptStrings-not-Symbols.js diff --git a/src/node.cc b/src/node.cc index 58c739facfd03d..fb85af7227f65a 100644 --- a/src/node.cc +++ b/src/node.cc @@ -114,6 +114,7 @@ using v8::Locker; using v8::MaybeLocal; using v8::Message; using v8::Name; +using v8::NamedPropertyHandlerConfiguration; using v8::Null; using v8::Number; using v8::Object; @@ -121,6 +122,7 @@ using v8::ObjectTemplate; using v8::Promise; using v8::PromiseRejectMessage; using v8::PropertyCallbackInfo; +using v8::PropertyHandlerFlags; using v8::ScriptOrigin; using v8::SealHandleScope; using v8::String; @@ -2673,7 +2675,7 @@ static void ProcessTitleSetter(Local property, } -static void EnvGetter(Local property, +static void EnvGetter(Local property, const PropertyCallbackInfo& info) { Isolate* isolate = info.GetIsolate(); #ifdef __POSIX__ @@ -2701,7 +2703,7 @@ static void EnvGetter(Local property, } -static void EnvSetter(Local property, +static void EnvSetter(Local property, Local value, const PropertyCallbackInfo& info) { #ifdef __POSIX__ @@ -2722,7 +2724,7 @@ static void EnvSetter(Local property, } -static void EnvQuery(Local property, +static void EnvQuery(Local property, const PropertyCallbackInfo& info) { int32_t rc = -1; // Not found unless proven otherwise. #ifdef __POSIX__ @@ -2748,7 +2750,7 @@ static void EnvQuery(Local property, } -static void EnvDeleter(Local property, +static void EnvDeleter(Local property, const PropertyCallbackInfo& info) { #ifdef __POSIX__ node::Utf8Value key(info.GetIsolate(), property); @@ -3147,12 +3149,15 @@ void SetupProcessObject(Environment* env, // create process.env Local process_env_template = ObjectTemplate::New(env->isolate()); - process_env_template->SetNamedPropertyHandler(EnvGetter, - EnvSetter, - EnvQuery, - EnvDeleter, - EnvEnumerator, - env->as_external()); + process_env_template->SetHandler(NamedPropertyHandlerConfiguration( + EnvGetter, + EnvSetter, + EnvQuery, + EnvDeleter, + EnvEnumerator, + env->as_external(), + PropertyHandlerFlags::kOnlyInterceptStrings)); + Local process_env = process_env_template->NewInstance(env->context()).ToLocalChecked(); process->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "env"), process_env); diff --git a/test/parallel/test-v8-interceptStrings-not-Symbols.js b/test/parallel/test-v8-interceptStrings-not-Symbols.js new file mode 100644 index 00000000000000..e999aae0b7e687 --- /dev/null +++ b/test/parallel/test-v8-interceptStrings-not-Symbols.js @@ -0,0 +1,34 @@ +'use strict'; +require('../common'); + +const assert = require('assert'); + +// Test that the v8 named property handler intercepts callbacks +// when properties are defined as Strings and NOT for Symbols. +// +// With the kOnlyInterceptStrings flag, manipulating properties via +// Strings is intercepted by the callbacks, while Symbols adopt +// the default global behaviour. +// Removing the kOnlyInterceptStrings flag, adds intercepting to Symbols, +// which causes Type Error at process.env[symbol]=42 due to process.env being +// strongly typed for Strings +// (node::Utf8Value key(info.GetIsolate(), property);). + + +const symbol = Symbol('sym'); + +// check if its undefined +assert.strictEqual(process.env[symbol], undefined); + +// set a value using a Symbol +process.env[symbol] = 42; + +// set a value using a String (call to EnvSetter, node.cc) +process.env['s'] = 42; + +//check the values after substitutions +assert.strictEqual(42, process.env[symbol]); +assert.strictEqual('42', process.env['s']); + +delete process.env[symbol]; +assert.strictEqual(undefined, process.env[symbol]); From e451022dd9ea25d5740c1ec50224b9ddc0b36833 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 28 Oct 2016 11:21:50 -0700 Subject: [PATCH 079/119] test: refactor test-http-client-readable * var -> const * remove function names where V8 inference is as good or better * add function names where there is no V8 inference * assert.equal -> strictEqual * move assertion from exit handler to response end handler PR-URL: https://github.com/nodejs/node/pull/9344 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Gibson Fahnestock Reviewed-By: Luigi Pinca --- test/parallel/test-http-client-readable.js | 32 ++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/test/parallel/test-http-client-readable.js b/test/parallel/test-http-client-readable.js index 3c50dc74f1fccf..e49181cedf63d6 100644 --- a/test/parallel/test-http-client-readable.js +++ b/test/parallel/test-http-client-readable.js @@ -1,21 +1,21 @@ 'use strict'; const common = require('../common'); -var assert = require('assert'); -var http = require('http'); -var util = require('util'); +const assert = require('assert'); +const http = require('http'); +const util = require('util'); -var Duplex = require('stream').Duplex; +const Duplex = require('stream').Duplex; function FakeAgent() { http.Agent.call(this); } util.inherits(FakeAgent, http.Agent); -FakeAgent.prototype.createConnection = function createConnection() { - var s = new Duplex(); +FakeAgent.prototype.createConnection = function() { + const s = new Duplex(); var once = false; - s._read = function _read() { + s._read = function() { if (once) return this.push(null); once = true; @@ -27,11 +27,11 @@ FakeAgent.prototype.createConnection = function createConnection() { }; // Blackhole - s._write = function _write(data, enc, cb) { + s._write = function(data, enc, cb) { cb(); }; - s.destroy = s.destroySoon = function destroy() { + s.destroy = s.destroySoon = function() { this.writable = false; }; @@ -40,17 +40,15 @@ FakeAgent.prototype.createConnection = function createConnection() { var received = ''; -var req = http.request({ +const req = http.request({ agent: new FakeAgent() -}, common.mustCall(function(res) { - res.on('data', function(chunk) { +}, common.mustCall(function requestCallback(res) { + res.on('data', function dataCallback(chunk) { received += chunk; }); - res.on('end', common.mustCall(function() {})); + res.on('end', common.mustCall(function endCallback() { + assert.strictEqual(received, 'hello world'); + })); })); req.end(); - -process.on('exit', function() { - assert.equal(received, 'hello world'); -}); From d09eb9c6b26aeeed0cb6d2e8a1937286eccdede0 Mon Sep 17 00:00:00 2001 From: Pedro Victor Date: Sat, 29 Oct 2016 13:39:53 -0200 Subject: [PATCH 080/119] net: name anonymous functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the changes are related https://github.com/nodejs/node/issues/8913 regarding the naming of just the inline anonymous functions that are not assigned to a variable PR-URL: https://github.com/nodejs/node/pull/9357 Reviewed-By: Rich Trott Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Ilkka Myller Reviewed-By: Matteo Collina Reviewed-By: Roman Reiss --- lib/net.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/net.js b/lib/net.js index 628908614fbd61..ce60d2f3521317 100644 --- a/lib/net.js +++ b/lib/net.js @@ -269,7 +269,7 @@ function onSocketEnd() { this.readable = false; maybeDestroy(this); } else { - this.once('end', function() { + this.once('end', function end() { this.readable = false; maybeDestroy(this); }); @@ -669,7 +669,7 @@ Socket.prototype._writeGeneric = function(writev, data, encoding, cb) { if (this.connecting) { this._pendingData = data; this._pendingEncoding = encoding; - this.once('connect', function() { + this.once('connect', function connect() { this._writeGeneric(writev, data, encoding, cb); }); return; @@ -991,7 +991,7 @@ function lookupAndConnect(self, options) { debug('connect: dns options', dnsopts); self._host = host; var lookup = options.lookup || dns.lookup; - lookup(host, dnsopts, function(err, ip, addressType) { + lookup(host, dnsopts, function emitLookup(err, ip, addressType) { self.emit('lookup', err, ip, addressType, host); // It's possible we were destroyed while looking this up. @@ -1389,7 +1389,7 @@ Server.prototype.listen = function() { }; function lookupAndListen(self, port, address, backlog, exclusive) { - require('dns').lookup(address, function(err, ip, addressType) { + require('dns').lookup(address, function doListening(err, ip, addressType) { if (err) { self.emit('error', err); } else { @@ -1494,7 +1494,7 @@ Server.prototype.close = function(cb) { if (typeof cb === 'function') { if (!this._handle) { - this.once('close', function() { + this.once('close', function close() { cb(new Error('Not running')); }); } else { From 071836aa4262d4178310c1b8215e9498c47adbde Mon Sep 17 00:00:00 2001 From: Pedro Victor Date: Sat, 29 Oct 2016 13:04:54 -0200 Subject: [PATCH 081/119] repl: name anonymous functions the changes are related to https://github.com/nodejs/node/issues/8913 regarding the naming of just the inline anonymous functions that are not assigned to a variable PR-URL: https://github.com/nodejs/node/pull/9356 Reviewed-By: Rich Trott Reviewed-By: James M Snell Reviewed-By: Roman Reiss --- lib/repl.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/repl.js b/lib/repl.js index cac79c5e2188f3..d00757b5125571 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -354,7 +354,7 @@ function REPLServer(prompt, self.eval = self._domain.bind(eval_); - self._domain.on('error', function(e) { + self._domain.on('error', function debugDomainError(e) { debug('domain error'); const top = replMap.get(self); internalUtil.decorateErrorStack(e); @@ -436,13 +436,13 @@ function REPLServer(prompt, }; } - self.on('close', function() { + self.on('close', function emitExit() { self.emit('exit'); }); var sawSIGINT = false; var sawCtrlD = false; - self.on('SIGINT', function() { + self.on('SIGINT', function onSigInt() { var empty = self.line.length === 0; self.clearLine(); self.turnOffEditorMode(); @@ -465,7 +465,7 @@ function REPLServer(prompt, self.displayPrompt(); }); - self.on('line', function(cmd) { + self.on('line', function onLine(cmd) { debug('line %j', cmd); sawSIGINT = false; @@ -586,7 +586,7 @@ function REPLServer(prompt, } }); - self.on('SIGCONT', function() { + self.on('SIGCONT', function onSigCont() { if (self.editorMode) { self.outputStream.write(`${self._initialPrompt}.editor\n`); self.outputStream.write( @@ -951,7 +951,7 @@ function complete(line, callback) { addStandardGlobals(completionGroups, filter); completionGroupsLoaded(); } else { - this.eval('.scope', this.context, 'repl', function(err, globals) { + this.eval('.scope', this.context, 'repl', function ev(err, globals) { if (err || !Array.isArray(globals)) { addStandardGlobals(completionGroups, filter); } else if (Array.isArray(globals[0])) { @@ -968,7 +968,7 @@ function complete(line, callback) { } } else { const evalExpr = `try { ${expr} } catch (e) {}`; - this.eval(evalExpr, this.context, 'repl', function(e, obj) { + this.eval(evalExpr, this.context, 'repl', function doEval(e, obj) { // if (e) console.log(e); if (obj != null) { From 5bfefa6063940da54e2f56a0eb3533bbb0a70aa2 Mon Sep 17 00:00:00 2001 From: jedireza Date: Sat, 29 Oct 2016 15:54:27 -0700 Subject: [PATCH 082/119] lib: change == to === in linkedlist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also removed a TODO comment that is no longer viable and left a note about the potentially confusing property naming convention for future readers. PR-URL: https://github.com/nodejs/node/pull/9362 Reviewed-By: Rich Trott Reviewed-By: Brian White Reviewed-By: Bryan English Reviewed-By: James M Snell Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso Reviewed-By: Roman Reiss --- lib/internal/linkedlist.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/internal/linkedlist.js b/lib/internal/linkedlist.js index 15f06c0efe8f05..40bca91de25803 100644 --- a/lib/internal/linkedlist.js +++ b/lib/internal/linkedlist.js @@ -16,7 +16,7 @@ exports.create = create; // show the most idle item function peek(list) { - if (list._idlePrev == list) return null; + if (list._idlePrev === list) return null; return list._idlePrev; } exports.peek = peek; @@ -54,7 +54,7 @@ function append(list, item) { } // items are linked with _idleNext -> (older) and _idlePrev -> (newer) - // TODO: swap the linkage to match the intuitive older items at "prev" + // Note: This linkage (next being older) may seem counter-intuitive at first. item._idleNext = list._idleNext; item._idlePrev = list; From c554f090df7abc63b726a63cccce4d7d84c0b10c Mon Sep 17 00:00:00 2001 From: Yangyang Liu Date: Tue, 25 Oct 2016 15:04:13 -0500 Subject: [PATCH 083/119] doc: fix outdate ninja link PR-URL: https://github.com/nodejs/node/pull/9278 Reviewed-By: Roman Reiss --- doc/guides/building-node-with-ninja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/guides/building-node-with-ninja.md b/doc/guides/building-node-with-ninja.md index a9a3a922ed6820..027c267e2b243d 100644 --- a/doc/guides/building-node-with-ninja.md +++ b/doc/guides/building-node-with-ninja.md @@ -35,4 +35,4 @@ The above alias can be modified slightly to produce a debug build, rather than a `alias nnodedebug='./configure --ninja && ninja -C out/Debug && ln -fs out/Debug/node node_g'` -[Ninja]: https://martine.github.io/ninja/ +[Ninja]: https://ninja-build.org/ From ff69e38070f8419bf0ed25246d6b46b1292087cd Mon Sep 17 00:00:00 2001 From: Zeke Sikelianos Date: Fri, 28 Oct 2016 13:41:47 -0700 Subject: [PATCH 084/119] doc: add more internal links to fs.Stats object PR-URL: https://github.com/nodejs/node/pull/9345 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Roman Reiss --- doc/api/fs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/fs.md b/doc/api/fs.md index cf60b5810b1159..80e9d0c7b9482c 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -877,7 +877,7 @@ added: v0.1.95 * `fd` {Integer} -Synchronous fstat(2). Returns an instance of `fs.Stats`. +Synchronous fstat(2). Returns an instance of [`fs.Stats`][]. ## fs.fsync(fd, callback) + +* {Object} A pipe representing the IPC channel to the child process. + +The `child.channel` property is a reference to the child's IPC channel. If no +IPC channel currently exists, this property is `undefined`. + ### child.connected + +If the Node.js process was spawned with an IPC channel (see the +[Child Process][] documentation), the `process.channel` +property is a reference to the IPC channel. If no IPC channel exists, this +property is `undefined`. + ## process.chdir(directory) +Reset the compressor/decompressor to factory defaults. Only applicable to +the inflate and deflate algorithms. + ## zlib.constants Provides an object enumerating Zlib-related constants. -Reset the compressor/decompressor to factory defaults. Only applicable to -the inflate and deflate algorithms. - ## zlib.createDeflate([options]) + +AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects. +Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method. + +It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators. + +| compression | size | +| :----------------- | -------: | +| asynckit.js | 12.34 kB | +| asynckit.min.js | 4.11 kB | +| asynckit.min.js.gz | 1.47 kB | + + +## Install + +```sh +$ npm install --save asynckit +``` + +## Examples + +### Parallel Jobs + +Runs iterator over provided array in parallel. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will terminate rest of the active jobs (if abort function is provided) +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var parallel = require('asynckit').parallel + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , target = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// async job accepts one element from the array +// and a callback function +function asyncJob(item, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var parallel = require('asynckit/parallel') + , assert = require('assert') + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ] + , target = [] + , keys = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); + assert.deepEqual(keys, expectedKeys); +}); + +// supports full value, key, callback (shortcut) interface +function asyncJob(item, key, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + keys.push(key); + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js). + +### Serial Jobs + +Runs iterator over provided array sequentially. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will not proceed to the rest of the items in the list +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var serial = require('asynckit/serial') + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// extended interface (item, key, callback) +// also supported for arrays +function asyncJob(item, key, cb) +{ + target.push(key); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-array.js](test/test-serial-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var serial = require('asynckit').serial + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , target = [] + ; + + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// shortcut interface (item, callback) +// works for object as well as for the arrays +function asyncJob(item, cb) +{ + target.push(item); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-object.js](test/test-serial-object.js). + +_Note: Since _object_ is an _unordered_ collection of properties, +it may produce unexpected results with sequential iterations. +Whenever order of the jobs' execution is important please use `serialOrdered` method._ + +### Ordered Serial Iterations + +TBD + +For example [compare-property](compare-property) package. + +### Streaming interface + +TBD + +## Want to Know More? + +More examples can be found in [test folder](test/). + +Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions. + +## License + +AsyncKit is licensed under the MIT license. diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/bench.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/bench.js new file mode 100644 index 00000000000000..c612f1a55fda02 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/bench.js @@ -0,0 +1,76 @@ +/* eslint no-console: "off" */ + +var asynckit = require('./') + , async = require('async') + , assert = require('assert') + , expected = 0 + ; + +var Benchmark = require('benchmark'); +var suite = new Benchmark.Suite; + +var source = []; +for (var z = 1; z < 100; z++) +{ + source.push(z); + expected += z; +} + +suite +// add tests + +.add('async.map', function(deferred) +{ + var total = 0; + + async.map(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +.add('asynckit.parallel', function(deferred) +{ + var total = 0; + + asynckit.parallel(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +// add listeners +.on('cycle', function(ev) +{ + console.log(String(ev.target)); +}) +.on('complete', function() +{ + console.log('Fastest is ' + this.filter('fastest').map('name')); +}) +// run async +.run({ 'async': true }); diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/index.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/index.js new file mode 100644 index 00000000000000..455f9454ee6483 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/index.js @@ -0,0 +1,6 @@ +module.exports = +{ + parallel : require('./parallel.js'), + serial : require('./serial.js'), + serialOrdered : require('./serialOrdered.js') +}; diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/abort.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/abort.js new file mode 100644 index 00000000000000..114367e5fbf144 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/abort.js @@ -0,0 +1,29 @@ +// API +module.exports = abort; + +/** + * Aborts leftover active jobs + * + * @param {object} state - current state object + */ +function abort(state) +{ + Object.keys(state.jobs).forEach(clean.bind(state)); + + // reset leftover jobs + state.jobs = {}; +} + +/** + * Cleans up leftover job by invoking abort function for the provided job id + * + * @this state + * @param {string|number} key - job id to abort + */ +function clean(key) +{ + if (typeof this.jobs[key] == 'function') + { + this.jobs[key](); + } +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/async.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/async.js new file mode 100644 index 00000000000000..7f1288a4ce9ae0 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/async.js @@ -0,0 +1,34 @@ +var defer = require('./defer.js'); + +// API +module.exports = async; + +/** + * Runs provided callback asynchronously + * even if callback itself is not + * + * @param {function} callback - callback to invoke + * @returns {function} - augmented callback + */ +function async(callback) +{ + var isAsync = false; + + // check if async happened + defer(function() { isAsync = true; }); + + return function async_callback(err, result) + { + if (isAsync) + { + callback(err, result); + } + else + { + defer(function nextTick_callback() + { + callback(err, result); + }); + } + }; +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/defer.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/defer.js new file mode 100644 index 00000000000000..b67110c7ad6e55 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/defer.js @@ -0,0 +1,26 @@ +module.exports = defer; + +/** + * Runs provided function on next iteration of the event loop + * + * @param {function} fn - function to run + */ +function defer(fn) +{ + var nextTick = typeof setImmediate == 'function' + ? setImmediate + : ( + typeof process == 'object' && typeof process.nextTick == 'function' + ? process.nextTick + : null + ); + + if (nextTick) + { + nextTick(fn); + } + else + { + setTimeout(fn, 0); + } +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/iterate.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/iterate.js new file mode 100644 index 00000000000000..5d2839a590b2ba --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/iterate.js @@ -0,0 +1,75 @@ +var async = require('./async.js') + , abort = require('./abort.js') + ; + +// API +module.exports = iterate; + +/** + * Iterates over each job object + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {object} state - current job status + * @param {function} callback - invoked when all elements processed + */ +function iterate(list, iterator, state, callback) +{ + // store current index + var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; + + state.jobs[key] = runJob(iterator, key, list[key], function(error, output) + { + // don't repeat yourself + // skip secondary callbacks + if (!(key in state.jobs)) + { + return; + } + + // clean up jobs + delete state.jobs[key]; + + if (error) + { + // don't process rest of the results + // stop still active jobs + // and reset the list + abort(state); + } + else + { + state.results[key] = output; + } + + // return salvaged results + callback(error, state.results); + }); +} + +/** + * Runs iterator over provided job element + * + * @param {function} iterator - iterator to invoke + * @param {string|number} key - key/index of the element in the list of jobs + * @param {mixed} item - job description + * @param {function} callback - invoked after iterator is done with the job + * @returns {function|mixed} - job abort function or something else + */ +function runJob(iterator, key, item, callback) +{ + var aborter; + + // allow shortcut if iterator expects only two arguments + if (iterator.length == 2) + { + aborter = iterator(item, async(callback)); + } + // otherwise go with full three arguments + else + { + aborter = iterator(item, key, async(callback)); + } + + return aborter; +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_asynckit.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_asynckit.js new file mode 100644 index 00000000000000..78ad240f0afd80 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_asynckit.js @@ -0,0 +1,91 @@ +var streamify = require('./streamify.js') + , defer = require('./defer.js') + ; + +// API +module.exports = ReadableAsyncKit; + +/** + * Base constructor for all streams + * used to hold properties/methods + */ +function ReadableAsyncKit() +{ + ReadableAsyncKit.super_.apply(this, arguments); + + // list of active jobs + this.jobs = {}; + + // add stream methods + this.destroy = destroy; + this._start = _start; + this._read = _read; +} + +/** + * Destroys readable stream, + * by aborting outstanding jobs + * + * @returns {void} + */ +function destroy() +{ + if (this.destroyed) + { + return; + } + + this.destroyed = true; + + if (typeof this.terminator == 'function') + { + this.terminator(); + } +} + +/** + * Starts provided jobs in async manner + * + * @private + */ +function _start() +{ + // first argument – runner function + var runner = arguments[0] + // take away first argument + , args = Array.prototype.slice.call(arguments, 1) + // second argument - input data + , input = args[0] + // last argument - result callback + , endCb = streamify.callback.call(this, args[args.length - 1]) + ; + + args[args.length - 1] = endCb; + // third argument - iterator + args[1] = streamify.iterator.call(this, args[1]); + + // allow time for proper setup + defer(function() + { + if (!this.destroyed) + { + this.terminator = runner.apply(null, args); + } + else + { + endCb(null, Array.isArray(input) ? [] : {}); + } + }.bind(this)); +} + + +/** + * Implement _read to comply with Readable streams + * Doesn't really make sense for flowing object mode + * + * @private + */ +function _read() +{ + +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_parallel.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_parallel.js new file mode 100644 index 00000000000000..5d2929f7a67750 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_parallel.js @@ -0,0 +1,25 @@ +var parallel = require('../parallel.js'); + +// API +module.exports = ReadableParallel; + +/** + * Streaming wrapper to `asynckit.parallel` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableParallel(list, iterator, callback) +{ + if (!(this instanceof ReadableParallel)) + { + return new ReadableParallel(list, iterator, callback); + } + + // turn on object mode + ReadableParallel.super_.call(this, {objectMode: true}); + + this._start(parallel, list, iterator, callback); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial.js new file mode 100644 index 00000000000000..78226982041ce4 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial.js @@ -0,0 +1,25 @@ +var serial = require('../serial.js'); + +// API +module.exports = ReadableSerial; + +/** + * Streaming wrapper to `asynckit.serial` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerial(list, iterator, callback) +{ + if (!(this instanceof ReadableSerial)) + { + return new ReadableSerial(list, iterator, callback); + } + + // turn on object mode + ReadableSerial.super_.call(this, {objectMode: true}); + + this._start(serial, list, iterator, callback); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial_ordered.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial_ordered.js new file mode 100644 index 00000000000000..3de89c47291b40 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/readable_serial_ordered.js @@ -0,0 +1,29 @@ +var serialOrdered = require('../serialOrdered.js'); + +// API +module.exports = ReadableSerialOrdered; +// expose sort helpers +module.exports.ascending = serialOrdered.ascending; +module.exports.descending = serialOrdered.descending; + +/** + * Streaming wrapper to `asynckit.serialOrdered` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerialOrdered(list, iterator, sortMethod, callback) +{ + if (!(this instanceof ReadableSerialOrdered)) + { + return new ReadableSerialOrdered(list, iterator, sortMethod, callback); + } + + // turn on object mode + ReadableSerialOrdered.super_.call(this, {objectMode: true}); + + this._start(serialOrdered, list, iterator, sortMethod, callback); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/state.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/state.js new file mode 100644 index 00000000000000..cbea7ad8f6bc63 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/state.js @@ -0,0 +1,37 @@ +// API +module.exports = state; + +/** + * Creates initial state object + * for iteration over list + * + * @param {array|object} list - list to iterate over + * @param {function|null} sortMethod - function to use for keys sort, + * or `null` to keep them as is + * @returns {object} - initial state object + */ +function state(list, sortMethod) +{ + var isNamedList = !Array.isArray(list) + , initState = + { + index : 0, + keyedList: isNamedList || sortMethod ? Object.keys(list) : null, + jobs : {}, + results : isNamedList ? {} : [], + size : isNamedList ? Object.keys(list).length : list.length + } + ; + + if (sortMethod) + { + // sort array keys based on it's values + // sort object's keys just on own merit + initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) + { + return sortMethod(list[a], list[b]); + }); + } + + return initState; +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/streamify.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/streamify.js new file mode 100644 index 00000000000000..f56a1c92bf5c21 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/streamify.js @@ -0,0 +1,141 @@ +var async = require('./async.js'); + +// API +module.exports = { + iterator: wrapIterator, + callback: wrapCallback +}; + +/** + * Wraps iterators with long signature + * + * @this ReadableAsyncKit# + * @param {function} iterator - function to wrap + * @returns {function} - wrapped function + */ +function wrapIterator(iterator) +{ + var stream = this; + + return function(item, key, cb) + { + var aborter + , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) + ; + + stream.jobs[key] = wrappedCb; + + // it's either shortcut (item, cb) + if (iterator.length == 2) + { + aborter = iterator(item, wrappedCb); + } + // or long format (item, key, cb) + else + { + aborter = iterator(item, key, wrappedCb); + } + + return aborter; + }; +} + +/** + * Wraps provided callback function + * allowing to execute snitch function before + * real callback + * + * @this ReadableAsyncKit# + * @param {function} callback - function to wrap + * @returns {function} - wrapped function + */ +function wrapCallback(callback) +{ + var stream = this; + + var wrapped = function(error, result) + { + return finisher.call(stream, error, result, callback); + }; + + return wrapped; +} + +/** + * Wraps provided iterator callback function + * makes sure snitch only called once, + * but passes secondary calls to the original callback + * + * @this ReadableAsyncKit# + * @param {function} callback - callback to wrap + * @param {number|string} key - iteration key + * @returns {function} wrapped callback + */ +function wrapIteratorCallback(callback, key) +{ + var stream = this; + + return function(error, output) + { + // don't repeat yourself + if (!(key in stream.jobs)) + { + callback(error, output); + return; + } + + // clean up jobs + delete stream.jobs[key]; + + return streamer.call(stream, error, {key: key, value: output}, callback); + }; +} + +/** + * Stream wrapper for iterator callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects iterator results + */ +function streamer(error, output, callback) +{ + if (error && !this.error) + { + this.error = error; + this.pause(); + this.emit('error', error); + // send back value only, as expected + callback(error, output && output.value); + return; + } + + // stream stuff + this.push(output); + + // back to original track + // send back value only, as expected + callback(error, output && output.value); +} + +/** + * Stream wrapper for finishing callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects final results + */ +function finisher(error, output, callback) +{ + // signal end of the stream + // only for successfully finished streams + if (!error) + { + this.push(null); + } + + // back to original track + callback(error, output); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/terminator.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/terminator.js new file mode 100644 index 00000000000000..d6eb99219f3d9d --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/lib/terminator.js @@ -0,0 +1,29 @@ +var abort = require('./abort.js') + , async = require('./async.js') + ; + +// API +module.exports = terminator; + +/** + * Terminates jobs in the attached state context + * + * @this AsyncKitState# + * @param {function} callback - final callback to invoke after termination + */ +function terminator(callback) +{ + if (!Object.keys(this.jobs).length) + { + return; + } + + // fast forward iteration index + this.index = this.size; + + // abort jobs + abort(this); + + // send back results we have so far + async(callback)(null, this.results); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/package.json b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/package.json new file mode 100644 index 00000000000000..ac7a956bf84863 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/package.json @@ -0,0 +1,126 @@ +{ + "_args": [ + [ + { + "raw": "asynckit@^0.4.0", + "scope": null, + "escapedName": "asynckit", + "name": "asynckit", + "rawSpec": "^0.4.0", + "spec": ">=0.4.0 <0.5.0", + "type": "range" + }, + "/Users/rebecca/code/npm/node_modules/request/node_modules/form-data" + ] + ], + "_from": "asynckit@>=0.4.0 <0.5.0", + "_id": "asynckit@0.4.0", + "_inCache": true, + "_location": "/request/form-data/asynckit", + "_nodeVersion": "0.12.11", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/asynckit-0.4.0.tgz_1465928940169_0.8008207362145185" + }, + "_npmUser": { + "name": "alexindigo", + "email": "iam@alexindigo.com" + }, + "_npmVersion": "2.15.6", + "_phantomChildren": {}, + "_requested": { + "raw": "asynckit@^0.4.0", + "scope": null, + "escapedName": "asynckit", + "name": "asynckit", + "rawSpec": "^0.4.0", + "spec": ">=0.4.0 <0.5.0", + "type": "range" + }, + "_requiredBy": [ + "/request/form-data" + ], + "_resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "_shasum": "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79", + "_shrinkwrap": null, + "_spec": "asynckit@^0.4.0", + "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/form-data", + "author": { + "name": "Alex Indigo", + "email": "iam@alexindigo.com" + }, + "bugs": { + "url": "https://github.com/alexindigo/asynckit/issues" + }, + "dependencies": {}, + "description": "Minimal async jobs utility library, with streams support", + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "^2.11.9", + "eslint": "^2.9.0", + "istanbul": "^0.4.3", + "obake": "^0.1.2", + "phantomjs-prebuilt": "^2.1.7", + "pre-commit": "^1.1.3", + "reamde": "^1.1.0", + "rimraf": "^2.5.2", + "size-table": "^0.2.0", + "tap-spec": "^4.1.1", + "tape": "^4.5.1" + }, + "directories": {}, + "dist": { + "shasum": "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79", + "tarball": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + }, + "gitHead": "583a75ed4fe41761b66416bb6e703ebb1f8963bf", + "homepage": "https://github.com/alexindigo/asynckit#readme", + "keywords": [ + "async", + "jobs", + "parallel", + "serial", + "iterator", + "array", + "object", + "stream", + "destroy", + "terminate", + "abort" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "alexindigo", + "email": "iam@alexindigo.com" + } + ], + "name": "asynckit", + "optionalDependencies": {}, + "pre-commit": [ + "clean", + "lint", + "test", + "browser", + "report", + "size" + ], + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/alexindigo/asynckit.git" + }, + "scripts": { + "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec", + "clean": "rimraf coverage", + "debug": "tape test/test-*.js", + "lint": "eslint *.js lib/*.js test/*.js", + "report": "istanbul report", + "size": "browserify index.js | size-table asynckit", + "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec", + "win-test": "tape test/test-*.js" + }, + "version": "0.4.0" +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/parallel.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/parallel.js new file mode 100644 index 00000000000000..3c50344d8515f8 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/parallel.js @@ -0,0 +1,43 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = parallel; + +/** + * Runs iterator over provided array elements in parallel + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function parallel(list, iterator, callback) +{ + var state = initState(list); + + while (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, function(error, result) + { + if (error) + { + callback(error, result); + return; + } + + // looks like it's the last one + if (Object.keys(state.jobs).length === 0) + { + callback(null, state.results); + return; + } + }); + + state.index++; + } + + return terminator.bind(state, callback); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serial.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serial.js new file mode 100644 index 00000000000000..6cd949a6777137 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serial.js @@ -0,0 +1,17 @@ +var serialOrdered = require('./serialOrdered.js'); + +// Public API +module.exports = serial; + +/** + * Runs iterator over provided array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serial(list, iterator, callback) +{ + return serialOrdered(list, iterator, null, callback); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serialOrdered.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serialOrdered.js new file mode 100644 index 00000000000000..607eafea56cb06 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/serialOrdered.js @@ -0,0 +1,75 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = serialOrdered; +// sorting helpers +module.exports.ascending = ascending; +module.exports.descending = descending; + +/** + * Runs iterator over provided sorted array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serialOrdered(list, iterator, sortMethod, callback) +{ + var state = initState(list, sortMethod); + + iterate(list, iterator, state, function iteratorHandler(error, result) + { + if (error) + { + callback(error, result); + return; + } + + state.index++; + + // are we there yet? + if (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, iteratorHandler); + return; + } + + // done here + callback(null, state.results); + }); + + return terminator.bind(state, callback); +} + +/* + * -- Sort methods + */ + +/** + * sort helper to sort array elements in ascending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function ascending(a, b) +{ + return a < b ? -1 : a > b ? 1 : 0; +} + +/** + * sort helper to sort array elements in descending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function descending(a, b) +{ + return -1 * ascending(a, b); +} diff --git a/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/stream.js b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/stream.js new file mode 100644 index 00000000000000..7b77116ebab733 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/form-data/node_modules/asynckit/stream.js @@ -0,0 +1,21 @@ +var inherits = require('util').inherits + , Readable = require('stream').Readable + , ReadableAsyncKit = require('./lib/readable_asynckit.js') + , ReadableParallel = require('./lib/readable_parallel.js') + , ReadableSerial = require('./lib/readable_serial.js') + , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js') + ; + +// API +module.exports = +{ + parallel : ReadableParallel, + serial : ReadableSerial, + serialOrdered : ReadableSerialOrdered, +}; + +inherits(ReadableAsyncKit, Readable); + +inherits(ReadableParallel, ReadableAsyncKit); +inherits(ReadableSerial, ReadableAsyncKit); +inherits(ReadableSerialOrdered, ReadableAsyncKit); diff --git a/deps/npm/node_modules/request/node_modules/form-data/package.json b/deps/npm/node_modules/request/node_modules/form-data/package.json index 5c4375edfe0207..a8b4839b7c7e69 100644 --- a/deps/npm/node_modules/request/node_modules/form-data/package.json +++ b/deps/npm/node_modules/request/node_modules/form-data/package.json @@ -2,49 +2,48 @@ "_args": [ [ { - "raw": "form-data@~1.0.0-rc4", + "raw": "form-data@~2.0.0", "scope": null, "escapedName": "form-data", "name": "form-data", - "rawSpec": "~1.0.0-rc4", - "spec": ">=1.0.0-rc4 <1.1.0", + "rawSpec": "~2.0.0", + "spec": ">=2.0.0 <2.1.0", "type": "range" }, "/Users/rebecca/code/npm/node_modules/request" ] ], - "_from": "form-data@>=1.0.0-rc4 <1.1.0", - "_id": "form-data@1.0.0-rc4", + "_from": "form-data@>=2.0.0 <2.1.0", + "_id": "form-data@2.0.0", "_inCache": true, - "_installable": true, "_location": "/request/form-data", - "_nodeVersion": "0.12.11", + "_nodeVersion": "4.5.0", "_npmOperationalInternal": { "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/form-data-1.0.0-rc4.tgz_1458059747097_0.14101114077493548" + "tmp": "tmp/form-data-2.0.0.tgz_1474092617403_0.5404838663525879" }, "_npmUser": { "name": "alexindigo", "email": "iam@alexindigo.com" }, - "_npmVersion": "2.14.9", + "_npmVersion": "2.15.9", "_phantomChildren": {}, "_requested": { - "raw": "form-data@~1.0.0-rc4", + "raw": "form-data@~2.0.0", "scope": null, "escapedName": "form-data", "name": "form-data", - "rawSpec": "~1.0.0-rc4", - "spec": ">=1.0.0-rc4 <1.1.0", + "rawSpec": "~2.0.0", + "spec": ">=2.0.0 <2.1.0", "type": "range" }, "_requiredBy": [ "/request" ], - "_resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", - "_shasum": "05ac6bc22227b43e4461f488161554699d4f8b5e", + "_resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "_shasum": "6f0aebadcc5da16c13e1ecc11137d85f9b883b25", "_shrinkwrap": null, - "_spec": "form-data@~1.0.0-rc4", + "_spec": "form-data@~2.0.0", "_where": "/Users/rebecca/code/npm/node_modules/request", "author": { "name": "Felix Geisendörfer", @@ -56,60 +55,54 @@ "url": "https://github.com/form-data/form-data/issues" }, "dependencies": { - "async": "^1.5.2", + "asynckit": "^0.4.0", "combined-stream": "^1.0.5", - "mime-types": "^2.1.10" + "mime-types": "^2.1.11" }, "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.", "devDependencies": { - "codacy-coverage": "^1.1.3", - "coveralls": "^2.11.8", - "cross-spawn": "^2.1.5", - "eslint": "^2.4.0", + "coveralls": "^2.11.13", + "cross-spawn": "^4.0.0", + "eslint": "^3.5.0", "fake": "^0.2.2", "far": "^0.0.7", "formidable": "^1.0.17", - "istanbul": "^0.4.2", - "pre-commit": "^1.1.2", - "request": "^2.69.0", - "rimraf": "^2.5.2" + "in-publish": "^2.0.0", + "is-node-modern": "^1.0.0", + "istanbul": "^0.4.5", + "pkgfiles": "^2.3.0", + "pre-commit": "^1.1.3", + "request": "^2.74.0", + "rimraf": "^2.5.4" }, "directories": {}, "dist": { - "shasum": "05ac6bc22227b43e4461f488161554699d4f8b5e", - "tarball": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" + "shasum": "6f0aebadcc5da16c13e1ecc11137d85f9b883b25", + "tarball": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.12" }, - "gitHead": "f73996e0508ee2d4b2b376276adfac1de4188ac2", + "gitHead": "652b16ff5b9077bdf65eb66b67286c823c2a1040", "homepage": "https://github.com/form-data/form-data#readme", "license": "MIT", "main": "./lib/form_data", "maintainers": [ - { - "name": "felixge", - "email": "felix@debuggable.com" - }, - { - "name": "idralyuk", - "email": "igor@buran.us" - }, { "name": "alexindigo", "email": "iam@alexindigo.com" }, { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" + "name": "dylanpiercey", + "email": "pierceydylan@gmail.com" }, { - "name": "celer", - "email": "dtyree77@gmail.com" + "name": "felixge", + "email": "felix@debuggable.com" }, { - "name": "dylanpiercey", - "email": "pierceydylan@gmail.com" + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" } ], "name": "form-data", @@ -126,13 +119,19 @@ }, "scripts": { "check": "istanbul check-coverage coverage/coverage*.json", - "coverage": "codacy-coverage < ./coverage/lcov.info; true", + "ci-lint": "is-node-modern && npm run lint || is-node-not-modern", "debug": "verbose=1 ./test/run.js", - "lint": "eslint lib/*.js test/*.js test/**/*.js", - "posttest": "istanbul report", + "files": "pkgfiles --sort=name", + "get-version": "node -e \"console.log(require('./package.json').version)\"", + "lint": "eslint lib/*.js test/*.js test/integration/*.js", + "postpublish": "npm run restore-readme", + "posttest": "istanbul report lcov text", "predebug": "rimraf coverage test/tmp", + "prepublish": "in-publish && npm run update-readme || not-in-publish", "pretest": "rimraf coverage test/tmp", - "test": "istanbul cover --report none test/run.js" + "restore-readme": "mv README.md.bak README.md", + "test": "istanbul cover test/run.js", + "update-readme": "sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md" }, - "version": "1.0.0-rc4" + "version": "2.0.0" } diff --git a/deps/npm/node_modules/request/node_modules/form-data/wercker.yml b/deps/npm/node_modules/request/node_modules/form-data/wercker.yml deleted file mode 100644 index 6b118d1e31aa73..00000000000000 --- a/deps/npm/node_modules/request/node_modules/form-data/wercker.yml +++ /dev/null @@ -1,36 +0,0 @@ -# This references the default nodejs container from -# the Docker Hub: https://registry.hub.docker.com/_/node/ -# If you want Nodesource's container you would reference nodesource/node -# Read more about containers on our dev center -# http://devcenter.wercker.com/docs/containers/index.html -box: node -# This is the build pipeline. Pipelines are the core of wercker -# Read more about pipelines on our dev center -# http://devcenter.wercker.com/docs/pipelines/index.html - -# You can also use services such as databases. Read more on our dev center: -# http://devcenter.wercker.com/docs/services/index.html -# services: - # - postgres - # http://devcenter.wercker.com/docs/services/postgresql.html - - # - mongodb - # http://devcenter.wercker.com/docs/services/mongodb.html -build: - # The steps that will be executed on build - # Steps make up the actions in your pipeline - # Read more about steps on our dev center: - # http://devcenter.wercker.com/docs/steps/index.html - steps: - # A step that executes `npm install` command - - npm-install - # A step that executes `npm test` command - - npm-test - - # A custom script step, name value is used in the UI - # and the code value contains the command that get executed - - script: - name: echo nodejs information - code: | - echo "node version $(node -v) running" - echo "npm version $(npm -v) running" diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js index f929bb75394944..779cfe20bf6009 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js @@ -514,15 +514,23 @@ var compile = function(schema, cache, root, reporter, opts) { } if (node.minimum !== undefined) { + if (type !== 'number' && type !== 'integer') validate('if (%s) {', types.number(name)) + validate('if (%s %s %d) {', name, node.exclusiveMinimum ? '<=' : '<', node.minimum) error('is less than minimum') validate('}') + + if (type !== 'number' && type !== 'integer') validate('}') } if (node.maximum !== undefined) { + if (type !== 'number' && type !== 'integer') validate('if (%s) {', types.number(name)) + validate('if (%s %s %d) {', name, node.exclusiveMaximum ? '>=' : '>', node.maximum) error('is more than maximum') validate('}') + + if (type !== 'number' && type !== 'integer') validate('}') } if (properties) { @@ -540,6 +548,8 @@ var compile = function(schema, cache, root, reporter, opts) { var validate = genfun ('function validate(data) {') + // Since undefined is not a valid JSON value, we coerce to null and other checks will catch this + ('if (data === undefined) data = null') ('validate.errors = null') ('var errors = 0') diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml index 9338bf147031df..7f56324f5c870d 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml @@ -1,10 +1,7 @@ language: "node_js" node_js: - - 0.6 - - 0.8 - 0.10 - 0.11 - 0.12 - - iojs-v1.0 - - iojs-v2.0 - - iojs + - 4.0 + - node diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/LICENSE.md b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/LICENSE.md new file mode 100644 index 00000000000000..ce3647904d79b9 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2015 Jan Lehnardt & Marc Bachmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md index e096dfa5d62a77..bc7aa153dd863b 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md @@ -3,17 +3,24 @@ This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08). ## Usage +```javascript +var jsonpointer = require('jsonpointer'); +var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]}; - var jsonpointer = require("jsonpointer"); - var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]}; - var one = jsonpointer.get(obj, "/foo"); - var two = jsonpointer.get(obj, "/bar/baz"); - var three = jsonpointer.get(obj, "/qux/0"); - var four = jsonpointer.get(obj, "/qux/1"); - var five = jsonpointer.get(obj, "/qux/2"); - var notfound = jsonpointer.get(obj, "/quo"); // returns null +jsonpointer.get(obj, '/foo'); // returns 1 +jsonpointer.get(obj, '/bar/baz'); // returns 2 +jsonpointer.get(obj, '/qux/0'); // returns 3 +jsonpointer.get(obj, '/qux/1'); // returns 4 +jsonpointer.get(obj, '/qux/2'); // returns 5 +jsonpointer.get(obj, '/quo'); // returns null - jsonpointer.set(obj, "/foo", 6); // obj.foo = 6; +jsonpointer.set(obj, '/foo', 6); // sets obj.foo = 6; +jsonpointer.set(obj, '/qux/-', 6) // sets obj.qux = [3, 4, 5, 6] + +var pointer = jsonpointer.compile('/foo') +pointer.get(obj) // returns 1 +pointer.set(obj, 1) // sets obj.foo = 1 +``` ## Testing @@ -25,7 +32,7 @@ This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-iet ## Author -(c) 2011 Jan Lehnardt +(c) 2011-2015 Jan Lehnardt & Marc Bachmann ## License diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/benchmark.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/benchmark.js new file mode 100644 index 00000000000000..8a95636deee0b9 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/benchmark.js @@ -0,0 +1,56 @@ +var jsonpointer = require('./') + +var i +var obj = { + a: 1, + b: { + c: 2 + }, + d: { + e: [{ a: 3 }, { b: 4 }, { c: 5 }] + } +} + +// Get +console.time('get first level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.get(obj, '/a') +} +console.timeEnd('get first level property') + +console.time('get second level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.get(obj, '/d/e') +} +console.timeEnd('get second level property') + +console.time('get third level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.get(obj, '/d/e/0') +} +console.timeEnd('get third level property') + +// Set +console.time('set first level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.set(obj, '/a', 'bla') +} +console.timeEnd('set first level property') + +console.time('set second level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.set(obj, '/d/e', 'bla') +} +console.timeEnd('set second level property') + +console.time('set third level property') +for (i = 0; i < 1e6; i++) { + jsonpointer.set(obj, '/d/e/0', 'bla') +} +console.timeEnd('set third level property') + +console.time('push property into array') +for (i = 0; i < 1e6; i++) { + jsonpointer.set(obj, '/d/e/-', 'bla') +} +console.timeEnd('push property into array') diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js index 006f85ef3a5489..7cfaec0fbda968 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js @@ -1,76 +1,93 @@ -var untilde = function(str) { - return str.replace(/~./g, function(m) { - switch (m) { - case "~0": - return "~"; - case "~1": - return "/"; - } - throw new Error("Invalid tilde escape: " + m); - }); +var hasExcape = /~/ +var escapeMatcher = /~[01]/g +function escapeReplacer (m) { + switch (m) { + case '~1': return '/' + case '~0': return '~' + } + throw new Error('Invalid tilde escape: ' + m) } -var traverse = function(obj, pointer, value) { - // assert(isArray(pointer)) - var part = untilde(pointer.shift()); - if(!obj.hasOwnProperty(part)) { - return null; - } - if(pointer.length !== 0) { // keep traversin! - return traverse(obj[part], pointer, value); - } - // we're done - if(typeof value === "undefined") { - // just reading - return obj[part]; - } - // set new value, return old value - var old_value = obj[part]; - if(value === null) { - delete obj[part]; - } else { - obj[part] = value; - } - return old_value; +function untilde (str) { + if (!hasExcape.test(str)) return str + return str.replace(escapeMatcher, escapeReplacer) } -var validate_input = function(obj, pointer) { - if(typeof obj !== "object") { - throw new Error("Invalid input object."); - } +function setter (obj, pointer, value) { + var part + var hasNextPart - if(pointer === "") { - return []; - } + for (var p = 1, len = pointer.length; p < len;) { + part = untilde(pointer[p++]) + hasNextPart = len > p + + if (typeof obj[part] === 'undefined') { + // support setting of /- + if (Array.isArray(obj) && part === '-') { + part = obj.length + } - if(!pointer) { - throw new Error("Invalid JSON pointer."); + // support nested objects/array when setting values + if (hasNextPart) { + if ((pointer[p] !== '' && pointer[p] < Infinity) || pointer[p] === '-') obj[part] = [] + else obj[part] = {} + } + } + + if (!hasNextPart) break + obj = obj[part] } - pointer = pointer.split("/"); - var first = pointer.shift(); - if (first !== "") { - throw new Error("Invalid JSON pointer."); + var oldValue = obj[part] + if (value === undefined) delete obj[part] + else obj[part] = value + return oldValue +} + +function compilePointer (pointer) { + if (typeof pointer === 'string') { + pointer = pointer.split('/') + if (pointer[0] === '') return pointer + throw new Error('Invalid JSON pointer.') + } else if (Array.isArray(pointer)) { + return pointer } - return pointer; + throw new Error('Invalid JSON pointer.') } -var get = function(obj, pointer) { - pointer = validate_input(obj, pointer); - if (pointer.length === 0) { - return obj; +function get (obj, pointer) { + if (typeof obj !== 'object') throw new Error('Invalid input object.') + pointer = compilePointer(pointer) + var len = pointer.length + if (len === 1) return obj + + for (var p = 1; p < len;) { + obj = obj[untilde(pointer[p++])] + if (len === p) return obj + if (typeof obj !== 'object') return undefined } - return traverse(obj, pointer); } -var set = function(obj, pointer, value) { - pointer = validate_input(obj, pointer); - if (pointer.length === 0) { - throw new Error("Invalid JSON pointer for set.") +function set (obj, pointer, value) { + if (typeof obj !== 'object') throw new Error('Invalid input object.') + pointer = compilePointer(pointer) + if (pointer.length === 0) throw new Error('Invalid JSON pointer for set.') + return setter(obj, pointer, value) +} + +function compile (pointer) { + var compiled = compilePointer(pointer) + return { + get: function (object) { + return get(object, compiled) + }, + set: function (object, value) { + return set(object, compiled, value) + } } - return traverse(obj, pointer, value); } exports.get = get exports.set = set +exports.compile = compile diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json index c90dcced7caae7..b2fe8c6ee36903 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json @@ -2,45 +2,48 @@ "_args": [ [ { - "raw": "jsonpointer@2.0.0", + "raw": "jsonpointer@^4.0.0", "scope": null, "escapedName": "jsonpointer", "name": "jsonpointer", - "rawSpec": "2.0.0", - "spec": "2.0.0", - "type": "version" + "rawSpec": "^4.0.0", + "spec": ">=4.0.0 <5.0.0", + "type": "range" }, "/Users/rebecca/code/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid" ] ], - "_from": "jsonpointer@2.0.0", - "_id": "jsonpointer@2.0.0", + "_from": "jsonpointer@>=4.0.0 <5.0.0", + "_id": "jsonpointer@4.0.0", "_inCache": true, - "_installable": true, "_location": "/request/har-validator/is-my-json-valid/jsonpointer", - "_nodeVersion": "0.10.36", + "_nodeVersion": "6.1.0", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/jsonpointer-4.0.0.tgz_1463651460494_0.02921536797657609" + }, "_npmUser": { "name": "marcbachmann", "email": "marc.brookman@gmail.com" }, - "_npmVersion": "2.10.1", + "_npmVersion": "3.8.6", "_phantomChildren": {}, "_requested": { - "raw": "jsonpointer@2.0.0", + "raw": "jsonpointer@^4.0.0", "scope": null, "escapedName": "jsonpointer", "name": "jsonpointer", - "rawSpec": "2.0.0", - "spec": "2.0.0", - "type": "version" + "rawSpec": "^4.0.0", + "spec": ">=4.0.0 <5.0.0", + "type": "range" }, "_requiredBy": [ "/request/har-validator/is-my-json-valid" ], - "_resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", - "_shasum": "3af1dd20fe85463910d469a385e33017d2a030d9", + "_resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz", + "_shasum": "6661e161d2fc445f19f98430231343722e1fcbd5", "_shrinkwrap": null, - "_spec": "jsonpointer@2.0.0", + "_spec": "jsonpointer@^4.0.0", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid", "author": { "name": "Jan Lehnardt", @@ -53,20 +56,26 @@ { "name": "Joe Hildebrand", "email": "joe-github@cursive.net" + }, + { + "name": "Marc Bachmann", + "email": "marc.brookman@gmail.com" } ], "dependencies": {}, "description": "Simple JSON Addressing.", - "devDependencies": {}, + "devDependencies": { + "standard": "^5.3.1" + }, "directories": {}, "dist": { - "shasum": "3af1dd20fe85463910d469a385e33017d2a030d9", - "tarball": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" + "shasum": "6661e161d2fc445f19f98430231343722e1fcbd5", + "tarball": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz" }, "engines": { - "node": ">=0.6.0" + "node": ">=0.10.0" }, - "gitHead": "26ea4a5c0fcb6d9a2e87f733403791dd05637af8", + "gitHead": "2d46030ba6df41b566934c7202e31fb65058de71", "homepage": "https://github.com/janl/node-jsonpointer#readme", "license": "MIT", "main": "./jsonpointer", @@ -88,7 +97,7 @@ "url": "git+ssh://git@github.com/janl/node-jsonpointer.git" }, "scripts": { - "test": "node test.js" + "test": "standard && node test.js" }, "tags": [ "util", @@ -96,5 +105,5 @@ "util", "utility" ], - "version": "2.0.0" + "version": "4.0.0" } diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js index 1c67d7f7efc898..e3d99630f0a903 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js @@ -1,5 +1,5 @@ -var assert = require("assert"); -var jsonpointer = require("./jsonpointer"); +var assert = require('assert') +var jsonpointer = require('./jsonpointer') var obj = { a: 1, @@ -7,92 +7,125 @@ var obj = { c: 2 }, d: { - e: [{a:3}, {b:4}, {c:5}] + e: [{ a: 3 }, { b: 4 }, { c: 5 }] } -}; +} -assert.equal(jsonpointer.get(obj, "/a"), 1); -assert.equal(jsonpointer.get(obj, "/b/c"), 2); -assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 3); -assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 4); -assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 5); +assert.equal(jsonpointer.get(obj, '/a'), 1) +assert.equal(jsonpointer.get(obj, '/b/c'), 2) +assert.equal(jsonpointer.get(obj, '/d/e/0/a'), 3) +assert.equal(jsonpointer.get(obj, '/d/e/1/b'), 4) +assert.equal(jsonpointer.get(obj, '/d/e/2/c'), 5) // set returns old value -assert.equal(jsonpointer.set(obj, "/a", 2), 1); -assert.equal(jsonpointer.set(obj, "/b/c", 3), 2); -assert.equal(jsonpointer.set(obj, "/d/e/0/a", 4), 3); -assert.equal(jsonpointer.set(obj, "/d/e/1/b", 5), 4); -assert.equal(jsonpointer.set(obj, "/d/e/2/c", 6), 5); - -assert.equal(jsonpointer.get(obj, "/a"), 2); -assert.equal(jsonpointer.get(obj, "/b/c"), 3); -assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 4); -assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 5); -assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 6); - -assert.equal(jsonpointer.get(obj, ""), obj); -assert.throws(function(){ jsonpointer.get(obj, "a"); }, validateError); -assert.throws(function(){ jsonpointer.get(obj, "a/"); }, validateError); - -function validateError(err) { - if ( (err instanceof Error) && /Invalid JSON pointer/.test(err.message) ) { - return true; +assert.equal(jsonpointer.set(obj, '/a', 2), 1) +assert.equal(jsonpointer.set(obj, '/b/c', 3), 2) +assert.equal(jsonpointer.set(obj, '/d/e/0/a', 4), 3) +assert.equal(jsonpointer.set(obj, '/d/e/1/b', 5), 4) +assert.equal(jsonpointer.set(obj, '/d/e/2/c', 6), 5) + +// set nested properties +assert.equal(jsonpointer.set(obj, '/f/g/h/i', 6), undefined) +assert.equal(jsonpointer.get(obj, '/f/g/h/i'), 6) + +// set an array +assert.equal(jsonpointer.set(obj, '/f/g/h/foo/-', 'test'), undefined) +var arr = jsonpointer.get(obj, '/f/g/h/foo') +assert(Array.isArray(arr), 'set /- creates an array.') +assert.equal(arr[0], 'test') + +assert.equal(jsonpointer.get(obj, '/a'), 2) +assert.equal(jsonpointer.get(obj, '/b/c'), 3) +assert.equal(jsonpointer.get(obj, '/d/e/0/a'), 4) +assert.equal(jsonpointer.get(obj, '/d/e/1/b'), 5) +assert.equal(jsonpointer.get(obj, '/d/e/2/c'), 6) + +// can set `null` as a value +assert.equal(jsonpointer.set(obj, '/f/g/h/foo/0', null), 'test') +assert.strictEqual(jsonpointer.get(obj, '/f/g/h/foo/0'), null) +assert.equal(jsonpointer.set(obj, '/b/c', null), 3) +assert.strictEqual(jsonpointer.get(obj, '/b/c'), null) + +assert.equal(jsonpointer.get(obj, ''), obj) +assert.throws(function () { jsonpointer.get(obj, 'a') }, validateError) +assert.throws(function () { jsonpointer.get(obj, 'a/') }, validateError) + +// can unset values with `undefined` +jsonpointer.set(obj, '/a', undefined) +assert.strictEqual(jsonpointer.get(obj, '/a'), undefined) +jsonpointer.set(obj, '/d/e/1', undefined) +assert.strictEqual(jsonpointer.get(obj, '/d/e/1'), undefined) + +// returns `undefined` when path extends beyond any existing objects +assert.strictEqual(jsonpointer.get(obj, '/x/y/z'), undefined) + +function validateError (err) { + if ((err instanceof Error) && /Invalid JSON pointer/.test(err.message)) { + return true } } var complexKeys = { - "a/b": { + 'a/b': { c: 1 }, d: { - "e/f": 2 + 'e/f': 2 }, - "~1": 3, - "01": 4 + '~1': 3, + '01': 4 } -assert.equal(jsonpointer.get(complexKeys, "/a~1b/c"), 1); -assert.equal(jsonpointer.get(complexKeys, "/d/e~1f"), 2); -assert.equal(jsonpointer.get(complexKeys, "/~01"), 3); -assert.equal(jsonpointer.get(complexKeys, "/01"), 4); -assert.equal(jsonpointer.get(complexKeys, "/a/b/c"), null); -assert.equal(jsonpointer.get(complexKeys, "/~1"), null); +assert.equal(jsonpointer.get(complexKeys, '/a~1b/c'), 1) +assert.equal(jsonpointer.get(complexKeys, '/d/e~1f'), 2) +assert.equal(jsonpointer.get(complexKeys, '/~01'), 3) +assert.equal(jsonpointer.get(complexKeys, '/01'), 4) +assert.equal(jsonpointer.get(complexKeys, '/a/b/c'), null) +assert.equal(jsonpointer.get(complexKeys, '/~1'), null) // draft-ietf-appsawg-json-pointer-08 has special array rules -var ary = [ "zero", "one", "two" ]; -assert.equal(jsonpointer.get(ary, "/01"), null); +var ary = [ 'zero', 'one', 'two' ] +assert.equal(jsonpointer.get(ary, '/01'), null) -//assert.equal(jsonpointer.set(ary, "/-", "three"), null); -//assert.equal(ary[3], "three"); +assert.equal(jsonpointer.set(ary, '/-', 'three'), null) +assert.equal(ary[3], 'three') // Examples from the draft: var example = { - "foo": ["bar", "baz"], - "": 0, - "a/b": 1, - "c%d": 2, - "e^f": 3, - "g|h": 4, - "i\\j": 5, - "k\"l": 6, - " ": 7, - "m~n": 8 -}; - -assert.equal(jsonpointer.get(example, ""), example); -var ans = jsonpointer.get(example, "/foo"); -assert.equal(ans.length, 2); -assert.equal(ans[0], "bar"); -assert.equal(ans[1], "baz"); -assert.equal(jsonpointer.get(example, "/foo/0"), "bar"); -assert.equal(jsonpointer.get(example, "/"), 0); -assert.equal(jsonpointer.get(example, "/a~1b"), 1); -assert.equal(jsonpointer.get(example, "/c%d"), 2); -assert.equal(jsonpointer.get(example, "/e^f"), 3); -assert.equal(jsonpointer.get(example, "/g|h"), 4); -assert.equal(jsonpointer.get(example, "/i\\j"), 5); -assert.equal(jsonpointer.get(example, "/k\"l"), 6); -assert.equal(jsonpointer.get(example, "/ "), 7); -assert.equal(jsonpointer.get(example, "/m~0n"), 8); - -console.log("All tests pass."); + 'foo': ['bar', 'baz'], + '': 0, + 'a/b': 1, + 'c%d': 2, + 'e^f': 3, + 'g|h': 4, + 'i\\j': 5, + 'k\'l': 6, + ' ': 7, + 'm~n': 8 +} + +assert.equal(jsonpointer.get(example, ''), example) +var ans = jsonpointer.get(example, '/foo') +assert.equal(ans.length, 2) +assert.equal(ans[0], 'bar') +assert.equal(ans[1], 'baz') +assert.equal(jsonpointer.get(example, '/foo/0'), 'bar') +assert.equal(jsonpointer.get(example, '/'), 0) +assert.equal(jsonpointer.get(example, '/a~1b'), 1) +assert.equal(jsonpointer.get(example, '/c%d'), 2) +assert.equal(jsonpointer.get(example, '/e^f'), 3) +assert.equal(jsonpointer.get(example, '/g|h'), 4) +assert.equal(jsonpointer.get(example, '/i\\j'), 5) +assert.equal(jsonpointer.get(example, '/k\'l'), 6) +assert.equal(jsonpointer.get(example, '/ '), 7) +assert.equal(jsonpointer.get(example, '/m~0n'), 8) + +// jsonpointer.compile(path) +var a = {foo: 'bar'} +var pointer = jsonpointer.compile('/foo') +assert.equal(pointer.get(a), 'bar') +assert.equal(pointer.set(a, 'test'), 'bar') +assert.equal(pointer.get(a), 'test') +assert.deepEqual(a, {foo: 'test'}) + +console.log('All tests pass.') diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json index aedffd1037d5fc..a38d59e52afa2b 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json @@ -14,20 +14,19 @@ ] ], "_from": "is-my-json-valid@>=2.12.4 <3.0.0", - "_id": "is-my-json-valid@2.13.1", + "_id": "is-my-json-valid@2.15.0", "_inCache": true, - "_installable": true, "_location": "/request/har-validator/is-my-json-valid", - "_nodeVersion": "4.2.3", + "_nodeVersion": "4.2.6", "_npmOperationalInternal": { - "host": "packages-5-east.internal.npmjs.com", - "tmp": "tmp/is-my-json-valid-2.13.1.tgz_1456180270224_0.17748022079467773" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/is-my-json-valid-2.15.0.tgz_1475420473174_0.8758093405049294" }, "_npmUser": { "name": "mafintosh", "email": "mathiasbuus@gmail.com" }, - "_npmVersion": "2.14.7", + "_npmVersion": "2.14.12", "_phantomChildren": {}, "_requested": { "raw": "is-my-json-valid@^2.12.4", @@ -41,8 +40,8 @@ "_requiredBy": [ "/request/har-validator" ], - "_resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", - "_shasum": "d55778a82feb6b0963ff4be111d5d1684e890707", + "_resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", + "_shasum": "936edda3ca3c211fd98f3b2d3e08da43f7b2915b", "_shrinkwrap": null, "_spec": "is-my-json-valid@^2.12.4", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/har-validator", @@ -55,7 +54,7 @@ "dependencies": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", - "jsonpointer": "2.0.0", + "jsonpointer": "^4.0.0", "xtend": "^4.0.0" }, "description": "A JSONSchema validator that uses code generation to be extremely fast", @@ -64,10 +63,10 @@ }, "directories": {}, "dist": { - "shasum": "d55778a82feb6b0963ff4be111d5d1684e890707", - "tarball": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" + "shasum": "936edda3ca3c211fd98f3b2d3e08da43f7b2915b", + "tarball": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz" }, - "gitHead": "5bacc71441750bc6e79829abcfc21d4f2f0c4396", + "gitHead": "c4da71bf1e57083d2dac6e7d123d2e8bd6b9255e", "homepage": "https://github.com/mafintosh/is-my-json-valid", "keywords": [ "json", @@ -78,6 +77,14 @@ "license": "MIT", "main": "index.js", "maintainers": [ + { + "name": "emilbay", + "email": "github@tixz.dk" + }, + { + "name": "emilbayes", + "email": "github@tixz.dk" + }, { "name": "freeall", "email": "freeall@gmail.com" @@ -105,5 +112,5 @@ "scripts": { "test": "tape test/*.js" }, - "version": "2.13.1" + "version": "2.15.0" } diff --git a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js index 275f2ac72f3877..4ea36d51b0c736 100644 --- a/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js +++ b/deps/npm/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js @@ -20,6 +20,14 @@ tape('simple', function(t) { t.end() }) +tape('data is undefined', function (t) { + var validate = validator({type: 'string'}) + + t.notOk(validate(null)) + t.notOk(validate(undefined)) + t.end() +}) + tape('advanced', function(t) { var validate = validator(cosmic.schema) @@ -194,6 +202,22 @@ tape('exclusiveMinimum/exclusiveMaximum', function(t) { t.end() }) +tape('minimum/maximum number type', function(t) { + var validate = validator({ + type: ['integer', 'null'], + minimum: 1, + maximum: 100 + }) + + t.notOk(validate(-1)) + t.notOk(validate(0)) + t.ok(validate(null)) + t.ok(validate(1)) + t.ok(validate(100)) + t.notOk(validate(101)) + t.end() +}) + tape('custom format', function(t) { var validate = validator({ type: 'object', diff --git a/deps/npm/node_modules/request/node_modules/hawk/.npmignore b/deps/npm/node_modules/request/node_modules/hawk/.npmignore index 70febc05e4f360..ab108bf92f34a7 100644 --- a/deps/npm/node_modules/request/node_modules/hawk/.npmignore +++ b/deps/npm/node_modules/request/node_modules/hawk/.npmignore @@ -17,4 +17,3 @@ config.json */*/._* coverage.* lib-cov - diff --git a/deps/npm/node_modules/request/node_modules/hawk/.travis.yml b/deps/npm/node_modules/request/node_modules/hawk/.travis.yml index 047f7e3d5e1e39..77795c6a9b47df 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/.travis.yml +++ b/deps/npm/node_modules/request/node_modules/hawk/.travis.yml @@ -2,4 +2,3 @@ language: node_js node_js: - 0.10 - diff --git a/deps/npm/node_modules/request/node_modules/hawk/README.md b/deps/npm/node_modules/request/node_modules/hawk/README.md index 4aff23f3a3f7c5..63725034fc5e72 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/README.md +++ b/deps/npm/node_modules/request/node_modules/hawk/README.md @@ -75,12 +75,12 @@ and the server. ## Replay Protection -Without replay protection, an attacker can use a compromised (but otherwise valid and authenticated) request more -than once, gaining access to a protected resource. To mitigate this, clients include both a nonce and a timestamp when +Without replay protection, an attacker can use a compromised (but otherwise valid and authenticated) request more +than once, gaining access to a protected resource. To mitigate this, clients include both a nonce and a timestamp when making requests. This gives the server enough information to prevent replay attacks. The nonce is generated by the client, and is a string unique across all requests with the same timestamp and -key identifier combination. +key identifier combination. The timestamp enables the server to restrict the validity period of the credentials where requests occuring afterwards are rejected. It also removes the need for the server to retain an unbounded number of nonce values for future checks. @@ -373,7 +373,7 @@ and for a finite period of time. Both the client and server can issue bewit cred credentials as the client to maintain clear traceability as to who issued which credentials. In order to simplify implementation, bewit credentials do not support single-use policy and can be replayed multiple times within -the granted access timeframe. +the granted access timeframe. ## Bewit Usage Example @@ -496,7 +496,7 @@ which can often affect how the request body is interpreted by the server. If the or value of such headers, an attacker can manipulate the request headers without being detected. Implementers should use the `ext` feature to pass application-specific information via the `Authorization` header which is protected by the request MAC. -The response authentication, when performed, only covers the response payload, content-type, and the request information +The response authentication, when performed, only covers the response payload, content-type, and the request information provided by the client in it's request (method, resource, timestamp, nonce, etc.). It does not cover the HTTP status code or any other response header field (e.g. Location) which can affect the client's behaviour. diff --git a/deps/npm/node_modules/request/node_modules/hawk/example/usage.js b/deps/npm/node_modules/request/node_modules/hawk/example/usage.js index 13b860b4c5ad8a..64fe17674a5753 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/example/usage.js +++ b/deps/npm/node_modules/request/node_modules/hawk/example/usage.js @@ -75,4 +75,3 @@ credentialsFunc('dh37fgj492je', function (err, credentials) { process.exit(0); }); }); - diff --git a/deps/npm/node_modules/request/node_modules/hawk/lib/client.js b/deps/npm/node_modules/request/node_modules/hawk/lib/client.js index b3e8649e3a6215..f9ae69171343bd 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/lib/client.js +++ b/deps/npm/node_modules/request/node_modules/hawk/lib/client.js @@ -364,6 +364,3 @@ exports.message = function (host, port, message, options) { return result; }; - - - diff --git a/deps/npm/node_modules/request/node_modules/hawk/lib/index.js b/deps/npm/node_modules/request/node_modules/hawk/lib/index.js index a883882c8c538c..911b906aabdaed 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/lib/index.js +++ b/deps/npm/node_modules/request/node_modules/hawk/lib/index.js @@ -12,4 +12,3 @@ exports.uri = { authenticate: exports.server.authenticateBewit, getBewit: exports.client.getBewit }; - diff --git a/deps/npm/node_modules/request/node_modules/hawk/lib/utils.js b/deps/npm/node_modules/request/node_modules/hawk/lib/utils.js index 28a35118ff8c00..2da3343904aeab 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/lib/utils.js +++ b/deps/npm/node_modules/request/node_modules/hawk/lib/utils.js @@ -181,4 +181,3 @@ exports.unauthorized = function (message, attributes) { return Boom.unauthorized(message, 'Hawk', attributes); }; - diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore index 77ba16cb055ca5..b0939eabe34d2d 100644 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore @@ -15,4 +15,3 @@ config.json */*/._* coverage.* lib-cov - diff --git a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml index dd1b24f13ac1f8..7a64dd2210cb10 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml +++ b/deps/npm/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml @@ -5,4 +5,3 @@ node_js: - 4.0 sudo: false - diff --git a/deps/npm/node_modules/request/node_modules/hawk/test/readme.js b/deps/npm/node_modules/request/node_modules/hawk/test/readme.js index a466264667ee64..7a343f5e219c61 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/test/readme.js +++ b/deps/npm/node_modules/request/node_modules/hawk/test/readme.js @@ -92,4 +92,3 @@ describe('README', function () { }); }); }); - diff --git a/deps/npm/node_modules/request/node_modules/hawk/test/server.js b/deps/npm/node_modules/request/node_modules/hawk/test/server.js index 1d3405a9ecc11e..0fdf13d435913e 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/test/server.js +++ b/deps/npm/node_modules/request/node_modules/hawk/test/server.js @@ -1326,4 +1326,3 @@ describe('Server', function () { }); }); }); - diff --git a/deps/npm/node_modules/request/node_modules/hawk/test/uri.js b/deps/npm/node_modules/request/node_modules/hawk/test/uri.js index f3c6ba2d629a65..3dc8e6a1c51042 100755 --- a/deps/npm/node_modules/request/node_modules/hawk/test/uri.js +++ b/deps/npm/node_modules/request/node_modules/hawk/test/uri.js @@ -835,4 +835,3 @@ describe('Uri', function () { }); }); }); - diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md index ab3a66417a6fa6..3e152ab804377d 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md @@ -4,6 +4,10 @@ None yet. +## v1.3.1 (2016-09-12) + +* #13 Incompatible with webpack + ## v1.3.0 (2016-06-22) * #14 add safer version of hasOwnProperty() diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md index 4de0124476e98c..78b81d39683251 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md @@ -1,5 +1,5 @@ JSON Schema is a repository for the JSON Schema specification, reference schemas and a CommonJS implementation of JSON Schema (not the only JavaScript implementation of JSON Schema, JSV is another excellent JavaScript validator). -Code is licensed under the AFL or BSD license as part of the Persevere +Code is licensed under the AFL or BSD license as part of the Persevere project which is administered under the Dojo foundation, and all contributions require a Dojo CLA. \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema index de80b918b671c7..36a85ccd244926 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema @@ -8,61 +8,61 @@ "items" : {"$ref" : "http://json-schema.org/draft-00/links#"}, "optional" : true }, - + "fragmentResolution" : { "type" : "string", "optional" : true, "default" : "dot-delimited" }, - + "root" : { "type" : "boolean", "optional" : true, "default" : false }, - + "readonly" : { "type" : "boolean", "optional" : true, "default" : false }, - + "pathStart" : { "type" : "string", "optional" : true, "format" : "uri" }, - + "mediaType" : { "type" : "string", "optional" : true, "format" : "media-type" }, - + "alternate" : { "type" : "array", "items" : {"$ref" : "#"}, "optional" : true } }, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "dot-delimited", "extends" : {"$ref" : "http://json-schema.org/draft-00/schema#"} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref index 3a872a71c973dc..5d1f76b6a694a4 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref @@ -1,26 +1,26 @@ { "$schema" : "http://json-schema.org/draft-00/hyper-schema#", "id" : "http://json-schema.org/draft-00/json-ref#", - + "items" : {"$ref" : "#"}, "additionalProperties" : {"$ref" : "#"}, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "dot-delimited" } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links index 8a5e7807250cf9..cbef326dd3de5b 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links @@ -2,28 +2,28 @@ "$schema" : "http://json-schema.org/draft-00/hyper-schema#", "id" : "http://json-schema.org/draft-00/links#", "type" : "object", - + "properties" : { "href" : { "type" : "string" }, - + "rel" : { "type" : "string" }, - + "method" : { "type" : "string", "default" : "GET", "optional" : true }, - + "enctype" : { "type" : "string", "requires" : "method", "optional" : true }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "http://json-schema.org/draft-00/hyper-schema#"}, diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema index 9aa2fbc57a4054..d452b023ee484a 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-00/hyper-schema#", "id" : "http://json-schema.org/draft-00/schema#", "type" : "object", - + "properties" : { "type" : { "type" : ["string", "array"], @@ -12,136 +12,136 @@ "optional" : true, "default" : "any" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "items" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "optional" : { "type" : "boolean", "optional" : true, "default" : false }, - + "additionalProperties" : { "type" : [{"$ref" : "#"}, "boolean"], "optional" : true, "default" : {} }, - + "requires" : { "type" : ["string", {"$ref" : "#"}], "optional" : true }, - + "minimum" : { "type" : "number", "optional" : true }, - + "maximum" : { "type" : "number", "optional" : true }, - + "minimumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "minimum", "default" : true }, - + "maximumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "maximum", "default" : true }, - + "minItems" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 }, - + "pattern" : { "type" : "string", "optional" : true, "format" : "regex" }, - + "minLength" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxLength" : { "type" : "integer", "optional" : true }, - + "enum" : { "type" : "array", "optional" : true, "minItems" : 1 }, - + "title" : { "type" : "string", "optional" : true }, - + "description" : { "type" : "string", "optional" : true }, - + "format" : { "type" : "string", "optional" : true }, - + "contentEncoding" : { "type" : "string", "optional" : true }, - + "default" : { "type" : "any", "optional" : true }, - + "maxDecimal" : { "type" : "integer", "optional" : true, "minimum" : 0 }, - + "disallow" : { "type" : ["string", "array"], "items" : {"type" : "string"}, "optional" : true }, - + "extends" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, @@ -149,7 +149,7 @@ "default" : {} } }, - + "optional" : true, "default" : {} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema index 3f6c6cc2c012df..b0fb5e157ef9bd 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema @@ -8,61 +8,61 @@ "items" : {"$ref" : "http://json-schema.org/draft-01/links#"}, "optional" : true }, - + "fragmentResolution" : { "type" : "string", "optional" : true, "default" : "dot-delimited" }, - + "root" : { "type" : "boolean", "optional" : true, "default" : false }, - + "readonly" : { "type" : "boolean", "optional" : true, "default" : false }, - + "pathStart" : { "type" : "string", "optional" : true, "format" : "uri" }, - + "mediaType" : { "type" : "string", "optional" : true, "format" : "media-type" }, - + "alternate" : { "type" : "array", "items" : {"$ref" : "#"}, "optional" : true } }, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "dot-delimited", "extends" : {"$ref" : "http://json-schema.org/draft-01/schema#"} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref index 4d26174ef17ad9..cbac1ba2e53286 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref @@ -1,26 +1,26 @@ { "$schema" : "http://json-schema.org/draft-01/hyper-schema#", "id" : "http://json-schema.org/draft-01/json-ref#", - + "items" : {"$ref" : "#"}, "additionalProperties" : {"$ref" : "#"}, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "dot-delimited" } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links index 52430a5d94ac75..ebc7b7b58b1326 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links @@ -2,28 +2,28 @@ "$schema" : "http://json-schema.org/draft-01/hyper-schema#", "id" : "http://json-schema.org/draft-01/links#", "type" : "object", - + "properties" : { "href" : { "type" : "string" }, - + "rel" : { "type" : "string" }, - + "method" : { "type" : "string", "default" : "GET", "optional" : true }, - + "enctype" : { "type" : "string", "requires" : "method", "optional" : true }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "http://json-schema.org/draft-01/hyper-schema#"}, diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema index 7a208e680e631b..a0f3801f840cca 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-01/hyper-schema#", "id" : "http://json-schema.org/draft-01/schema#", "type" : "object", - + "properties" : { "type" : { "type" : ["string", "array"], @@ -12,136 +12,136 @@ "optional" : true, "default" : "any" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "items" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "optional" : { "type" : "boolean", "optional" : true, "default" : false }, - + "additionalProperties" : { "type" : [{"$ref" : "#"}, "boolean"], "optional" : true, "default" : {} }, - + "requires" : { "type" : ["string", {"$ref" : "#"}], "optional" : true }, - + "minimum" : { "type" : "number", "optional" : true }, - + "maximum" : { "type" : "number", "optional" : true }, - + "minimumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "minimum", "default" : true }, - + "maximumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "maximum", "default" : true }, - + "minItems" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 }, - + "pattern" : { "type" : "string", "optional" : true, "format" : "regex" }, - + "minLength" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxLength" : { "type" : "integer", "optional" : true }, - + "enum" : { "type" : "array", "optional" : true, "minItems" : 1 }, - + "title" : { "type" : "string", "optional" : true }, - + "description" : { "type" : "string", "optional" : true }, - + "format" : { "type" : "string", "optional" : true }, - + "contentEncoding" : { "type" : "string", "optional" : true }, - + "default" : { "type" : "any", "optional" : true }, - + "maxDecimal" : { "type" : "integer", "optional" : true, "minimum" : 0 }, - + "disallow" : { "type" : ["string", "array"], "items" : {"type" : "string"}, "optional" : true }, - + "extends" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, @@ -149,7 +149,7 @@ "default" : {} } }, - + "optional" : true, "default" : {} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema index 4ec1b7569137c3..0771e2b31e8eef 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema @@ -8,61 +8,61 @@ "items" : {"$ref" : "http://json-schema.org/draft-02/links#"}, "optional" : true }, - + "fragmentResolution" : { "type" : "string", "optional" : true, "default" : "slash-delimited" }, - + "root" : { "type" : "boolean", "optional" : true, "default" : false }, - + "readonly" : { "type" : "boolean", "optional" : true, "default" : false }, - + "pathStart" : { "type" : "string", "optional" : true, "format" : "uri" }, - + "mediaType" : { "type" : "string", "optional" : true, "format" : "media-type" }, - + "alternate" : { "type" : "array", "items" : {"$ref" : "#"}, "optional" : true } }, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "slash-delimited", "extends" : {"$ref" : "http://json-schema.org/draft-02/schema#"} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref index 6526c394556665..1a6c56d04b665a 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref @@ -1,26 +1,26 @@ { "$schema" : "http://json-schema.org/draft-02/hyper-schema#", "id" : "http://json-schema.org/draft-02/json-ref#", - + "items" : {"$ref" : "#"}, "additionalProperties" : {"$ref" : "#"}, - + "links" : [ { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" }, - + { "href" : "{id}", "rel" : "self" } ], - + "fragmentResolution" : "dot-delimited" } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links index 1b176178a2c333..dacc53a1a4adb6 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links @@ -2,30 +2,30 @@ "$schema" : "http://json-schema.org/draft-02/hyper-schema#", "id" : "http://json-schema.org/draft-02/links#", "type" : "object", - + "properties" : { "href" : { "type" : "string" }, - + "rel" : { "type" : "string" }, - + "targetSchema" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"}, - + "method" : { "type" : "string", "default" : "GET", "optional" : true }, - + "enctype" : { "type" : "string", "requires" : "method", "optional" : true }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"}, diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema index 61b8de15483962..a4998abea2065e 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-02/hyper-schema#", "id" : "http://json-schema.org/draft-02/schema#", "type" : "object", - + "properties" : { "type" : { "type" : ["string", "array"], @@ -13,131 +13,131 @@ "uniqueItems" : true, "default" : "any" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "items" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "optional" : true, "default" : {} }, - + "optional" : { "type" : "boolean", "optional" : true, "default" : false }, - + "additionalProperties" : { "type" : [{"$ref" : "#"}, "boolean"], "optional" : true, "default" : {} }, - + "requires" : { "type" : ["string", {"$ref" : "#"}], "optional" : true }, - + "minimum" : { "type" : "number", "optional" : true }, - + "maximum" : { "type" : "number", "optional" : true }, - + "minimumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "minimum", "default" : true }, - + "maximumCanEqual" : { "type" : "boolean", "optional" : true, "requires" : "maximum", "default" : true }, - + "minItems" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxItems" : { "type" : "integer", "optional" : true, "minimum" : 0 }, - + "uniqueItems" : { "type" : "boolean", "optional" : true, "default" : false }, - + "pattern" : { "type" : "string", "optional" : true, "format" : "regex" }, - + "minLength" : { "type" : "integer", "optional" : true, "minimum" : 0, "default" : 0 }, - + "maxLength" : { "type" : "integer", "optional" : true }, - + "enum" : { "type" : "array", "optional" : true, "minItems" : 1, "uniqueItems" : true }, - + "title" : { "type" : "string", "optional" : true }, - + "description" : { "type" : "string", "optional" : true }, - + "format" : { "type" : "string", "optional" : true }, - + "contentEncoding" : { "type" : "string", "optional" : true }, - + "default" : { "type" : "any", "optional" : true }, - + "divisibleBy" : { "type" : "number", "minimum" : 0, @@ -145,14 +145,14 @@ "optional" : true, "default" : 1 }, - + "disallow" : { "type" : ["string", "array"], "items" : {"type" : "string"}, "optional" : true, "uniqueItems" : true }, - + "extends" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, @@ -160,7 +160,7 @@ "default" : {} } }, - + "optional" : true, "default" : {} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar index 463cfb314b6431..d8fb5335f081b4 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar @@ -12,12 +12,12 @@ "type":"string", "required":true }, - "location" : { - "type" : "string" + "location" : { + "type" : "string" }, "url" : { - "type" : "string", - "format" : "url" + "type" : "string", + "format" : "url" }, "dtend" : { "format" : "date-time", @@ -47,7 +47,3 @@ "geo" : { "$ref" : "http://json-schema.org/draft-03/geo" } } } - - - - diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces index 288a19856b7263..84ebf83a993f6d 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces @@ -6,18 +6,18 @@ "type":"object", "description":"This defines the set of methods available to the class instances", "additionalProperties":{ - "type":"object", - "description":"The definition of the method", - "properties":{ - "parameters":{ - "type":"array", - "description":"The set of parameters that should be passed to the method when it is called", - "items":{"$ref":"#"}, - "required": true - }, - "returns":{"$ref":"#"} - } + "type":"object", + "description":"The definition of the method", + "properties":{ + "parameters":{ + "type":"array", + "description":"The set of parameters that should be passed to the method when it is called", + "items":{"$ref":"#"}, + "required": true + }, + "returns":{"$ref":"#"} + } } - } + } } } diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref index 7e491a8e882347..388476323a08ab 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref @@ -1,26 +1,26 @@ { "$schema" : "http://json-schema.org/draft-03/hyper-schema#", "id" : "http://json-schema.org/draft-03/json-ref#", - + "additionalItems" : {"$ref" : "#"}, "additionalProperties" : {"$ref" : "#"}, - + "links" : [ { "href" : "{id}", "rel" : "self" }, - + { "href" : "{$ref}", "rel" : "full" }, - + { "href" : "{$schema}", "rel" : "describedby" } ], - + "fragmentResolution" : "dot-delimited" } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links index 6b0a85a6295b25..3dbcdba73cc4e8 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links @@ -2,31 +2,31 @@ "$schema" : "http://json-schema.org/draft-03/hyper-schema#", "id" : "http://json-schema.org/draft-03/links#", "type" : "object", - + "properties" : { "href" : { "type" : "string", "required" : true, "format" : "link-description-object-template" }, - + "rel" : { "type" : "string", "required" : true }, - + "targetSchema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"}, - + "method" : { "type" : "string", "default" : "GET" }, - + "enctype" : { "type" : "string", "requires" : "method" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"} diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema index 55ae47d808c0ab..361456d8a7e89e 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-03/schema#", "id" : "http://json-schema.org/draft-03/schema#", "type" : "object", - + "properties" : { "type" : { "type" : ["string", "array"], @@ -12,40 +12,40 @@ "uniqueItems" : true, "default" : "any" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "default" : {} }, - + "patternProperties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "default" : {} }, - + "additionalProperties" : { "type" : [{"$ref" : "#"}, "boolean"], "default" : {} }, - + "items" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "default" : {} }, - + "additionalItems" : { "type" : [{"$ref" : "#"}, "boolean"], "default" : {} }, - + "required" : { "type" : "boolean", "default" : false }, - + "dependencies" : { "type" : "object", "additionalProperties" : { @@ -56,85 +56,85 @@ }, "default" : {} }, - + "minimum" : { "type" : "number" }, - + "maximum" : { "type" : "number" }, - + "exclusiveMinimum" : { "type" : "boolean", "default" : false }, - + "exclusiveMaximum" : { "type" : "boolean", "default" : false }, - + "minItems" : { "type" : "integer", "minimum" : 0, "default" : 0 }, - + "maxItems" : { "type" : "integer", "minimum" : 0 }, - + "uniqueItems" : { "type" : "boolean", "default" : false }, - + "pattern" : { "type" : "string", "format" : "regex" }, - + "minLength" : { "type" : "integer", "minimum" : 0, "default" : 0 }, - + "maxLength" : { "type" : "integer" }, - + "enum" : { "type" : "array", "minItems" : 1, "uniqueItems" : true }, - + "default" : { "type" : "any" }, - + "title" : { "type" : "string" }, - + "description" : { "type" : "string" }, - + "format" : { "type" : "string" }, - + "divisibleBy" : { "type" : "number", "minimum" : 0, "exclusiveMinimum" : true, "default" : 1 }, - + "disallow" : { "type" : ["string", "array"], "items" : { @@ -142,33 +142,33 @@ }, "uniqueItems" : true }, - + "extends" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "default" : {} }, - + "id" : { "type" : "string", "format" : "uri" }, - + "$ref" : { "type" : "string", "format" : "uri" }, - + "$schema" : { "type" : "string", "format" : "uri" } }, - + "dependencies" : { "exclusiveMinimum" : "minimum", "exclusiveMaximum" : "maximum" }, - + "default" : {} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links index de272cc4513d0a..7cf7c92c20965c 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-04/hyper-schema#", "id" : "http://json-schema.org/draft-04/links#", "type" : "object", - + "properties" : { "rel" : { "type" : "string" @@ -15,26 +15,26 @@ "template" : { "type" : "string" }, - + "targetSchema" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"}, - + "method" : { "type" : "string", "default" : "GET" }, - + "enctype" : { "type" : "string" }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"} } }, - + "required" : ["rel", "href"], - + "dependencies" : { "enctype" : "method" } diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema index 598951e57d2eb7..e9c90699fda128 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema @@ -2,7 +2,7 @@ "$schema" : "http://json-schema.org/draft-04/schema#", "id" : "http://json-schema.org/draft-04/schema#", "type" : "object", - + "properties" : { "type" : { "type" : [ @@ -10,19 +10,19 @@ "id" : "#simple-type", "type" : "string", "enum" : ["object", "array", "string", "number", "boolean", "null", "any"] - }, + }, "array" ], "items" : { "type" : [ - {"$ref" : "#simple-type"}, + {"$ref" : "#simple-type"}, {"$ref" : "#"} ] }, "uniqueItems" : true, "default" : "any" }, - + "disallow" : { "type" : ["string", "array"], "items" : { @@ -30,7 +30,7 @@ }, "uniqueItems" : true }, - + "extends" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, @@ -42,108 +42,108 @@ "minItems" : 1, "uniqueItems" : true }, - + "minimum" : { "type" : "number" }, - + "maximum" : { "type" : "number" }, - + "exclusiveMinimum" : { "type" : "boolean", "default" : false }, - + "exclusiveMaximum" : { "type" : "boolean", "default" : false }, - + "divisibleBy" : { "type" : "number", "minimum" : 0, "exclusiveMinimum" : true, "default" : 1 }, - + "minLength" : { "type" : "integer", "minimum" : 0, "default" : 0 }, - + "maxLength" : { "type" : "integer" }, - + "pattern" : { "type" : "string" }, - + "items" : { "type" : [{"$ref" : "#"}, "array"], "items" : {"$ref" : "#"}, "default" : {} }, - + "additionalItems" : { "type" : [{"$ref" : "#"}, "boolean"], "default" : {} }, - + "minItems" : { "type" : "integer", "minimum" : 0, "default" : 0 }, - + "maxItems" : { "type" : "integer", "minimum" : 0 }, - + "uniqueItems" : { "type" : "boolean", "default" : false }, - + "properties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "default" : {} }, - + "patternProperties" : { "type" : "object", "additionalProperties" : {"$ref" : "#"}, "default" : {} }, - + "additionalProperties" : { "type" : [{"$ref" : "#"}, "boolean"], "default" : {} }, - + "minProperties" : { "type" : "integer", "minimum" : 0, "default" : 0 }, - + "maxProperties" : { "type" : "integer", "minimum" : 0 }, - + "required" : { "type" : "array", "items" : { "type" : "string" } }, - + "dependencies" : { "type" : "object", "additionalProperties" : { @@ -154,36 +154,36 @@ }, "default" : {} }, - + "id" : { "type" : "string" }, - + "$ref" : { "type" : "string" }, - + "$schema" : { "type" : "string" }, - + "title" : { "type" : "string" }, - + "description" : { "type" : "string" }, - + "default" : { "type" : "any" } }, - + "dependencies" : { "exclusiveMinimum" : "minimum", "exclusiveMaximum" : "maximum" }, - + "default" : {} } \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml index c28f40dcd6ee44..1cf715910b5a83 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml @@ -24,7 +24,7 @@ A JSON Media Type for Describing the Structure and Meaning of JSON Documents - + SitePen (USA)
@@ -37,7 +37,7 @@ kris@sitepen.com
- +
@@ -48,7 +48,7 @@ gary.court@gmail.com
- + Internet Engineering Task Force JSON @@ -58,59 +58,59 @@ Notation Hyper Schema Hypermedia - + - JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", - a JSON based format for defining - the structure of JSON data. JSON Schema provides a contract for what JSON - data is required for a given application and how to interact with it. JSON - Schema is intended to define validation, documentation, hyperlink - navigation, and interaction control of JSON data. + JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", + a JSON based format for defining + the structure of JSON data. JSON Schema provides a contract for what JSON + data is required for a given application and how to interact with it. JSON + Schema is intended to define validation, documentation, hyperlink + navigation, and interaction control of JSON data.
- +
- JSON (JavaScript Object Notation) Schema is a JSON media type for defining - the structure of JSON data. JSON Schema provides a contract for what JSON - data is required for a given application and how to interact with it. JSON - Schema is intended to define validation, documentation, hyperlink - navigation, and interaction control of JSON data. + JSON (JavaScript Object Notation) Schema is a JSON media type for defining + the structure of JSON data. JSON Schema provides a contract for what JSON + data is required for a given application and how to interact with it. JSON + Schema is intended to define validation, documentation, hyperlink + navigation, and interaction control of JSON data.
- +
- - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
- + - +
- JSON Schema defines the media type "application/schema+json" for + JSON Schema defines the media type "application/schema+json" for describing the structure of other - JSON documents. JSON Schema is JSON-based and includes facilities + JSON documents. JSON Schema is JSON-based and includes facilities for describing the structure of JSON documents in terms of allowable values, descriptions, and interpreting relations with other resources. - JSON Schema format is organized into several separate definitions. The first - definition is the core schema specification. This definition is primary + JSON Schema format is organized into several separate definitions. The first + definition is the core schema specification. This definition is primary concerned with describing a JSON structure and specifying valid elements in the structure. The second definition is the Hyper Schema specification which is intended define elements in a structure that can be interpreted as hyperlinks. - Hyper Schema builds on JSON Schema to describe the hyperlink structure of + Hyper Schema builds on JSON Schema to describe the hyperlink structure of other JSON documents and elements of interaction. This allows user agents to be able to successfully navigate JSON documents based on their schemas. @@ -118,12 +118,12 @@ Cumulatively JSON Schema acts as a meta-document that can be used to define the required type and constraints on property values, as well as define the meaning of the property values for the purpose of describing a resource and determining hyperlinks - within the representation. + within the representation.
An example JSON Schema that describes products might look like: - - This schema defines the properties of the instance JSON documents, + This schema defines the properties of the instance JSON documents, the required properties (id, name, and price), as well as an optional property (tags). This also defines the link relations of the instance JSON documents.
- +
- For this specification, schema will be used to denote a JSON Schema - definition, and an instance refers to a JSON value that the schema + For this specification, schema will be used to denote a JSON Schema + definition, and an instance refers to a JSON value that the schema will be describing and validating.
- +
The JSON Schema media type does not attempt to dictate the structure of JSON @@ -194,7 +194,7 @@ This specification is protocol agnostic. The underlying protocol (such as HTTP) should sufficiently define the semantics of the client-server interface, the retrieval of resource - representations linked to by JSON representations, and modification of + representations linked to by JSON representations, and modification of those resources. The goal of this format is to sufficiently describe JSON structures such that one can utilize existing information available in existing JSON @@ -203,7 +203,7 @@
- +
JSON Schema instances are correlated to their schema by the "describedby" @@ -217,22 +217,22 @@ representation and messages may retain the self-descriptive characteristic, avoiding the need for out-of-band information about instance data. Two approaches are recommended for declaring the - relation to the schema that describes the meaning of a JSON instance's (or collection + relation to the schema that describes the meaning of a JSON instance's (or collection of instances) structure. A MIME type parameter named "profile" or a relation of "describedby" (which could be defined by a Link header) may be used: - +
-
- + or if the content is being transferred by a protocol (such as HTTP) that provides headers, a Link header can be used: - +
; rel="describedby" ]]>
- - Instances MAY specify multiple schemas, to indicate all the schemas that - are applicable to the data, and the data SHOULD be valid by all the schemas. - The instance data MAY have multiple schemas - that it is defined by (the instance data SHOULD be valid for those schemas). - Or if the document is a collection of instances, the collection MAY contain - instances from different schemas. When collections contain heterogeneous - instances, the "pathStart" attribute MAY be specified in the - schema to disambiguate which schema should be applied for each item in the + + Instances MAY specify multiple schemas, to indicate all the schemas that + are applicable to the data, and the data SHOULD be valid by all the schemas. + The instance data MAY have multiple schemas + that it is defined by (the instance data SHOULD be valid for those schemas). + Or if the document is a collection of instances, the collection MAY contain + instances from different schemas. When collections contain heterogeneous + instances, the "pathStart" attribute MAY be specified in the + schema to disambiguate which schema should be applied for each item in the collection. However, ultimately, the mechanism for referencing a schema is up to the media type of the instance documents (if they choose to specify that schemas can be referenced).
- +
- JSON Schemas can themselves be described using JSON Schemas. + JSON Schemas can themselves be described using JSON Schemas. A self-describing JSON Schema for the core JSON Schema can - be found at http://json-schema.org/schema for the latest version or - http://json-schema.org/draft-03/schema for the draft-03 version. The hyper schema - self-description can be found at http://json-schema.org/hyper-schema + be found at http://json-schema.org/schema for the latest version or + http://json-schema.org/draft-03/schema for the draft-03 version. The hyper schema + self-description can be found at http://json-schema.org/hyper-schema or http://json-schema.org/draft-03/hyper-schema. All schemas used within a protocol with media type definitions SHOULD include a MIME parameter that refers to the self-descriptive hyper schema or another schema that extends this hyper schema: - +
- @@ -277,15 +277,15 @@ Content-Type: application/json;
- +
- A JSON Schema is a JSON Object that defines various attributes + A JSON Schema is a JSON Object that defines various attributes (including usage and valid values) of a JSON value. JSON Schema has recursive capabilities; there are a number of elements in the structure that allow for nested JSON Schemas. - +
An example JSON Schema definition could look like: @@ -307,15 +307,15 @@ Content-Type: application/json; ]]>
- + A JSON Schema object may have any of the following properties, called schema attributes (all attributes are optional): - +
- This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. + This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. This attribute can take one of two forms: @@ -332,19 +332,19 @@ Content-Type: application/json; Value MUST be null. Note this is mainly for purpose of being able use union types to define nullability. If this type is not included in a union, null values are not allowed (the primitives listed above do not allow nulls on their own). Value MAY be of any type including null. - - If the property is not defined or is not in this list, then any type of value is acceptable. - Other type values MAY be used for custom purposes, but minimal validators of the specification + + If the property is not defined or is not in this list, then any type of value is acceptable. + Other type values MAY be used for custom purposes, but minimal validators of the specification implementation can allow any instance value on unknown type values. - + An array of two or more simple type definitions. Each item in the array MUST be a simple type definition or a schema. - The instance value is valid if it is of the same type as one of the simple type definitions, or valid by one of the schemas, in the array. + The instance value is valid if it is of the same type as one of the simple type definitions, or valid by one of the schemas, in the array. - +
For example, a schema that defines if an instance can be a string or a number would be: @@ -355,38 +355,38 @@ Content-Type: application/json; ]]>
- +
This attribute is an object with property definitions that define the valid values of instance object property values. When the instance value is an object, the property values of the instance object MUST conform to the property definitions in this object. In this object, each property definition's value MUST be a schema, and the property's name MUST be the name of the instance property that it defines. The instance property value MUST be valid according to the schema from the property definition. Properties are considered unordered, the order of the instance properties MAY be in any order.
- +
This attribute is an object that defines the schema for a set of property names of an object instance. The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.
- +
This attribute defines a schema for all properties that are not explicitly defined in an object type definition. If specified, the value MUST be a schema or a boolean. If false is provided, no additional properties are allowed beyond the properties defined in the schema. The default value is an empty schema which allows any value for additional properties.
- +
This attribute defines the allowed items in an instance array, and MUST be a schema or an array of schemas. The default value is an empty schema which allows any value for items in the instance array. When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema. When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST conform to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the "additionalItems" attribute using the same rules as "additionalProperties" for objects.
- +
This provides a definition for additional items in an array instance when tuple definitions of the items is provided. This can be false to indicate additional items in the array are not allowed, or it can be a schema that defines the schema of the additional items.
- +
This attribute indicates if the instance must have a value, and not be undefined. This is false by default, making the instance optional.
- +
This attribute is an object that defines the requirements of a property on an instance object. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value"). The dependency value can take one of two forms: - + If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value. @@ -398,36 +398,36 @@ Content-Type: application/json;
- +
This attribute defines the minimum value of the instance property when the type of the instance value is a number.
- +
This attribute defines the maximum value of the instance property when the type of the instance value is a number.
- +
This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.
- +
This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.
- +
This attribute defines the minimum number of values in an array when the array is the instance value.
- +
This attribute defines the maximum number of values in an array when the array is the instance value.
- +
This attribute indicates that all items in an array instance MUST be unique (contains no two identical values). Two instance are consider equal if they are both of the same type and: - + are null; or are booleans/numbers/strings and have the same value; or @@ -436,41 +436,41 @@ Content-Type: application/json;
- +
When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5
- +
When the instance value is a string, this defines the minimum length of the string.
- +
When the instance value is a string, this defines the maximum length of the string.
- +
This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in "uniqueItems".
- +
This attribute defines the default value of the instance when the instance is undefined.
- +
This attribute is a string that provides a short description of the instance property.
- +
This attribute is a string that provides a full description of the of purpose the instance property.
- +
This property defines the type of data, content type, or microformat to be expected in the instance property values. A format attribute MAY be one of the values listed below, and if so, SHOULD adhere to the semantics describing for the format. A format SHOULD only be used to give meaning to primitive types (string, integer, number, or boolean). Validators MAY (but are not required to) validate that the instance values conform to a format. - + The following formats are predefined: - + This SHOULD be a date in ISO 8601 format of YYYY-MM-DDThh:mm:ssZ in UTC time. This is the recommended form of date/timestamp. This SHOULD be a date in the format of YYYY-MM-DD. It is recommended that you use the "date-time" format instead of "date" unless you need to transfer only the date part. @@ -487,18 +487,18 @@ Content-Type: application/json; This SHOULD be a host-name. - + Additional custom formats MAY be created. These custom formats MAY be expressed as an URI, and this URI MAY reference a schema of that format.
- +
This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.
- +
This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.
- +
The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints. @@ -506,7 +506,7 @@ Content-Type: application/json; instance against all constraints in the extending schema as well as the extended schema(s). More optimized implementations that merge schemas are possible, but are not required. Some examples of using "extends": - +
- +
- +
This attribute defines the current URI of this schema (this attribute is @@ -553,28 +553,28 @@ Content-Type: application/json; is also used to construct relative references such as for $ref.
- +
- This attribute defines a URI of a schema that contains the full representation of this schema. - When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. + This attribute defines a URI of a schema that contains the full representation of this schema. + When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
- +
- This attribute defines a URI of a JSON Schema that is the schema of the current schema. + This attribute defines a URI of a JSON Schema that is the schema of the current schema. When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving Hyper Schemalinks. - + - A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. + A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
- +
The following attributes are specified in addition to those @@ -586,28 +586,28 @@ Content-Type: application/json; essentially describes plain JSON (no constraints on the structures). Addition of attributes provides additive information for user agents. - +
- The value of the links property MUST be an array, where each item + The value of the links property MUST be an array, where each item in the array is a link description object which describes the link relations of the instances. - +
- A link description object is used to describe link relations. In - the context of a schema, it defines the link relations of the + A link description object is used to describe link relations. In + the context of a schema, it defines the link relations of the instances of the schema, and can be parameterized by the instance values. The link description format can be used on its own in regular (non-schema documents), and use of this format can be declared by referencing the normative link description - schema as the the schema for the data structure that uses the - links. The URI of the normative link description schema is: + schema as the the schema for the data structure that uses the + links. The URI of the normative link description schema is: http://json-schema.org/links (latest version) or http://json-schema.org/draft-03/links (draft-03 version). - +
The value of the "href" link description property @@ -615,19 +615,19 @@ Content-Type: application/json; of the instance property SHOULD be resolved as a URI-Reference per RFC 3986 and MAY be a relative URI. The base URI to be used for relative resolution SHOULD be the URI used to retrieve the instance object (not the schema) - when used within a schema. Also, when links are used within a schema, the URI - SHOULD be parametrized by the property values of the instance + when used within a schema. Also, when links are used within a schema, the URI + SHOULD be parametrized by the property values of the instance object, if property values exist for the corresponding variables in the template (otherwise they MAY be provided from alternate sources, like user input). - + Instance property values SHOULD be substituted into the URIs where matching braces ('{', '}') are found surrounding zero or more characters, creating an expanded URI. Instance property value substitutions are resolved by using the text between the braces to denote the property name - from the instance to get the value to substitute. - + from the instance to get the value to substitute. +
For example, if an href value is defined: @@ -637,7 +637,7 @@ http://somesite.com/{id} Then it would be resolved by replace the value of the "id" property value from the instance object.
- +
If the value of the "id" property was "45", the expanded URI would be: @@ -646,23 +646,23 @@ http://somesite.com/45 ]]>
- - If matching braces are found with the string "@" (no quotes) between the braces, then the + + If matching braces are found with the string "@" (no quotes) between the braces, then the actual instance value SHOULD be used to replace the braces, rather than a property value. - This should only be used in situations where the instance is a scalar (string, + This should only be used in situations where the instance is a scalar (string, boolean, or number), and not for objects or arrays.
- +
- The value of the "rel" property indicates the name of the + The value of the "rel" property indicates the name of the relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation. - + Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see RFC 4287). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations: - + If the relation value is "self", when this property is encountered in @@ -670,15 +670,15 @@ http://somesite.com/45 treated as a full representation of the target resource identified by the specified URI. - + This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation. - + This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures. - + This relation indicates that the target of the link SHOULD be treated as the root or the body of the representation for the @@ -688,7 +688,7 @@ http://somesite.com/45 - + The following relations are applicable for schemas (the schema as the "from" resource in the relation): @@ -697,7 +697,7 @@ http://somesite.com/45 This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST). - +
For example, if a schema is defined: @@ -718,7 +718,7 @@ http://somesite.com/45 ]]>
- +
And if a collection of instance resource's JSON representation was retrieved: @@ -742,37 +742,37 @@ GET /Resource/ The "children" collection would be located at "/Resource/?upId=thing".
- +
This property value is a schema that defines the expected structure of the JSON representation of the target of the link.
- +
- The following properties also apply to link definition objects, and - provide functionality analogous to HTML forms, in providing a + The following properties also apply to link definition objects, and + provide functionality analogous to HTML forms, in providing a means for submitting extra (often user supplied) information to send to a server. - +
- This attribute defines which method can be used to access the target resource. - In an HTTP environment, this would be "GET" or "POST" (other HTTP methods - such as "PUT" and "DELETE" have semantics that are clearly implied by - accessed resources, and do not need to be defined here). + This attribute defines which method can be used to access the target resource. + In an HTTP environment, this would be "GET" or "POST" (other HTTP methods + such as "PUT" and "DELETE" have semantics that are clearly implied by + accessed resources, and do not need to be defined here). This defaults to "GET".
- +
If present, this property indicates a query media type format that the server - supports for querying or posting to the collection of instances at the target - resource. The query can be + supports for querying or posting to the collection of instances at the target + resource. The query can be suffixed to the target URI to query the collection with property-based constraints on the resources that SHOULD be returned from the server or used to post data to the resource (depending on the method). - +
For example, with the following schema: @@ -793,7 +793,7 @@ GET /Resource/ This indicates that the client can query the server for instances that have a specific name.
- +
For example: @@ -803,23 +803,23 @@ GET /Resource/
- If no enctype or method is specified, only the single URI specified by - the href property is defined. If the method is POST, "application/json" is + If no enctype or method is specified, only the single URI specified by + the href property is defined. If the method is POST, "application/json" is the default media type.
- +
This attribute contains a schema which defines the acceptable structure of the submitted - request (for a GET request, this schema would define the properties for the query string + request (for a GET request, this schema would define the properties for the query string and for a POST request, this would define the body).
- +
This property indicates the fragment resolution protocol to use for @@ -829,12 +829,12 @@ GET /Resource/ protocol is "slash-delimited", which is defined below. Other fragment resolution protocols MAY be used, but are not defined in this document. - + The fragment identifier is based on RFC 2396, Sec 5, and defines the mechanism for resolving references to entities within a document. - +
With the slash-delimited fragment resolution protocol, the fragment @@ -852,15 +852,15 @@ GET /Resource/ item in array the array with the index defined by the next property reference token (which MUST be a number). The target is successively updated for each property reference token, until the entire fragment has - been traversed. + been traversed. - + - Property names SHOULD be URI-encoded. In particular, any "/" in a - property name MUST be encoded to avoid being interpreted as a property + Property names SHOULD be URI-encoded. In particular, any "/" in a + property name MUST be encoded to avoid being interpreted as a property delimiter. - +
For example, for the following JSON representation: @@ -879,7 +879,7 @@ GET /Resource/ ]]>
- +
The following fragment identifiers would be resolved: @@ -889,10 +889,10 @@ fragment identifier resolution # self, the root of the resource itself #/foo the object referred to by the foo property #/foo/another%20prop the object referred to by the "another prop" - property of the object referred to by the + property of the object referred to by the "foo" property #/foo/another%20prop/baz the string referred to by the value of "baz" - property of the "another prop" property of + property of the "another prop" property of the object referred to by the "foo" property #/foo/anArray/0 the first object in the "anArray" array ]]> @@ -900,61 +900,61 @@ fragment identifier resolution
- +
- The dot-delimited fragment resolution protocol is the same as - slash-delimited fragment resolution protocol except that the "." character - (\x2E) is used as the delimiter between property names (instead of "/") and + The dot-delimited fragment resolution protocol is the same as + slash-delimited fragment resolution protocol except that the "." character + (\x2E) is used as the delimiter between property names (instead of "/") and the path does not need to start with a ".". For example, #.foo and #foo are a valid fragment identifiers for referencing the value of the foo propery.
- +
This attribute indicates that the instance property SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.
- +
If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. RFC 2045, Sec 6.1 lists the possible values for this property.
- +
- This attribute is a URI that defines what the instance's URI MUST start with in order to validate. - The value of the "pathStart" attribute MUST be resolved as per RFC 3986, Sec 5, + This attribute is a URI that defines what the instance's URI MUST start with in order to validate. + The value of the "pathStart" attribute MUST be resolved as per RFC 3986, Sec 5, and is relative to the instance's URI. - + - When multiple schemas have been referenced for an instance, the user agent - can determine if this schema is applicable for a particular instance by + When multiple schemas have been referenced for an instance, the user agent + can determine if this schema is applicable for a particular instance by determining if the URI of the instance begins with the the value of the "pathStart" - attribute. If the URI of the instance does not start with this URI, - or if another schema specifies a starting URI that is longer and also matches the - instance, this schema SHOULD NOT be applied to the instance. Any schema - that does not have a pathStart attribute SHOULD be considered applicable + attribute. If the URI of the instance does not start with this URI, + or if another schema specifies a starting URI that is longer and also matches the + instance, this schema SHOULD NOT be applied to the instance. Any schema + that does not have a pathStart attribute SHOULD be considered applicable to all the instances for which it is referenced.
- +
This attribute defines the media type of the instance representations that this schema is defining.
- +
- This specification is a sub-type of the JSON format, and - consequently the security considerations are generally the same as RFC 4627. + This specification is a sub-type of the JSON format, and + consequently the security considerations are generally the same as RFC 4627. However, an additional issue is that when link relation of "self" - is used to denote a full representation of an object, the user agent + is used to denote a full representation of an object, the user agent SHOULD NOT consider the representation to be the authoritative representation of the resource denoted by the target URI if the target URI is not - equivalent to or a sub-path of the the URI used to request the resource + equivalent to or a sub-path of the the URI used to request the resource representation which contains the target URI with the "self" link. - +
For example, if a hyper schema was defined: @@ -968,7 +968,7 @@ fragment identifier resolution ]]>
- +
And a resource was requested from somesite.com: @@ -1005,22 +1005,22 @@ Content-Type: application/json; profile=/schema-for-this-data
- +
The proposed MIME media type for JSON Schema is "application/schema+json". Type name: application Subtype name: schema+json Required parameters: profile - The value of the profile parameter SHOULD be a URI (relative or absolute) that - refers to the schema used to define the structure of this structure (the + The value of the profile parameter SHOULD be a URI (relative or absolute) that + refers to the schema used to define the structure of this structure (the meta-schema). Normally the value would be http://json-schema.org/draft-03/hyper-schema, but it is allowable to use other schemas that extend the hyper schema's meta- schema. Optional parameters: pretty The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read. - +
This registry is maintained by IANA per RFC 4287 and this specification adds @@ -1032,7 +1032,7 @@ Content-Type: application/json; profile=/schema-for-this-data
- + @@ -1080,7 +1080,7 @@ Content-Type: application/json; profile=/schema-for-this-data Added "$ref" and "$schema" attributes. - + Replaced "maxDecimal" attribute with "divisibleBy" attribute. @@ -1090,13 +1090,13 @@ Content-Type: application/json; profile=/schema-for-this-data Added "targetSchema" attribute to link description object. - + Fixed category and updates from template. - + Initial draft. @@ -1105,7 +1105,7 @@ Content-Type: application/json; profile=/schema-for-this-data - +
diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml index f9c1ea5a0c00a2..22fb3290df1472 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml @@ -23,7 +23,7 @@ A JSON Media Type for Describing the Structure and Meaning of JSON Documents - + SitePen (USA)
@@ -36,7 +36,7 @@ kris@sitepen.com
- +
@@ -47,7 +47,7 @@ gary.court@gmail.com
- + Internet Engineering Task Force JSON @@ -57,48 +57,48 @@ Notation Hyper Schema Hypermedia - + - JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", - a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON - data is required for a given application and how to interact with it. JSON - Schema is intended to define validation, documentation, hyperlink - navigation, and interaction control of JSON data. + JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", + a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON + data is required for a given application and how to interact with it. JSON + Schema is intended to define validation, documentation, hyperlink + navigation, and interaction control of JSON data.
- +
- JSON (JavaScript Object Notation) Schema is a JSON media type for defining - the structure of JSON data. JSON Schema provides a contract for what JSON - data is required for a given application and how to interact with it. JSON - Schema is intended to define validation, documentation, hyperlink - navigation, and interaction control of JSON data. + JSON (JavaScript Object Notation) Schema is a JSON media type for defining + the structure of JSON data. JSON Schema provides a contract for what JSON + data is required for a given application and how to interact with it. JSON + Schema is intended to define validation, documentation, hyperlink + navigation, and interaction control of JSON data.
- +
- - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119. - + - The terms "JSON", "JSON text", "JSON value", "member", "element", "object", - "array", "number", "string", "boolean", "true", "false", and "null" in this + The terms "JSON", "JSON text", "JSON value", "member", "element", "object", + "array", "number", "string", "boolean", "true", "false", and "null" in this document are to be interpreted as defined in RFC 4627. - + This specification also uses the following defined terms: - + A JSON Schema object. Equivalent to "JSON value" as defined in RFC 4627. @@ -108,35 +108,35 @@
- +
- JSON Schema defines the media type "application/schema+json" for - describing the structure of JSON text. JSON Schemas are also written in JSON and includes facilities + JSON Schema defines the media type "application/schema+json" for + describing the structure of JSON text. JSON Schemas are also written in JSON and includes facilities for describing the structure of JSON in terms of allowable values, descriptions, and interpreting relations with other resources. - This document is organized into several separate definitions. The first - definition is the core schema specification. This definition is primary + This document is organized into several separate definitions. The first + definition is the core schema specification. This definition is primary concerned with describing a JSON structure and specifying valid elements in the structure. The second definition is the Hyper Schema specification which is intended to define elements in a structure that can be interpreted as hyperlinks. - Hyper Schema builds on JSON Schema to describe the hyperlink structure of + Hyper Schema builds on JSON Schema to describe the hyperlink structure of JSON values. This allows user agents to be able to successfully navigate documents containing JSON based on their schemas. - Cumulatively JSON Schema acts as meta-JSON that can be used to define the + Cumulatively JSON Schema acts as meta-JSON that can be used to define the required type and constraints on JSON values, as well as define the meaning of the JSON values for the purpose of describing a resource and determining - hyperlinks within the representation. + hyperlinks within the representation.
An example JSON Schema that describes products might look like: - - This schema defines the properties of the instance, + This schema defines the properties of the instance, the required properties (id, name, and price), as well as an optional property (tags). This also defines the link relations of the instance.
- +
The JSON Schema media type does not attempt to dictate the structure of JSON @@ -195,7 +195,7 @@ This specification is protocol agnostic. The underlying protocol (such as HTTP) should sufficiently define the semantics of the client-server interface, the retrieval of resource - representations linked to by JSON representations, and modification of + representations linked to by JSON representations, and modification of those resources. The goal of this format is to sufficiently describe JSON structures such that one can utilize existing information available in existing JSON @@ -204,35 +204,35 @@
- +
JSON values are correlated to their schema by the "describedby" relation, where the schema is the target of the relation. JSON values MUST be of the "application/json" media type or - any other subtype. Consequently, dictating how a JSON value should + any other subtype. Consequently, dictating how a JSON value should specify the relation to the schema is beyond the normative scope of this document since this document specifically defines the JSON Schema media type, and no other. It is RECOMMNENDED that JSON values specify their schema so that user agents can interpret the instance and retain the self-descriptive characteristics. This avoides the need for out-of-band information about instance data. Two approaches are recommended for declaring the - relation to the schema that describes the meaning of a JSON instance's (or collection + relation to the schema that describes the meaning of a JSON instance's (or collection of instances) structure. A MIME type parameter named "profile" or a relation of "describedby" (which could be specified by a Link header) may be used: - +
-
- + or if the content is being transferred by a protocol (such as HTTP) that provides headers, a Link header can be used: - +
; rel="describedby" ]]>
- - Instances MAY specify multiple schemas, to indicate all the schemas that - are applicable to the data, and the data SHOULD be valid by all the schemas. - The instance data MAY have multiple schemas - that it is described by (the instance data SHOULD be valid for those schemas). - Or if the document is a collection of instances, the collection MAY contain - instances from different schemas. The mechanism for referencing a schema is - determined by the media type of the instance (if it provides a method for + + Instances MAY specify multiple schemas, to indicate all the schemas that + are applicable to the data, and the data SHOULD be valid by all the schemas. + The instance data MAY have multiple schemas + that it is described by (the instance data SHOULD be valid for those schemas). + Or if the document is a collection of instances, the collection MAY contain + instances from different schemas. The mechanism for referencing a schema is + determined by the media type of the instance (if it provides a method for referencing schemas).
- +
- JSON Schemas can themselves be described using JSON Schemas. + JSON Schemas can themselves be described using JSON Schemas. A self-describing JSON Schema for the core JSON Schema can - be found at http://json-schema.org/schema for the latest version or - http://json-schema.org/draft-04/schema for the draft-04 version. The hyper schema - self-description can be found at http://json-schema.org/hyper-schema + be found at http://json-schema.org/schema for the latest version or + http://json-schema.org/draft-04/schema for the draft-04 version. The hyper schema + self-description can be found at http://json-schema.org/hyper-schema or http://json-schema.org/draft-04/hyper-schema. All schemas used within a protocol with a media type specified SHOULD include a MIME parameter that refers to the self-descriptive hyper schema or another schema that extends this hyper schema: - +
- @@ -273,15 +273,15 @@ Content-Type: application/json;
- +
- A JSON Schema is a JSON object that defines various attributes + A JSON Schema is a JSON object that defines various attributes (including usage and valid values) of a JSON value. JSON Schema has recursive capabilities; there are a number of elements in the structure that allow for nested JSON Schemas. - +
An example JSON Schema could look like: @@ -305,17 +305,17 @@ Content-Type: application/json; ]]>
- + A JSON Schema object MAY have any of the following optional properties: - + - +
- This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. + This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. This attribute can take one of two forms: @@ -332,16 +332,16 @@ Content-Type: application/json; Instance MAY be of any type, including null. - + An array of one or more simple or schema types. - The instance value is valid if it is of the same type as one of the simple types, or valid by one of the schemas, in the array. + The instance value is valid if it is of the same type as one of the simple types, or valid by one of the schemas, in the array. - - If this attribute is not specified, then all value types are accepted. + + If this attribute is not specified, then all value types are accepted. - +
For example, a schema that defines if an instance can be a string or a number would be: @@ -352,37 +352,37 @@ Content-Type: application/json; ]]>
- +
This attribute is an object with properties that specify the schemas for the properties of the instance object. - In this attribute's object, each property value MUST be a schema. + In this attribute's object, each property value MUST be a schema. When the instance value is an object, the value of the instance's properties MUST be valid according to the schemas with the same property names specified in this attribute. Objects are unordered, so therefore the order of the instance properties or attribute properties MUST NOT determine validation success.
- +
- This attribute is an object that defines the schema for a set of property names of an object instance. - The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. + This attribute is an object that defines the schema for a set of property names of an object instance. + The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.
- +
- This attribute specifies how any instance property that is not explicitly defined by either the "properties" or "patternProperties" attributes (hereafter referred to as "additional properties") is handled. If specified, the value MUST be a schema or a boolean. + This attribute specifies how any instance property that is not explicitly defined by either the "properties" or "patternProperties" attributes (hereafter referred to as "additional properties") is handled. If specified, the value MUST be a schema or a boolean. If a schema is provided, then all additional properties MUST be valid according to the schema. If false is provided, then no additional properties are allowed. The default value is an empty schema, which allows any value for additional properties.
- +
This attribute provides the allowed items in an array instance. If specified, this attribute MUST be a schema or an array of schemas. When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema. When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST be valid according to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the "additionalItems" attribute the same way as "additionalProperties" for objects is.
- +
This attribute specifies how any item in the array instance that is not explicitly defined by "items" (hereafter referred to as "additional items") is handled. If specified, the value MUST be a schema or a boolean. If a schema is provided: @@ -395,16 +395,16 @@ Content-Type: application/json; If false is provided, then any additional items in the array are not allowed. The default value is an empty schema, which allows any value for additional items.
- +
This attribute is an array of strings that defines all the property names that must exist on the object instance.
- +
This attribute is an object that specifies the requirements of a property on an object instance. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value"). The dependency value can take one of two forms: - + If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value. @@ -416,44 +416,44 @@ Content-Type: application/json;
- +
This attribute defines the minimum value of the instance property when the type of the instance value is a number.
- +
This attribute defines the maximum value of the instance property when the type of the instance value is a number.
- +
This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.
- +
This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.
- +
This attribute defines the minimum number of values in an array when the array is the instance value.
- +
This attribute defines the maximum number of values in an array when the array is the instance value.
- +
This attribute defines the minimum number of properties required on an object instance.
- +
This attribute defines the maximum number of properties the object instance can have.
- +
This attribute indicates that all items in an array instance MUST be unique (contains no two identical values). Two instance are consider equal if they are both of the same type and: - + are null; or are booleans/numbers/strings and have the same value; or @@ -462,43 +462,43 @@ Content-Type: application/json;
- +
When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5
- +
When the instance value is a string, this defines the minimum length of the string.
- +
When the instance value is a string, this defines the maximum length of the string.
- +
This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in "uniqueItems".
- +
This attribute defines the default value of the instance when the instance is undefined.
- +
This attribute is a string that provides a short description of the instance property.
- +
This attribute is a string that provides a full description of the of purpose the instance property.
- +
This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.
- +
This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.
- +
The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints. @@ -506,7 +506,7 @@ Content-Type: application/json; instance against all constraints in the extending schema as well as the extended schema(s). More optimized implementations that merge schemas are possible, but are not required. Some examples of using "extends": - +
- +
- +
This attribute defines the current URI of this schema (this attribute is @@ -553,28 +553,28 @@ Content-Type: application/json; is also used to construct relative references such as for $ref.
- +
- This attribute defines a URI of a schema that contains the full representation of this schema. - When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. + This attribute defines a URI of a schema that contains the full representation of this schema. + When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
- +
- This attribute defines a URI of a JSON Schema that is the schema of the current schema. + This attribute defines a URI of a JSON Schema that is the schema of the current schema. When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving Hyper Schemalinks. - + - A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. + A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
- +
The following attributes are specified in addition to those @@ -586,30 +586,30 @@ Content-Type: application/json; essentially describes plain JSON (no constraints on the structures). Addition of attributes provides additive information for user agents. - +
- The value of the links property MUST be an array, where each item + The value of the links property MUST be an array, where each item in the array is a link description object which describes the link relations of the instances. - + - +
- A link description object is used to describe link relations. In - the context of a schema, it defines the link relations of the + A link description object is used to describe link relations. In + the context of a schema, it defines the link relations of the instances of the schema, and can be parameterized by the instance - values. The link description format can be used without JSON Schema, + values. The link description format can be used without JSON Schema, and use of this format can be declared by referencing the normative link description - schema as the the schema for the data structure that uses the - links. The URI of the normative link description schema is: + schema as the the schema for the data structure that uses the + links. The URI of the normative link description schema is: http://json-schema.org/links (latest version) or http://json-schema.org/draft-04/links (draft-04 version). - +
The value of the "href" link description property @@ -617,19 +617,19 @@ Content-Type: application/json; of the instance property SHOULD be resolved as a URI-Reference per RFC 3986 and MAY be a relative URI. The base URI to be used for relative resolution SHOULD be the URI used to retrieve the instance object (not the schema) - when used within a schema. Also, when links are used within a schema, the URI - SHOULD be parametrized by the property values of the instance + when used within a schema. Also, when links are used within a schema, the URI + SHOULD be parametrized by the property values of the instance object, if property values exist for the corresponding variables in the template (otherwise they MAY be provided from alternate sources, like user input). - + Instance property values SHOULD be substituted into the URIs where matching braces ('{', '}') are found surrounding zero or more characters, creating an expanded URI. Instance property value substitutions are resolved by using the text between the braces to denote the property name - from the instance to get the value to substitute. - + from the instance to get the value to substitute. +
For example, if an href value is defined: @@ -639,7 +639,7 @@ http://somesite.com/{id} Then it would be resolved by replace the value of the "id" property value from the instance object.
- +
If the value of the "id" property was "45", the expanded URI would be: @@ -648,23 +648,23 @@ http://somesite.com/45 ]]>
- - If matching braces are found with the string "@" (no quotes) between the braces, then the + + If matching braces are found with the string "@" (no quotes) between the braces, then the actual instance value SHOULD be used to replace the braces, rather than a property value. - This should only be used in situations where the instance is a scalar (string, + This should only be used in situations where the instance is a scalar (string, boolean, or number), and not for objects or arrays.
- +
- The value of the "rel" property indicates the name of the + The value of the "rel" property indicates the name of the relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation. - + Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see RFC 4287). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations: - + If the relation value is "self", when this property is encountered in @@ -672,15 +672,15 @@ http://somesite.com/45 treated as a full representation of the target resource identified by the specified URI. - + This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation. - + This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures. - + This relation indicates that the target of the link SHOULD be treated as the root or the body of the representation for the @@ -690,7 +690,7 @@ http://somesite.com/45 - + The following relations are applicable for schemas (the schema as the "from" resource in the relation): @@ -699,7 +699,7 @@ http://somesite.com/45 This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST). - +
For example, if a schema is defined: @@ -720,7 +720,7 @@ http://somesite.com/45 ]]>
- +
And if a collection of instance resource's JSON representation was retrieved: @@ -744,41 +744,41 @@ GET /Resource/ The "children" collection would be located at "/Resource/?upId=thing".
- +
This property value is a string that defines the templating language used in the "href" attribute. If no templating language is defined, then the default Link Description Object templating langauge is used.
- +
This property value is a schema that defines the expected structure of the JSON representation of the target of the link.
- +
- The following properties also apply to link definition objects, and - provide functionality analogous to HTML forms, in providing a + The following properties also apply to link definition objects, and + provide functionality analogous to HTML forms, in providing a means for submitting extra (often user supplied) information to send to a server. - +
- This attribute defines which method can be used to access the target resource. - In an HTTP environment, this would be "GET" or "POST" (other HTTP methods - such as "PUT" and "DELETE" have semantics that are clearly implied by - accessed resources, and do not need to be defined here). + This attribute defines which method can be used to access the target resource. + In an HTTP environment, this would be "GET" or "POST" (other HTTP methods + such as "PUT" and "DELETE" have semantics that are clearly implied by + accessed resources, and do not need to be defined here). This defaults to "GET".
- +
If present, this property indicates a query media type format that the server - supports for querying or posting to the collection of instances at the target - resource. The query can be + supports for querying or posting to the collection of instances at the target + resource. The query can be suffixed to the target URI to query the collection with property-based constraints on the resources that SHOULD be returned from the server or used to post data to the resource (depending on the method). - +
For example, with the following schema: @@ -799,7 +799,7 @@ GET /Resource/ This indicates that the client can query the server for instances that have a specific name.
- +
For example: @@ -809,23 +809,23 @@ GET /Resource/
- If no enctype or method is specified, only the single URI specified by - the href property is defined. If the method is POST, "application/json" is + If no enctype or method is specified, only the single URI specified by + the href property is defined. If the method is POST, "application/json" is the default media type.
- +
This attribute contains a schema which defines the acceptable structure of the submitted - request (for a GET request, this schema would define the properties for the query string + request (for a GET request, this schema would define the properties for the query string and for a POST request, this would define the body).
- +
This property indicates the fragment resolution protocol to use for @@ -835,62 +835,62 @@ GET /Resource/ protocol is "json-pointer", which is defined below. Other fragment resolution protocols MAY be used, but are not defined in this document. - + The fragment identifier is based on RFC 3986, Sec 5, and defines the mechanism for resolving references to entities within a document. - +
The "json-pointer" fragment resolution protocol uses a JSON Pointer to resolve fragment identifiers in URIs within instance representations.
- + - +
This attribute indicates that the instance value SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.
- +
If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. RFC 2045, Sec 6.1 lists the possible values for this property.
- +
- This attribute is a URI that defines what the instance's URI MUST start with in order to validate. - The value of the "pathStart" attribute MUST be resolved as per RFC 3986, Sec 5, + This attribute is a URI that defines what the instance's URI MUST start with in order to validate. + The value of the "pathStart" attribute MUST be resolved as per RFC 3986, Sec 5, and is relative to the instance's URI. - + - When multiple schemas have been referenced for an instance, the user agent - can determine if this schema is applicable for a particular instance by + When multiple schemas have been referenced for an instance, the user agent + can determine if this schema is applicable for a particular instance by determining if the URI of the instance begins with the the value of the "pathStart" - attribute. If the URI of the instance does not start with this URI, - or if another schema specifies a starting URI that is longer and also matches the - instance, this schema SHOULD NOT be applied to the instance. Any schema - that does not have a pathStart attribute SHOULD be considered applicable + attribute. If the URI of the instance does not start with this URI, + or if another schema specifies a starting URI that is longer and also matches the + instance, this schema SHOULD NOT be applied to the instance. Any schema + that does not have a pathStart attribute SHOULD be considered applicable to all the instances for which it is referenced.
- +
This attribute defines the media type of the instance representations that this schema is defining.
- +
- This specification is a sub-type of the JSON format, and - consequently the security considerations are generally the same as RFC 4627. + This specification is a sub-type of the JSON format, and + consequently the security considerations are generally the same as RFC 4627. However, an additional issue is that when link relation of "self" - is used to denote a full representation of an object, the user agent + is used to denote a full representation of an object, the user agent SHOULD NOT consider the representation to be the authoritative representation of the resource denoted by the target URI if the target URI is not - equivalent to or a sub-path of the the URI used to request the resource + equivalent to or a sub-path of the the URI used to request the resource representation which contains the target URI with the "self" link. - +
For example, if a hyper schema was defined: @@ -904,7 +904,7 @@ GET /Resource/ ]]>
- +
And a resource was requested from somesite.com: @@ -941,22 +941,22 @@ Content-Type: application/json; profile=/schema-for-this-data
- +
The proposed MIME media type for JSON Schema is "application/schema+json". Type name: application Subtype name: schema+json Required parameters: profile - The value of the profile parameter SHOULD be a URI (relative or absolute) that - refers to the schema used to define the structure of this structure (the + The value of the profile parameter SHOULD be a URI (relative or absolute) that + refers to the schema used to define the structure of this structure (the meta-schema). Normally the value would be http://json-schema.org/draft-04/hyper-schema, but it is allowable to use other schemas that extend the hyper schema's meta- schema. Optional parameters: pretty The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read. - +
This registry is maintained by IANA per RFC 4287 and this specification adds @@ -968,7 +968,7 @@ Content-Type: application/json; profile=/schema-for-this-data
- + @@ -1019,7 +1019,7 @@ Content-Type: application/json; profile=/schema-for-this-data Improved wording of many sections.
- + Added example and verbiage to "extends" attribute. @@ -1043,7 +1043,7 @@ Content-Type: application/json; profile=/schema-for-this-data Added "$ref" and "$schema" attributes. - + Replaced "maxDecimal" attribute with "divisibleBy" attribute. @@ -1053,13 +1053,13 @@ Content-Type: application/json; profile=/schema-for-this-data Added "targetSchema" attribute to link description object. - + Fixed category and updates from template. - + Initial draft. diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js index 5b1bbbfdd61c8d..2ef3f9fb7d0afe 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js @@ -1,21 +1,35 @@ -/** +/** * JSON Schema link handler * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com) * Licensed under the MIT (MIT-LICENSE.txt) license. */ -({define:typeof define!="undefined"?define:function(deps, factory){module.exports = factory();}}). -define([], function(){ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function () { + return factory(); + }); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.jsonSchemaLinks = factory(); + } +}(this, function () {// setup primitive classes to be JSON Schema types var exports = {}; exports.cacheLinks = true; exports.getLink = function(relation, instance, schema){ // gets the URI of the link for the given relation based on the instance and schema // for example: // getLink( - // "brother", - // {"brother_id":33}, + // "brother", + // {"brother_id":33}, // {links:[{rel:"brother", href:"Brother/{brother_id}"}]}) -> // "Brother/33" - var links = schema.__linkTemplates; + var links = schema.__linkTemplates; if(!links){ links = {}; var schemaLinks = schema.links; @@ -49,4 +63,4 @@ exports.substitute = function(linkTemplate, instance){ }); }; return exports; -}); \ No newline at end of file +})); \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js index 97cbbf6fa34603..4b6108800aafb5 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js @@ -13,10 +13,23 @@ empty list will be returned. A validation error will have two properties: "property" which indicates which property had the error "message" which indicates what the error was */ -({define:typeof define!="undefined"?define:function(deps, factory){module.exports = factory();}}). -define([], function(){ -var exports = validate; -// setup primitive classes to be JSON Schema types +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function () { + return factory(); + }); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals + root.jsonSchema = factory(); + } +}(this, function () {// setup primitive classes to be JSON Schema types +var exports = validate exports.Integer = {type:"integer"}; var primitiveConstructors = { String: String, @@ -194,8 +207,8 @@ var validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*O if(typeof instance != 'object' || instance instanceof Array){ errors.push({property:path,message:"an object is required"}); } - - for(var i in objTypeDef){ + + for(var i in objTypeDef){ if(objTypeDef.hasOwnProperty(i)){ var value = instance[i]; // skip _not_ specified properties @@ -257,4 +270,4 @@ exports.mustBeValid = function(result){ } return exports; -}); +})); diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json index b77d8b34664b20..f2de2d65f7ae1e 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json @@ -2,44 +2,48 @@ "_args": [ [ { - "raw": "json-schema@0.2.2", + "raw": "json-schema@0.2.3", "scope": null, "escapedName": "json-schema", "name": "json-schema", - "rawSpec": "0.2.2", - "spec": "0.2.2", + "rawSpec": "0.2.3", + "spec": "0.2.3", "type": "version" }, "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim" ] ], - "_from": "json-schema@0.2.2", - "_id": "json-schema@0.2.2", + "_from": "json-schema@0.2.3", + "_id": "json-schema@0.2.3", "_inCache": true, - "_installable": true, "_location": "/request/http-signature/jsprim/json-schema", + "_nodeVersion": "6.1.0", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/json-schema-0.2.3.tgz_1473699189380_0.7420965158380568" + }, "_npmUser": { "name": "kriszyp", "email": "kriszyp@gmail.com" }, - "_npmVersion": "1.1.59", + "_npmVersion": "3.8.9", "_phantomChildren": {}, "_requested": { - "raw": "json-schema@0.2.2", + "raw": "json-schema@0.2.3", "scope": null, "escapedName": "json-schema", "name": "json-schema", - "rawSpec": "0.2.2", - "spec": "0.2.2", + "rawSpec": "0.2.3", + "spec": "0.2.3", "type": "version" }, "_requiredBy": [ "/request/http-signature/jsprim" ], - "_resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", - "_shasum": "50354f19f603917c695f70b85afa77c3b0f23506", + "_resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "_shasum": "b480c892e59a2f05954ce727bd3f2a4e882f9e13", "_shrinkwrap": null, - "_spec": "json-schema@0.2.2", + "_spec": "json-schema@0.2.3", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim", "author": { "name": "Kris Zyp" @@ -56,9 +60,10 @@ "lib": "./lib" }, "dist": { - "shasum": "50354f19f603917c695f70b85afa77c3b0f23506", - "tarball": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + "shasum": "b480c892e59a2f05954ce727bd3f2a4e882f9e13", + "tarball": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" }, + "gitHead": "07ae2c618b5f581dbc108e065f4f95dcf0a1d85f", "homepage": "https://github.com/kriszyp/json-schema#readme", "keywords": [ "json", @@ -83,7 +88,7 @@ ], "name": "json-schema", "optionalDependencies": {}, - "readme": "JSON Schema is a repository for the JSON Schema specification, reference schemas and a CommonJS implementation of JSON Schema (not the only JavaScript implementation of JSON Schema, JSV is another excellent JavaScript validator).\r\n\r\nCode is licensed under the AFL or BSD license as part of the Persevere \r\nproject which is administered under the Dojo foundation,\r\nand all contributions require a Dojo CLA.", + "readme": "ERROR: No README data found!", "repository": { "type": "git", "url": "git+ssh://git@github.com/kriszyp/json-schema.git" @@ -91,5 +96,5 @@ "scripts": { "test": "echo TESTS DISABLED vows --spec test/*.js" }, - "version": "0.2.2" + "version": "0.2.3" } diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json index e7c32411843366..974d4af4236c75 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json @@ -14,20 +14,19 @@ ] ], "_from": "jsprim@>=1.2.2 <2.0.0", - "_id": "jsprim@1.3.0", + "_id": "jsprim@1.3.1", "_inCache": true, - "_installable": true, "_location": "/request/http-signature/jsprim", "_nodeVersion": "0.12.7", "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/jsprim-1.3.0.tgz_1466708163640_0.5282344303559512" + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/jsprim-1.3.1.tgz_1473725209917_0.5387293708045036" }, "_npmUser": { "name": "dap", "email": "dap@cs.brown.edu" }, - "_npmVersion": "2.11.3", + "_npmVersion": "2.15.9", "_phantomChildren": {}, "_requested": { "raw": "jsprim@^1.2.2", @@ -41,8 +40,8 @@ "_requiredBy": [ "/request/http-signature" ], - "_resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", - "_shasum": "ce2e1bef835204b4f3099928c602f8b6ae615650", + "_resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", + "_shasum": "2a7256f70412a29ee3670aaca625994c4dcff252", "_shrinkwrap": null, "_spec": "jsprim@^1.2.2", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature", @@ -51,20 +50,20 @@ }, "dependencies": { "extsprintf": "1.0.2", - "json-schema": "0.2.2", + "json-schema": "0.2.3", "verror": "1.3.6" }, "description": "utilities for primitive JavaScript types", "devDependencies": {}, "directories": {}, "dist": { - "shasum": "ce2e1bef835204b4f3099928c602f8b6ae615650", - "tarball": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz" + "shasum": "2a7256f70412a29ee3670aaca625994c4dcff252", + "tarball": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz" }, "engines": [ "node >=0.6.0" ], - "gitHead": "694edcb22e2291c21f6c2a23907bf02e1edbfdf4", + "gitHead": "825aba45c6cff4340c18cdae363ccb5bdf840bd7", "homepage": "https://github.com/davepacheco/node-jsprim#readme", "license": "MIT", "main": "./lib/jsprim.js", @@ -82,5 +81,5 @@ "url": "git://github.com/davepacheco/node-jsprim.git" }, "scripts": {}, - "version": "1.3.0" + "version": "1.3.1" } diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv index a1205a45d5431f..444045a5e8a8a0 100755 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv @@ -149,6 +149,12 @@ if (require.main === module) { } catch (e) { if (e.name === 'KeyEncryptedError') { getPassword(function (err, pw) { + if (err) { + console.log('sshpk-conv: ' + + err.name + ': ' + + err.message); + process.exit(1); + } parseOpts.passphrase = pw; processKey(); }); diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js index 5318b35165336d..c254e4e804c6f6 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js @@ -107,9 +107,9 @@ function read(buf, options, forceType) { /* The new OpenSSH internal format abuses PEM headers */ if (alg && alg.toLowerCase() === 'openssh') - return (sshpriv.readSSHPrivate(type, buf)); + return (sshpriv.readSSHPrivate(type, buf, options)); if (alg && alg.toLowerCase() === 'ssh2') - return (rfc4253.readType(type, buf)); + return (rfc4253.readType(type, buf, options)); var der = new asn1.BerReader(buf); der.originalInput = input; diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js index bfbdab527f9b82..2fcf71990c4725 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js @@ -17,6 +17,9 @@ var PrivateKey = require('../private-key'); var pem = require('./pem'); var rfc4253 = require('./rfc4253'); var SSHBuffer = require('../ssh-buffer'); +var errors = require('../errors'); + +var bcrypt; function read(buf, options) { return (pem.read(buf, options)); @@ -24,7 +27,7 @@ function read(buf, options) { var MAGIC = 'openssh-key-v1'; -function readSSHPrivate(type, buf) { +function readSSHPrivate(type, buf, options) { buf = new SSHBuffer({buffer: buf}); var magic = buf.readCString(); @@ -32,16 +35,7 @@ function readSSHPrivate(type, buf) { var cipher = buf.readString(); var kdf = buf.readString(); - - /* We only support unencrypted keys. */ - if (cipher !== 'none' || kdf !== 'none') { - throw (new Error('OpenSSH-format key is encrypted ' + - '(password-protected). Please use the SSH agent ' + - 'or decrypt the key.')); - } - - /* Skip over kdfoptions. */ - buf.readString(); + var kdfOpts = buf.readBuffer(); var nkeys = buf.readInt(); if (nkeys !== 1) { @@ -59,11 +53,74 @@ function readSSHPrivate(type, buf) { var privKeyBlob = buf.readBuffer(); assert.ok(buf.atEnd(), 'excess bytes left after key'); + var kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts }); + switch (kdf) { + case 'none': + if (cipher !== 'none') { + throw (new Error('OpenSSH-format key uses KDF "none" ' + + 'but specifies a cipher other than "none"')); + } + break; + case 'bcrypt': + var salt = kdfOptsBuf.readBuffer(); + var rounds = kdfOptsBuf.readInt(); + var cinf = utils.opensshCipherInfo(cipher); + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + + if (typeof (options.passphrase) === 'string') { + options.passphrase = new Buffer(options.passphrase, + 'utf-8'); + } + if (!Buffer.isBuffer(options.passphrase)) { + throw (new errors.KeyEncryptedError( + options.filename, 'OpenSSH')); + } + + var pass = new Uint8Array(options.passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = new Buffer(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + var cipherStream = crypto.createDecipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + if (e.toString().indexOf('bad decrypt') !== -1) { + throw (new Error('Incorrect passphrase ' + + 'supplied, could not decrypt key')); + } + throw (e); + }); + cipherStream.write(privKeyBlob); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privKeyBlob = Buffer.concat(chunks); + break; + default: + throw (new Error( + 'OpenSSH-format key uses unknown KDF "' + kdf + '"')); + } + buf = new SSHBuffer({buffer: privKeyBlob}); var checkInt1 = buf.readInt(); var checkInt2 = buf.readInt(); - assert.strictEqual(checkInt1, checkInt2, 'checkints do not match'); + if (checkInt1 !== checkInt2) { + throw (new Error('Incorrect passphrase supplied, could not ' + + 'decrypt key')); + } var ret = {}; var key = rfc4253.readInternal(ret, 'private', buf.remainder()); @@ -83,6 +140,26 @@ function write(key, options) { else pubKey = key; + var cipher = 'none'; + var kdf = 'none'; + var kdfopts = new Buffer(0); + var cinf = { blockSize: 8 }; + var passphrase; + if (options !== undefined) { + passphrase = options.passphrase; + if (typeof (passphrase) === 'string') + passphrase = new Buffer(passphrase, 'utf-8'); + if (passphrase !== undefined) { + assert.buffer(passphrase, 'options.passphrase'); + assert.optionalString(options.cipher, 'options.cipher'); + cipher = options.cipher; + if (cipher === undefined) + cipher = 'aes128-ctr'; + cinf = utils.opensshCipherInfo(cipher); + kdf = 'bcrypt'; + } + } + var privBuf; if (PrivateKey.isPrivateKey(key)) { privBuf = new SSHBuffer({}); @@ -93,22 +170,68 @@ function write(key, options) { privBuf.writeString(key.comment || ''); var n = 1; - while (privBuf._offset % 8 !== 0) + while (privBuf._offset % cinf.blockSize !== 0) privBuf.writeChar(n++); + privBuf = privBuf.toBuffer(); + } + + switch (kdf) { + case 'none': + break; + case 'bcrypt': + var salt = crypto.randomBytes(16); + var rounds = 16; + var kdfssh = new SSHBuffer({}); + kdfssh.writeBuffer(salt); + kdfssh.writeInt(rounds); + kdfopts = kdfssh.toBuffer(); + + if (bcrypt === undefined) { + bcrypt = require('bcrypt-pbkdf'); + } + var pass = new Uint8Array(passphrase); + var salti = new Uint8Array(salt); + /* Use the pbkdf to derive both the key and the IV. */ + var out = new Uint8Array(cinf.keySize + cinf.blockSize); + var res = bcrypt.pbkdf(pass, pass.length, salti, salti.length, + out, out.length, rounds); + if (res !== 0) { + throw (new Error('bcrypt_pbkdf function returned ' + + 'failure, parameters invalid')); + } + out = new Buffer(out); + var ckey = out.slice(0, cinf.keySize); + var iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize); + + var cipherStream = crypto.createCipheriv(cinf.opensslName, + ckey, iv); + cipherStream.setAutoPadding(false); + var chunk, chunks = []; + cipherStream.once('error', function (e) { + throw (e); + }); + cipherStream.write(privBuf); + cipherStream.end(); + while ((chunk = cipherStream.read()) !== null) + chunks.push(chunk); + privBuf = Buffer.concat(chunks); + break; + default: + throw (new Error('Unsupported kdf ' + kdf)); } var buf = new SSHBuffer({}); buf.writeCString(MAGIC); - buf.writeString('none'); /* cipher */ - buf.writeString('none'); /* kdf */ - buf.writeBuffer(new Buffer(0)); /* kdfoptions */ + buf.writeString(cipher); /* cipher */ + buf.writeString(kdf); /* kdf */ + buf.writeBuffer(kdfopts); /* kdfoptions */ buf.writeInt(1); /* nkeys */ buf.writeBuffer(pubKey.toBuffer('rfc4253')); if (privBuf) - buf.writeBuffer(privBuf.toBuffer()); + buf.writeBuffer(privBuf); buf = buf.toBuffer(); diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js index d57245cc16b41d..466634c00ecbd7 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js @@ -9,7 +9,8 @@ module.exports = { countZeros: countZeros, assertCompatible: assertCompatible, isCompatible: isCompatible, - opensslKeyDeriv: opensslKeyDeriv + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo }; var assert = require('assert-plus'); @@ -244,3 +245,44 @@ function addRSAMissing(key) { key.parts.push(key.part.dmodq); } } + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/README.md b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/README.md new file mode 100644 index 00000000000000..12018090bb18f4 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/README.md @@ -0,0 +1,39 @@ +Port of the OpenBSD `bcrypt_pbkdf` function to pure Javascript. `npm`-ified +version of [Devi Mandiri's port] +(https://github.com/devi/tmp/blob/master/js/bcrypt_pbkdf.js), +with some minor performance improvements. The code is copied verbatim (and +un-styled) from Devi's work. + +This product includes software developed by Niels Provos. + +## API + +### `bcrypt_pbkdf.pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds)` + +Derive a cryptographic key of arbitrary length from a given password and salt, +using the OpenBSD `bcrypt_pbkdf` function. This is a combination of Blowfish and +SHA-512. + +See [this article](http://www.tedunangst.com/flak/post/bcrypt-pbkdf) for +further information. + +Parameters: + + * `pass`, a Uint8Array of length `passlen` + * `passlen`, an integer Number + * `salt`, a Uint8Array of length `saltlen` + * `saltlen`, an integer Number + * `key`, a Uint8Array of length `keylen`, will be filled with output + * `keylen`, an integer Number + * `rounds`, an integer Number, number of rounds of the PBKDF to run + +### `bcrypt_pbkdf.hash(sha2pass, sha2salt, out)` + +Calculate a Blowfish hash, given SHA2-512 output of a password and salt. Used as +part of the inner round function in the PBKDF. + +Parameters: + + * `sha2pass`, a Uint8Array of length 64 + * `sha2salt`, a Uint8Array of length 64 + * `out`, a Uint8Array of length 32, will be filled with output diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/index.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/index.js new file mode 100644 index 00000000000000..ea29aa967cbc8e --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/index.js @@ -0,0 +1,559 @@ +'use strict'; + +var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash; + +/* + * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a + * result, it retains the original copyright and license. The two files are + * under slightly different (but compatible) licenses, and are here combined in + * one file. + * + * Credit for the actual porting work goes to: + * Devi Mandiri + */ + +/* + * The Blowfish portions are under the following license: + * + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Niels Provos. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The bcrypt_pbkdf portions are under the following license: + * + * Copyright (c) 2013 Ted Unangst + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Performance improvements (Javascript-specific): + * + * Copyright 2016, Joyent Inc + * Author: Alex Wilson + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// Ported from OpenBSD bcrypt_pbkdf.c v1.9 + +var BLF_J = 0; + +var Blowfish = function() { + this.S = [ + new Uint32Array([ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]), + new Uint32Array([ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]), + new Uint32Array([ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]), + new Uint32Array([ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]) + ]; + this.P = new Uint32Array([ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b]); +}; + +function F(S, x8, i) { + return (((S[0][x8[i+3]] + + S[1][x8[i+2]]) ^ + S[2][x8[i+1]]) + + S[3][x8[i]]); +}; + +Blowfish.prototype.encipher = function(x, x8) { + if (x8 === undefined) { + x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + } + x[0] ^= this.P[0]; + for (var i = 1; i < 16; i += 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i+1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[17]; + x[1] = t; +}; + +Blowfish.prototype.decipher = function(x) { + var x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + x[0] ^= this.P[17]; + for (var i = 16; i > 0; i -= 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i-1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[0]; + x[1] = t; +}; + +function stream2word(data, databytes){ + var i, temp = 0; + for (i = 0; i < 4; i++, BLF_J++) { + if (BLF_J >= databytes) BLF_J = 0; + temp = (temp << 8) | data[BLF_J]; + } + return temp; +}; + +Blowfish.prototype.expand0state = function(key, keybytes) { + var d = new Uint32Array(2), i, k; + var d8 = new Uint8Array(d.buffer); + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + BLF_J = 0; + + for (i = 0; i < 18; i += 2) { + this.encipher(d, d8); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + this.encipher(d, d8); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } +}; + +Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { + var d = new Uint32Array(2), i, k; + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + + for (i = 0, BLF_J = 0; i < 18; i += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } + BLF_J = 0; +}; + +Blowfish.prototype.enc = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.encipher(data.subarray(i*2)); + } +}; + +Blowfish.prototype.dec = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.decipher(data.subarray(i*2)); + } +}; + +var BCRYPT_BLOCKS = 8, + BCRYPT_HASHSIZE = 32; + +function bcrypt_hash(sha2pass, sha2salt, out) { + var state = new Blowfish(), + cdata = new Uint32Array(BCRYPT_BLOCKS), i, + ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105, + 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109, + 105,116,101]); //"OxychromaticBlowfishSwatDynamite" + + state.expandstate(sha2salt, 64, sha2pass, 64); + for (i = 0; i < 64; i++) { + state.expand0state(sha2salt, 64); + state.expand0state(sha2pass, 64); + } + + for (i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = stream2word(ciphertext, ciphertext.byteLength); + for (i = 0; i < 64; i++) + state.enc(cdata, cdata.byteLength / 8); + + for (i = 0; i < BCRYPT_BLOCKS; i++) { + out[4*i+3] = cdata[i] >>> 24; + out[4*i+2] = cdata[i] >>> 16; + out[4*i+1] = cdata[i] >>> 8; + out[4*i+0] = cdata[i]; + } +}; + +function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { + var sha2pass = new Uint8Array(64), + sha2salt = new Uint8Array(64), + out = new Uint8Array(BCRYPT_HASHSIZE), + tmpout = new Uint8Array(BCRYPT_HASHSIZE), + countsalt = new Uint8Array(saltlen+4), + i, j, amt, stride, dest, count, + origkeylen = keylen; + + if (rounds < 1) + return -1; + if (passlen === 0 || saltlen === 0 || keylen === 0 || + keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20)) + return -1; + + stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); + amt = Math.floor((keylen + stride - 1) / stride); + + for (i = 0; i < saltlen; i++) + countsalt[i] = salt[i]; + + crypto_hash_sha512(sha2pass, pass, passlen); + + for (count = 1; keylen > 0; count++) { + countsalt[saltlen+0] = count >>> 24; + countsalt[saltlen+1] = count >>> 16; + countsalt[saltlen+2] = count >>> 8; + countsalt[saltlen+3] = count; + + crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (i = out.byteLength; i--;) + out[i] = tmpout[i]; + + for (i = 1; i < rounds; i++) { + crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (j = 0; j < out.byteLength; j++) + out[j] ^= tmpout[j]; + } + + amt = Math.min(amt, keylen); + for (i = 0; i < amt; i++) { + dest = i * stride + (count - 1); + if (dest >= origkeylen) + break; + key[dest] = out[i]; + } + keylen -= i; + } + + return 0; +}; + +module.exports = { + BLOCKS: BCRYPT_BLOCKS, + HASHSIZE: BCRYPT_HASHSIZE, + hash: bcrypt_hash, + pbkdf: bcrypt_pbkdf +}; diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/package.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/package.json new file mode 100644 index 00000000000000..fc8efaac7c49c3 --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/bcrypt-pbkdf/package.json @@ -0,0 +1,72 @@ +{ + "_args": [ + [ + { + "raw": "bcrypt-pbkdf@^1.0.0", + "scope": null, + "escapedName": "bcrypt-pbkdf", + "name": "bcrypt-pbkdf", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk" + ] + ], + "_from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", + "_id": "bcrypt-pbkdf@1.0.0", + "_inCache": true, + "_location": "/request/http-signature/sshpk/bcrypt-pbkdf", + "_nodeVersion": "0.12.15", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/bcrypt-pbkdf-1.0.0.tgz_1471381825814_0.06877309852279723" + }, + "_npmUser": { + "name": "arekinath", + "email": "alex@cooperi.net" + }, + "_npmVersion": "3.10.3", + "_phantomChildren": {}, + "_requested": { + "raw": "bcrypt-pbkdf@^1.0.0", + "scope": null, + "escapedName": "bcrypt-pbkdf", + "name": "bcrypt-pbkdf", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/request/http-signature/sshpk" + ], + "_resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", + "_shasum": "3ca76b85241c7170bf7d9703e7b9aa74630040d4", + "_shrinkwrap": null, + "_spec": "bcrypt-pbkdf@^1.0.0", + "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk", + "dependencies": { + "tweetnacl": "^0.14.3" + }, + "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "3ca76b85241c7170bf7d9703e7b9aa74630040d4", + "tarball": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz" + }, + "gitHead": "e88be37d3cd25395b4aa496ac468b33671368be6", + "license": "BSD-4-Clause", + "main": "index.js", + "maintainers": [ + { + "name": "arekinath", + "email": "alex@cooperi.net" + } + ], + "name": "bcrypt-pbkdf", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "scripts": {}, + "version": "1.0.0" +} diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md index 77c69bd5ee45be..9debcb42f2e992 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md @@ -2,6 +2,59 @@ TweetNaCl.js Changelog ====================== +v0.14.1 +------- + +No code changes, just tweaked packaging and added COPYING.txt. + + +v0.14.0 +------- + +* **Breaking change!** All functions from `nacl.util` have been removed. These + functions are no longer available: + + nacl.util.decodeUTF8 + nacl.util.encodeUTF8 + nacl.util.decodeBase64 + nacl.util.encodeBase64 + + If want to continue using them, you can include + package: + + + + + or + + var nacl = require('tweetnacl'); + nacl.util = require('tweetnacl-util'); + + However it is recommended to use better packages that have wider + compatibility and better performance. Functions from `nacl.util` were never + intended to be robust solution for string conversion and were included for + convenience: cryptography library is not the right place for them. + + Currently calling these functions will throw error pointing to + `tweetnacl-util-js` (in the next version this error message will be removed). + +* Improved detection of available random number generators, making it possible + to use `nacl.randomBytes` and related functions in Web Workers without + changes. + +* Changes to testing (see README). + + +v0.13.3 +------- + +No code changes. + +* Reverted license field in package.json to "Public domain". + +* Fixed typo in README. + + v0.13.2 ------- diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/COPYING.txt b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/COPYING.txt new file mode 100644 index 00000000000000..c2bd1e5b7e81ab --- /dev/null +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/COPYING.txt @@ -0,0 +1,9 @@ +Public Domain + +The person who associated a work with this deed has dedicated the work to the +public domain by waiving all of his or her rights to the work worldwide under +copyright law, including all related and neighboring rights, to the extent +allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial +purposes, all without asking permission. diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md index 11bd3472c258d1..c80bbed8d8da15 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md @@ -7,7 +7,7 @@ to JavaScript for modern browsers and Node.js. Public domain. [![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master) ](https://travis-ci.org/dchest/tweetnacl-js) -[Demo](https://dchest.github.io/tweetnacl-js/) +Demo: **:warning: Beta version. The library is stable and API is frozen, however it has not been independently reviewed. If you can help reviewing it, please @@ -26,8 +26,6 @@ Documentation * [Hashing](#hashing) * [Random bytes generation](#random-bytes-generation) * [Constant-time comparison](#constant-time-comparison) - * [Utilities](#utilities) -* [Examples](#examples) * [System requirements](#system-requirements) * [Development and testing](#development-and-testing) * [Contributors](#contributors) @@ -67,10 +65,20 @@ or [download source code](https://github.com/dchest/tweetnacl-js/releases). Usage ------- +----- All API functions accept and return bytes as `Uint8Array`s. If you need to -encode or decode strings, use functions from `nacl.util` namespace. +encode or decode strings, use functions from + or one of the more robust codec +packages. + +In Node.js v4 and later `Buffer` objects are backed by `Uint8Array`s, so you +can freely pass them to TweetNaCl.js functions as arguments. The returned +objects are still `Uint8Array`s, so if you need `Buffer`s, you'll have to +convert them manually; make sure to convert using copying: `new Buffer(array)`, +instead of sharing: `new Buffer(array.buffer)`, because some functions return +subarrays of their buffers. + ### Public-key authenticated encryption (box) @@ -287,12 +295,6 @@ depending on the platform it runs on: * `window.msCrypto.getRandomValues` (Internet Explorer 11) * `crypto.randomBytes` (Node.js) -Note that browsers are required to throw `QuotaExceededError` exception if -requested `length` is more than 65536, so do not ask for more than 65536 bytes -in *one call* (multiple calls to get as many bytes as you like are okay: -browsers can generate infinite amount of random bytes without any bad -consequences). - If the platform doesn't provide a suitable PRNG, the following functions, which require random numbers, will throw exception: @@ -326,30 +328,6 @@ Returns `false` if either of the arguments has zero length, or arguments have different lengths, or their contents differ. -### Utilities - -Encoding/decoding functions are provided for convenience. They are correct, -however their performance and wide compatibility with uncommon runtimes is not -something that is considered important compared to the simplicity and size of -implementation. You can use third-party libraries if you need to. - -#### nacl.util.decodeUTF8(string) - -Decodes string and returns `Uint8Array` of bytes. - -#### nacl.util.encodeUTF8(array) - -Encodes `Uint8Array` or `Array` of bytes into string. - -#### nacl.util.decodeBase64(string) - -Decodes Base-64 encoded string and returns `Uint8Array` of bytes. - -#### nacl.util.encodeBase64(array) - -Encodes `Uint8Array` or `Array` of bytes into string using Base-64 encoding. - - System requirements ------------------- @@ -364,7 +342,7 @@ of: Other systems: -* Node.js (we test on 0.10 and later) +* Node.js Development and testing @@ -385,32 +363,36 @@ Tests use minified version, so make sure to rebuild it every time you change To run tests in Node.js: - $ npm test + $ npm run test-node By default all tests described here work on `nacl.min.js`. To test other versions, set environment variable `NACL_SRC` to the file name you want to test. For example, the following command will test fast minified version: - $ NACL_SRC=nacl-fast.min.js npm test + $ NACL_SRC=nacl-fast.min.js npm run test-node To run full suite of tests in Node.js, including comparing outputs of JavaScript port to outputs of the original C version: - $ npm run testall + $ npm run test-node-all To prepare tests for browsers: - $ npm run browser + $ npm run build-test-browser and then open `test/browser/test.html` (or `test/browser/test-fast.html`) to run them. -To run headless browser tests with `testling`: +To run headless browser tests with `tape-run` (powered by Electron): - $ npm run testling + $ npm run test-browser (If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.) +To run tests in both Node and Electron: + + $ npm test + ### Benchmarking To run benchmarks in Node.js: diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js index 6c4995848cc42c..5e4562fe89a1ab 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js @@ -745,7 +745,7 @@ poly1305.prototype.finish = function(mac, macpos) { } g[9] -= (1 << 13); - mask = (g[9] >>> ((2 * 8) - 1)) - 1; + mask = (c ^ 1) - 1; for (i = 0; i < 10; i++) g[i] &= mask; mask = ~mask; for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; @@ -2157,39 +2157,13 @@ function cleanup(arr) { for (var i = 0; i < arr.length; i++) arr[i] = 0; } -nacl.util = {}; - -nacl.util.decodeUTF8 = function(s) { - var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; -}; - -nacl.util.encodeUTF8 = function(arr) { - var i, s = []; - for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i])); - return decodeURIComponent(escape(s.join(''))); -}; - -nacl.util.encodeBase64 = function(arr) { - if (typeof btoa === 'undefined') { - return (new Buffer(arr)).toString('base64'); - } else { - var i, s = [], len = arr.length; - for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i])); - return btoa(s.join('')); - } -}; - -nacl.util.decodeBase64 = function(s) { - if (typeof atob === 'undefined') { - return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0)); - } else { - var i, d = atob(s), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; - } -}; +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} nacl.randomBytes = function(n) { var b = new Uint8Array(n); @@ -2386,26 +2360,22 @@ nacl.setPRNG = function(fn) { (function() { // Initialize PRNG if environment provides CSPRNG. // If not, methods calling randombytes will throw. - var crypto; - if (typeof window !== 'undefined') { - // Browser. - if (window.crypto && window.crypto.getRandomValues) { - crypto = window.crypto; // Standard - } else if (window.msCrypto && window.msCrypto.getRandomValues) { - crypto = window.msCrypto; // Internet Explorer 11+ - } - if (crypto) { - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - crypto.getRandomValues(v); - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); } else if (typeof require !== 'undefined') { // Node.js. crypto = require('crypto'); - if (crypto) { + if (crypto && crypto.randomBytes) { nacl.setPRNG(function(x, n) { var i, v = crypto.randomBytes(n); for (i = 0; i < n; i++) x[i] = v[i]; @@ -2415,4 +2385,4 @@ nacl.setPRNG = function(fn) { } })(); -})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {})); +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js index 7072c2af4435bd..624fbbe91e71fc 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js @@ -1,2 +1,2 @@ -!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;o>i;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;_=_+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+u|0,B=B+c|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+g|0,L=L+v|0,C=C+b|0,R=R+d|0,z=z+A|0,r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=C>>>0&255,r[53]=C>>>8&255,r[54]=C>>>16&255,r[55]=C>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=z>>>0&255,r[61]=z>>>8&255,r[62]=z>>>16&255,r[63]=z>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=z>>>0&255,r[13]=z>>>8&255,r[14]=z>>>16&255,r[15]=z>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,u=new Uint8Array(16),c=new Uint8Array(64);for(s=0;16>s;s++)u[s]=0;for(s=0;8>s;s++)u[s]=i[s];for(;o>=64;){for(a(c,u,h,cr),s=0;64>s;s++)r[t+s]=n[e+s]^c[s];for(f=1,s=8;16>s;s++)f=f+(255&u[s])|0,u[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(c,u,h,cr),s=0;o>s;s++)r[t+s]=n[e+s]^c[s];return 0}function u(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;16>h;h++)f[h]=0;for(h=0;8>h;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,cr),h=0;64>h;h++)r[t+h]=s[h];for(i=1,h=8;16>h;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,cr),h=0;n>h;h++)r[t+h]=s[h];return 0}function c(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,cr);for(var h=new Uint8Array(8),a=0;8>a;a++)h[a]=e[a+16];return u(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,cr);for(var u=new Uint8Array(8),c=0;8>c;c++)u[c]=i[c+16];return s(r,t,n,e,o,u,a)}function l(r,t,n,e,o,i){var h=new yr(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(32>n)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;16>i;i++)r[i]=0;return 0}function g(r,t,n,e,o){var i,h=new Uint8Array(32);if(32>n)return-1;if(c(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;32>i;i++)r[i]=0;return 0}function v(r,t){var n;for(n=0;16>n;n++)r[n]=0|t[n]}function b(r){var t,n,e=1;for(t=0;16>t;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function d(r,t,n){for(var e,o=~(n-1),i=0;16>i;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=$(),h=$();for(n=0;16>n;n++)h[n]=t[n];for(b(h),b(h),b(h),e=0;2>e;e++){for(i[0]=h[0]-65517,n=1;15>n;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(h,i,1-o)}for(n=0;16>n;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function _(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;16>n;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,u=0,c=0,y=0,l=0,w=0,p=0,g=0,v=0,b=0,d=0,A=0,_=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,C=0,R=0,z=n[0],P=n[1],O=n[2],N=n[3],F=n[4],I=n[5],j=n[6],G=n[7],Z=n[8],V=n[9],q=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*z,h+=e*P,a+=e*O,f+=e*N,s+=e*F,u+=e*I,c+=e*j,y+=e*G,l+=e*Z,w+=e*V,p+=e*q,g+=e*X,v+=e*D,b+=e*H,d+=e*J,A+=e*Q,e=t[1],h+=e*z,a+=e*P,f+=e*O,s+=e*N,u+=e*F,c+=e*I,y+=e*j,l+=e*G,w+=e*Z,p+=e*V,g+=e*q,v+=e*X,b+=e*D,d+=e*H,A+=e*J,_+=e*Q,e=t[2],a+=e*z,f+=e*P,s+=e*O,u+=e*N,c+=e*F,y+=e*I,l+=e*j,w+=e*G,p+=e*Z,g+=e*V,v+=e*q,b+=e*X,d+=e*D,A+=e*H,_+=e*J,U+=e*Q,e=t[3],f+=e*z,s+=e*P,u+=e*O,c+=e*N,y+=e*F,l+=e*I,w+=e*j,p+=e*G,g+=e*Z,v+=e*V,b+=e*q,d+=e*X,A+=e*D,_+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*z,u+=e*P,c+=e*O,y+=e*N,l+=e*F,w+=e*I,p+=e*j,g+=e*G,v+=e*Z,b+=e*V,d+=e*q,A+=e*X,_+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],u+=e*z,c+=e*P,y+=e*O,l+=e*N,w+=e*F,p+=e*I,g+=e*j,v+=e*G,b+=e*Z,d+=e*V,A+=e*q,_+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],c+=e*z,y+=e*P,l+=e*O,w+=e*N,p+=e*F,g+=e*I,v+=e*j,b+=e*G,d+=e*Z,A+=e*V,_+=e*q,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*z,l+=e*P,w+=e*O,p+=e*N,g+=e*F,v+=e*I,b+=e*j,d+=e*G,A+=e*Z,_+=e*V,U+=e*q,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*z,w+=e*P,p+=e*O,g+=e*N,v+=e*F,b+=e*I,d+=e*j,A+=e*G,_+=e*Z,U+=e*V,E+=e*q,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*z,p+=e*P,g+=e*O,v+=e*N,b+=e*F,d+=e*I,A+=e*j,_+=e*G,U+=e*Z,E+=e*V,x+=e*q,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*z,g+=e*P,v+=e*O,b+=e*N,d+=e*F,A+=e*I,_+=e*j,U+=e*G,E+=e*Z,x+=e*V,M+=e*q,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],g+=e*z,v+=e*P,b+=e*O,d+=e*N,A+=e*F,_+=e*I,U+=e*j,E+=e*G,x+=e*Z,M+=e*V,m+=e*q,B+=e*X,S+=e*D,K+=e*H,T+=e*J,Y+=e*Q,e=t[12],v+=e*z,b+=e*P,d+=e*O,A+=e*N,_+=e*F,U+=e*I,E+=e*j,x+=e*G,M+=e*Z,m+=e*V,B+=e*q,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],b+=e*z,d+=e*P,A+=e*O,_+=e*N,U+=e*F,E+=e*I,x+=e*j,M+=e*G,m+=e*Z,B+=e*V,S+=e*q,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],d+=e*z,A+=e*P,_+=e*O,U+=e*N,E+=e*F,x+=e*I,M+=e*j,m+=e*G,B+=e*Z,S+=e*V,K+=e*q,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,C+=e*Q,e=t[15],A+=e*z,_+=e*P,U+=e*O,E+=e*N,x+=e*F,M+=e*I,m+=e*j,B+=e*G,S+=e*Z,K+=e*V,T+=e*q,Y+=e*X,k+=e*D,L+=e*H,C+=e*J,R+=e*Q,i+=38*_,h+=38*U,a+=38*E,f+=38*x,s+=38*M,u+=38*m,c+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,g+=38*k,v+=38*L,b+=38*C,d+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=u,r[6]=c,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=g,r[12]=v,r[13]=b,r[14]=d,r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),u=$(),c=$(),y=$();for(o=0;31>o;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;16>o;o++)f[o]=h[o],u[o]=a[o]=s[o]=0;for(a[0]=u[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,d(a,f,e),d(s,u,e),x(c,a,s),M(a,a,s),x(s,f,u),M(f,f,u),B(u,c),B(y,a),m(a,s,a),m(s,f,c),x(c,a,s),M(a,a,s),B(f,a),M(s,u,y),m(a,s,ir),x(a,a,u),m(s,s,a),m(a,u,y),m(u,f,h),B(f,c),d(a,f,e),d(s,u,e);for(o=0;16>o;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=u[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,cr)}function C(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function z(r,t,n,e){for(var o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],C=r[2],R=r[3],z=r[4],P=r[5],O=r[6],N=r[7],F=t[0],I=t[1],j=t[2],G=t[3],Z=t[4],V=t[5],q=t[6],X=t[7],D=0;e>=128;){for(U=0;16>U;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;80>U;U++)if(o=k,i=L,h=C,a=R,f=z,s=P,u=O,c=N,y=F,l=I,w=j,p=G,g=Z,v=V,b=q,d=X,x=N,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(z>>>14|Z<<18)^(z>>>18|Z<<14)^(Z>>>9|z<<23),M=(Z>>>14|z<<18)^(Z>>>18|z<<14)^(z>>>9|Z<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=z&P^~z&O,M=Z&V^~Z&q,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,_=65535&m|B<<16,x=A,M=_,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&C^L&C,M=F&I^F&j^I&j,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,c=65535&S|K<<16,d=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=_,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,C=i,R=h,z=a,P=f,O=s,N=u,k=c,I=y,j=l,G=w,Z=p,V=g,q=v,X=b,F=d,U%16===15)for(E=0;16>E;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],_=Y[(E+1)%16],x=(A>>>1|_<<31)^(A>>>8|_<<24)^A>>>7,M=(_>>>1|A<<31)^(_>>>8|A<<24)^(_>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],_=Y[(E+14)%16],x=(A>>>19|_<<13)^(_>>>29|A<<3)^A>>>6,M=(_>>>19|A<<13)^(A>>>29|_<<3)^(_>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=C,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=C=65535&S|K<<16,t[2]=j=65535&m|B<<16,x=R,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=G=65535&m|B<<16,x=z,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=z=65535&S|K<<16,t[4]=Z=65535&m|B<<16,x=P,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=P=65535&S|K<<16,t[5]=V=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=O=65535&S|K<<16,t[6]=q=65535&m|B<<16,x=N,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=N=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function P(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,z(i,h,n,e),e%=128,o=0;e>o;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),z(i,h,a,e),o=0;8>o;o++)t(r,8*o,i[o],h[o]);return 0}function O(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$(),s=$(),u=$();M(n,r[1],r[0]),M(u,t[1],t[0]),m(n,n,u),x(e,r[0],r[1]),x(u,t[0],t[1]),m(e,e,u),m(o,r[3],t[3]),m(o,o,ar),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function N(r,t,n){var e;for(e=0;4>e;e++)d(r[e],t[e],n)}function F(r,t){var n=$(),e=$(),o=$();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(v(r[0],er),v(r[1],or),v(r[2],or),v(r[3],er),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,N(r,t,e),O(t,r),O(r,r),N(r,t,e)}function j(r,t){var n=[$(),$(),$(),$()];v(n[0],fr),v(n[1],sr),v(n[2],or),m(n[3],fr,sr),I(r,n,t)}function G(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),P(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,j(i,o),F(r,i),e=0;32>e;e++)t[e+32]=r[e];return 0}function Z(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;i>o;++o)t[o]+=n-16*t[e]*gr[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;32>o;o++)t[o]+=n-(t[31]>>4)*gr[o],n=t[o]>>8,t[o]&=255;for(o=0;32>o;o++)t[o]-=n*gr[o];for(e=0;32>e;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function V(r){var t,n=new Float64Array(64);for(t=0;64>t;t++)n[t]=r[t];for(t=0;64>t;t++)r[t]=0;Z(r,n)}function q(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),u=[$(),$(),$(),$()];P(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var c=n+64;for(o=0;n>o;o++)r[64+o]=t[o];for(o=0;32>o;o++)r[32+o]=h[32+o];for(P(f,r.subarray(32),n+32),V(f),j(u,f),F(r,u),o=32;64>o;o++)r[o]=e[o];for(P(a,r,n+64),V(a),o=0;64>o;o++)s[o]=0;for(o=0;32>o;o++)s[o]=f[o];for(o=0;32>o;o++)for(i=0;32>i;i++)s[o+i]+=a[o]*h[i];return Z(r.subarray(32),s),c}function X(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$();return v(r[2],or),E(r[1],t),B(o,r[1]),m(i,o,hr),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),_(e,o)&&m(r[0],r[0],ur),B(e,r[0]),m(e,e,i),_(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],u=[$(),$(),$(),$()];if(h=-1,64>n)return-1;if(X(u,e))return-1;for(i=0;n>i;i++)r[i]=t[i];for(i=0;32>i;i++)r[i+32]=e[i];if(P(f,r,n),V(f),I(s,u,f),j(u,t.subarray(32)),O(s,u),F(a,s),n-=64,o(t,0,a,0)){for(i=0;n>i;i++)r[i]=0;return-1}for(i=0;n>i;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==vr)throw new Error("bad key size");if(t.length!==br)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Er)throw new Error("bad public key size");if(t.length!==xr)throw new Error("bad secret key size")}function Q(){var r,t;for(t=0;t>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],C=this.r[1],R=this.r[2],z=this.r[3],P=this.r[4],O=this.r[5],N=this.r[6],F=this.r[7],I=this.r[8],j=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),u=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|u<<8),k+=u>>>5|U,c=0,y=c,y+=E*L,y+=5*x*j,y+=5*M*I,y+=5*m*F,y+=5*B*N,c=y>>>13,y&=8191,y+=5*S*O,y+=5*K*P,y+=5*T*z,y+=5*Y*R,y+=5*k*C,c+=y>>>13,y&=8191,l=c,l+=E*C,l+=x*L,l+=5*M*j,l+=5*m*I,l+=5*B*F,c=l>>>13,l&=8191,l+=5*S*N,l+=5*K*O,l+=5*T*P,l+=5*Y*z,l+=5*k*R,c+=l>>>13,l&=8191,w=c,w+=E*R,w+=x*C,w+=M*L,w+=5*m*j,w+=5*B*I,c=w>>>13,w&=8191,w+=5*S*F,w+=5*K*N,w+=5*T*O,w+=5*Y*P,w+=5*k*z,c+=w>>>13,w&=8191,p=c,p+=E*z,p+=x*R,p+=M*C,p+=m*L,p+=5*B*j,c=p>>>13,p&=8191,p+=5*S*I,p+=5*K*F,p+=5*T*N,p+=5*Y*O,p+=5*k*P,c+=p>>>13,p&=8191,g=c,g+=E*P,g+=x*z,g+=M*R,g+=m*C,g+=B*L,c=g>>>13,g&=8191,g+=5*S*j,g+=5*K*I,g+=5*T*F,g+=5*Y*N,g+=5*k*O,c+=g>>>13,g&=8191,v=c,v+=E*O,v+=x*P,v+=M*z,v+=m*R,v+=B*C,c=v>>>13,v&=8191,v+=S*L,v+=5*K*j,v+=5*T*I,v+=5*Y*F,v+=5*k*N,c+=v>>>13,v&=8191,b=c,b+=E*N,b+=x*O,b+=M*P,b+=m*z,b+=B*R,c=b>>>13,b&=8191,b+=S*C,b+=K*L,b+=5*T*j,b+=5*Y*I,b+=5*k*F,c+=b>>>13,b&=8191,d=c,d+=E*F,d+=x*N,d+=M*O,d+=m*P,d+=B*z,c=d>>>13,d&=8191,d+=S*R,d+=K*C,d+=T*L,d+=5*Y*j,d+=5*k*I,c+=d>>>13,d&=8191,A=c,A+=E*I,A+=x*F,A+=M*N,A+=m*O,A+=B*P,c=A>>>13,A&=8191,A+=S*z,A+=K*R,A+=T*C,A+=Y*L,A+=5*k*j,c+=A>>>13,A&=8191,_=c,_+=E*j,_+=x*I,_+=M*F,_+=m*N,_+=B*O,c=_>>>13,_&=8191,_+=S*P,_+=K*z,_+=T*R,_+=Y*C,_+=k*L,c+=_>>>13,_&=8191,c=(c<<2)+c|0,c=c+y|0,y=8191&c,c>>>=13,l+=c,E=y,x=l,M=w,m=p,B=g,S=v,K=b,T=d,Y=A,k=_,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;16>i;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;10>i;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;10>i;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(h[9]>>>15)-1,i=0;10>i;i++)h[i]&=e;for(e=~e,i=0;10>i;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;8>i;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;o>e;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;n>e;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var lr=p,wr=g,pr=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],gr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),vr=32,br=24,dr=32,Ar=16,_r=32,Ur=32,Er=32,xr=32,Mr=32,mr=br,Br=dr,Sr=Ar,Kr=64,Tr=32,Yr=64,kr=32,Lr=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:c,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:u,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:g,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:lr,crypto_box:C,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:P,crypto_sign:q,crypto_sign_keypair:G,crypto_sign_open:D,crypto_secretbox_KEYBYTES:vr,crypto_secretbox_NONCEBYTES:br,crypto_secretbox_ZEROBYTES:dr,crypto_secretbox_BOXZEROBYTES:Ar,crypto_scalarmult_BYTES:_r,crypto_scalarmult_SCALARBYTES:Ur,crypto_box_PUBLICKEYBYTES:Er,crypto_box_SECRETKEYBYTES:xr,crypto_box_BEFORENMBYTES:Mr,crypto_box_NONCEBYTES:mr,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:Sr,crypto_sign_BYTES:Kr,crypto_sign_PUBLICKEYBYTES:Tr,crypto_sign_SECRETKEYBYTES:Yr,crypto_sign_SEEDBYTES:kr,crypto_hash_BYTES:Lr},r.util={},r.util.decodeUTF8=function(r){var t,n=unescape(encodeURIComponent(r)),e=new Uint8Array(n.length);for(t=0;tt;t++)n.push(String.fromCharCode(r[t]));return btoa(n.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var t,n=atob(r),e=new Uint8Array(n.length);for(t=0;te)return null;for(var o=new Uint8Array(e),i=0;ie;e++)o[e]=t[e];for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return G(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;ne;e++)n[e]=r[e];return G(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Tr,r.sign.secretKeyLength=Yr,r.sign.seedLength=kr,r.sign.signatureLength=Kr,r.hash=function(r){Q(r);var t=new Uint8Array(Lr);return P(t,r,r.length),t},r.hash.hashLength=Lr,r.verify=function(r,t){return Q(r,t),0===r.length||0===t.length?!1:r.length!==t.length?!1:0===n(r,0,t,0,r.length)?!0:!1},r.setPRNG=function(r){rr=r},function(){var t;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?t=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(t=window.msCrypto),t&&r.setPRNG(function(r,n){var e,o=new Uint8Array(n);for(t.getRandomValues(o),e=0;n>e;e++)r[e]=o[e];W(o)})):"undefined"!=typeof require&&(t=require("crypto"),t&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;n>e;e++)r[e]=o[e];W(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{}); \ No newline at end of file +!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;o>i;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;20>O;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;d=d+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+u|0,B=B+c|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+v|0,L=L+b|0,z=z+g|0,R=R+_|0,P=P+A|0,r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=z>>>0&255,r[53]=z>>>8&255,r[54]=z>>>16&255,r[55]=z>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=P>>>0&255,r[61]=P>>>8&255,r[62]=P>>>16&255,r[63]=P>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,v=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,b=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,g=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,_=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,d=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=v,L=b,z=g,R=_,P=A,O=0;20>O;O+=2)o=d+L|0,M^=o<<7|o>>>25,o=M+d|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,d^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,z^=o<<9|o>>>23,o=z+T|0,U^=o<<13|o>>>19,o=U+z|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=P+k|0,x^=o<<7|o>>>25,o=x+P|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,P^=o<<18|o>>>14,o=d+x|0,U^=o<<7|o>>>25,o=U+d|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,d^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=P+R|0,L^=o<<7|o>>>25,o=L+P|0,z^=o<<9|o>>>23,o=z+L|0,R^=o<<13|o>>>19,o=R+z|0,P^=o<<18|o>>>14;r[0]=d>>>0&255,r[1]=d>>>8&255,r[2]=d>>>16&255,r[3]=d>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=P>>>0&255,r[13]=P>>>8&255,r[14]=P>>>16&255,r[15]=P>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,u=new Uint8Array(16),c=new Uint8Array(64);for(s=0;16>s;s++)u[s]=0;for(s=0;8>s;s++)u[s]=i[s];for(;o>=64;){for(a(c,u,h,cr),s=0;64>s;s++)r[t+s]=n[e+s]^c[s];for(f=1,s=8;16>s;s++)f=f+(255&u[s])|0,u[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(c,u,h,cr),s=0;o>s;s++)r[t+s]=n[e+s]^c[s];return 0}function u(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;16>h;h++)f[h]=0;for(h=0;8>h;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,cr),h=0;64>h;h++)r[t+h]=s[h];for(i=1,h=8;16>h;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,cr),h=0;n>h;h++)r[t+h]=s[h];return 0}function c(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,cr);for(var h=new Uint8Array(8),a=0;8>a;a++)h[a]=e[a+16];return u(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,cr);for(var u=new Uint8Array(8),c=0;8>c;c++)u[c]=i[c+16];return s(r,t,n,e,o,u,a)}function l(r,t,n,e,o,i){var h=new yr(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(32>n)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;16>i;i++)r[i]=0;return 0}function v(r,t,n,e,o){var i,h=new Uint8Array(32);if(32>n)return-1;if(c(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;32>i;i++)r[i]=0;return 0}function b(r,t){var n;for(n=0;16>n;n++)r[n]=0|t[n]}function g(r){var t,n,e=1;for(t=0;16>t;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function _(r,t,n){for(var e,o=~(n-1),i=0;16>i;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=$(),h=$();for(n=0;16>n;n++)h[n]=t[n];for(g(h),g(h),g(h),e=0;2>e;e++){for(i[0]=h[0]-65517,n=1;15>n;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,_(h,i,1-o)}for(n=0;16>n;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function d(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;16>n;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,u=0,c=0,y=0,l=0,w=0,p=0,v=0,b=0,g=0,_=0,A=0,d=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,z=0,R=0,P=n[0],O=n[1],N=n[2],C=n[3],F=n[4],I=n[5],G=n[6],Z=n[7],j=n[8],q=n[9],V=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*P,h+=e*O,a+=e*N,f+=e*C,s+=e*F,u+=e*I,c+=e*G,y+=e*Z,l+=e*j,w+=e*q,p+=e*V,v+=e*X,b+=e*D,g+=e*H,_+=e*J,A+=e*Q,e=t[1],h+=e*P,a+=e*O,f+=e*N,s+=e*C,u+=e*F,c+=e*I,y+=e*G,l+=e*Z,w+=e*j,p+=e*q,v+=e*V,b+=e*X,g+=e*D,_+=e*H,A+=e*J,d+=e*Q,e=t[2],a+=e*P,f+=e*O,s+=e*N,u+=e*C,c+=e*F,y+=e*I,l+=e*G,w+=e*Z,p+=e*j,v+=e*q,b+=e*V,g+=e*X,_+=e*D,A+=e*H,d+=e*J,U+=e*Q,e=t[3],f+=e*P,s+=e*O,u+=e*N,c+=e*C,y+=e*F,l+=e*I,w+=e*G,p+=e*Z,v+=e*j,b+=e*q,g+=e*V,_+=e*X,A+=e*D,d+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*P,u+=e*O,c+=e*N,y+=e*C,l+=e*F,w+=e*I,p+=e*G,v+=e*Z,b+=e*j,g+=e*q,_+=e*V,A+=e*X,d+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],u+=e*P,c+=e*O,y+=e*N,l+=e*C,w+=e*F,p+=e*I,v+=e*G,b+=e*Z,g+=e*j,_+=e*q,A+=e*V,d+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],c+=e*P,y+=e*O,l+=e*N,w+=e*C,p+=e*F,v+=e*I,b+=e*G,g+=e*Z,_+=e*j,A+=e*q,d+=e*V,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*P,l+=e*O,w+=e*N,p+=e*C,v+=e*F,b+=e*I,g+=e*G,_+=e*Z,A+=e*j,d+=e*q,U+=e*V,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*P,w+=e*O,p+=e*N,v+=e*C,b+=e*F,g+=e*I,_+=e*G,A+=e*Z,d+=e*j,U+=e*q,E+=e*V,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*P,p+=e*O,v+=e*N,b+=e*C,g+=e*F,_+=e*I,A+=e*G,d+=e*Z,U+=e*j,E+=e*q,x+=e*V,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*P,v+=e*O,b+=e*N,g+=e*C,_+=e*F,A+=e*I,d+=e*G,U+=e*Z,E+=e*j,x+=e*q,M+=e*V,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],v+=e*P,b+=e*O,g+=e*N,_+=e*C,A+=e*F,d+=e*I,U+=e*G,E+=e*Z,x+=e*j,M+=e*q,m+=e*V,B+=e*X,S+=e*D,K+=e*H,T+=e*J,Y+=e*Q,e=t[12],b+=e*P,g+=e*O,_+=e*N,A+=e*C,d+=e*F,U+=e*I,E+=e*G,x+=e*Z,M+=e*j,m+=e*q,B+=e*V,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],g+=e*P,_+=e*O,A+=e*N,d+=e*C,U+=e*F,E+=e*I,x+=e*G,M+=e*Z,m+=e*j,B+=e*q,S+=e*V,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],_+=e*P,A+=e*O,d+=e*N,U+=e*C,E+=e*F,x+=e*I,M+=e*G,m+=e*Z,B+=e*j,S+=e*q,K+=e*V,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,z+=e*Q,e=t[15],A+=e*P,d+=e*O,U+=e*N,E+=e*C,x+=e*F,M+=e*I,m+=e*G,B+=e*Z,S+=e*j,K+=e*q,T+=e*V,Y+=e*X,k+=e*D,L+=e*H,z+=e*J,R+=e*Q,i+=38*d,h+=38*U,a+=38*E,f+=38*x,s+=38*M,u+=38*m,c+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,v+=38*k,b+=38*L,g+=38*z,_+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=_+o+65535,o=Math.floor(e/65536),_=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=u,r[6]=c,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=v,r[12]=b,r[13]=g,r[14]=_,r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),u=$(),c=$(),y=$();for(o=0;31>o;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;16>o;o++)f[o]=h[o],u[o]=a[o]=s[o]=0;for(a[0]=u[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,_(a,f,e),_(s,u,e),x(c,a,s),M(a,a,s),x(s,f,u),M(f,f,u),B(u,c),B(y,a),m(a,s,a),m(s,f,c),x(c,a,s),M(a,a,s),B(f,a),M(s,u,y),m(a,s,ir),x(a,a,u),m(s,s,a),m(a,u,y),m(u,f,h),B(f,c),_(a,f,e),_(s,u,e);for(o=0;16>o;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=u[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,cr)}function z(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function P(r,t,n,e){for(var o,i,h,a,f,s,u,c,y,l,w,p,v,b,g,_,A,d,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],z=r[2],R=r[3],P=r[4],O=r[5],N=r[6],C=r[7],F=t[0],I=t[1],G=t[2],Z=t[3],j=t[4],q=t[5],V=t[6],X=t[7],D=0;e>=128;){for(U=0;16>U;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;80>U;U++)if(o=k,i=L,h=z,a=R,f=P,s=O,u=N,c=C,y=F,l=I,w=G,p=Z,v=j,b=q,g=V,_=X,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(P>>>14|j<<18)^(P>>>18|j<<14)^(j>>>9|P<<23),M=(j>>>14|P<<18)^(j>>>18|P<<14)^(P>>>9|j<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=P&O^~P&N,M=j&q^~j&V,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,d=65535&m|B<<16,x=A,M=d,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&z^L&z,M=F&I^F&G^I&G,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,c=65535&S|K<<16,_=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=d,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,z=i,R=h,P=a,O=f,N=s,C=u,k=c,I=y,G=l,Z=w,j=p,q=v,V=b,X=g,F=_,U%16===15)for(E=0;16>E;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],d=Y[(E+1)%16],x=(A>>>1|d<<31)^(A>>>8|d<<24)^A>>>7,M=(d>>>1|A<<31)^(d>>>8|A<<24)^(d>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],d=Y[(E+14)%16],x=(A>>>19|d<<13)^(d>>>29|A<<3)^A>>>6,M=(d>>>19|A<<13)^(A>>>29|d<<3)^(d>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=z,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=z=65535&S|K<<16,t[2]=G=65535&m|B<<16,x=R,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=Z=65535&m|B<<16,x=P,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=P=65535&S|K<<16,t[4]=j=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=O=65535&S|K<<16,t[5]=q=65535&m|B<<16,x=N,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=N=65535&S|K<<16,t[6]=V=65535&m|B<<16,x=C,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=C=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function O(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,P(i,h,n,e),e%=128,o=0;e>o;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),P(i,h,a,e),o=0;8>o;o++)t(r,8*o,i[o],h[o]);return 0}function N(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$(),s=$(),u=$();M(n,r[1],r[0]),M(u,t[1],t[0]),m(n,n,u),x(e,r[0],r[1]),x(u,t[0],t[1]),m(e,e,u),m(o,r[3],t[3]),m(o,o,ar),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function C(r,t,n){var e;for(e=0;4>e;e++)_(r[e],t[e],n)}function F(r,t){var n=$(),e=$(),o=$();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(b(r[0],er),b(r[1],or),b(r[2],or),b(r[3],er),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,C(r,t,e),N(t,r),N(r,r),C(r,t,e)}function G(r,t){var n=[$(),$(),$(),$()];b(n[0],fr),b(n[1],sr),b(n[2],or),m(n[3],fr,sr),I(r,n,t)}function Z(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),O(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,G(i,o),F(r,i),e=0;32>e;e++)t[e+32]=r[e];return 0}function j(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;i>o;++o)t[o]+=n-16*t[e]*vr[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;32>o;o++)t[o]+=n-(t[31]>>4)*vr[o],n=t[o]>>8,t[o]&=255;for(o=0;32>o;o++)t[o]-=n*vr[o];for(e=0;32>e;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function q(r){var t,n=new Float64Array(64);for(t=0;64>t;t++)n[t]=r[t];for(t=0;64>t;t++)r[t]=0;j(r,n)}function V(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),u=[$(),$(),$(),$()];O(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var c=n+64;for(o=0;n>o;o++)r[64+o]=t[o];for(o=0;32>o;o++)r[32+o]=h[32+o];for(O(f,r.subarray(32),n+32),q(f),G(u,f),F(r,u),o=32;64>o;o++)r[o]=e[o];for(O(a,r,n+64),q(a),o=0;64>o;o++)s[o]=0;for(o=0;32>o;o++)s[o]=f[o];for(o=0;32>o;o++)for(i=0;32>i;i++)s[o+i]+=a[o]*h[i];return j(r.subarray(32),s),c}function X(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$();return b(r[2],or),E(r[1],t),B(o,r[1]),m(i,o,hr),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),d(e,o)&&m(r[0],r[0],ur),B(e,r[0]),m(e,e,i),d(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],u=[$(),$(),$(),$()];if(h=-1,64>n)return-1;if(X(u,e))return-1;for(i=0;n>i;i++)r[i]=t[i];for(i=0;32>i;i++)r[i+32]=e[i];if(O(f,r,n),q(f),I(s,u,f),G(u,t.subarray(32)),N(s,u),F(a,s),n-=64,o(t,0,a,0)){for(i=0;n>i;i++)r[i]=0;return-1}for(i=0;n>i;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==br)throw new Error("bad key size");if(t.length!==gr)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Er)throw new Error("bad public key size");if(t.length!==xr)throw new Error("bad secret key size")}function Q(){var r,t;for(t=0;t>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,u,c,y,l,w,p,v,b,g,_,A,d,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],z=this.r[1],R=this.r[2],P=this.r[3],O=this.r[4],N=this.r[5],C=this.r[6],F=this.r[7],I=this.r[8],G=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),u=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|u<<8),k+=u>>>5|U,c=0,y=c,y+=E*L,y+=x*(5*G),y+=M*(5*I),y+=m*(5*F),y+=B*(5*C),c=y>>>13,y&=8191,y+=S*(5*N),y+=K*(5*O),y+=T*(5*P),y+=Y*(5*R),y+=k*(5*z),c+=y>>>13,y&=8191,l=c,l+=E*z,l+=x*L,l+=M*(5*G),l+=m*(5*I),l+=B*(5*F),c=l>>>13,l&=8191,l+=S*(5*C),l+=K*(5*N),l+=T*(5*O),l+=Y*(5*P),l+=k*(5*R),c+=l>>>13,l&=8191,w=c,w+=E*R,w+=x*z,w+=M*L,w+=m*(5*G),w+=B*(5*I),c=w>>>13,w&=8191,w+=S*(5*F),w+=K*(5*C),w+=T*(5*N),w+=Y*(5*O),w+=k*(5*P),c+=w>>>13,w&=8191,p=c,p+=E*P,p+=x*R,p+=M*z,p+=m*L,p+=B*(5*G),c=p>>>13,p&=8191,p+=S*(5*I),p+=K*(5*F),p+=T*(5*C),p+=Y*(5*N),p+=k*(5*O),c+=p>>>13,p&=8191,v=c,v+=E*O,v+=x*P,v+=M*R,v+=m*z,v+=B*L,c=v>>>13,v&=8191,v+=S*(5*G),v+=K*(5*I),v+=T*(5*F),v+=Y*(5*C),v+=k*(5*N),c+=v>>>13,v&=8191,b=c,b+=E*N,b+=x*O,b+=M*P,b+=m*R,b+=B*z,c=b>>>13,b&=8191,b+=S*L,b+=K*(5*G),b+=T*(5*I),b+=Y*(5*F),b+=k*(5*C),c+=b>>>13,b&=8191,g=c,g+=E*C,g+=x*N,g+=M*O,g+=m*P,g+=B*R,c=g>>>13,g&=8191,g+=S*z,g+=K*L,g+=T*(5*G),g+=Y*(5*I),g+=k*(5*F),c+=g>>>13,g&=8191,_=c,_+=E*F,_+=x*C,_+=M*N,_+=m*O,_+=B*P,c=_>>>13,_&=8191,_+=S*R,_+=K*z,_+=T*L,_+=Y*(5*G),_+=k*(5*I),c+=_>>>13,_&=8191,A=c,A+=E*I,A+=x*F,A+=M*C,A+=m*N,A+=B*O,c=A>>>13,A&=8191,A+=S*P,A+=K*R,A+=T*z,A+=Y*L,A+=k*(5*G),c+=A>>>13,A&=8191,d=c,d+=E*G,d+=x*I,d+=M*F,d+=m*C,d+=B*N,c=d>>>13,d&=8191,d+=S*O,d+=K*P,d+=T*R,d+=Y*z,d+=k*L,c+=d>>>13,d&=8191,c=(c<<2)+c|0,c=c+y|0,y=8191&c,c>>>=13,l+=c,E=y,x=l,M=w,m=p,B=v,S=b,K=g,T=_,Y=A,k=d,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;16>i;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;10>i;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;10>i;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(1^n)-1,i=0;10>i;i++)h[i]&=e;for(e=~e,i=0;10>i;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;8>i;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;o>e;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;n>e;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var lr=p,wr=v,pr=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],vr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),br=32,gr=24,_r=32,Ar=16,dr=32,Ur=32,Er=32,xr=32,Mr=32,mr=gr,Br=_r,Sr=Ar,Kr=64,Tr=32,Yr=64,kr=32,Lr=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:c,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:u,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:v,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:lr,crypto_box:z,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:O,crypto_sign:V,crypto_sign_keypair:Z,crypto_sign_open:D,crypto_secretbox_KEYBYTES:br,crypto_secretbox_NONCEBYTES:gr,crypto_secretbox_ZEROBYTES:_r,crypto_secretbox_BOXZEROBYTES:Ar,crypto_scalarmult_BYTES:dr,crypto_scalarmult_SCALARBYTES:Ur,crypto_box_PUBLICKEYBYTES:Er,crypto_box_SECRETKEYBYTES:xr,crypto_box_BEFORENMBYTES:Mr,crypto_box_NONCEBYTES:mr,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:Sr,crypto_sign_BYTES:Kr,crypto_sign_PUBLICKEYBYTES:Tr,crypto_sign_SECRETKEYBYTES:Yr,crypto_sign_SEEDBYTES:kr,crypto_hash_BYTES:Lr},r.util||(r.util={},r.util.decodeUTF8=r.util.encodeUTF8=r.util.encodeBase64=r.util.decodeBase64=function(){throw new Error("nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js")}),r.randomBytes=function(r){var t=new Uint8Array(r);return rr(t,r),t},r.secretbox=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(_r+r.length),o=new Uint8Array(e.length),i=0;ie)return null;for(var o=new Uint8Array(e),i=0;ie;e++)o[e]=t[e];for(e=0;e=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return Z(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;ne;e++)n[e]=r[e];return Z(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Tr,r.sign.secretKeyLength=Yr,r.sign.seedLength=kr,r.sign.signatureLength=Kr,r.hash=function(r){Q(r);var t=new Uint8Array(Lr);return O(t,r,r.length),t},r.hash.hashLength=Lr,r.verify=function(r,t){return Q(r,t), +0===r.length||0===t.length?!1:r.length!==t.length?!1:0===n(r,0,t,0,r.length)?!0:!1},r.setPRNG=function(r){rr=r},function(){var t="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(t&&t.getRandomValues){var n=65536;r.setPRNG(function(r,e){var o,i=new Uint8Array(e);for(o=0;e>o;o+=n)t.getRandomValues(i.subarray(o,o+Math.min(e-o,n)));for(o=0;e>o;o++)r[o]=i[o];W(i)})}else"undefined"!=typeof require&&(t=require("crypto"),t&&t.randomBytes&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;n>e;e++)r[e]=o[e];W(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{}); \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js index b8edbbee692cdf..f72dd78d12550f 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js @@ -944,39 +944,13 @@ function cleanup(arr) { for (var i = 0; i < arr.length; i++) arr[i] = 0; } -nacl.util = {}; - -nacl.util.decodeUTF8 = function(s) { - var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; -}; - -nacl.util.encodeUTF8 = function(arr) { - var i, s = []; - for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i])); - return decodeURIComponent(escape(s.join(''))); -}; - -nacl.util.encodeBase64 = function(arr) { - if (typeof btoa === 'undefined') { - return (new Buffer(arr)).toString('base64'); - } else { - var i, s = [], len = arr.length; - for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i])); - return btoa(s.join('')); - } -}; - -nacl.util.decodeBase64 = function(s) { - if (typeof atob === 'undefined') { - return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0)); - } else { - var i, d = atob(s), b = new Uint8Array(d.length); - for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i); - return b; - } -}; +// TODO: Completely remove this in v0.15. +if (!nacl.util) { + nacl.util = {}; + nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { + throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); + }; +} nacl.randomBytes = function(n) { var b = new Uint8Array(n); @@ -1173,26 +1147,22 @@ nacl.setPRNG = function(fn) { (function() { // Initialize PRNG if environment provides CSPRNG. // If not, methods calling randombytes will throw. - var crypto; - if (typeof window !== 'undefined') { - // Browser. - if (window.crypto && window.crypto.getRandomValues) { - crypto = window.crypto; // Standard - } else if (window.msCrypto && window.msCrypto.getRandomValues) { - crypto = window.msCrypto; // Internet Explorer 11+ - } - if (crypto) { - nacl.setPRNG(function(x, n) { - var i, v = new Uint8Array(n); - crypto.getRandomValues(v); - for (i = 0; i < n; i++) x[i] = v[i]; - cleanup(v); - }); - } + var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; + if (crypto && crypto.getRandomValues) { + // Browsers. + var QUOTA = 65536; + nacl.setPRNG(function(x, n) { + var i, v = new Uint8Array(n); + for (i = 0; i < n; i += QUOTA) { + crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); + } + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); } else if (typeof require !== 'undefined') { // Node.js. crypto = require('crypto'); - if (crypto) { + if (crypto && crypto.randomBytes) { nacl.setPRNG(function(x, n) { var i, v = crypto.randomBytes(n); for (i = 0; i < n; i++) x[i] = v[i]; @@ -1202,4 +1172,4 @@ nacl.setPRNG = function(fn) { } })(); -})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {})); +})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {})); diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js index 95d869502e4b0d..eed3854153ec05 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js @@ -1 +1 @@ -!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new lr(e,t)}function o(r,n,e){var t;for(t=0;4>t;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;o>i;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),s=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4);for(u=0;4>u;u++)s[5*u]=e(a,4*u),s[1+u]=e(i,4*u),s[6+u]=e(t,4*u),s[11+u]=e(i,16+4*u);for(u=0;16>u;u++)l[u]=s[u];for(u=0;20>u;u++){for(c=0;4>c;c++){for(w=0;4>w;w++)h[w]=s[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;4>w;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;16>w;w++)s[w]=y[w]}if(f){for(u=0;16>u;u++)s[u]=s[u]+l[u]|0;for(u=0;4>u;u++)s[5*u]=s[5*u]-e(a,4*u)|0,s[6+u]=s[6+u]-e(t,4*u)|0;for(u=0;4>u;u++)o(r,4*u,s[5*u]),o(r,16+4*u,s[6+u])}else for(u=0;16>u;u++)o(r,4*u,s[u]+l[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function s(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;16>u;u++)c[u]=0;for(u=0;8>u;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;64>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;16>u;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;o>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function l(r,n,e,t,o){return s(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Br),l(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Br),s(r,n,e,t,o,i.subarray(16),f)}function p(r,n){var e,t=0;for(e=0;17>e;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function v(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),s=new Uint32Array(17),l=new Uint32Array(17),h=new Uint32Array(17);for(u=0;17>u;u++)y[u]=s[u]=0;for(u=0;16>u;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;17>u;u++)l[u]=0;for(u=0;16>u&&o>u;++u)l[u]=e[t+u];for(l[u]=1,t+=u,o-=u,p(s,l),f=0;17>f;f++)for(w[f]=0,u=0;17>u;u++)w[f]=w[f]+s[u]*(f>=u?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;17>f;f++)s[f]=w[f];for(c=0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;for(c=c+s[16]|0,s[16]=3&c,c=5*(c>>>2)|0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;c=c+s[16]|0,s[16]=c}for(u=0;17>u;u++)h[u]=s[u];for(p(s,Sr),a=0|-(s[16]>>>7),u=0;17>u;u++)s[u]^=a&(h[u]^s[u]);for(u=0;16>u;u++)l[u]=i[u+16];for(l[16]=0,p(s,l),u=0;16>u;u++)r[n+u]=s[u];return 0}function b(r,n,e,t,o,i){var a=new Uint8Array(16);return v(a,0,e,t,o,i),f(r,n,a,0)}function A(r,n,e,t,o){var i;if(32>e)return-1;for(g(r,0,n,0,e,t,o),v(r,16,r,32,e-32,r),i=0;16>i;i++)r[i]=0;return 0}function U(r,n,e,t,o){var i,a=new Uint8Array(32);if(32>e)return-1;if(h(a,0,32,t,o),0!==b(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;32>i;i++)r[i]=0;return 0}function _(r,n){var e;for(e=0;16>e;e++)r[e]=0|n[e]}function d(r){var n,e;for(e=0;16>e;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(15>e?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function E(r,n,e){for(var t,o=~(e-1),i=0;16>i;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;16>e;e++)a[e]=n[e];for(d(a),d(a),d(a),t=0;2>t;t++){for(i[0]=a[0]-65517,e=1;15>e;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,E(a,i,1-o)}for(e=0;16>e;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;16>e;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;31>t;t++)i[t]=0;for(t=0;16>t;t++)for(o=0;16>o;o++)i[t+o]+=n[t]*e[o];for(t=0;15>t;t++)i[t]+=38*i[t+16];for(t=0;16>t;t++)r[t]=i[t];d(r),d(r)}function L(r,n){Y(r,n,n)}function C(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function R(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function k(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),s=hr();for(o=0;31>o;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;16>o;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,E(f,u,t),E(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(s,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,s),Y(f,c,Ur),K(f,f,w),Y(c,c,f),Y(f,w,s),Y(w,u,a),L(u,y),E(f,u,t),E(c,w,t);for(o=0;16>o;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var l=a.subarray(32),h=a.subarray(16);return C(l,l),Y(h,h,l),x(r,h),0}function z(r,n){return k(r,n,vr)}function P(r,n){return gr(n,32),z(r,n)}function O(r,n,e){var t=new Uint8Array(32);return k(t,e,n),y(r,pr,t,Br)}function F(r,n,e,t,o,i){var a=new Uint8Array(32);return O(a,o,i),Kr(r,n,e,t,a)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return O(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new lr(i&f|a<<16,t&f|o<<16)}function j(r,n){return new lr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function G(){var r,n=0,e=0;for(r=0;rn?(e=r.hi>>>n|r.lo<>>n|r.hi<n&&(e=r.lo>>>n|r.hi<>>n|r.lo<a;a++)u[a]=w[a]=t(r,8*a);for(var s=0;e>=128;){for(a=0;16>a;a++)y[a]=t(n,8*a+s);for(a=0;80>a;a++){for(f=0;8>f;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),Z(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,q(w[0]),V(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;8>f;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;16>f;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;8>a;a++)w[a]=M(w[a],u[a]),u[a]=w[a];s+=128,e-=128}for(a=0;8>a;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;64>t;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;256>t;t++)a[t]=0;for(t=0;e>t;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,i(a,e-8,new lr(f/536870912|0,f<<3)),J(o,a,e),t=0;64>t;t++)r[t]=o[t];return 0}function W(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr(),c=hr(),w=hr();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,dr),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;4>t;t++)E(r[t],n[t],e)}function rr(r,n){var e=hr(),t=hr(),o=hr();C(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nr(r,n,e){var t,o;for(_(r[0],br),_(r[1],Ar),_(r[2],Ar),_(r[3],br),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];_(e[0],Er),_(e[1],xr),_(e[2],Ar),Y(e[3],Er,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;32>t;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;i>o;++o)n[o]+=e-16*n[t]*Cr[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;32>o;o++)n[o]+=e-(n[31]>>4)*Cr[o],e=n[o]>>8,n[o]&=255;for(o=0;32>o;o++)n[o]-=e*Cr[o];for(t=0;32>t;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;64>n;n++)e[n]=r[n];for(n=0;64>n;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;e>o;o++)r[64+o]=n[o];for(o=0;32>o;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),ir(u),er(w,u),rr(r,w),o=32;64>o;o++)r[o]=t[o];for(Q(f,r,e+64),ir(f),o=0;64>o;o++)c[o]=0;for(o=0;32>o;o++)c[o]=u[o];for(o=0;32>o;o++)for(i=0;32>i;i++)c[o+i]+=f[o]*a[i];return or(r.subarray(32),c),y}function fr(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr();return _(r[2],Ar),S(r[1],n),L(o,r[1]),Y(i,o,_r),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),R(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mr),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],br,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,64>e)return-1;if(fr(w,t))return-1;for(o=0;e>o;o++)r[o]=n[o];for(o=0;32>o;o++)r[o+32]=t[o];if(Q(f,r,e),ir(f),nr(c,w,f),er(w,n.subarray(32)),W(c,w),rr(a,c),e-=64,u(n,0,a,0)){for(o=0;e>o;o++)r[o]=0;return-1}for(o=0;e>o;o++)r[o]=n[o+64];return i=e}function cr(r,n){if(r.length!==Rr)throw new Error("bad key size");if(n.length!==kr)throw new Error("bad nonce size")}function wr(r,n){if(r.length!==Nr)throw new Error("bad public key size");if(n.length!==Mr)throw new Error("bad secret key size")}function yr(){var r,n;for(n=0;nn;n++)e.push(String.fromCharCode(r[n]));return btoa(e.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var n,e=atob(r),t=new Uint8Array(e.length);for(n=0;nt)return null;for(var o=new Uint8Array(t),i=0;it;t++)o[t]=n[t];for(t=0;t=0},r.sign.keyPair=function(){var r=new Uint8Array(qr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(qr),e=0;et;t++)e[t]=r[t];return tr(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=qr,r.sign.secretKeyLength=Xr,r.sign.seedLength=Dr,r.sign.signatureLength=Vr,r.hash=function(r){yr(r);var n=new Uint8Array(Hr);return Q(n,r,r.length),n},r.hash.hashLength=Hr,r.verify=function(r,n){return yr(r,n),0===r.length||0===n.length?!1:r.length!==n.length?!1:0===a(r,0,n,0,r.length)?!0:!1},r.setPRNG=function(r){gr=r},function(){var n;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?n=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(n=window.msCrypto),n&&r.setPRNG(function(r,e){var t,o=new Uint8Array(e);for(n.getRandomValues(o),t=0;e>t;t++)r[t]=o[t];sr(o)})):"undefined"!=typeof require&&(n=require("crypto"),n&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;e>t;t++)r[t]=o[t];sr(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{}); \ No newline at end of file +!function(r){"use strict";function n(r,n){return r<>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new lr(e,t)}function o(r,n,e){var t;for(t=0;4>t;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;o>i;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),s=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4);for(u=0;4>u;u++)s[5*u]=e(a,4*u),s[1+u]=e(i,4*u),s[6+u]=e(t,4*u),s[11+u]=e(i,16+4*u);for(u=0;16>u;u++)l[u]=s[u];for(u=0;20>u;u++){for(c=0;4>c;c++){for(w=0;4>w;w++)h[w]=s[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;4>w;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;16>w;w++)s[w]=y[w]}if(f){for(u=0;16>u;u++)s[u]=s[u]+l[u]|0;for(u=0;4>u;u++)s[5*u]=s[5*u]-e(a,4*u)|0,s[6+u]=s[6+u]-e(t,4*u)|0;for(u=0;4>u;u++)o(r,4*u,s[5*u]),o(r,16+4*u,s[6+u])}else for(u=0;16>u;u++)o(r,4*u,s[u]+l[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function s(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;16>u;u++)c[u]=0;for(u=0;8>u;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;64>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;16>u;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;o>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function l(r,n,e,t,o){return s(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Br),l(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Br),s(r,n,e,t,o,i.subarray(16),f)}function v(r,n){var e,t=0;for(e=0;17>e;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function b(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),s=new Uint32Array(17),l=new Uint32Array(17),h=new Uint32Array(17);for(u=0;17>u;u++)y[u]=s[u]=0;for(u=0;16>u;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;17>u;u++)l[u]=0;for(u=0;16>u&&o>u;++u)l[u]=e[t+u];for(l[u]=1,t+=u,o-=u,v(s,l),f=0;17>f;f++)for(w[f]=0,u=0;17>u;u++)w[f]=w[f]+s[u]*(f>=u?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;17>f;f++)s[f]=w[f];for(c=0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;for(c=c+s[16]|0,s[16]=3&c,c=5*(c>>>2)|0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;c=c+s[16]|0,s[16]=c}for(u=0;17>u;u++)h[u]=s[u];for(v(s,Sr),a=0|-(s[16]>>>7),u=0;17>u;u++)s[u]^=a&(h[u]^s[u]);for(u=0;16>u;u++)l[u]=i[u+16];for(l[16]=0,v(s,l),u=0;16>u;u++)r[n+u]=s[u];return 0}function p(r,n,e,t,o,i){var a=new Uint8Array(16);return b(a,0,e,t,o,i),f(r,n,a,0)}function _(r,n,e,t,o){var i;if(32>e)return-1;for(g(r,0,n,0,e,t,o),b(r,16,r,32,e-32,r),i=0;16>i;i++)r[i]=0;return 0}function A(r,n,e,t,o){var i,a=new Uint8Array(32);if(32>e)return-1;if(h(a,0,32,t,o),0!==p(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;32>i;i++)r[i]=0;return 0}function U(r,n){var e;for(e=0;16>e;e++)r[e]=0|n[e]}function E(r){var n,e;for(e=0;16>e;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(15>e?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function d(r,n,e){for(var t,o=~(e-1),i=0;16>i;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;16>e;e++)a[e]=n[e];for(E(a),E(a),E(a),t=0;2>t;t++){for(i[0]=a[0]-65517,e=1;15>e;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(a,i,1-o)}for(e=0;16>e;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;16>e;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;31>t;t++)i[t]=0;for(t=0;16>t;t++)for(o=0;16>o;o++)i[t+o]+=n[t]*e[o];for(t=0;15>t;t++)i[t]+=38*i[t+16];for(t=0;16>t;t++)r[t]=i[t];E(r),E(r)}function L(r,n){Y(r,n,n)}function k(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function z(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function R(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),s=hr();for(o=0;31>o;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;16>o;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,d(f,u,t),d(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(s,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,s),Y(f,c,Ar),K(f,f,w),Y(c,c,f),Y(f,w,s),Y(w,u,a),L(u,y),d(f,u,t),d(c,w,t);for(o=0;16>o;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var l=a.subarray(32),h=a.subarray(16);return k(l,l),Y(h,h,l),x(r,h),0}function P(r,n){return R(r,n,br)}function O(r,n){return gr(n,32),P(r,n)}function F(r,n,e){var t=new Uint8Array(32);return R(t,e,n),y(r,vr,t,Br)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Kr(r,n,e,t,a)}function C(r,n,e,t,o,i){var a=new Uint8Array(32);return F(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new lr(i&f|a<<16,t&f|o<<16)}function G(r,n){return new lr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function Z(){var r,n=0,e=0;for(r=0;rn?(e=r.hi>>>n|r.lo<>>n|r.hi<n&&(e=r.lo>>>n|r.hi<>>n|r.lo<a;a++)u[a]=w[a]=t(r,8*a);for(var s=0;e>=128;){for(a=0;16>a;a++)y[a]=t(n,8*a+s);for(a=0;80>a;a++){for(f=0;8>f;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),q(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,V(w[0]),I(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;8>f;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;16>f;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;8>a;a++)w[a]=M(w[a],u[a]),u[a]=w[a];s+=128,e-=128}for(a=0;8>a;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;64>t;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;256>t;t++)a[t]=0;for(t=0;e>t;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,i(a,e-8,new lr(f/536870912|0,f<<3)),J(o,a,e),t=0;64>t;t++)r[t]=o[t];return 0}function W(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr(),c=hr(),w=hr();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,Er),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;4>t;t++)d(r[t],n[t],e)}function rr(r,n){var e=hr(),t=hr(),o=hr();k(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nr(r,n,e){var t,o;for(U(r[0],pr),U(r[1],_r),U(r[2],_r),U(r[3],pr),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];U(e[0],dr),U(e[1],xr),U(e[2],_r),Y(e[3],dr,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;32>t;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;i>o;++o)n[o]+=e-16*n[t]*kr[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;32>o;o++)n[o]+=e-(n[31]>>4)*kr[o],e=n[o]>>8,n[o]&=255;for(o=0;32>o;o++)n[o]-=e*kr[o];for(t=0;32>t;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;64>n;n++)e[n]=r[n];for(n=0;64>n;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;e>o;o++)r[64+o]=n[o];for(o=0;32>o;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),ir(u),er(w,u),rr(r,w),o=32;64>o;o++)r[o]=t[o];for(Q(f,r,e+64),ir(f),o=0;64>o;o++)c[o]=0;for(o=0;32>o;o++)c[o]=u[o];for(o=0;32>o;o++)for(i=0;32>i;i++)c[o+i]+=f[o]*a[i];return or(r.subarray(32),c),y}function fr(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr();return U(r[2],_r),S(r[1],n),L(o,r[1]),Y(i,o,Ur),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),z(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mr),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],pr,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,64>e)return-1;if(fr(w,t))return-1;for(o=0;e>o;o++)r[o]=n[o];for(o=0;32>o;o++)r[o+32]=t[o];if(Q(f,r,e),ir(f),nr(c,w,f),er(w,n.subarray(32)),W(c,w),rr(a,c),e-=64,u(n,0,a,0)){for(o=0;e>o;o++)r[o]=0;return-1}for(o=0;e>o;o++)r[o]=n[o+64];return i=e}function cr(r,n){if(r.length!==zr)throw new Error("bad key size");if(n.length!==Rr)throw new Error("bad nonce size")}function wr(r,n){if(r.length!==Cr)throw new Error("bad public key size");if(n.length!==Mr)throw new Error("bad secret key size")}function yr(){var r,n;for(n=0;nt)return null;for(var o=new Uint8Array(t),i=0;it;t++)o[t]=n[t];for(t=0;t=0},r.sign.keyPair=function(){var r=new Uint8Array(Vr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(Vr),e=0;et;t++)e[t]=r[t];return tr(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=Vr,r.sign.secretKeyLength=Xr,r.sign.seedLength=Dr,r.sign.signatureLength=Ir,r.hash=function(r){yr(r);var n=new Uint8Array(Hr);return Q(n,r,r.length),n},r.hash.hashLength=Hr,r.verify=function(r,n){return yr(r,n),0===r.length||0===n.length?!1:r.length!==n.length?!1:0===a(r,0,n,0,r.length)?!0:!1},r.setPRNG=function(r){gr=r},function(){var n="undefined"!=typeof self?self.crypto||self.msCrypto:null;if(n&&n.getRandomValues){var e=65536;r.setPRNG(function(r,t){var o,i=new Uint8Array(t);for(o=0;t>o;o+=e)n.getRandomValues(i.subarray(o,o+Math.min(t-o,e)));for(o=0;t>o;o++)r[o]=i[o];sr(i)})}else"undefined"!=typeof require&&(n=require("crypto"),n&&n.randomBytes&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;e>t;t++)r[t]=o[t];sr(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:self.nacl=self.nacl||{}); \ No newline at end of file diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json index 147ea92c406fa1..9e31f630bca074 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json @@ -2,45 +2,49 @@ "_args": [ [ { - "raw": "tweetnacl@~0.13.0", + "raw": "tweetnacl@~0.14.0", "scope": null, "escapedName": "tweetnacl", "name": "tweetnacl", - "rawSpec": "~0.13.0", - "spec": ">=0.13.0 <0.14.0", + "rawSpec": "~0.14.0", + "spec": ">=0.14.0 <0.15.0", "type": "range" }, "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk" ] ], - "_from": "tweetnacl@>=0.13.0 <0.14.0", - "_id": "tweetnacl@0.13.3", + "_from": "tweetnacl@>=0.14.0 <0.15.0", + "_id": "tweetnacl@0.14.3", "_inCache": true, - "_installable": true, "_location": "/request/http-signature/sshpk/tweetnacl", - "_nodeVersion": "4.2.3", + "_nodeVersion": "5.6.0", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/tweetnacl-0.14.3.tgz_1459224951636_0.7403244483284652" + }, "_npmUser": { "name": "dchest", "email": "dmitry@codingrobots.com" }, - "_npmVersion": "2.14.7", + "_npmVersion": "3.7.3", "_phantomChildren": {}, "_requested": { - "raw": "tweetnacl@~0.13.0", + "raw": "tweetnacl@~0.14.0", "scope": null, "escapedName": "tweetnacl", "name": "tweetnacl", - "rawSpec": "~0.13.0", - "spec": ">=0.13.0 <0.14.0", + "rawSpec": "~0.14.0", + "spec": ">=0.14.0 <0.15.0", "type": "range" }, "_requiredBy": [ - "/request/http-signature/sshpk" + "/request/http-signature/sshpk", + "/request/http-signature/sshpk/bcrypt-pbkdf" ], - "_resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "_shasum": "d628b56f3bcc3d5ae74ba9d4c1a704def5ab4b56", + "_resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz", + "_shasum": "3da382f670f25ded78d7b3d1792119bca0b7132d", "_shrinkwrap": null, - "_spec": "tweetnacl@~0.13.0", + "_spec": "tweetnacl@~0.14.0", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk", "author": { "name": "TweetNaCl-js contributors" @@ -55,23 +59,24 @@ "dependencies": {}, "description": "Port of TweetNaCl cryptographic library to JavaScript", "devDependencies": { - "browserify": "^10.1.3", - "eslint": "^1.4.3", - "faucet": "0.0.1", + "browserify": "^13.0.0", + "eslint": "^2.2.0", + "faucet": "^0.0.1", "tap-browser-color": "^0.1.2", - "tape": "^4.0.0", - "testling": "^1.7.1", - "uglify-js": "^2.4.21" + "tape": "^4.4.0", + "tape-run": "^2.1.3", + "tweetnacl-util": "^0.13.3", + "uglify-js": "^2.6.1" }, "directories": { "test": "test" }, "dist": { - "shasum": "d628b56f3bcc3d5ae74ba9d4c1a704def5ab4b56", - "tarball": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + "shasum": "3da382f670f25ded78d7b3d1792119bca0b7132d", + "tarball": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz" }, - "gitHead": "2bb422cb707fba4a5ec9654688564a4fb861b068", - "homepage": "https://dchest.github.io/tweetnacl-js", + "gitHead": "3eb4fc544a2a1d6c0a41b98b9906288ca8b087e4", + "homepage": "https://tweetnacl.js.org", "keywords": [ "crypto", "cryptography", @@ -86,7 +91,7 @@ "salsa20", "signatures" ], - "license": "Public domain", + "license": "SEE LICENSE IN COPYING.txt", "main": "nacl-fast.js", "maintainers": [ { @@ -103,27 +108,13 @@ }, "scripts": { "bench": "node test/benchmark/bench.js", - "browser": "browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null", - "browser-quick": "browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", "build": "uglifyjs nacl.js -c -m -o nacl.min.js && uglifyjs nacl-fast.js -c -m -o nacl-fast.min.js", - "chrome": "browserify test/browser/testling_init.js test/*.js | testling -x google-chrome | faucet", - "firefox": "browserify test/browser/testling_init.js test/*.js | testling -x firefox | faucet", + "build-test-browser": "browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null && browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null", "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js", - "test": "tape test/*.js | faucet", - "testall": "make -C test/c && tape test/*.js test/c/*.js | faucet", - "testling": "browserify test/browser/testling_init.js test/*.js | testling | faucet" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "chrome/22..latest", - "firefox/16..latest", - "safari/latest", - "opera/11.0..latest", - "iphone/6..latest", - "ipad/6..latest", - "android-browser/latest" - ] + "test": "npm run test-node-all && npm run test-browser", + "test-browser": "NACL_SRC=${NACL_SRC:='nacl.min.js'} && npm run build-test-browser && cat $NACL_SRC test/browser/_bundle.js | tape-run | faucet", + "test-node": "tape test/*.js | faucet", + "test-node-all": "make -C test/c && tape test/*.js test/c/*.js | faucet" }, - "version": "0.13.3" + "version": "0.14.3" } diff --git a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json index 27d297637ebc2f..02ae0ac7647e07 100644 --- a/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json +++ b/deps/npm/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json @@ -14,20 +14,19 @@ ] ], "_from": "sshpk@>=1.7.0 <2.0.0", - "_id": "sshpk@1.9.2", + "_id": "sshpk@1.10.1", "_inCache": true, - "_installable": true, "_location": "/request/http-signature/sshpk", "_nodeVersion": "0.12.15", "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/sshpk-1.9.2.tgz_1469841656006_0.10793639998883009" + "tmp": "tmp/sshpk-1.10.1.tgz_1475095320582_0.4095200637821108" }, "_npmUser": { "name": "arekinath", "email": "alex@cooperi.net" }, - "_npmVersion": "2.15.8", + "_npmVersion": "3.10.3", "_phantomChildren": {}, "_requested": { "raw": "sshpk@^1.7.0", @@ -41,8 +40,8 @@ "_requiredBy": [ "/request/http-signature" ], - "_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.9.2.tgz", - "_shasum": "3b41351bbad5c34ddf4bd8119937efee31a46765", + "_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", + "_shasum": "30e1a5d329244974a1af61511339d595af6638b0", "_shrinkwrap": null, "_spec": "sshpk@^1.7.0", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/http-signature", @@ -74,12 +73,13 @@ "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jodid25519": "^1.0.0", "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" + "tweetnacl": "~0.14.0" }, "description": "A library for finding and using SSH public keys", "devDependencies": { @@ -94,13 +94,13 @@ "man": "./man/man1" }, "dist": { - "shasum": "3b41351bbad5c34ddf4bd8119937efee31a46765", - "tarball": "https://registry.npmjs.org/sshpk/-/sshpk-1.9.2.tgz" + "shasum": "30e1a5d329244974a1af61511339d595af6638b0", + "tarball": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz" }, "engines": { "node": ">=0.10.0" }, - "gitHead": "a8b794384822a52eea5ed3b2f192a780b7909609", + "gitHead": "4212272b3889f2df155d2aa8a1a5305fe7a7d3a5", "homepage": "https://github.com/arekinath/node-sshpk#readme", "license": "MIT", "main": "lib/index.js", @@ -117,10 +117,11 @@ ], "name": "sshpk", "optionalDependencies": { + "bcrypt-pbkdf": "^1.0.0", "ecc-jsbn": "~0.1.1", "jodid25519": "^1.0.0", "jsbn": "~0.1.0", - "tweetnacl": "~0.13.0" + "tweetnacl": "~0.14.0" }, "readme": "ERROR: No README data found!", "repository": { @@ -130,5 +131,5 @@ "scripts": { "test": "tape test/*.js" }, - "version": "1.9.2" + "version": "1.10.1" } diff --git a/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md b/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md index 63bd4ea0b40ce4..8c0383a61b98f5 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md +++ b/deps/npm/node_modules/request/node_modules/mime-types/HISTORY.md @@ -1,3 +1,10 @@ +2.1.12 / 2016-09-18 +=================== + + * deps: mime-db@~1.24.0 + - Add new mime types + - Add `audio/mp3` + 2.1.11 / 2016-05-01 =================== diff --git a/deps/npm/node_modules/request/node_modules/mime-types/index.js b/deps/npm/node_modules/request/node_modules/mime-types/index.js index f7008b246d1e4c..9226ca58473eed 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/index.js +++ b/deps/npm/node_modules/request/node_modules/mime-types/index.js @@ -46,7 +46,7 @@ populateMaps(exports.extensions, exports.types) * @return {boolean|string} */ -function charset(type) { +function charset (type) { if (!type || typeof type !== 'string') { return false } @@ -74,7 +74,7 @@ function charset(type) { * @return {boolean|string} */ -function contentType(str) { +function contentType (str) { // TODO: should this even be in this module? if (!str || typeof str !== 'string') { return false @@ -104,7 +104,7 @@ function contentType(str) { * @return {boolean|string} */ -function extension(type) { +function extension (type) { if (!type || typeof type !== 'string') { return false } @@ -129,7 +129,7 @@ function extension(type) { * @return {boolean|string} */ -function lookup(path) { +function lookup (path) { if (!path || typeof path !== 'string') { return false } @@ -151,11 +151,11 @@ function lookup(path) { * @private */ -function populateMaps(extensions, types) { +function populateMaps (extensions, types) { // source preference (least -> most) var preference = ['nginx', 'apache', undefined, 'iana'] - Object.keys(db).forEach(function forEachMimeType(type) { + Object.keys(db).forEach(function forEachMimeType (type) { var mime = db[type] var exts = mime.extensions @@ -174,8 +174,8 @@ function populateMaps(extensions, types) { var from = preference.indexOf(db[types[extension]].source) var to = preference.indexOf(mime.source) - if (types[extension] !== 'application/octet-stream' - && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { + if (types[extension] !== 'application/octet-stream' && + from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { // skip the remapping continue } diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md index d6705ac86d114f..d4796b55eeff2b 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md +++ b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md @@ -1,3 +1,27 @@ +1.24.0 / 2016-09-18 +=================== + + * Add `application/clue_info+xml` + * Add `application/geo+json` + * Add `application/lgr+xml` + * Add `application/vnd.amazon.mobi8-ebook` + * Add `application/vnd.chess-pgn` + * Add `application/vnd.comicbook+zip` + * Add `application/vnd.d2l.coursepackage1p0+zip` + * Add `application/vnd.espass-espass+zip` + * Add `application/vnd.nearst.inv+json` + * Add `application/vnd.oma.lwm2m+json` + * Add `application/vnd.oma.lwm2m+tlv` + * Add `application/vnd.quarantainenet` + * Add `application/vnd.rar` + * Add `audio/mp3` + * Add `image/dicom-rle` + * Add `image/emf` + * Add `image/jls` + * Add `image/wmf` + * Add `model/gltf+json` + * Add `text/vnd.ascii-art` + 1.23.0 / 2016-05-01 =================== diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json index 0a5a8a7bba5574..63b226f9c47d94 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +++ b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json @@ -173,6 +173,9 @@ "application/cfw": { "source": "iana" }, + "application/clue_info+xml": { + "source": "iana" + }, "application/cms": { "source": "iana" }, @@ -357,6 +360,10 @@ "application/framework-attributes+xml": { "source": "iana" }, + "application/geo+json": { + "source": "iana", + "compressible": true + }, "application/gml+xml": { "source": "apache", "extensions": ["gml"] @@ -511,6 +518,9 @@ "compressible": true, "extensions": ["jsonld"] }, + "application/lgr+xml": { + "source": "iana" + }, "application/link-format": { "source": "iana" }, @@ -1316,6 +1326,9 @@ "source": "apache", "extensions": ["azw"] }, + "application/vnd.amazon.mobi8-ebook": { + "source": "iana" + }, "application/vnd.americandynamics.acc": { "source": "iana", "extensions": ["acc"] @@ -1446,6 +1459,9 @@ "source": "iana", "extensions": ["cdxml"] }, + "application/vnd.chess-pgn": { + "source": "iana" + }, "application/vnd.chipnuts.karaoke-mmd": { "source": "iana", "extensions": ["mmd"] @@ -1495,6 +1511,9 @@ "source": "iana", "compressible": true }, + "application/vnd.comicbook+zip": { + "source": "iana" + }, "application/vnd.commerce-battelle": { "source": "iana" }, @@ -1578,6 +1597,9 @@ "application/vnd.cybank": { "source": "iana" }, + "application/vnd.d2l.coursepackage1p0+zip": { + "source": "iana" + }, "application/vnd.dart": { "source": "iana", "compressible": true, @@ -1798,6 +1820,9 @@ "application/vnd.ericsson.quickcall": { "source": "iana" }, + "application/vnd.espass-espass+zip": { + "source": "iana" + }, "application/vnd.eszigno3+xml": { "source": "iana", "extensions": ["es3","et3"] @@ -2809,6 +2834,10 @@ "application/vnd.ncd.reference": { "source": "iana" }, + "application/vnd.nearst.inv+json": { + "source": "iana", + "compressible": true + }, "application/vnd.nervana": { "source": "iana" }, @@ -3115,6 +3144,13 @@ "application/vnd.oma.group-usage-list+xml": { "source": "iana" }, + "application/vnd.oma.lwm2m+json": { + "source": "iana", + "compressible": true + }, + "application/vnd.oma.lwm2m+tlv": { + "source": "iana" + }, "application/vnd.oma.pal+xml": { "source": "iana" }, @@ -3540,6 +3576,9 @@ "application/vnd.qualcomm.brew-app-res": { "source": "iana" }, + "application/vnd.quarantainenet": { + "source": "iana" + }, "application/vnd.quark.quarkxpress": { "source": "iana", "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] @@ -3598,6 +3637,9 @@ "application/vnd.rapid": { "source": "iana" }, + "application/vnd.rar": { + "source": "iana" + }, "application/vnd.realvnc.bed": { "source": "iana", "extensions": ["bed"] @@ -5062,6 +5104,10 @@ "audio/mobile-xmf": { "source": "iana" }, + "audio/mp3": { + "compressible": false, + "extensions": ["mp3"] + }, "audio/mp4": { "source": "iana", "compressible": false, @@ -5425,7 +5471,7 @@ "extensions": ["otf"] }, "image/bmp": { - "source": "apache", + "source": "iana", "compressible": true, "extensions": ["bmp"] }, @@ -5433,6 +5479,12 @@ "source": "iana", "extensions": ["cgm"] }, + "image/dicom-rle": { + "source": "iana" + }, + "image/emf": { + "source": "iana" + }, "image/fits": { "source": "iana" }, @@ -5449,6 +5501,9 @@ "source": "iana", "extensions": ["ief"] }, + "image/jls": { + "source": "iana" + }, "image/jp2": { "source": "iana" }, @@ -5619,6 +5674,9 @@ "source": "apache", "extensions": ["webp"] }, + "image/wmf": { + "source": "iana" + }, "image/x-3ds": { "source": "apache", "extensions": ["3ds"] @@ -5765,6 +5823,10 @@ "message/vnd.wfa.wsc": { "source": "iana" }, + "model/gltf+json": { + "source": "iana", + "compressible": true + }, "model/iges": { "source": "iana", "compressible": false, @@ -6092,6 +6154,9 @@ "text/vnd.abc": { "source": "iana" }, + "text/vnd.ascii-art": { + "source": "iana" + }, "text/vnd.curl": { "source": "iana", "extensions": ["curl"] diff --git a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json index 8411c5ad0e3f7c..658681becdf5cb 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json +++ b/deps/npm/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json @@ -2,49 +2,48 @@ "_args": [ [ { - "raw": "mime-db@~1.23.0", + "raw": "mime-db@~1.24.0", "scope": null, "escapedName": "mime-db", "name": "mime-db", - "rawSpec": "~1.23.0", - "spec": ">=1.23.0 <1.24.0", + "rawSpec": "~1.24.0", + "spec": ">=1.24.0 <1.25.0", "type": "range" }, "/Users/rebecca/code/npm/node_modules/request/node_modules/mime-types" ] ], - "_from": "mime-db@>=1.23.0 <1.24.0", - "_id": "mime-db@1.23.0", + "_from": "mime-db@>=1.24.0 <1.25.0", + "_id": "mime-db@1.24.0", "_inCache": true, - "_installable": true, "_location": "/request/mime-types/mime-db", - "_nodeVersion": "4.4.3", + "_nodeVersion": "4.5.0", "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/mime-db-1.23.0.tgz_1462163798086_0.43938886746764183" + "tmp": "tmp/mime-db-1.24.0.tgz_1474198792761_0.7161959335207939" }, "_npmUser": { "name": "dougwilson", "email": "doug@somethingdoug.com" }, - "_npmVersion": "2.15.1", + "_npmVersion": "2.15.9", "_phantomChildren": {}, "_requested": { - "raw": "mime-db@~1.23.0", + "raw": "mime-db@~1.24.0", "scope": null, "escapedName": "mime-db", "name": "mime-db", - "rawSpec": "~1.23.0", - "spec": ">=1.23.0 <1.24.0", + "rawSpec": "~1.24.0", + "spec": ">=1.24.0 <1.25.0", "type": "range" }, "_requiredBy": [ "/request/mime-types" ], - "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "_shasum": "a31b4070adaea27d732ea333740a64d0ec9a6659", + "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.24.0.tgz", + "_shasum": "e2d13f939f0016c6e4e9ad25a8652f126c467f0c", "_shrinkwrap": null, - "_spec": "mime-db@~1.23.0", + "_spec": "mime-db@~1.24.0", "_where": "/Users/rebecca/code/npm/node_modules/request/node_modules/mime-types", "bugs": { "url": "https://github.com/jshttp/mime-db/issues" @@ -68,20 +67,20 @@ "dependencies": {}, "description": "Media Type Database", "devDependencies": { - "bluebird": "3.3.5", + "bluebird": "3.4.6", "co": "4.6.0", "cogent": "1.0.1", - "csv-parse": "1.1.0", + "csv-parse": "1.1.7", "gnode": "0.1.2", - "istanbul": "0.4.3", + "istanbul": "0.4.5", "mocha": "1.21.5", - "raw-body": "2.1.6", + "raw-body": "2.1.7", "stream-to-array": "2.3.0" }, "directories": {}, "dist": { - "shasum": "a31b4070adaea27d732ea333740a64d0ec9a6659", - "tarball": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" + "shasum": "e2d13f939f0016c6e4e9ad25a8652f126c467f0c", + "tarball": "https://registry.npmjs.org/mime-db/-/mime-db-1.24.0.tgz" }, "engines": { "node": ">= 0.6" @@ -93,7 +92,7 @@ "db.json", "index.js" ], - "gitHead": "ba0d99fd05b3bfdc2ebcd78f858c25cb7db6af41", + "gitHead": "9dd00b34556a8cdd6f3385f09d4989298c4b86e1", "homepage": "https://github.com/jshttp/mime-db#readme", "keywords": [ "mime", @@ -130,5 +129,5 @@ "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", "update": "npm run fetch && npm run build" }, - "version": "1.23.0" + "version": "1.24.0" } diff --git a/deps/npm/node_modules/request/node_modules/mime-types/package.json b/deps/npm/node_modules/request/node_modules/mime-types/package.json index dae8f5a70a0c2e..140951c792a707 100644 --- a/deps/npm/node_modules/request/node_modules/mime-types/package.json +++ b/deps/npm/node_modules/request/node_modules/mime-types/package.json @@ -14,20 +14,19 @@ ] ], "_from": "mime-types@>=2.1.7 <2.2.0", - "_id": "mime-types@2.1.11", + "_id": "mime-types@2.1.12", "_inCache": true, - "_installable": true, "_location": "/request/mime-types", - "_nodeVersion": "4.4.3", + "_nodeVersion": "4.5.0", "_npmOperationalInternal": { "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/mime-types-2.1.11.tgz_1462165365027_0.7217204745393246" + "tmp": "tmp/mime-types-2.1.12.tgz_1474237415119_0.03028594213537872" }, "_npmUser": { "name": "dougwilson", "email": "doug@somethingdoug.com" }, - "_npmVersion": "2.15.1", + "_npmVersion": "2.15.9", "_phantomChildren": {}, "_requested": { "raw": "mime-types@~2.1.7", @@ -42,8 +41,8 @@ "/request", "/request/form-data" ], - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", - "_shasum": "c259c471bda808a85d6cd193b430a5fae4473b3c", + "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz", + "_shasum": "152ba256777020dd4663f54c2e7bc26381e71729", "_shrinkwrap": null, "_spec": "mime-types@~2.1.7", "_where": "/Users/rebecca/code/npm/node_modules/request", @@ -67,17 +66,21 @@ } ], "dependencies": { - "mime-db": "~1.23.0" + "mime-db": "~1.24.0" }, "description": "The ultimate javascript content-type utility.", "devDependencies": { - "istanbul": "0.4.3", + "eslint": "3.5.0", + "eslint-config-standard": "6.0.1", + "eslint-plugin-promise": "2.0.1", + "eslint-plugin-standard": "2.0.0", + "istanbul": "0.4.5", "mocha": "1.21.5" }, "directories": {}, "dist": { - "shasum": "c259c471bda808a85d6cd193b430a5fae4473b3c", - "tarball": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" + "shasum": "152ba256777020dd4663f54c2e7bc26381e71729", + "tarball": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz" }, "engines": { "node": ">= 0.6" @@ -87,7 +90,7 @@ "LICENSE", "index.js" ], - "gitHead": "298ffcf490a5d6e60edea7bf7a69036df04846b1", + "gitHead": "7193a9094e2efe31da93988350bb0b32ab18b1ea", "homepage": "https://github.com/jshttp/mime-types#readme", "keywords": [ "mime", @@ -116,9 +119,10 @@ "url": "git+https://github.com/jshttp/mime-types.git" }, "scripts": { + "lint": "eslint **/*.js", "test": "mocha --reporter spec test/test.js", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js", "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js" }, - "version": "2.1.11" + "version": "2.1.12" } diff --git a/deps/npm/node_modules/request/package.json b/deps/npm/node_modules/request/package.json index 8e1c5b8a118203..822499736605cc 100644 --- a/deps/npm/node_modules/request/package.json +++ b/deps/npm/node_modules/request/package.json @@ -2,58 +2,55 @@ "_args": [ [ { - "raw": "request@~2.74.0", + "raw": "request@2.75.0", "scope": null, "escapedName": "request", "name": "request", - "rawSpec": "~2.74.0", - "spec": ">=2.74.0 <2.75.0", - "type": "range" + "rawSpec": "2.75.0", + "spec": "2.75.0", + "type": "version" }, "/Users/rebecca/code/npm" ] ], - "_from": "request@>=2.74.0 <2.75.0", - "_id": "request@2.74.0", + "_from": "request@2.75.0", + "_id": "request@2.75.0", "_inCache": true, - "_installable": true, "_location": "/request", - "_nodeVersion": "6.2.2", + "_nodeVersion": "6.5.0", "_npmOperationalInternal": { "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/request-2.74.0.tgz_1469231082306_0.13140005595050752" + "tmp": "tmp/request-2.75.0.tgz_1474151606844_0.8052814984694123" }, "_npmUser": { "name": "simov", "email": "simeonvelichkov@gmail.com" }, - "_npmVersion": "2.15.6", + "_npmVersion": "2.15.9", "_phantomChildren": { "ansi-regex": "2.0.0", - "inherits": "2.0.1", + "inherits": "2.0.3", "strip-ansi": "3.0.1" }, "_requested": { - "raw": "request@~2.74.0", + "raw": "request@2.75.0", "scope": null, "escapedName": "request", "name": "request", - "rawSpec": "~2.74.0", - "spec": ">=2.74.0 <2.75.0", - "type": "range" + "rawSpec": "2.75.0", + "spec": "2.75.0", + "type": "version" }, "_requiredBy": [ "#USER", "/", "/node-gyp", - "/npm-registry-client", - "/npm-registry-couchapp/couchapp", - "/npm-registry-couchapp/couchapp/nano" + "/npm-registry-client" ], - "_resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", - "_shasum": "7693ca768bbb0ea5c8ce08c084a45efa05b892ab", + "_resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "_shasum": "d2b8268a286da13eaa5d01adf5d18cc90f657d93", "_shrinkwrap": null, - "_spec": "request@~2.74.0", + "_spec": "request@2.75.0", "_where": "/Users/rebecca/code/npm", "author": { "name": "Mikeal Rogers", @@ -70,7 +67,7 @@ "combined-stream": "~1.0.5", "extend": "~3.0.0", "forever-agent": "~0.6.1", - "form-data": "~1.0.0-rc4", + "form-data": "~2.0.0", "har-validator": "~2.0.6", "hawk": "~3.1.3", "http-signature": "~1.1.0", @@ -101,7 +98,7 @@ "karma-cli": "^1.0.0", "karma-coverage": "^1.0.0", "karma-phantomjs-launcher": "^1.0.0", - "karma-tap": "^2.0.1", + "karma-tap": "^3.0.1", "phantomjs-prebuilt": "^2.1.3", "rimraf": "^2.2.8", "server-destroy": "^1.0.1", @@ -110,13 +107,20 @@ }, "directories": {}, "dist": { - "shasum": "7693ca768bbb0ea5c8ce08c084a45efa05b892ab", - "tarball": "https://registry.npmjs.org/request/-/request-2.74.0.tgz" + "shasum": "d2b8268a286da13eaa5d01adf5d18cc90f657d93", + "tarball": "https://registry.npmjs.org/request/-/request-2.75.0.tgz" }, "engines": { "node": ">=0.8.0" }, - "gitHead": "76e82351cbc21049441b1763c6f2bbd504fa8f5a", + "gitHead": "e9f09c2832073858d6d988ba82a2895f36efa92d", + "greenkeeper": { + "ignore": [ + "eslint", + "hawk", + "har-validator" + ] + }, "homepage": "https://github.com/request/request#readme", "license": "Apache-2.0", "main": "index.js", @@ -158,5 +162,5 @@ "util", "utility" ], - "version": "2.74.0" + "version": "2.75.0" } diff --git a/deps/npm/node_modules/request/request.js b/deps/npm/node_modules/request/request.js index 8267c125375af4..96a71b6ed5efd3 100644 --- a/deps/npm/node_modules/request/request.js +++ b/deps/npm/node_modules/request/request.js @@ -958,6 +958,10 @@ Request.prototype.onRequestResponse = function (response) { }) responseContent.on('data', function (chunk) { + if (self.timing && !self.responseStarted) { + self.responseStartTime = (new Date()).getTime() + response.responseStartTime = self.responseStartTime + } self._destdata = true self.emit('data', chunk) }) diff --git a/deps/npm/node_modules/sorted-object/LICENSE.txt b/deps/npm/node_modules/sorted-object/LICENSE.txt index 4a323deb518f3a..2edd064bf5507a 100644 --- a/deps/npm/node_modules/sorted-object/LICENSE.txt +++ b/deps/npm/node_modules/sorted-object/LICENSE.txt @@ -1,3 +1,7 @@ +Dual licensed under WTFPL and MIT: + +--- + Copyright © 2014–2016 Domenic Denicola This work is free. You can redistribute it and/or modify it under the @@ -17,3 +21,27 @@ as published by Sam Hocevar. See below for more details. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. + +--- + +The MIT License (MIT) + +Copyright © 2014–2016 Domenic Denicola + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deps/npm/node_modules/sorted-object/README.md b/deps/npm/node_modules/sorted-object/README.md deleted file mode 100644 index d3f12a27885d6d..00000000000000 --- a/deps/npm/node_modules/sorted-object/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Get a Version of an Object with Sorted Keys - -Although objects in JavaScript are theoretically unsorted, in practice most engines use insertion order—at least, ignoring numeric keys. This manifests itself most prominently when dealing with an object's JSON serialization. - -So, for example, you might be trying to serialize some object to a JSON file. But every time you write it, it ends up being output in a different order, depending on how you created it in the first place! This makes for some ugly diffs. - -**sorted-object** gives you the answer. Just use this package to create a version of your object with its keys sorted before serializing, and you'll get a consistent order every time. - -```js -var sortedObject = require("sorted-object"); - -var objectToSerialize = generateStuffNondeterministically(); - -// Before: -fs.writeFileSync("dest.json", JSON.stringify(objectToSerialize)); - -// After: -var sortedVersion = sortedObject(objectToSerialize); -fs.writeFileSync("dest.json", JSON.stringify(sortedVersion)); -``` diff --git a/deps/npm/node_modules/sorted-object/package.json b/deps/npm/node_modules/sorted-object/package.json index 60a8356bac177b..c4bb99f2b324e8 100644 --- a/deps/npm/node_modules/sorted-object/package.json +++ b/deps/npm/node_modules/sorted-object/package.json @@ -1,45 +1,54 @@ { "_args": [ [ - "sorted-object@latest", + { + "raw": "sorted-object@2.0.1", + "scope": null, + "escapedName": "sorted-object", + "name": "sorted-object", + "rawSpec": "2.0.1", + "spec": "2.0.1", + "type": "version" + }, "/Users/rebecca/code/npm" ] ], - "_from": "sorted-object@latest", - "_id": "sorted-object@2.0.0", + "_from": "sorted-object@2.0.1", + "_id": "sorted-object@2.0.1", "_inCache": true, - "_installable": true, "_location": "/sorted-object", - "_nodeVersion": "5.7.1", + "_nodeVersion": "6.2.2", "_npmOperationalInternal": { "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/sorted-object-2.0.0.tgz_1457910693572_0.6718082851730287" + "tmp": "tmp/sorted-object-2.0.1.tgz_1473550768215_0.1242613298818469" }, "_npmUser": { - "email": "d@domenic.me", - "name": "domenic" + "name": "domenic", + "email": "d@domenic.me" }, - "_npmVersion": "3.6.0", + "_npmVersion": "3.9.5", "_phantomChildren": {}, "_requested": { - "name": "sorted-object", - "raw": "sorted-object@latest", - "rawSpec": "latest", + "raw": "sorted-object@2.0.1", "scope": null, - "spec": "latest", - "type": "tag" + "escapedName": "sorted-object", + "name": "sorted-object", + "rawSpec": "2.0.1", + "spec": "2.0.1", + "type": "version" }, "_requiredBy": [ + "#USER", "/" ], - "_resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.0.tgz", - "_shasum": "1cfea981609047d8043807a490a9d99b317faf7f", + "_resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz", + "_shasum": "7d631f4bd3a798a24af1dffcfbfe83337a5df5fc", "_shrinkwrap": null, - "_spec": "sorted-object@latest", + "_spec": "sorted-object@2.0.1", "_where": "/Users/rebecca/code/npm", "author": { - "email": "d@domenic.me", "name": "Domenic Denicola", + "email": "d@domenic.me", "url": "https://domenic.me/" }, "bugs": { @@ -53,25 +62,25 @@ }, "directories": {}, "dist": { - "shasum": "1cfea981609047d8043807a490a9d99b317faf7f", - "tarball": "http://registry.npmjs.org/sorted-object/-/sorted-object-2.0.0.tgz" + "shasum": "7d631f4bd3a798a24af1dffcfbfe83337a5df5fc", + "tarball": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz" }, "files": [ "lib/" ], - "gitHead": "3cbdde212c8ceef219fbb8fa7805bfc38b94aa90", + "gitHead": "87105deb13d4f4151b2abd1a78d27a5216e3e79d", "homepage": "https://github.com/domenic/sorted-object#readme", "keywords": [ "sort", "keys", "object" ], - "license": "WTFPL", + "license": "(WTFPL OR MIT)", "main": "lib/sorted-object.js", "maintainers": [ { - "email": "domenic@domenicdenicola.com", - "name": "domenic" + "name": "domenic", + "email": "domenic@domenicdenicola.com" } ], "name": "sorted-object", @@ -85,5 +94,5 @@ "lint": "eslint .", "test": "tape test/tests.js" }, - "version": "2.0.0" + "version": "2.0.1" } diff --git a/deps/npm/package.json b/deps/npm/package.json index 55659aab66248a..c1df08e43d4d8b 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "3.10.8", + "version": "3.10.9", "name": "npm", "description": "a package manager for JavaScript", "keywords": [ @@ -35,19 +35,19 @@ "ansistyles": "~0.1.3", "aproba": "~1.0.4", "archy": "~1.0.0", - "asap": "~2.0.4", + "asap": "~2.0.5", "chownr": "~1.0.1", "cmd-shim": "~2.0.2", "columnify": "~1.5.4", - "config-chain": "~1.1.10", + "config-chain": "~1.1.11", "dezalgo": "~1.0.3", "editor": "~1.0.0", "fs-vacuum": "~1.2.9", "fs-write-stream-atomic": "~1.0.8", "fstream": "~1.0.10", "fstream-npm": "~1.2.0", - "glob": "~7.0.6", - "graceful-fs": "~4.1.6", + "glob": "~7.1.0", + "graceful-fs": "~4.1.9", "has-unicode": "~2.0.1", "hosted-git-info": "~2.1.5", "iferr": "~0.1.5", @@ -55,7 +55,7 @@ "inherits": "~2.0.3", "ini": "~1.3.4", "init-package-json": "~1.9.4", - "lockfile": "~1.0.1", + "lockfile": "~1.0.2", "lodash._baseuniq": "~4.6.0", "lodash.clonedeep": "~4.5.0", "lodash.union": "~4.6.0", @@ -73,9 +73,9 @@ "npm-user-validate": "~0.1.5", "npmlog": "~4.0.0", "once": "~1.4.0", - "opener": "~1.4.1", + "opener": "~1.4.2", "osenv": "~0.1.3", - "path-is-inside": "~1.0.1", + "path-is-inside": "~1.0.2", "read": "~1.0.7", "read-cmd-shim": "~1.0.1", "read-installed": "~4.0.3", @@ -83,13 +83,13 @@ "read-package-tree": "~5.1.5", "readable-stream": "~2.1.5", "realize-package-specifier": "~3.0.3", - "request": "~2.74.0", + "request": "~2.75.0", "retry": "~0.10.0", "rimraf": "~2.5.4", "semver": "~5.3.0", "sha": "~2.0.1", "slide": "~1.1.6", - "sorted-object": "~2.0.0", + "sorted-object": "~2.0.1", "strip-ansi": "~3.0.1", "tar": "~2.2.1", "text-table": "~0.2.0", @@ -195,8 +195,8 @@ "require-inject": "~1.4.0", "sprintf-js": "~1.0.3", "standard": "~6.0.8", - "tacks": "~1.2.1", - "tap": "~7.0.0" + "tacks": "~1.2.2", + "tap": "~7.1.2" }, "scripts": { "dumpconf": "env | grep npm | sort | uniq", diff --git a/deps/npm/scripts/changelog.js b/deps/npm/scripts/changelog.js index c60c6c664baea8..abbec4b4e9e17d 100644 --- a/deps/npm/scripts/changelog.js +++ b/deps/npm/scripts/changelog.js @@ -25,7 +25,7 @@ function shortname (url) { if (repo !== 'npm/npm') { return `${repo}#${id}` } else { - return `${id}` + return `#${id}` } } @@ -90,7 +90,7 @@ function main () { } else if (m = line.match(/^Credit: @(.*)/)) { if (!commit.credit) commit.credit = [] commit.credit.push(m[1]) - } else if (m = line.match(/^Fixes: (.*)/)) { + } else if (m = line.match(/^Fixes: #?(.*?)/)) { commit.fixes = m[1] } else if (m = line.match(/^Reviewed-By: @(.*)/)) { commit.reviewed = m[1] diff --git a/deps/npm/scripts/dep-update b/deps/npm/scripts/dep-update new file mode 100755 index 00000000000000..a0aaed7dbcd55a --- /dev/null +++ b/deps/npm/scripts/dep-update @@ -0,0 +1,6 @@ +#!/bin/bash +node . install --save $1@$2 &&\ +git add node_modules/$1/ package.json &&\ +git commit -m"$1@$2" &&\ +node . repo $1 &&\ +git commit --amend diff --git a/deps/npm/scripts/dev-dep-update b/deps/npm/scripts/dev-dep-update new file mode 100755 index 00000000000000..6058cce9427317 --- /dev/null +++ b/deps/npm/scripts/dev-dep-update @@ -0,0 +1,6 @@ +#!/bin/bash +node . install --save --save-dev $1@$2 &&\ +git add package.json &&\ +git commit -m"$1@$2" &&\ +node . repo $1 &&\ +git commit --amend diff --git a/deps/npm/test/tap/bitbucket-https-url-with-creds-package.js b/deps/npm/test/tap/bitbucket-https-url-with-creds-package.js index e5a4142ef3277d..7268b504004fad 100644 --- a/deps/npm/test/tap/bitbucket-https-url-with-creds-package.js +++ b/deps/npm/test/tap/bitbucket-https-url-with-creds-package.js @@ -34,10 +34,10 @@ test('bitbucket-https-url-with-creds-package', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/bitbucket-https-url-with-creds.js b/deps/npm/test/tap/bitbucket-https-url-with-creds.js index 4e9d14d7e01a17..846e3ae74141e5 100644 --- a/deps/npm/test/tap/bitbucket-https-url-with-creds.js +++ b/deps/npm/test/tap/bitbucket-https-url-with-creds.js @@ -31,10 +31,10 @@ test('bitbucket-https-url-with-creds', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/bitbucket-shortcut-package.js b/deps/npm/test/tap/bitbucket-shortcut-package.js index 69cfe6c2059203..37fe57950c2ea5 100644 --- a/deps/npm/test/tap/bitbucket-shortcut-package.js +++ b/deps/npm/test/tap/bitbucket-shortcut-package.js @@ -35,10 +35,10 @@ test('bitbucket-shortcut', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/bitbucket-shortcut.js b/deps/npm/test/tap/bitbucket-shortcut.js index a9b60f8b56818a..a708d84972556a 100644 --- a/deps/npm/test/tap/bitbucket-shortcut.js +++ b/deps/npm/test/tap/bitbucket-shortcut.js @@ -32,10 +32,10 @@ test('bitbucket-shortcut', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gist-short-shortcut-package.js b/deps/npm/test/tap/gist-short-shortcut-package.js index 02457b4dc9e599..c15e1df7e205a6 100644 --- a/deps/npm/test/tap/gist-short-shortcut-package.js +++ b/deps/npm/test/tap/gist-short-shortcut-package.js @@ -35,10 +35,10 @@ test('gist-short-shortcut-package', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gist-short-shortcut.js b/deps/npm/test/tap/gist-short-shortcut.js index 58dcf78e8d2229..c7d217f9a9ed1e 100644 --- a/deps/npm/test/tap/gist-short-shortcut.js +++ b/deps/npm/test/tap/gist-short-shortcut.js @@ -32,10 +32,10 @@ test('gist-shortcut', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gist-shortcut-package.js b/deps/npm/test/tap/gist-shortcut-package.js index 370476ac80771f..e35ab71e840876 100644 --- a/deps/npm/test/tap/gist-shortcut-package.js +++ b/deps/npm/test/tap/gist-shortcut-package.js @@ -35,10 +35,10 @@ test('gist-shortcut-package', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gist-shortcut.js b/deps/npm/test/tap/gist-shortcut.js index e975a09b3e72c4..3b48e47009dcf2 100644 --- a/deps/npm/test/tap/gist-shortcut.js +++ b/deps/npm/test/tap/gist-shortcut.js @@ -32,10 +32,10 @@ test('gist-shortcut', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/git-races.js b/deps/npm/test/tap/git-races.js index 6bbfe78bd79ca9..f275455cd04d70 100644 --- a/deps/npm/test/tap/git-races.js +++ b/deps/npm/test/tap/git-races.js @@ -60,9 +60,12 @@ function cleanup () { var npm = requireInject.installGlobally('../../lib/npm.js', { 'child_process': { 'execFile': function (cmd, args, options, cb) { + // on win 32, the following prefix is added in utils/git.js + // $ git -c core.longpaths=true clone + var i = process.platform === 'win32' ? 2 : 0 // If it's a clone we swap any requests for any of the urls we're mocking // with the path to the bare repo - if (args[0] === 'clone') { + if (args[i] === 'clone') { var m2 = args.length - 2 var m1 = args.length - 1 if (testrepos[args[m2]]) { @@ -72,7 +75,7 @@ var npm = requireInject.installGlobally('../../lib/npm.js', { execFile(cmd, args, options, cb) // here, we intercept npm validating the remote origin url on one of the // clones we've done previously and return the original url that was requested - } else if (args[0] === 'config' && args[1] === '--get' && args[2] === 'remote.origin.url') { + } else if (args[i] === 'config' && args[i + 1] === '--get' && args[i + 2] === 'remote.origin.url') { process.nextTick(function () { cb(null, testurls[options.cwd], '') }) diff --git a/deps/npm/test/tap/github-shortcut-package.js b/deps/npm/test/tap/github-shortcut-package.js index 13c6806b01c812..e1a4b306cc19c2 100644 --- a/deps/npm/test/tap/github-shortcut-package.js +++ b/deps/npm/test/tap/github-shortcut-package.js @@ -35,10 +35,10 @@ test('github-shortcut-package', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gitlab-shortcut-package.js b/deps/npm/test/tap/gitlab-shortcut-package.js index 76cd7f911bb277..335bc4d60ac78b 100644 --- a/deps/npm/test/tap/gitlab-shortcut-package.js +++ b/deps/npm/test/tap/gitlab-shortcut-package.js @@ -34,10 +34,10 @@ test('gitlab-shortcut-package', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/gitlab-shortcut.js b/deps/npm/test/tap/gitlab-shortcut.js index 96da268ee03c05..dcba064bc11ce9 100644 --- a/deps/npm/test/tap/gitlab-shortcut.js +++ b/deps/npm/test/tap/gitlab-shortcut.js @@ -31,10 +31,10 @@ test('gitlab-shortcut', function (t) { 'child_process': { 'execFile': function (cmd, args, options, cb) { process.nextTick(function () { - if (args[0] !== 'clone') return cb(null, '', '') + if (args.indexOf('clone') === -1) return cb(null, '', '') var cloneUrl = cloneUrls.shift() if (cloneUrl) { - t.is(args[3], cloneUrl[0], cloneUrl[1]) + t.is(args[args.length - 2], cloneUrl[0], cloneUrl[1]) } else { t.fail('too many attempts to clone') } diff --git a/deps/npm/test/tap/install-bin-null.js b/deps/npm/test/tap/install-bin-null.js new file mode 100644 index 00000000000000..f45528a75acf45 --- /dev/null +++ b/deps/npm/test/tap/install-bin-null.js @@ -0,0 +1,91 @@ +var fs = require('graceful-fs') +var path = require('path') + +var mkdirp = require('mkdirp') +var osenv = require('osenv') +var rimraf = require('rimraf') +var test = require('tap').test + +var common = require('../common-tap.js') + +var pkg = path.join(__dirname, 'install-bin-null') + +var EXEC_OPTS = { cwd: pkg } + +var parentPkg = { + name: 'parent-package', + version: '0.0.0', + dependencies: { + 'child-package-a': 'file:./child-package-a', + 'child-package-b': 'file:./child-package-b' + } +} + +var childPkgA = { + name: 'child-package-a', + version: '0.0.0', + bin: 'index.js' +} + +var childPkgB = { + name: 'child-package-b', + version: '0.0.0', + dependencies: { + 'grandchild-package': 'file:../grandchild-package' + } +} + +var grandchildPkg = { + name: 'grandchild-package', + version: '0.0.0', + bin: null +} + +var pkgs = [childPkgA, childPkgB, grandchildPkg] + +test('the grandchild has bin:null', function (t) { + setup() + common.npm(['install'], EXEC_OPTS, function (err, code, stdout, stderr) { + t.ifErr(err, 'npm link finished without error') + t.equal(code, 0, 'exited ok') + t.ok(stdout, 'output indicating success') + t.notOk(stderr, 'no output stderr') + t.end() + }) +}) + +test('cleanup', function (t) { + cleanup() + t.end() +}) + +function cleanup () { + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +function setup () { + cleanup() + mkdirp.sync(pkg) + fs.writeFileSync( + path.join(pkg, 'package.json'), + JSON.stringify(parentPkg, null, 2) + ) + pkgs.forEach(function (json) { + process.chdir(mkPkg(json)) + }) + fs.writeFileSync( + path.join(pkg, childPkgA.name, 'index.js'), + '' + ) +} + +function mkPkg (json) { + var pkgPath = path.resolve(pkg, json.name) + mkdirp.sync(pkgPath) + fs.writeFileSync( + path.join(pkgPath, 'package.json'), + JSON.stringify(json, null, 2) + ) + return pkgPath +} diff --git a/deps/npm/test/tap/shrinkwrap-lifecycle-cwd.js b/deps/npm/test/tap/shrinkwrap-lifecycle-cwd.js new file mode 100644 index 00000000000000..8d5210c4048d5b --- /dev/null +++ b/deps/npm/test/tap/shrinkwrap-lifecycle-cwd.js @@ -0,0 +1,89 @@ +'use strict' +var path = require('path') +var test = require('tap').test +var mr = require('npm-registry-mock') +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir +var extend = Object.assign || require('util')._extend +var common = require('../common-tap.js') + +var basedir = path.join(__dirname, path.basename(__filename, '.js')) +var testdir = path.join(basedir, 'testdir') +var cachedir = path.join(basedir, 'cache') +var globaldir = path.join(basedir, 'global') +var tmpdir = path.join(basedir, 'tmp') +var escapeArg = require('../../lib/utils/escape-arg.js') + +var conf = { + cwd: testdir, + env: extend({ + npm_config_cache: cachedir, + npm_config_tmp: tmpdir, + npm_config_prefix: globaldir, + npm_config_registry: common.registry, + npm_config_loglevel: 'warn' + }, process.env) +} + +var server +var fixture = new Tacks(Dir({ + cache: Dir(), + global: Dir(), + tmp: Dir(), + testdir: Dir({ + node_modules: Dir({}), + 'package.json': File({ + name: '13252', + version: '1.0.0', + scripts: { + // add this to the end of the command to preserve the debug log: + // || mv npm-debug.log real-debug.log + // removed for windows compat reasons + abc: escapeArg(common.nodeBin) + ' ' + escapeArg(common.bin) + ' shrinkwrap', + shrinkwrap: escapeArg(common.nodeBin) + ' scripts/shrinkwrap.js' + } + }), + scripts: Dir({ + 'shrinkwrap.js': File( + 'console.log("OK " + process.cwd())' + ) + }) + }) +})) + +function setup () { + cleanup() + fixture.create(basedir) +} + +function cleanup () { + fixture.remove(basedir) +} + +test('setup', function (t) { + setup() + mr({port: common.port, throwOnUnmatched: true}, function (err, s) { + if (err) throw err + server = s + t.done() + }) +}) + +test('shrinkwrap-lifecycle-cwd', function (t) { + common.npm(['run', 'abc'], conf, function (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'command ran ok') + t.comment(stdout.trim()) + t.comment(stderr.trim()) + t.match(stdout.trim(), 'OK ' + testdir, 'got output from lifecycle script') + t.is(stderr.trim().length, 0, 'no errors') + t.done() + }) +}) + +test('cleanup', function (t) { + server.close() + cleanup() + t.done() +}) diff --git a/deps/npm/test/tap/tagged-version-matching.js b/deps/npm/test/tap/tagged-version-matching.js new file mode 100644 index 00000000000000..f7d51d90b7e122 --- /dev/null +++ b/deps/npm/test/tap/tagged-version-matching.js @@ -0,0 +1,162 @@ +'use strict' +var path = require('path') +var test = require('tap').test +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir +var extend = Object.assign || require('util')._extend +var common = require('../common-tap.js') + +var basedir = path.join(__dirname, path.basename(__filename, '.js')) +var testdir = path.join(basedir, 'testdir') +var cachedir = path.join(basedir, 'cache') +var globaldir = path.join(basedir, 'global') +var tmpdir = path.join(basedir, 'tmp') + +var conf = { + cwd: testdir, + env: extend({ + npm_config_cache: cachedir, + npm_config_tmp: tmpdir, + npm_config_prefix: globaldir, + npm_config_registry: common.registry, + npm_config_loglevel: 'warn' + }, process.env) +} + +var fixture = new Tacks(Dir({ + cache: Dir(), + global: Dir(), + tmp: Dir(), + testdir: Dir({ + node_modules: Dir({ + example: Dir({ + 'package.json': File({ + _from: 'example', + _id: 'example@1.0.0', + _requested: { + raw: 'example@file:example', + scope: null, + escapedName: 'example', + name: 'example', + rawSpec: 'file:example', + type: 'directory' + }, + dependencies: { + tagdep: 'latest', + gitdep: 'npm/example-gitdep' + }, + name: 'example', + version: '1.0.0' + }) + }), + gitdep: Dir({ + 'package.json': File({ + _from: 'npm/example-gitdep', + _id: 'gitdep@1.0.0', + _requested: { + raw: 'gitdep@git://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + scope: null, + escapedName: 'gitdep', + name: 'gitdep', + rawSpec: 'git://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + spec: 'git://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + type: 'hosted', + hosted: { + type: 'github', + ssh: 'git@github.com:npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + sshUrl: 'git+ssh://git@github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + httpsUrl: 'git+https://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + gitUrl: 'git://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709', + shortcut: 'github:npm/example-gitdep#da39a3ee5e6b4b0d3255bfef95601890afd80709', + directUrl: 'https://raw.githubusercontent.com/npm/example-gitdep/da39a3ee5e6b4b0d3255bfef95601890afd80709/package.json' + } + }, + name: 'gitdep', + version: '1.0.0' + }) + }), + tagdep: Dir({ + 'package.json': File({ + _from: 'tagdep@latest', + _id: 'tagdep@1.0.0', + _requested: { + raw: 'tagdep@https://registry.example.com/tagdep/-/tagdep-1.0.0.tgz', + scope: null, + escapedName: 'tagdep', + name: 'tagdep', + rawSpec: 'https://registry.example.com/tagdep/-/tagdep-1.0.0.tgz', + spec: 'https://registry.example.com/tagdep/-/tagdep-1.0.0.tgz', + type: 'remote' + }, + name: 'tagdep', + version: '1.0.0' + }) + }) + }), + 'npm-shrinkwrap.json': File({ + name: 'tagged-version-matching', + version: '1.0.0', + dependencies: { + tagdep: { + version: '1.0.0', + from: 'tagdep@latest', + resolved: 'https://registry.example.com/tagdep/-/tagdep-1.0.0.tgz' + }, + example: { + version: '1.0.0', + from: 'example' + }, + gitdep: { + version: '1.0.0', + from: 'npm/example-gitdep', + resolved: 'git://github.com/npm/example-gitdep.git#da39a3ee5e6b4b0d3255bfef95601890afd80709' + } + } + }), + 'package.json': File({ + name: 'tagged-version-matching', + version: '1.0.0', + dependencies: { + example: 'file:example', + gitdep: 'npm/example-gitdep' + } + }) + }) +})) + +function setup () { + cleanup() + fixture.create(basedir) +} + +function cleanup () { + fixture.remove(basedir) +} + +test('setup', function (t) { + setup() + t.done() +}) + +test('tagged-version-matching', function (t) { + common.npm(['ls', '--json'], conf, function (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'command ran ok') + if (stderr.trim()) t.comment(stderr.trim()) + var result = JSON.parse(stdout.trim()) + var problems = result.problems || [] + // Original PR: https://github.com/npm/npm/pull/13941 + // Original issue: https://github.com/npm/npm/issues/13496 + // Original issue: https://github.com/npm/npm/issues/11736 + t.is(problems.length, 0, 'no problems') + t.ok(!problems.some(function (err) { return /missing: tagdep/.test(err) }), 'tagged dependency matched ok') + t.ok(!problems.some(function (err) { return /missing: gitdep/.test(err) }), 'git dependency matched ok') + t.done() + }) +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) diff --git a/deps/npm/test/tap/upgrade-lifecycles.js b/deps/npm/test/tap/upgrade-lifecycles.js new file mode 100644 index 00000000000000..f15fe0038e1d06 --- /dev/null +++ b/deps/npm/test/tap/upgrade-lifecycles.js @@ -0,0 +1,89 @@ +'use strict' +var path = require('path') +var test = require('tap').test +var Tacks = require('tacks') +var File = Tacks.File +var Dir = Tacks.Dir +var extend = Object.assign || require('util')._extend +var common = require('../common-tap.js') + +var basedir = path.join(__dirname, path.basename(__filename, '.js')) +var testdir = path.join(basedir, 'testdir') +var cachedir = path.join(basedir, 'cache') +var globaldir = path.join(basedir, 'global') +var tmpdir = path.join(basedir, 'tmp') + +var conf = { + cwd: testdir, + env: extend({ + npm_config_cache: cachedir, + npm_config_tmp: tmpdir, + npm_config_prefix: globaldir, + npm_config_registry: common.registry, + npm_config_loglevel: 'warn' + }, process.env) +} + +var cycler = { + name: 'cycler', + version: '1.0.0', + scripts: { + uninstall: 'echo #UNINSTALL#', + install: 'echo #INSTALL#' + } +} + +var fixture = new Tacks(Dir({ + cache: Dir(), + global: Dir(), + tmp: Dir(), + testdir: Dir({ + 'cycler': Dir({ + 'package.json': File(cycler) + }), + node_modules: Dir({ + 'cycler': Dir({ + 'package.json': File(cycler) + }) + }), + 'package.json': File({ + name: 'upgrade-lifecycles', + version: '1.0.0', + dependencies: { + 'cycler': 'file:cycler' + } + }) + }) +})) + +function setup () { + cleanup() + fixture.create(basedir) +} + +function cleanup () { + fixture.remove(basedir) +} + +test('setup', function (t) { + setup() + t.done() +}) + +test('upgrade-lifecycles', function (t) { + common.npm(['install', 'file:cycler'], conf, function (err, code, stdout, stderr) { + if (err) throw err + t.is(code, 0, 'command ran ok') + + t.comment(stdout.trim()) + t.comment(stderr.trim()) + t.match(stdout, /#INSTALL#/, 'ran install lifecycle') + t.match(stdout, /#UNINSTALL#/, 'ran uninstall lifecycle') + t.done() + }) +}) + +test('cleanup', function (t) { + cleanup() + t.done() +}) diff --git a/deps/npm/test/tap/version-sub-directory-shrinkwrap.js b/deps/npm/test/tap/version-sub-directory-shrinkwrap.js new file mode 100644 index 00000000000000..0455b62ab7536a --- /dev/null +++ b/deps/npm/test/tap/version-sub-directory-shrinkwrap.js @@ -0,0 +1,80 @@ +var common = require('../common-tap.js') +var fs = require('fs') +var path = require('path') + +var mkdirp = require('mkdirp') +var osenv = require('osenv') +var rimraf = require('rimraf') +var test = require('tap').test + +var npm = require('../../lib/npm.js') + +var pkg = path.resolve(__dirname, 'version-sub-directory') +var subDirectory = path.resolve(pkg, 'sub-directory') +var packagePath = path.resolve(pkg, 'package.json') +var shrinkwrapPath = path.resolve(pkg, 'npm-shrinkwrap.json') +var cache = path.resolve(pkg, 'cache') + +var json = { name: 'cat', version: '0.1.2' } + +test('npm version from a subdirectory', function (t) { + setup() + npmLoad() + + function npmLoad () { + npm.load({ cache: cache }, function () { + common.makeGitRepo({ + path: pkg, + added: ['package.json', 'npm-shrinkwrap.json'] + }, version) + }) + } + + function version (er, stdout, stderr) { + t.ifError(er, 'git repo initialized without issue') + t.notOk(stderr, 'no error output') + npm.config.set('sign-git-tag', false) + npm.commands.version(['patch'], checkVersion) + } + + function checkVersion (er) { + var newShrinkwrap = JSON.parse(fs.readFileSync(shrinkwrapPath)) + t.is(newShrinkwrap.version, '0.1.3', 'shrinkwrap has right version') + var newPackage = JSON.parse(fs.readFileSync(packagePath)) + t.is(newPackage.version, '0.1.3', 'package.json has right version') + var git = require('../../lib/utils/git.js') + t.ifError(er, 'version command ran without error') + git.whichAndExec( + ['log'], + { cwd: pkg, env: process.env }, + checkCommit + ) + } + + function checkCommit (er, log, stderr) { + t.ifError(er, 'git log ran without issue') + t.notOk(stderr, 'no error output') + t.ok(log.match(/0\.1\.3/g), 'commited from subdirectory') + t.end() + } +}) + +test('cleanup', function (t) { + cleanup() + t.end() +}) + +function cleanup () { + // windows fix for locked files + process.chdir(osenv.tmpdir()) + rimraf.sync(pkg) +} + +function setup () { + cleanup() + mkdirp.sync(cache) + mkdirp.sync(subDirectory) + process.chdir(subDirectory) + fs.writeFileSync(packagePath, JSON.stringify(json), 'utf8') + fs.writeFileSync(shrinkwrapPath, JSON.stringify(json), 'utf8') +} diff --git a/deps/npm/test/tap/view.js b/deps/npm/test/tap/view.js index e80031b1c2d447..371e1d922de460 100644 --- a/deps/npm/test/tap/view.js +++ b/deps/npm/test/tap/view.js @@ -11,6 +11,8 @@ var t2dir = path.resolve(tmp, 'view-local-notmine') var t3dir = path.resolve(tmp, 'view-local-mine') var mr = require('npm-registry-mock') +var server + test('setup', function (t) { mkdirp.sync(t1dir) mkdirp.sync(t2dir) @@ -29,7 +31,11 @@ test('setup', function (t) { }), 'utf8') t.pass('created fixtures') - t.end() + + mr({ port: common.port, plugin: plugin }, function (er, s) { + server = s + t.end() + }) }) function plugin (server) { @@ -84,294 +90,293 @@ test('npm view . with no package.json', function (t) { test('npm view . with no published package', function (t) { process.chdir(t3dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.', - '--registry=' + common.registry - ], { cwd: t3dir }, function (err, code, stdout, stderr) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 1, 'exit not ok') - t.similar(stderr, /version not found/m) - s.close() - t.end() - }) + common.npm([ + 'view', + '.', + '--registry=' + common.registry + ], { cwd: t3dir }, function (err, code, stdout, stderr) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 1, 'exit not ok') + t.similar(stderr, /version not found/m) + t.end() }) }) test('npm view .', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - var re = new RegExp("name: 'test-repo-url-https'") - t.similar(stdout, re) - s.close() - t.end() - }) + common.npm([ + 'view', + '.', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + var re = new RegExp("name: 'test-repo-url-https'") + t.similar(stdout, re) + t.end() }) }) test('npm view . select fields', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.', - 'main', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), 'index.js', 'should print `index.js`') - s.close() - t.end() - }) + common.npm([ + 'view', + '.', + 'main', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), 'index.js', 'should print `index.js`') + t.end() }) }) test('npm view .@', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.@0.0.0', - 'version', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), '0.0.0', 'should print `0.0.0`') - s.close() - t.end() - }) + common.npm([ + 'view', + '.@0.0.0', + 'version', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), '0.0.0', 'should print `0.0.0`') + t.end() }) }) test('npm view .@ version --json', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.@0.0.0', - 'version', - '--json', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), '"0.0.0"', 'should print `"0.0.0"`') - s.close() - t.end() - }) + common.npm([ + 'view', + '.@0.0.0', + 'version', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), '"0.0.0"', 'should print `"0.0.0"`') + t.end() }) }) test('npm view . --json author name version', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.', - 'author', - 'name', - 'version', - '--json', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - var expected = JSON.stringify({ - author: 'Evan Lucas ', - name: 'test-repo-url-https', - version: '0.0.1' - }, null, 2) - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), expected, 'should print ' + expected) - s.close() - t.end() - }) + common.npm([ + 'view', + '.', + 'author', + 'name', + 'version', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + var expected = JSON.stringify({ + author: 'Evan Lucas ', + name: 'test-repo-url-https', + version: '0.0.1' + }, null, 2) + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), expected, 'should print ' + expected) + t.end() }) }) test('npm view .@ --json author name version', function (t) { process.chdir(t2dir) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - '.@0.0.0', - 'author', - 'name', - 'version', - '--json', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - var expected = JSON.stringify({ - author: 'Evan Lucas ', - name: 'test-repo-url-https', - version: '0.0.0' - }, null, 2) - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), expected, 'should print ' + expected) - s.close() - t.end() - }) + common.npm([ + 'view', + '.@0.0.0', + 'author', + 'name', + 'version', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + var expected = JSON.stringify({ + author: 'Evan Lucas ', + name: 'test-repo-url-https', + version: '0.0.0' + }, null, 2) + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), expected, 'should print ' + expected) + t.end() }) }) test('npm view ', function (t) { - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - 'underscore', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - var re = new RegExp("name: 'underscore'") - t.similar(stdout, re, 'should have name `underscore`') - s.close() - t.end() - }) + common.npm([ + 'view', + 'underscore', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + var re = new RegExp("name: 'underscore'") + t.similar(stdout, re, 'should have name `underscore`') + t.end() }) }) test('npm view --global', function (t) { - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - 'underscore', - '--global', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - var re = new RegExp("name: 'underscore'") - t.similar(stdout, re, 'should have name `underscore`') - s.close() - t.end() - }) + common.npm([ + 'view', + 'underscore', + '--global', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + var re = new RegExp("name: 'underscore'") + t.similar(stdout, re, 'should have name `underscore`') + t.end() }) }) test('npm view @ versions', function (t) { - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - 'underscore@^1.5.0', - 'versions', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - var re = new RegExp('1.5.0') - t.similar(stdout, re, 'should have version `1.5.0`') - s.close() - t.end() - }) + common.npm([ + 'view', + 'underscore@^1.5.0', + 'versions', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + var re = new RegExp('1.5.0') + t.similar(stdout, re, 'should have version `1.5.0`') + t.end() + }) +}) + +test('npm view @ version --json', function (t) { + common.npm([ + 'view', + 'underscore@~1.5.0', + 'version', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), JSON.stringify([ + '1.5.0', + '1.5.1' + ], null, 2), 'should have three versions') + t.end() }) }) test('npm view --json', function (t) { t.plan(3) - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - 'underscore', - '--json', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - s.close() - try { - var out = JSON.parse(stdout.trim()) - t.similar(out, { - maintainers: ['jashkenas '] - }, 'should have the same maintainer') - } catch (er) { - t.fail('Unable to parse JSON') - } - }) + common.npm([ + 'view', + 'underscore', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + try { + var out = JSON.parse(stdout.trim()) + t.similar(out, { + maintainers: ['jashkenas '] + }, 'should have the same maintainer') + } catch (er) { + t.fail('Unable to parse JSON') + } + }) +}) + +test('npm view @', function (t) { + common.npm([ + 'view', + 'underscore@12345', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), '', 'should return empty') + t.end() + }) +}) + +test('npm view @ --json', function (t) { + common.npm([ + 'view', + 'underscore@12345', + '--json', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), '', 'should return empty') + t.end() }) }) test('npm view ', function (t) { - mr({ port: common.port, plugin: plugin }, function (er, s) { - common.npm([ - 'view', - 'underscore', - 'homepage', - '--registry=' + common.registry - ], { cwd: t2dir }, function (err, code, stdout) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 0, 'exit ok') - t.equal(stdout.trim(), 'http://underscorejs.org', - 'homepage should equal `http://underscorejs.org`') - s.close() - t.end() - }) + common.npm([ + 'view', + 'underscore', + 'homepage', + '--registry=' + common.registry + ], { cwd: t2dir }, function (err, code, stdout) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 0, 'exit ok') + t.equal(stdout.trim(), 'http://underscorejs.org', + 'homepage should equal `http://underscorejs.org`') + t.end() }) }) test('npm view with invalid package name', function (t) { var invalidName = 'InvalidPackage' - var obj = {} - obj['/' + invalidName] = [404, {'error': 'not found'}] - - mr({ port: common.port, mocks: { 'get': obj } }, function (er, s) { - common.npm([ - 'view', - invalidName, - '--registry=' + common.registry - ], {}, function (err, code, stdout, stderr) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 1, 'exit not ok') - - t.similar(stderr, new RegExp('is not in the npm registry'), - 'Package should NOT be found') - - t.dissimilar(stderr, new RegExp('use the name yourself!'), - 'Suggestion should not be there') - - t.similar(stderr, new RegExp('name can no longer contain capital letters'), - 'Suggestion about Capital letter should be there') - - s.close() - t.end() - }) + + server.get('/' + invalidName).reply('404', {'error': 'not found'}) + common.npm([ + 'view', + invalidName, + '--registry=' + common.registry + ], {}, function (err, code, stdout, stderr) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 1, 'exit not ok') + + t.similar(stderr, new RegExp('is not in the npm registry'), + 'Package should NOT be found') + + t.dissimilar(stderr, new RegExp('use the name yourself!'), + 'Suggestion should not be there') + + t.similar(stderr, new RegExp('name can no longer contain capital letters'), + 'Suggestion about Capital letter should be there') + + t.end() }) }) test('npm view with valid but non existent package name', function (t) { - mr({ port: common.port, mocks: { - 'get': { - '/valid-but-non-existent-package': [404, {'error': 'not found'}] - } - }}, function (er, s) { - common.npm([ - 'view', - 'valid-but-non-existent-package', - '--registry=' + common.registry - ], {}, function (err, code, stdout, stderr) { - t.ifError(err, 'view command finished successfully') - t.equal(code, 1, 'exit not ok') - - t.similar(stderr, - new RegExp("'valid-but-non-existent-package' is not in the npm registry\."), - 'Package should NOT be found') - - t.similar(stderr, new RegExp('use the name yourself!'), - 'Suggestion should be there') - - s.close() - t.end() - }) + server.get('/valid-but-non-existent-package').reply(404, {'error': 'not found'}) + common.npm([ + 'view', + 'valid-but-non-existent-package', + '--registry=' + common.registry + ], {}, function (err, code, stdout, stderr) { + t.ifError(err, 'view command finished successfully') + t.equal(code, 1, 'exit not ok') + + t.similar(stderr, + new RegExp("'valid-but-non-existent-package' is not in the npm registry\."), + 'Package should NOT be found') + + t.similar(stderr, new RegExp('use the name yourself!'), + 'Suggestion should be there') + + t.end() }) }) @@ -381,5 +386,6 @@ test('cleanup', function (t) { rimraf.sync(t2dir) rimraf.sync(t3dir) t.pass('cleaned up') + server.close() t.end() }) From c70c96a3e2a1c4bf305c07b272f5275ccc0e69c2 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 28 Oct 2016 10:35:58 -0400 Subject: [PATCH 101/119] buffer: coerce offset using Math.trunc() This is a partial revert of 14d1a8a631a58408f1e85365a5f2aaa047cc0a5f, which coerced the offset of Buffer#slice() using the | operator. This causes some edge cases to be handled incorrectly. This commit restores the old behavior, but converts offsets to integers using Math.trunc(). This commit does not revert any tests, and adds an additional regression test. Refs: https://github.com/nodejs/node/issues/9096 Refs: https://github.com/nodejs/node/pull/9101 PR-URL: https://github.com/nodejs/node/pull/9341 Reviewed-By: Sakthipriyan Vairamani Reviewed-By: James M Snell Reviewed-By: Brian White Reviewed-By: Trevor Norris --- lib/buffer.js | 6 ++++-- test/parallel/test-buffer-slice.js | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/buffer.js b/lib/buffer.js index 9754cfeeb50b94..b2325098bcbb9d 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -807,8 +807,10 @@ Buffer.prototype.toJSON = function() { function adjustOffset(offset, length) { - offset |= 0; - if (offset === 0) { + // Use Math.trunc() to convert offset to an integer value that can be larger + // than an Int32. Hence, don't use offset | 0 or similar techniques. + offset = Math.trunc(offset); + if (offset === 0 || Number.isNaN(offset)) { return 0; } else if (offset < 0) { offset += length; diff --git a/test/parallel/test-buffer-slice.js b/test/parallel/test-buffer-slice.js index e5b598e62519e7..076bf33fb07736 100644 --- a/test/parallel/test-buffer-slice.js +++ b/test/parallel/test-buffer-slice.js @@ -72,3 +72,30 @@ assert.strictEqual(0, Buffer.from('hello').slice(0, 0).length); 'bcd' ); } + +{ + const buf = Buffer.from('abcdefg'); + assert.strictEqual(buf.slice(-(-1 >>> 0) - 1).toString(), buf.toString()); +} + +{ + const buf = Buffer.from('abc'); + assert.strictEqual(buf.slice(-0.5).toString(), buf.toString()); +} + +{ + const buf = Buffer.from([ + 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, + 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0 + ]); + const chunk1 = Buffer.from([ + 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0 + ]); + const chunk2 = Buffer.from([ + 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0 + ]); + const middle = buf.length / 2; + + assert.deepStrictEqual(buf.slice(0, middle), chunk1); + assert.deepStrictEqual(buf.slice(middle), chunk2); +} From 9d9ea8127e9f03269ad9f6f476bc5bfa231efbd8 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 2 Nov 2016 20:06:50 -0700 Subject: [PATCH 102/119] test: move timer-dependent test to sequential Timer-dependent tests fail frequently on certain platforms in CI when run in parallel with other tests, likely due to competition for resources. Move test-repl-timeout-throw to sequential to avoid this problem. Also did some minor refactoring (var->const and more use of assert.strictEqual of looser assertions). PR-URL: https://github.com/nodejs/node/pull/9431 Reviewed-By: Colin Ihrig Reviewed-By: Santiago Gimeno Reviewed-By: James M Snell Reviewed-By: Johan Bergstrom --- .../test-repl-timeout-throw.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename test/{parallel => sequential}/test-repl-timeout-throw.js (88%) diff --git a/test/parallel/test-repl-timeout-throw.js b/test/sequential/test-repl-timeout-throw.js similarity index 88% rename from test/parallel/test-repl-timeout-throw.js rename to test/sequential/test-repl-timeout-throw.js index 35bb8967d39a90..0188b3b8c502d8 100644 --- a/test/parallel/test-repl-timeout-throw.js +++ b/test/sequential/test-repl-timeout-throw.js @@ -1,10 +1,10 @@ 'use strict'; const common = require('../common'); -var assert = require('assert'); +const assert = require('assert'); -var spawn = require('child_process').spawn; +const spawn = require('child_process').spawn; -var child = spawn(process.execPath, [ '-i' ], { +const child = spawn(process.execPath, [ '-i' ], { stdio: [null, null, 2] }); @@ -52,8 +52,8 @@ child.stdout.once('data', function() { }); child.on('close', function(c) { - assert(!c); + assert.strictEqual(c, 0); // make sure we got 3 throws, in the end. var lastLine = stdout.trim().split(/\r?\n/).pop(); - assert.equal(lastLine, '> 3'); + assert.strictEqual(lastLine, '> 3'); }); From 4bb9d21d01a533f6ea0e47543e5344681328429e Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 2 Nov 2016 20:22:00 -0700 Subject: [PATCH 103/119] doc: update GOVERNANCE.md to use "meeting chair" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The governance documentation refers to a CTC meeting "moderator" but that is a confusing term. "Meeting chair" seems more correctly descriptive. Change instances of "moderator" to "meeting chair". Refs: https://github.com/nodejs/CTC/issues/23 PR-URL: https://github.com/nodejs/node/pull/9432 Reviewed-By: Rod Vagg Reviewed-By: Evan Lucas Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Josh Gavant Reviewed-By: James M Snell Reviewed-By: Сковорода Никита Андреевич --- GOVERNANCE.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 410257192ea0bf..4e6bca06272375 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -117,7 +117,8 @@ Collaborator activities as well. ### CTC Meetings The CTC meets weekly in a voice conference call. The meeting is run by a -designated moderator approved by the CTC. Each meeting is streamed on YouTube. +designated meeting chair approved by the CTC. Each meeting is streamed on +YouTube. Items are added to the CTC agenda which are considered contentious or are modifications of governance, contribution policy, CTC membership, @@ -129,21 +130,21 @@ group of Collaborators. Any community member or contributor can ask that something be reviewed by the CTC by logging a GitHub issue. Any Collaborator, CTC member, or the -moderator can bring the issue to the CTC's attention by applying the +meeting chair can bring the issue to the CTC's attention by applying the `ctc-review` label. If consensus-seeking among CTC members fails for a particular issue, it may be added to the CTC meeting agenda by adding the `ctc-agenda` label. -Prior to each CTC meeting, the moderator will share the agenda with +Prior to each CTC meeting, the meeting chair will share the agenda with members of the CTC. CTC members can also add items to the agenda at the -beginning of each meeting. The moderator and the CTC cannot veto or remove +beginning of each meeting. The meeting chair and the CTC cannot veto or remove items. The CTC may invite persons or representatives from certain projects to participate in a non-voting capacity. -The moderator is responsible for summarizing the discussion of each agenda item -and sending it as a pull request after the meeting. +The meeting chair is responsible for summarizing the discussion of each agenda +item and sending it as a pull request after the meeting. Due to the challenges of scheduling a global meeting with participants in several timezones, the CTC will seek to resolve as many agenda items as possible @@ -165,8 +166,8 @@ The CTC follows a [Consensus Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model. -When an agenda item has appeared to reach a consensus, the moderator will ask -"Does anyone object?" as a final call for dissent from the consensus. +When an agenda item has appeared to reach a consensus, the meeting chair will +ask "Does anyone object?" as a final call for dissent from the consensus. If an agenda item cannot reach a consensus, a CTC member can call for either a closing vote or a vote to table the issue to the next meeting. All votes From 90aac7ca28e8293fe57f59cd07c59333a8130e25 Mon Sep 17 00:00:00 2001 From: "Sakthipriyan Vairamani (thefourtheye)" Date: Mon, 31 Oct 2016 17:37:24 +0530 Subject: [PATCH 104/119] build: start comments at beginning of line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As the comments are indented in Makefile, they are actually echoed on the screen. This patch makes sure that the comments actually start at the beginning of the line, and so not echoed and ignored. PR-URL: https://github.com/nodejs/node/pull/9375 Reviewed-By: Colin Ihrig Reviewed-By: Johan Bergström Reviewed-By: Roman Reiss Reviewed-By: Gibson Fahnestock Reviewed-By: Prince John Wesley Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 3e30589a6aecf9..5aff7f25c05861 100644 --- a/Makefile +++ b/Makefile @@ -163,8 +163,8 @@ test/addons/.buildstamp: config.gypi \ deps/uv/include/*.h deps/v8/include/*.h \ src/node.h src/node_buffer.h src/node_object_wrap.h src/node_version.h \ test/addons/.docbuildstamp - # Cannot use $(wildcard test/addons/*/) here, it's evaluated before - # embedded addons have been generated from the documentation. +# Cannot use $(wildcard test/addons/*/) here, it's evaluated before +# embedded addons have been generated from the documentation. for dirname in test/addons/*/; do \ echo "\nRunning addons test $$PWD/$$dirname" ; \ $(NODE) deps/npm/node_modules/node-gyp/bin/node-gyp --loglevel=$(LOGLEVEL) rebuild \ @@ -262,7 +262,7 @@ test-timers-clean: ifneq ("","$(wildcard deps/v8/tools/run-tests.py)") test-v8: v8 - # note: performs full test unless QUICKCHECK is specified +# note: performs full test unless QUICKCHECK is specified deps/v8/tools/run-tests.py --arch=$(V8_ARCH) \ --mode=$(BUILDTYPE_LOWER) $(V8_TEST_OPTIONS) $(QUICKCHECK_ARG) \ --no-presubmit \ @@ -270,7 +270,7 @@ test-v8: v8 $(TAP_V8) test-v8-intl: v8 - # note: performs full test unless QUICKCHECK is specified +# note: performs full test unless QUICKCHECK is specified deps/v8/tools/run-tests.py --arch=$(V8_ARCH) \ --mode=$(BUILDTYPE_LOWER) --no-presubmit $(QUICKCHECK_ARG) \ --shell-dir=deps/v8/out/$(V8_ARCH).$(BUILDTYPE_LOWER) intl \ @@ -283,7 +283,7 @@ test-v8-benchmarks: v8 $(TAP_V8_BENCHMARKS) test-v8-all: test-v8 test-v8-intl test-v8-benchmarks - # runs all v8 tests +# runs all v8 tests else test-v8 test-v8-intl test-v8-benchmarks test-v8-all: @echo "Testing v8 is not available through the source tarball." From bc2d1c9d91b5936834f55d66ee56210d1c197737 Mon Sep 17 00:00:00 2001 From: "Sakthipriyan Vairamani (thefourtheye)" Date: Wed, 2 Nov 2016 22:28:02 +0530 Subject: [PATCH 105/119] doc: do not link in the headings If there is a link in the headings, when the ToC is generated, that is not properly linked and the square brackets are left as they are. Even if we fix this, different parts of the heading will link to different sections or even different pages. For example, ### What makes [`Buffer.allocUnsafe()`] and [`Buffer.allocUnsafeSlow()`] "unsafe"? will point to three different sections. `allocUnsafe` and `allocUnsafeSlow` will link to their corresponding sections and all other words actually link to the heading in the document. This could be visually confusing. PR-URL: https://github.com/nodejs/node/pull/9416 Fixes: https://github.com/nodejs/node/issues/9331 Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Minwoo Jung Reviewed-By: Roman Reiss Reviewed-By: Brian White --- doc/api/buffer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/buffer.md b/doc/api/buffer.md index a79db2131e7a44..0849bd6da80936 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -124,7 +124,7 @@ $ node --zero-fill-buffers ``` -### What makes [`Buffer.allocUnsafe()`] and [`Buffer.allocUnsafeSlow()`] "unsafe"? +### What makes `Buffer.allocUnsafe()` and `Buffer.allocUnsafeSlow()` "unsafe"? When calling [`Buffer.allocUnsafe()`] and [`Buffer.allocUnsafeSlow()`], the segment of allocated memory is *uninitialized* (it is not zeroed-out). While From ed8df171351b657c36f265a4e4fd41b6068ba563 Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Sat, 5 Nov 2016 12:59:35 +0000 Subject: [PATCH 106/119] doc: note that tests should include a description Update the Writing Tests guide to specify that tests should include a brief description of what they are designed to test. PR-URL: https://github.com/nodejs/node/pull/9415 Reviewed-By: Santiago Gimeno Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani oc --- doc/guides/writing_tests.md | 53 ++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/doc/guides/writing_tests.md b/doc/guides/writing_tests.md index 0e9d3a17cb3c51..169a9c8e5fa11f 100644 --- a/doc/guides/writing_tests.md +++ b/doc/guides/writing_tests.md @@ -23,23 +23,27 @@ Tests can be added for multiple reasons: Let's analyze this very basic test from the Node.js test suite: ```javascript -1 'use strict'; -2 const common = require('../common'); -3 const http = require('http'); -4 const assert = require('assert'); -5 -6 const server = http.createServer(common.mustCall((req, res) => { -7 res.end('ok'); -8 })); -9 server.listen(0, () => { -10 http.get({ -11 port: server.address().port, -12 headers: {'Test': 'Düsseldorf'} -13 }, common.mustCall((res) => { -14 assert.equal(res.statusCode, 200); -15 server.close(); -16 })); -17 }); +1 'use strict'; +2 const common = require('../common'); +3 +4 // This test ensures that the http-parser can handle UTF-8 characters +5 // in the http header. +6 +7 const http = require('http'); +8 const assert = require('assert'); +9 +10 const server = http.createServer(common.mustCall((req, res) => { +11 res.end('ok'); +12 })); +13 server.listen(0, () => { +14 http.get({ +15 port: server.address().port, +16 headers: {'Test': 'Düsseldorf'} +17 }, common.mustCall((res) => { +18 assert.strictEqual(res.statusCode, 200); +19 server.close(); +20 })); +21 }); ``` **Lines 1-2** @@ -60,7 +64,18 @@ require('../common'); Why? It checks for leaks of globals. -**Lines 3-4** +**Lines 4-5** + +```javascript +// This test ensures that the http-parser can handle UTF-8 characters +// in the http header. +``` + +A test should start with a comment containing a brief description of what it is +designed to test. + + +**Lines 7-8** ```javascript const http = require('http'); @@ -72,7 +87,7 @@ modules should only include core modules. The `assert` module is used by most of the tests to check that the assumptions for the test are met. -**Lines 6-17** +**Lines 10-21** This is the body of the test. This test is quite simple, it just tests that an HTTP server accepts `non-ASCII` characters in the headers of an incoming From 675a4b20b6bc76855983836dd57983e27a238e0e Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Sat, 5 Nov 2016 12:59:49 +0000 Subject: [PATCH 107/119] test: update http-header-obstext PR-URL: https://github.com/nodejs/node/pull/9415 Reviewed-By: Santiago Gimeno Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani --- test/parallel/test-http-header-obstext.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-http-header-obstext.js b/test/parallel/test-http-header-obstext.js index b3422cf0ced181..8762c753206a80 100644 --- a/test/parallel/test-http-header-obstext.js +++ b/test/parallel/test-http-header-obstext.js @@ -1,6 +1,9 @@ 'use strict'; - const common = require('../common'); + +// This test ensures that the http-parser can handle UTF-8 characters +// in the http header. + const http = require('http'); const assert = require('assert'); @@ -12,7 +15,7 @@ server.listen(0, () => { port: server.address().port, headers: {'Test': 'Düsseldorf'} }, common.mustCall((res) => { - assert.equal(res.statusCode, 200); + assert.strictEqual(res.statusCode, 200); server.close(); })); }); From 4c4132e5d38f40043c064a22c64e917575401fa0 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 2 Nov 2016 12:36:06 -0700 Subject: [PATCH 108/119] doc: update minute-taking procedure for CTC The doc says that the CTC moderator is responsible for taking minutes. This change updates the doc to say that the moderator is responsible for making sure that notes are taken, but not necessarily taking the notes themselves. PR-URL: https://github.com/nodejs/node/pull/9425 Reviewed-By: Josh Gavant Reviewed-By: Evan Lucas Reviewed-By: Michael Dawson --- GOVERNANCE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 4e6bca06272375..417c16e04e7ae3 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -143,8 +143,8 @@ items. The CTC may invite persons or representatives from certain projects to participate in a non-voting capacity. -The meeting chair is responsible for summarizing the discussion of each agenda -item and sending it as a pull request after the meeting. +The meeting chair is responsible for ensuring that minutes are taken and that a +pull request with the minutes is submitted after the meeting. Due to the challenges of scheduling a global meeting with participants in several timezones, the CTC will seek to resolve as many agenda items as possible From f640bafc5813589d70d15c1b72ed04e973728eea Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Fri, 4 Nov 2016 11:01:26 +0100 Subject: [PATCH 109/119] test: fix flaky test-force-repl-with-eval MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the timer just in case the test takes longer to complete. PR-URL: https://github.com/nodejs/node/pull/9460 Reviewed-By: Colin Ihrig Reviewed-By: Rich Trott Reviewed-By: Michaël Zasso --- test/parallel/test-force-repl-with-eval.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/parallel/test-force-repl-with-eval.js b/test/parallel/test-force-repl-with-eval.js index a285db8e57d930..e5044ba59df4d5 100644 --- a/test/parallel/test-force-repl-with-eval.js +++ b/test/parallel/test-force-repl-with-eval.js @@ -1,14 +1,11 @@ 'use strict'; -const common = require('../common'); +require('../common'); const assert = require('assert'); const spawn = require('child_process').spawn; // spawn a node child process in "interactive" mode (force the repl) and eval const cp = spawn(process.execPath, ['-i', '-e', 'console.log("42")']); var gotToEnd = false; -const timeoutId = setTimeout(function() { - throw new Error('timeout!'); -}, common.platformTimeout(1000)); // give node + the repl 1 second to boot up cp.stdout.setEncoding('utf8'); @@ -16,7 +13,6 @@ var output = ''; cp.stdout.on('data', function(b) { output += b; if (output === '> 42\n') { - clearTimeout(timeoutId); gotToEnd = true; cp.kill(); } From 6eb6816e22f3863bb12563f2b507a40529793db5 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Fri, 4 Nov 2016 09:55:36 +0100 Subject: [PATCH 110/119] test: fix flaky test-net-GH-5504 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The test is failing on `SmartOS` quite often. Removing the timeout seems to fix it. Fixes: https://github.com/nodejs/node/issues/8930 PR-URL: https://github.com/nodejs/node/pull/9461 Reviewed-By: Ben Noordhuis Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso --- test/sequential/test-net-GH-5504.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/sequential/test-net-GH-5504.js b/test/sequential/test-net-GH-5504.js index c6e4e8e3d6a2b7..3ebf9db548d4db 100644 --- a/test/sequential/test-net-GH-5504.js +++ b/test/sequential/test-net-GH-5504.js @@ -48,14 +48,6 @@ function parent() { var spawn = require('child_process').spawn; var node = process.execPath; - setTimeout(function() { - if (s) s.kill(); - if (c) c.kill(); - setTimeout(function() { - throw new Error('hang'); - }); - }, common.platformTimeout(2000)).unref(); - var s = spawn(node, [__filename, 'server'], { env: Object.assign(process.env, { NODE_DEBUG: 'net' From b083086ff2c5a07ab09fcd2eb8e169b8fbe75c28 Mon Sep 17 00:00:00 2001 From: solebox <5013box@gmail.com> Date: Tue, 1 Nov 2016 00:35:27 +0200 Subject: [PATCH 111/119] vm: name anonymous functions Name anonymous arrow function in vm module to improve readability PR-URL: https://github.com/nodejs/node/pull/9388 Reviewed-By: Luigi Pinca Reviewed-By: James Snell Reviewed-By: Benjamin Gruenbaum Ref: #8913 --- lib/vm.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/vm.js b/lib/vm.js index 73359c1b6825b0..4869d368807665 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -18,9 +18,10 @@ const realRunInContext = Script.prototype.runInContext; Script.prototype.runInThisContext = function(options) { if (options && options.breakOnSigint) { - return sigintHandlersWrap(() => { + const realRunInThisContextScript = () => { return realRunInThisContext.call(this, options); - }); + }; + return sigintHandlersWrap(realRunInThisContextScript); } else { return realRunInThisContext.call(this, options); } @@ -28,9 +29,10 @@ Script.prototype.runInThisContext = function(options) { Script.prototype.runInContext = function(contextifiedSandbox, options) { if (options && options.breakOnSigint) { - return sigintHandlersWrap(() => { + const realRunInContextScript = () => { return realRunInContext.call(this, contextifiedSandbox, options); - }); + }; + return sigintHandlersWrap(realRunInContextScript); } else { return realRunInContext.call(this, contextifiedSandbox, options); } From 44792f83bf6246f77f4b4d2ff527c953504639eb Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 3 Nov 2016 11:32:06 -0700 Subject: [PATCH 112/119] benchmark,lib,test,tools: remove unneeded . escape The `.` character does not need to be escaped when it appears inside a regular expression character class. This removes instances of unnecessary escapes of the `.` character. This also removes a few unnecessary escapes of the `(` and `)` characters within character classes too. PR-URL: https://github.com/nodejs/node/pull/9449 Reviewed-By: Roman Reiss Reviewed-By: Colin Ihrig Reviewed-By: Minwoo Jung Reviewed-By: James Snell --- benchmark/_http-benchmarkers.js | 2 +- lib/_tls_wrap.js | 2 +- test/parallel/test-repl.js | 2 +- tools/doc/json.js | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/benchmark/_http-benchmarkers.js b/benchmark/_http-benchmarkers.js index ca8b4625066f67..581bed6b2dc9e6 100644 --- a/benchmark/_http-benchmarkers.js +++ b/benchmark/_http-benchmarkers.js @@ -37,7 +37,7 @@ AutocannonBenchmarker.prototype.processResults = function(output) { function WrkBenchmarker() { this.name = 'wrk'; - this.regexp = /Requests\/sec:[ \t]+([0-9\.]+)/; + this.regexp = /Requests\/sec:[ \t]+([0-9.]+)/; const result = child_process.spawnSync('wrk', ['-h']); this.present = !(result.error && result.error.code === 'ENOENT'); } diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index c31ae76651c0ab..478fd20188196d 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -919,7 +919,7 @@ Server.prototype.addContext = function(servername, context) { } var re = new RegExp('^' + - servername.replace(/([\.^$+?\-\\[\]{}])/g, '\\$1') + servername.replace(/([.^$+?\-\\[\]{}])/g, '\\$1') .replace(/\*/g, '[^.]*') + '$'); this._contexts.push([re, tls.createSecureContext(context).context]); diff --git a/test/parallel/test-repl.js b/test/parallel/test-repl.js index a6603332aad672..29c85e36076dbd 100644 --- a/test/parallel/test-repl.js +++ b/test/parallel/test-repl.js @@ -72,7 +72,7 @@ function error_test() { if (read_buffer !== client_unix.expect) { var expect = client_unix.expect; if (expect === prompt_multiline) - expect = /[\.]{3} /; + expect = /[.]{3} /; assert.ok(read_buffer.match(expect)); console.error('match'); } diff --git a/tools/doc/json.js b/tools/doc/json.js index a194c7f7231423..a782c54028d756 100644 --- a/tools/doc/json.js +++ b/tools/doc/json.js @@ -545,12 +545,12 @@ function deepCopy_(src) { // these parse out the contents of an H# tag var eventExpr = /^Event(?::|\s)+['"]?([^"']+).*$/i; var classExpr = /^Class:\s*([^ ]+).*?$/i; -var propExpr = /^(?:property:?\s*)?[^\.]+\.([^ \.\(\)]+)\s*?$/i; -var braceExpr = /^(?:property:?\s*)?[^\.\[]+(\[[^\]]+\])\s*?$/i; +var propExpr = /^(?:property:?\s*)?[^.]+\.([^ .()]+)\s*?$/i; +var braceExpr = /^(?:property:?\s*)?[^.\[]+(\[[^\]]+\])\s*?$/i; var classMethExpr = - /^class\s*method\s*:?[^\.]+\.([^ \.\(\)]+)\([^\)]*\)\s*?$/i; + /^class\s*method\s*:?[^.]+\.([^ .()]+)\([^)]*\)\s*?$/i; var methExpr = - /^(?:method:?\s*)?(?:[^\.]+\.)?([^ \.\(\)]+)\([^\)]*\)\s*?$/i; + /^(?:method:?\s*)?(?:[^.]+\.)?([^ .()]+)\([^)]*\)\s*?$/i; var newExpr = /^new ([A-Z][a-zA-Z]+)\([^\)]*\)\s*?$/; var paramExpr = /\((.*)\);?$/; From 1109d0b2449b177b41e7737d9d4c0da78d6312bc Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 4 Nov 2016 08:17:21 +0100 Subject: [PATCH 113/119] build: reduce noise from doc target The doc target currently echos the complete shell command, which might produces a lot of output. Using this change the actual commands run are still shown. Before: [ -e tools/doc/node_modules/js-yaml/package.json ] || \ [ -e tools/eslint/node_modules/js-yaml/package.json ] || \ if [ -x ./node ]; then \ cd tools/doc && ../.././node ../.././deps/npm/bin/npm-cli.js install; \ else \ cd tools/doc && node ../.././deps/npm/bin/npm-cli.js install; \ fi [ -x ./node ] && ./node tools/doc/generate.js --node-version=v8.0.0 --format=html --template=doc/template.html doc/api/assert.md > out/doc/api/assert.html || node tools/doc/generate.js --node-version=v8.0.0 --format=html --template=doc/template.html doc/api/assert.md > out/doc/api/assert.html Input file = doc/api/assert.md After: [ -x ./node ] && ./node tools/doc/generate.js --node-version=v8.0.0 --format=html --template=doc/template.html doc/api/assert.md > out/doc/api/assert.html || node tools/doc/generate.js --node-version=v8.0.0 --format=html --template=doc/template.html doc/api/assert.md > out/doc/api/assert.html Input file = doc/api/assert.md To verify run: $ make docclean $ make doc PR-URL: https://github.com/nodejs/node/pull/9457 Reviewed-By: Colin Ihrig Reviewed-By: Jeremiah Senkpiel Reviewed-By: James Snell --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 5aff7f25c05861..369fa22a7a7dbd 100644 --- a/Makefile +++ b/Makefile @@ -315,7 +315,7 @@ out/doc/%: doc/% # check if ./node is actually set, else use user pre-installed binary gen-json = tools/doc/generate.js --format=json $< > $@ out/doc/api/%.json: doc/api/%.md - [ -e tools/doc/node_modules/js-yaml/package.json ] || \ + @[ -e tools/doc/node_modules/js-yaml/package.json ] || \ [ -e tools/eslint/node_modules/js-yaml/package.json ] || \ if [ -x $(NODE) ]; then \ cd tools/doc && ../../$(NODE) ../../$(NPM) install; \ @@ -327,7 +327,7 @@ out/doc/api/%.json: doc/api/%.md # check if ./node is actually set, else use user pre-installed binary gen-html = tools/doc/generate.js --node-version=$(FULLVERSION) --format=html --template=doc/template.html $< > $@ out/doc/api/%.html: doc/api/%.md - [ -e tools/doc/node_modules/js-yaml/package.json ] || \ + @[ -e tools/doc/node_modules/js-yaml/package.json ] || \ [ -e tools/eslint/node_modules/js-yaml/package.json ] || \ if [ -x $(NODE) ]; then \ cd tools/doc && ../../$(NODE) ../../$(NPM) install; \ From 6e1eb59fee387010fb42ec757ec52d626effe920 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Sun, 6 Nov 2016 13:50:52 +0100 Subject: [PATCH 114/119] test: improve test-debugger-util-regression Avoid the `exit` command to be sent more than once. It prevents from undesired errors emitted on `proc.stdin`. Remove the watchdog timer so the test does not fail in case it takes longer to complete. PR-URL: https://github.com/nodejs/node/pull/9490 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: James Snell --- .../parallel/test-debugger-util-regression.js | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/test/parallel/test-debugger-util-regression.js b/test/parallel/test-debugger-util-regression.js index 6425312b426f7d..6378ea3e9b171c 100644 --- a/test/parallel/test-debugger-util-regression.js +++ b/test/parallel/test-debugger-util-regression.js @@ -19,16 +19,11 @@ const proc = spawn(process.execPath, args, { stdio: 'pipe' }); proc.stdout.setEncoding('utf8'); proc.stderr.setEncoding('utf8'); -function fail() { - common.fail('the program should not hang'); -} - -const timer = setTimeout(fail, common.platformTimeout(4000)); - let stdout = ''; let stderr = ''; let nextCount = 0; +let exit = false; proc.stdout.on('data', (data) => { stdout += data; @@ -38,8 +33,8 @@ proc.stdout.on('data', (data) => { stdout.includes('> 4') && nextCount < 4) { nextCount++; proc.stdin.write('n\n'); - } else if (stdout.includes('{ a: \'b\' }')) { - clearTimeout(timer); + } else if (!exit && (stdout.includes('< { a: \'b\' }'))) { + exit = true; proc.stdin.write('.exit\n'); } else if (stdout.includes('program terminated')) { // Catch edge case present in v4.x @@ -50,15 +45,6 @@ proc.stdout.on('data', (data) => { proc.stderr.on('data', (data) => stderr += data); -// FIXME -// This test has been periodically failing on certain systems due to -// uncaught errors on proc.stdin. This will stop the process from -// exploding but is still not an elegant solution. Likely a deeper bug -// causing this problem. -proc.stdin.on('error', (err) => { - console.error(err); -}); - process.on('exit', (code) => { assert.equal(code, 0, 'the program should exit cleanly'); assert.equal(stdout.includes('{ a: \'b\' }'), true, From ceec520aefaebe781b07c759e11340aeffc89f06 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Thu, 3 Nov 2016 20:40:34 +0100 Subject: [PATCH 115/119] build: add MAKEFLAGS="-j1" to node-gyp Currently, when building the addons the following warning is displayed: make[2]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule. Adding the MAKEFLAGS="-j1" to avoid the warning. Also updated the log message to say that it is building the addon and not running the test as I think that is more accurate. PR-URL: https://github.com/nodejs/node/pull/9450 Reviewed-By: Ben Noordhuis Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Colin Ihrig --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 369fa22a7a7dbd..193319503557fe 100644 --- a/Makefile +++ b/Makefile @@ -165,9 +165,10 @@ test/addons/.buildstamp: config.gypi \ test/addons/.docbuildstamp # Cannot use $(wildcard test/addons/*/) here, it's evaluated before # embedded addons have been generated from the documentation. - for dirname in test/addons/*/; do \ - echo "\nRunning addons test $$PWD/$$dirname" ; \ - $(NODE) deps/npm/node_modules/node-gyp/bin/node-gyp --loglevel=$(LOGLEVEL) rebuild \ + @for dirname in test/addons/*/; do \ + echo "\nBuilding addon $$PWD/$$dirname" ; \ + env MAKEFLAGS="-j1" $(NODE) deps/npm/node_modules/node-gyp/bin/node-gyp \ + --loglevel=$(LOGLEVEL) rebuild \ --python="$(PYTHON)" \ --directory="$$PWD/$$dirname" \ --nodedir="$$PWD" || exit 1 ; \ From 032533954bae82367e06c96b155556cc96c56641 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Mon, 24 Oct 2016 12:03:53 -0400 Subject: [PATCH 116/119] tools: use long format for gpg fingerprint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git has been using my Long format fingerprint in the tagging messages, this has been causing the release script to fail on my keys. It would also be wise to be using the long format on keys based on some attacks that hack been found in the wild around short keys. PR-URL: https://github.com/nodejs/node/pull/9258 Reviewed-By: Johan Bergström Reviewed-By: James M Snell Reviewed-By: Rod Vagg --- tools/release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release.sh b/tools/release.sh index 397d3d466df785..1151b6dd68d510 100755 --- a/tools/release.sh +++ b/tools/release.sh @@ -50,7 +50,7 @@ elif [ $keycount -ne 1 ]; then done fi -gpgfing=$(gpg --fingerprint $gpgkey | grep 'Key fingerprint =' | awk -F' = ' '{print $2}' | tr -d ' ') +gpgfing=$(gpg --keyid-format 0xLONG --fingerprint $gpgkey | grep 'Key fingerprint =' | awk -F' = ' '{print $2}' | tr -d ' ') if ! test "$(grep $gpgfing README.md)"; then echo 'Error: this GPG key fingerprint is not listed in ./README.md' From 173b088e1a3dd672350e0944b9c82d59abd7a9fd Mon Sep 17 00:00:00 2001 From: Eugene Ostroukhov Date: Thu, 3 Nov 2016 14:28:08 -0700 Subject: [PATCH 117/119] inspector: do not prompt to use localhost MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are multiple reports of Windows7 not being able to resolve localhost on some setups (web search also confirms that). This change will advertise "127.0.0.1" as inspector host name. Fixes: https://github.com/nodejs/node/issues/9382 Fixes: https://github.com/nodejs/node/issues/9188 PR-URL: https://github.com/nodejs/node/pull/9451 Reviewed-By: Ben Noordhuis Reviewed-By: Colin Ihrig Reviewed-By: Michaël Zasso Reviewed-By: James M Snell --- src/inspector_agent.cc | 2 +- test/inspector/test-inspector.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/inspector_agent.cc b/src/inspector_agent.cc index 7f82b7b0516fa6..44c7501375e3eb 100644 --- a/src/inspector_agent.cc +++ b/src/inspector_agent.cc @@ -39,7 +39,7 @@ static const uint8_t PROTOCOL_JSON[] = { std::string GetWsUrl(int port, const std::string& id) { char buf[1024]; - snprintf(buf, sizeof(buf), "localhost:%d/%s", port, id.c_str()); + snprintf(buf, sizeof(buf), "127.0.0.1:%d/%s", port, id.c_str()); return buf; } diff --git a/test/inspector/test-inspector.js b/test/inspector/test-inspector.js index d3d0bbd55923c1..75c645bb222781 100644 --- a/test/inspector/test-inspector.js +++ b/test/inspector/test-inspector.js @@ -11,7 +11,7 @@ function checkListResponse(err, response) { assert.ok(response[0]['devtoolsFrontendUrl']); assert.ok( response[0]['webSocketDebuggerUrl'] - .match(/ws:\/\/localhost:\d+\/[0-9A-Fa-f]{8}-/)); + .match(/ws:\/\/127.0.0.1:\d+\/[0-9A-Fa-f]{8}-/)); } function checkVersion(err, response) { From 0a3a967d54cd7e3ea509914cbf14e0fea04dd586 Mon Sep 17 00:00:00 2001 From: Evan Lucas Date: Thu, 3 Nov 2016 06:00:09 -0500 Subject: [PATCH 118/119] 2016-11-08, Version 7.1.0 (Current) Notable changes: * buffer: add buffer.transcode to transcode a buffer's content from one encoding to another primarily using ICU (James M Snell) * child_process: add public API for IPC channel (cjihrig) * icu * Upgraded to ICU 58 - small icu (Steven R. Loomis) * Add `cldr`, `tz`, and `unicode` to `process.versions` (Steven R. Loomis) * lib: make `String(global) === '[object global]'` (Anna Henningsen) * libuv: Upgraded to 1.10.0 (cjihrig) * readline: use icu based string width calculation (James M Snell) * src: * add NODE_PRESERVE_SYMLINKS environment variable that has the same effect as the `--preserve-symlinks` flag (Marc Udoff) * Fix `String#toLocaleUpperCase()` and `String#toLocaleLowerCase()` (Steven R. Loomis) PR-URL: https://github.com/nodejs/node/pull/9438 --- CHANGELOG.md | 3 +- doc/api/buffer.md | 2 +- doc/api/child_process.md | 2 +- doc/api/cli.md | 2 +- doc/api/process.md | 2 +- doc/changelogs/CHANGELOG_V7.md | 138 +++++++++++++++++++++++++++++++++ src/node_version.h | 6 +- 7 files changed, 147 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67c776da1531a5..5c72be67b64e9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,8 @@ release. - 7.0.0
+ 7.1.0
+ 7.0.0
6.7.0
diff --git a/doc/api/buffer.md b/doc/api/buffer.md index 0849bd6da80936..3396223a07287c 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -2308,7 +2308,7 @@ On 64-bit architectures, this value is `(2^31)-1` (~2GB). ## buffer.transcode(source, fromEnc, toEnc) * `source` {Buffer} A `Buffer` instance diff --git a/doc/api/child_process.md b/doc/api/child_process.md index 6fe6079d4e84a4..96b4c16d9cee2b 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -778,7 +778,7 @@ to send messages. ### child.channel * {Object} A pipe representing the IPC channel to the child process. diff --git a/doc/api/cli.md b/doc/api/cli.md index b45dc8c63f86b3..b0ccb8bb6c0f7c 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -289,7 +289,7 @@ with small-icu support. ### `NODE_PRESERVE_SYMLINKS=1` When set to `1`, instructs the module loader to preserve symbolic links when diff --git a/doc/api/process.md b/doc/api/process.md index 6c25fc4d6ada54..d21be90237c356 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -510,7 +510,7 @@ $ bash -c 'exec -a customArgv0 ./node' ## process.channel If the Node.js process was spawned with an IPC channel (see the diff --git a/doc/changelogs/CHANGELOG_V7.md b/doc/changelogs/CHANGELOG_V7.md index bb1eb4522f4d3e..9c1b61040016ce 100644 --- a/doc/changelogs/CHANGELOG_V7.md +++ b/doc/changelogs/CHANGELOG_V7.md @@ -20,6 +20,144 @@ * [io.js](CHANGELOG_IOJS.md) * [Archive](CHANGELOG_ARCHIVE.md) + +## 2016-11-08, Version 7.1.0 (Current), @evanlucas + +### Notable changes + +* **buffer**: add buffer.transcode to transcode a buffer's content from one encoding to another primarily using ICU (James M Snell) [#9038](https://github.com/nodejs/node/pull/9038) +* **child_process**: add public API for IPC channel (cjihrig) [#9322](https://github.com/nodejs/node/pull/9322) +* **icu**: + * Upgraded to ICU 58 - small icu (Steven R. Loomis) [#9234](https://github.com/nodejs/node/pull/9234) + * Add `cldr`, `tz`, and `unicode` to `process.versions` (Steven R. Loomis) [#9266](https://github.com/nodejs/node/pull/9266) +* **lib**: make `String(global) === '\[object global\]'` (Anna Henningsen) [#9279](https://github.com/nodejs/node/pull/9279) +* **libuv**: Upgraded to 1.10.0 (cjihrig) [#9267](https://github.com/nodejs/node/pull/9267) +* **readline**: use icu based string width calculation (James M Snell) [#9040](https://github.com/nodejs/node/pull/9040) +* **src**: + * add NODE_PRESERVE_SYMLINKS environment variable that has the same effect as the `--preserve-symlinks` flag (Marc Udoff) [#8749](https://github.com/nodejs/node/pull/8749) + * Fix `String#toLocaleUpperCase()` and `String#toLocaleLowerCase()` (Steven R. Loomis) + +### Commits + +* [[`dafdb7b069`](https://github.com/nodejs/node/commit/dafdb7b069)] - **benchmark**: add trailing newline for consistency (Roman Reiss) [#9410](https://github.com/nodejs/node/pull/9410) +* [[`fab8eb660f`](https://github.com/nodejs/node/commit/fab8eb660f)] - **benchmark**: add microbenchmarks for ES Map (Rod Vagg) [#7581](https://github.com/nodejs/node/pull/7581) +* [[`44792f83bf`](https://github.com/nodejs/node/commit/44792f83bf)] - **benchmark,lib,test,tools**: remove unneeded . escape (Rich Trott) [#9449](https://github.com/nodejs/node/pull/9449) +* [[`c70c96a3e2`](https://github.com/nodejs/node/commit/c70c96a3e2)] - **buffer**: coerce offset using Math.trunc() (cjihrig) [#9341](https://github.com/nodejs/node/pull/9341) +* [[`212da12f45`](https://github.com/nodejs/node/commit/212da12f45)] - **buffer**: use correct name for custom inspect symbol (Charmander) [#9289](https://github.com/nodejs/node/pull/9289) +* [[`0939edd4ed`](https://github.com/nodejs/node/commit/0939edd4ed)] - **(SEMVER-MINOR)** **buffer**: add buffer.transcode (James M Snell) [#9038](https://github.com/nodejs/node/pull/9038) +* [[`ceec520aef`](https://github.com/nodejs/node/commit/ceec520aef)] - **build**: add MAKEFLAGS="-j1" to node-gyp (Daniel Bevenius) [#9450](https://github.com/nodejs/node/pull/9450) +* [[`1109d0b244`](https://github.com/nodejs/node/commit/1109d0b244)] - **build**: reduce noise from doc target (Daniel Bevenius) [#9457](https://github.com/nodejs/node/pull/9457) +* [[`90aac7ca28`](https://github.com/nodejs/node/commit/90aac7ca28)] - **build**: start comments at beginning of line (Sakthipriyan Vairamani (thefourtheye)) [#9375](https://github.com/nodejs/node/pull/9375) +* [[`b51db7120e`](https://github.com/nodejs/node/commit/b51db7120e)] - **build**: make node-gyp output silent (Sakthipriyan Vairamani (thefourtheye)) [#8990](https://github.com/nodejs/node/pull/8990) +* [[`d8eaa14c2d`](https://github.com/nodejs/node/commit/d8eaa14c2d)] - **build**: prioritise --shared-X-Y over pkg-config (Rod Vagg) [#9368](https://github.com/nodejs/node/pull/9368) +* [[`f7d8481ee2`](https://github.com/nodejs/node/commit/f7d8481ee2)] - **build**: use wxneeded on openbsd (Aaron Bieber) [#9232](https://github.com/nodejs/node/pull/9232) +* [[`7b0e93738b`](https://github.com/nodejs/node/commit/7b0e93738b)] - **(SEMVER-MINOR)** **child_process**: add public API for IPC channel (cjihrig) [#9322](https://github.com/nodejs/node/pull/9322) +* [[`4e3731c7e7`](https://github.com/nodejs/node/commit/4e3731c7e7)] - **child_process**: remove unreachable code (cjihrig) [#9307](https://github.com/nodejs/node/pull/9307) +* [[`d573acf96f`](https://github.com/nodejs/node/commit/d573acf96f)] - **child_process**: remove unreachable execSync() code (cjihrig) [#9209](https://github.com/nodejs/node/pull/9209) +* [[`f1f00df9bf`](https://github.com/nodejs/node/commit/f1f00df9bf)] - **deps**: upgrade npm to 3.10.9 (Kat Marchán) [#9286](https://github.com/nodejs/node/pull/9286) +* [[`3d1766f492`](https://github.com/nodejs/node/commit/3d1766f492)] - **(SEMVER-MINOR)** **deps**: Intl: ICU 58 bump - small icu (BIG COMMIT) (Steven R. Loomis) [#9234](https://github.com/nodejs/node/pull/9234) +* [[`827000ee62`](https://github.com/nodejs/node/commit/827000ee62)] - **(SEMVER-MINOR)** **deps**: Intl: ICU 58 bump: configure/LICENSE/docs (Steven R. Loomis) [#9234](https://github.com/nodejs/node/pull/9234) +* [[`0f871e1087`](https://github.com/nodejs/node/commit/0f871e1087)] - **deps**: back port OpenBSD fix in c-ares/c-ares (Aaron Bieber) [#9232](https://github.com/nodejs/node/pull/9232) +* [[`106d71914c`](https://github.com/nodejs/node/commit/106d71914c)] - **deps**: upgrade libuv to 1.10.0 (cjihrig) [#9267](https://github.com/nodejs/node/pull/9267) +* [[`4c4132e5d3`](https://github.com/nodejs/node/commit/4c4132e5d3)] - **doc**: update minute-taking procedure for CTC (Rich Trott) [#9425](https://github.com/nodejs/node/pull/9425) +* [[`ed8df17135`](https://github.com/nodejs/node/commit/ed8df17135)] - **doc**: note that tests should include a description (Gibson Fahnestock) [#9415](https://github.com/nodejs/node/pull/9415) +* [[`bc2d1c9d91`](https://github.com/nodejs/node/commit/bc2d1c9d91)] - **doc**: do not link in the headings (Sakthipriyan Vairamani (thefourtheye)) [#9416](https://github.com/nodejs/node/pull/9416) +* [[`4bb9d21d01`](https://github.com/nodejs/node/commit/4bb9d21d01)] - **doc**: update GOVERNANCE.md to use "meeting chair" (Rich Trott) [#9432](https://github.com/nodejs/node/pull/9432) +* [[`c2fab3c600`](https://github.com/nodejs/node/commit/c2fab3c600)] - **doc**: add Sakthipriyan to the CTC (Rod Vagg) [#9427](https://github.com/nodejs/node/pull/9427) +* [[`a8295d86d9`](https://github.com/nodejs/node/commit/a8295d86d9)] - **doc**: update Diagnostics WG info (Josh Gavant) [#9329](https://github.com/nodejs/node/pull/9329) +* [[`3af9453019`](https://github.com/nodejs/node/commit/3af9453019)] - **doc**: move stray sentences in zlib doc (Rich Trott) [#9365](https://github.com/nodejs/node/pull/9365) +* [[`d4b509584f`](https://github.com/nodejs/node/commit/d4b509584f)] - **doc**: use 'an' over 'a', remove redundant sentence (Zeke Sikelianos) [#9345](https://github.com/nodejs/node/pull/9345) +* [[`ff69e38070`](https://github.com/nodejs/node/commit/ff69e38070)] - **doc**: add more internal links to fs.Stats object (Zeke Sikelianos) [#9345](https://github.com/nodejs/node/pull/9345) +* [[`c554f090df`](https://github.com/nodejs/node/commit/c554f090df)] - **doc**: fix outdate ninja link (Yangyang Liu) [#9278](https://github.com/nodejs/node/pull/9278) +* [[`3d4a829d85`](https://github.com/nodejs/node/commit/3d4a829d85)] - **doc**: fix broken links to Buffer.from(string) (Jesse McCarthy) [#9294](https://github.com/nodejs/node/pull/9294) +* [[`225a9dfb00`](https://github.com/nodejs/node/commit/225a9dfb00)] - **doc**: fs: fix link to mkdtemp (coderaiser) [#9379](https://github.com/nodejs/node/pull/9379) +* [[`dbeadd363c`](https://github.com/nodejs/node/commit/dbeadd363c)] - **doc**: update OpenSSL links (kobelb) [#9338](https://github.com/nodejs/node/pull/9338) +* [[`eeabab3827`](https://github.com/nodejs/node/commit/eeabab3827)] - **doc**: add 2016-10-26 CTC meeting minutes (Rich Trott) [#9348](https://github.com/nodejs/node/pull/9348) +* [[`31690a690c`](https://github.com/nodejs/node/commit/31690a690c)] - **doc**: add 2016-10-05 CTC meeting minutes (Josh Gavant) [#9326](https://github.com/nodejs/node/pull/9326) +* [[`7f1a40dbcf`](https://github.com/nodejs/node/commit/7f1a40dbcf)] - **doc**: add 2016-09-28 CTC meeting minutes (Josh Gavant) [#9325](https://github.com/nodejs/node/pull/9325) +* [[`edd89265ba`](https://github.com/nodejs/node/commit/edd89265ba)] - **doc**: update CONTRIBUTING.md to address editing PRs (Gibson Fahnestock) [#9259](https://github.com/nodejs/node/pull/9259) +* [[`c7458909a7`](https://github.com/nodejs/node/commit/c7458909a7)] - **doc**: reference signal(7) for the list of signals (Emanuele DelBono) [#9323](https://github.com/nodejs/node/pull/9323) +* [[`a3f6854724`](https://github.com/nodejs/node/commit/a3f6854724)] - **doc**: more realistic custom inspect example (Ryan Scheel (Havvy)) [#8875](https://github.com/nodejs/node/pull/8875) +* [[`a0074e2232`](https://github.com/nodejs/node/commit/a0074e2232)] - **doc**: clarify buffer toString docs. (Olan Byrne) [#8984](https://github.com/nodejs/node/pull/8984) +* [[`3f90481e20`](https://github.com/nodejs/node/commit/3f90481e20)] - **doc**: clarify relation between a file and a module (marzelin) [#9026](https://github.com/nodejs/node/pull/9026) +* [[`82119049ef`](https://github.com/nodejs/node/commit/82119049ef)] - **doc**: fix typo in http.md (anu0012) [#9144](https://github.com/nodejs/node/pull/9144) +* [[`d2e7882723`](https://github.com/nodejs/node/commit/d2e7882723)] - **doc**: add 2016-10-19 CTC meeting minutes (Josh Gavant) [#9193](https://github.com/nodejs/node/pull/9193) +* [[`ce00a9d2b6`](https://github.com/nodejs/node/commit/ce00a9d2b6)] - **doc**: add performance warning to require.extensions (Ben Noordhuis) [#9196](https://github.com/nodejs/node/pull/9196) +* [[`d1c32aa335`](https://github.com/nodejs/node/commit/d1c32aa335)] - **doc**: mention case-insensitive env on windows (Oliver Salzburg) [#9166](https://github.com/nodejs/node/pull/9166) +* [[`c6e429a6bc`](https://github.com/nodejs/node/commit/c6e429a6bc)] - **doc**: add CTC meeting minutes for 2016-10-12 (Michael Dawson) [#9070](https://github.com/nodejs/node/pull/9070) +* [[`355041960d`](https://github.com/nodejs/node/commit/355041960d)] - **events**: remove unnecessary checks (cjihrig) [#9330](https://github.com/nodejs/node/pull/9330) +* [[`0ce0abf6cb`](https://github.com/nodejs/node/commit/0ce0abf6cb)] - **events,test**: fix TypeError in EventEmitter warning (jseagull) [#9021](https://github.com/nodejs/node/pull/9021) +* [[`6f35e4421a`](https://github.com/nodejs/node/commit/6f35e4421a)] - **http**: add debug message for invalid header value (Evan Lucas) [#9195](https://github.com/nodejs/node/pull/9195) +* [[`173b088e1a`](https://github.com/nodejs/node/commit/173b088e1a)] - **inspector**: do not prompt to use localhost (Eugene Ostroukhov) [#9451](https://github.com/nodejs/node/pull/9451) +* [[`939d1023c2`](https://github.com/nodejs/node/commit/939d1023c2)] - **inspector**: switch to new inspector APIs (Eugene Ostroukhov) [#9028](https://github.com/nodejs/node/pull/9028) +* [[`2e7b078e7b`](https://github.com/nodejs/node/commit/2e7b078e7b)] - **inspector**: fix request path nullptr dereference (Ben Noordhuis) [#9184](https://github.com/nodejs/node/pull/9184) +* [[`9940666c1b`](https://github.com/nodejs/node/commit/9940666c1b)] - **(SEMVER-MINOR)** **intl**: Add more versions from ICU (Steven R. Loomis) [#9266](https://github.com/nodejs/node/pull/9266) +* [[`5bfefa6063`](https://github.com/nodejs/node/commit/5bfefa6063)] - **lib**: change == to === in linkedlist (jedireza) [#9362](https://github.com/nodejs/node/pull/9362) +* [[`d24bd20d2b`](https://github.com/nodejs/node/commit/d24bd20d2b)] - **lib**: make `String(global) === '\[object global\]'` (Anna Henningsen) [#9279](https://github.com/nodejs/node/pull/9279) +* [[`9372aee4a3`](https://github.com/nodejs/node/commit/9372aee4a3)] - **lib**: fix beforeExit not working with -e (Ben Noordhuis) [#8821](https://github.com/nodejs/node/pull/8821) +* [[`c231130e06`](https://github.com/nodejs/node/commit/c231130e06)] - **module**: skip directories known not to exist (Ben Noordhuis) [#9196](https://github.com/nodejs/node/pull/9196) +* [[`d09eb9c6b2`](https://github.com/nodejs/node/commit/d09eb9c6b2)] - **net**: name anonymous functions (Pedro Victor) [#9357](https://github.com/nodejs/node/pull/9357) +* [[`a5c62cb4f2`](https://github.com/nodejs/node/commit/a5c62cb4f2)] - **(SEMVER-MINOR)** **readline**: use icu based string width calculation (James M Snell) [#9040](https://github.com/nodejs/node/pull/9040) +* [[`60461d2d90`](https://github.com/nodejs/node/commit/60461d2d90)] - **repl**: refactor lib/repl.js (Rich Trott) [#9374](https://github.com/nodejs/node/pull/9374) +* [[`071836aa42`](https://github.com/nodejs/node/commit/071836aa42)] - **repl**: name anonymous functions (Pedro Victor) [#9356](https://github.com/nodejs/node/pull/9356) +* [[`0b9d80a037`](https://github.com/nodejs/node/commit/0b9d80a037)] - **repl**: don’t write to input stream in editor mode (Anna Henningsen) [#9207](https://github.com/nodejs/node/pull/9207) +* [[`1c59cefc44`](https://github.com/nodejs/node/commit/1c59cefc44)] - **repl**: make `key` of `repl.write()` optional always (Anna Henningsen) [#9207](https://github.com/nodejs/node/pull/9207) +* [[`b1ef638de3`](https://github.com/nodejs/node/commit/b1ef638de3)] - **(SEMVER-MINOR)** **src**: default --icu_case_mapping on as a v8 option (Steven R. Loomis) [#9454](https://github.com/nodejs/node/pull/9454) +* [[`0c236d1d36`](https://github.com/nodejs/node/commit/0c236d1d36)] - **src**: replace SetNamedPropertyHandler() (AnnaMag) [#9062](https://github.com/nodejs/node/pull/9062) +* [[`5ab172ee8f`](https://github.com/nodejs/node/commit/5ab172ee8f)] - **src**: fix use of uninitialized variable (James M Snell) [#9281](https://github.com/nodejs/node/pull/9281) +* [[`57c0a9b5dc`](https://github.com/nodejs/node/commit/57c0a9b5dc)] - **src**: remove unused function (Brian White) [#9243](https://github.com/nodejs/node/pull/9243) +* [[`08e12c7809`](https://github.com/nodejs/node/commit/08e12c7809)] - **src**: remove superfluous env_string string (Ben Noordhuis) [#9213](https://github.com/nodejs/node/pull/9213) +* [[`c342bda49e`](https://github.com/nodejs/node/commit/c342bda49e)] - **src**: make cross-context MakeCallback() calls work (Ben Noordhuis) [#9221](https://github.com/nodejs/node/pull/9221) +* [[`60a5b515b8`](https://github.com/nodejs/node/commit/60a5b515b8)] - **(SEMVER-MINOR)** **src**: add NODE_PRESERVE_SYMLINKS environment variable (Marc Udoff) [#8749](https://github.com/nodejs/node/pull/8749) +* [[`f2a3b24611`](https://github.com/nodejs/node/commit/f2a3b24611)] - **src**: clean up program/isolate/env init logic (Ben Noordhuis) [#9224](https://github.com/nodejs/node/pull/9224) +* [[`9e753ba782`](https://github.com/nodejs/node/commit/9e753ba782)] - **src**: simplify code, remove NodeInstanceData (Ben Noordhuis) [#9224](https://github.com/nodejs/node/pull/9224) +* [[`8b53f3c41c`](https://github.com/nodejs/node/commit/8b53f3c41c)] - **src**: speed up module loading, don't resize buffer (Ben Noordhuis) [#9132](https://github.com/nodejs/node/pull/9132) +* [[`362c307f38`](https://github.com/nodejs/node/commit/362c307f38)] - **src**: speed up module loading, skip EOF read (Ben Noordhuis) [#9132](https://github.com/nodejs/node/pull/9132) +* [[`85a9295813`](https://github.com/nodejs/node/commit/85a9295813)] - **src,tools**: speed up startup by 2.5% (Ben Noordhuis) [#5458](https://github.com/nodejs/node/pull/5458) +* [[`6e1eb59fee`](https://github.com/nodejs/node/commit/6e1eb59fee)] - **test**: improve test-debugger-util-regression (Santiago Gimeno) [#9490](https://github.com/nodejs/node/pull/9490) +* [[`6eb6816e22`](https://github.com/nodejs/node/commit/6eb6816e22)] - **test**: fix flaky test-net-GH-5504 (Santiago Gimeno) [#9461](https://github.com/nodejs/node/pull/9461) +* [[`f640bafc58`](https://github.com/nodejs/node/commit/f640bafc58)] - **test**: fix flaky test-force-repl-with-eval (Santiago Gimeno) [#9460](https://github.com/nodejs/node/pull/9460) +* [[`675a4b20b6`](https://github.com/nodejs/node/commit/675a4b20b6)] - **test**: update http-header-obstext (Gibson Fahnestock) [#9415](https://github.com/nodejs/node/pull/9415) +* [[`9d9ea8127e`](https://github.com/nodejs/node/commit/9d9ea8127e)] - **test**: move timer-dependent test to sequential (Rich Trott) [#9431](https://github.com/nodejs/node/pull/9431) +* [[`1c3487b5c3`](https://github.com/nodejs/node/commit/1c3487b5c3)] - **test**: remove timers from streams test (Anna Henningsen) +* [[`e696bc33eb`](https://github.com/nodejs/node/commit/e696bc33eb)] - **test**: increase test coverage for lib/zlib.js (Rich Trott) [#9366](https://github.com/nodejs/node/pull/9366) +* [[`ed3f80a988`](https://github.com/nodejs/node/commit/ed3f80a988)] - **test**: add test for HTTP client "aborted" event (Kyle E. Mitchell) [#7376](https://github.com/nodejs/node/pull/7376) +* [[`d12ed29f6a`](https://github.com/nodejs/node/commit/d12ed29f6a)] - **test**: remove timer in test-dgram-send-empty-array (Rich Trott) [#9361](https://github.com/nodejs/node/pull/9361) +* [[`e451022dd9`](https://github.com/nodejs/node/commit/e451022dd9)] - **test**: refactor test-http-client-readable (Rich Trott) [#9344](https://github.com/nodejs/node/pull/9344) +* [[`01b626a45a`](https://github.com/nodejs/node/commit/01b626a45a)] - **test**: clean up dgram-broadcast-multi-process test (Isobel Redelmeier) [#9308](https://github.com/nodejs/node/pull/9308) +* [[`411b1339bc`](https://github.com/nodejs/node/commit/411b1339bc)] - **test**: fix freebsd10-64 CI failures (Rich Trott) [#9317](https://github.com/nodejs/node/pull/9317) +* [[`1037463604`](https://github.com/nodejs/node/commit/1037463604)] - **test**: add child_process customFds test (cjihrig) [#9307](https://github.com/nodejs/node/pull/9307) +* [[`bd9cb40977`](https://github.com/nodejs/node/commit/bd9cb40977)] - **test**: run all of test-timers-blocking-callback (Rich Trott) [#9305](https://github.com/nodejs/node/pull/9305) +* [[`8b7ce8bd11`](https://github.com/nodejs/node/commit/8b7ce8bd11)] - **test**: fix flaky test-fs-watch-recursive on OS X (Rich Trott) [#9303](https://github.com/nodejs/node/pull/9303) +* [[`6c9e4fddf0`](https://github.com/nodejs/node/commit/6c9e4fddf0)] - **test**: refactor test-async-wrap-check-providers (Gerges Beshay) [#9297](https://github.com/nodejs/node/pull/9297) +* [[`0ab008e50d`](https://github.com/nodejs/node/commit/0ab008e50d)] - **test**: fix lint error regarding unused commons const (Daniel Bevenius) [#9334](https://github.com/nodejs/node/pull/9334) +* [[`c9b67c6a91`](https://github.com/nodejs/node/commit/c9b67c6a91)] - **test**: writable stream needDrain state (Italo A. Casas) [#8799](https://github.com/nodejs/node/pull/8799) +* [[`248a3200b2`](https://github.com/nodejs/node/commit/248a3200b2)] - **test**: writable stream ending state (Italo A. Casas) [#8707](https://github.com/nodejs/node/pull/8707) +* [[`d6f688ae0d`](https://github.com/nodejs/node/commit/d6f688ae0d)] - **test**: writable stream finished state (Italo A. Casas) [#8791](https://github.com/nodejs/node/pull/8791) +* [[`d49d990c42`](https://github.com/nodejs/node/commit/d49d990c42)] - **test**: prevent workers outliving parent (Sam Roberts) [#9257](https://github.com/nodejs/node/pull/9257) +* [[`2ad81ed0e6`](https://github.com/nodejs/node/commit/2ad81ed0e6)] - **test**: refactor /parallel/test-cluster-uncaught-exception.js to ES6 (Deverick) [#9239](https://github.com/nodejs/node/pull/9239) +* [[`f39eb05946`](https://github.com/nodejs/node/commit/f39eb05946)] - **test**: use strict assertions in module loader test (Ben Noordhuis) [#9263](https://github.com/nodejs/node/pull/9263) +* [[`fc9e6a37fa`](https://github.com/nodejs/node/commit/fc9e6a37fa)] - **test**: remove err timer from test-http-set-timeout (BethGriggs) [#9264](https://github.com/nodejs/node/pull/9264) +* [[`53520f06f3`](https://github.com/nodejs/node/commit/53520f06f3)] - **test**: clean up `test-child-process-exec-cwd.js` (Jeena Lee) [#9231](https://github.com/nodejs/node/pull/9231) +* [[`deef2f6079`](https://github.com/nodejs/node/commit/deef2f6079)] - **test**: add child_process.exec() timeout coverage (cjihrig) [#9208](https://github.com/nodejs/node/pull/9208) +* [[`5e138fe768`](https://github.com/nodejs/node/commit/5e138fe768)] - **test**: skip whatwg url parse and setter tests when icu is missing (James M Snell) [#9246](https://github.com/nodejs/node/pull/9246) +* [[`a39b98ef73`](https://github.com/nodejs/node/commit/a39b98ef73)] - **test**: add common.hasIntl (James M Snell) [#9246](https://github.com/nodejs/node/pull/9246) +* [[`efb62aa146`](https://github.com/nodejs/node/commit/efb62aa146)] - **test**: fix flaky test by removing timer (Evan Lucas) [#9199](https://github.com/nodejs/node/pull/9199) +* [[`44427cc1f7`](https://github.com/nodejs/node/commit/44427cc1f7)] - **test**: case sensitivity of env variables (Oliver Salzburg) [#9166](https://github.com/nodejs/node/pull/9166) +* [[`63ef0990f3`](https://github.com/nodejs/node/commit/63ef0990f3)] - **test**: add coverage for execFileSync() errors (cjihrig) [#9211](https://github.com/nodejs/node/pull/9211) +* [[`06b414078e`](https://github.com/nodejs/node/commit/06b414078e)] - **test**: remove test-v8-inspector-json-protocol test (Ben Noordhuis) [#9184](https://github.com/nodejs/node/pull/9184) +* [[`21ba3e3b89`](https://github.com/nodejs/node/commit/21ba3e3b89)] - **test**: add more module loader test coverage (Ben Noordhuis) [#9196](https://github.com/nodejs/node/pull/9196) +* [[`204461925b`](https://github.com/nodejs/node/commit/204461925b)] - **test**: make flaky pummel test more reliable (Ben Noordhuis) [#9241](https://github.com/nodejs/node/pull/9241) +* [[`4be1ba582a`](https://github.com/nodejs/node/commit/4be1ba582a)] - **test**: move flaky test to test/pummel (Ben Noordhuis) [#9241](https://github.com/nodejs/node/pull/9241) +* [[`032533954b`](https://github.com/nodejs/node/commit/032533954b)] - **tools**: use long format for gpg fingerprint (Myles Borins) [#9258](https://github.com/nodejs/node/pull/9258) +* [[`aac4af2b26`](https://github.com/nodejs/node/commit/aac4af2b26)] - **tools**: enable final newline in .editorconfig (Roman Reiss) [#9410](https://github.com/nodejs/node/pull/9410) +* [[`513da404cb`](https://github.com/nodejs/node/commit/513da404cb)] - **tools**: enforce function name matching in linter (Rich Trott) [#9408](https://github.com/nodejs/node/pull/9408) +* [[`c23ece7056`](https://github.com/nodejs/node/commit/c23ece7056)] - **tools**: remove dangling eslint symlink (Sam Roberts) [#9299](https://github.com/nodejs/node/pull/9299) +* [[`bdad1e28fd`](https://github.com/nodejs/node/commit/bdad1e28fd)] - **tools**: make --repeat work with -j in test.py (Rich Trott) [#9249](https://github.com/nodejs/node/pull/9249) +* [[`4f0596fb03`](https://github.com/nodejs/node/commit/4f0596fb03)] - **util**: use template strings (Alejandro Oviedo Garcia) [#9120](https://github.com/nodejs/node/pull/9120) +* [[`b083086ff2`](https://github.com/nodejs/node/commit/b083086ff2)] - **vm**: name anonymous functions (solebox) [#9388](https://github.com/nodejs/node/pull/9388) + + ## 2016-10-25, Version 7.0.0 (Current), @jasnell diff --git a/src/node_version.h b/src/node_version.h index 7f573a4e924732..c8c3f01e29e19f 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -2,10 +2,10 @@ #define SRC_NODE_VERSION_H_ #define NODE_MAJOR_VERSION 7 -#define NODE_MINOR_VERSION 0 -#define NODE_PATCH_VERSION 1 +#define NODE_MINOR_VERSION 1 +#define NODE_PATCH_VERSION 0 -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n) From 3daf11635dc8e0cf48110514000fd550ed79a425 Mon Sep 17 00:00:00 2001 From: Evan Lucas Date: Tue, 8 Nov 2016 13:34:00 -0600 Subject: [PATCH 119/119] Working on v7.1.1 PR-URL: PR-URL: https://github.com/nodejs/node/pull/9438 --- src/node_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node_version.h b/src/node_version.h index c8c3f01e29e19f..a66a242eab3a3b 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -3,9 +3,9 @@ #define NODE_MAJOR_VERSION 7 #define NODE_MINOR_VERSION 1 -#define NODE_PATCH_VERSION 0 +#define NODE_PATCH_VERSION 1 -#define NODE_VERSION_IS_RELEASE 1 +#define NODE_VERSION_IS_RELEASE 0 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)

6Z< 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